/*
Theme Name:   KMFURNILA v6
Theme URI:    https://www.kmfurnila.com/
Description:  KMFURNILA 家具品牌独立站主题。极简直角版式（参照 Anker 设计语言），黑白灰中性色系 + 小面积强调色，为家具类目优化的转化型设计。独立实现，不依赖任何父主题。
Author:       KMFURNILA
Version:      8.0.0
License:      GNU General Public License v2 or later
Text Domain:  kmfurnila
Tags:         e-commerce, furniture, custom-colors, custom-menu, featured-images
*/

/* ==========================================================================
   1. 设计令牌
   ★★ 2026-10-07 第八轮「Anker 化」重定向 ★★
   参照 www.anker.com 实测规格（HTML 2.02MB + 主 CSS 940KB + Playwright
   计算样式）重构：
     · 色彩：纯白底 + 冷灰阶（#f5f5f7 / #f1f3f5）+ 近黑正文（#1d1d1f）
             + 强调黑（#080a0f）
     · 按钮：★ 黑底白字直角（不再是彩色底）—— Anker 的「高级感」
             有相当部分来自「不用彩色按钮」
     · 圆角：全部 0（Anker 按钮/卡片/图片容器实测 border-radius:0px）
     · 阴影：全部去掉，用背景色差 + 1px 细线分隔
     · 字体：单一无衬线 + 负字距；正文 14px/500，标题 700
     · 强调色：降级为小面积点缀（标签/图标/勾选/星级），不再刷按钮底
   令牌名全部保留（clay/pine 等名字不变，含义重定义）——
   40+ 处引用零改动，diff 最小化。
   ========================================================================== */

:root {
	/* 移动端抽屉上沿（= 页头实测底边）。
	   由 assets/kmfurnila.js 的 initMobileNav → syncTop() 在运行时写入
	   documentElement 的内联样式覆盖此默认值；这里给一份静态回退，
	   保证 JS 未执行或执行前抽屉也不会盖住页头。
	   ★ 2026-10-08 第十轮：页头从「公告条 36 + 顶栏 64 + 搜索行 61 = 161px」
	   收敛为「公告条 34 + 顶栏 103 = 137px」，回退值同步下调。 */
	--kmf-drawer-top:  137px;

/* --------------------------------------------------------------------------
	   强调色 —— ★ 第八轮：由「松柏绿」整体重指向 Anker 强调黑。
	   变更理由（2026-10-08 目检发现）：
	     · 上一版只把按钮底色换成黑，但 pine 绿色仍在 50+ 处生效 ——
	       hero 的 1-2 days / Free / 30 days 三个数字、链接 hover、
	       焦点环、已选变体边框、NEW 徽章、星级、勾选图标全是绿的，
	       与 Anker 全站「只黑/白/灰，无彩色」的观感直接冲突。
	     · 50+ 处逐个改 diff 太大且易漏，改为**令牌层重指向**：
	       令牌名不变（引用零改动），值从绿改为近黑 #1d1d1f。
	       链接 hover / 焦点环 / 选中态用黑，与 Anker 实测一致
	       （Anker 链接 hover 就是加深的黑，不用彩色）。
	     · NEW 徽章随之变黑底白字 —— 与 Anker 的黑色标签同形。
	   保留：--kmf-ok / --kmf-warn / --kmf-err 三个语义色独立，不受影响
	         （表单校验、库存告警等仍需可辨识的红/绿语义）。
	   -------------------------------------------------------------------------- */
	--kmf-pine:        #1d1d1f;   /* Anker 正文黑（原 #1b5e4a 松柏绿） */
	--kmf-pine-d:      #080a0f;   /* hover 加深 → Anker 强调黑 */
	--kmf-pine-l:      #424245;   /* 次级 → Anker 次级灰 */
	--kmf-pine-wash:   #f1f3f5;   /* 浅底 → Anker 瓷砖灰（原绿洗底 e9efec） */

	/* 强调黑 —— 原「赤陶橘」槽位。Anker 全站 CTA / 大标题 / 徽章用
	   #080a0f（比正文更深更冷）。这里作为新的按钮底色与强调色。 */
	--kmf-clay:        #080a0f;
	--kmf-clay-d:      #000000;
	--kmf-clay-l:      #7db79f;
	--kmf-clay-wash:   #f1f3f5;

	/* 大面积深色表面专用（公告条 / 类目墙 / 横幅 / 页脚） */
	--kmf-ink-deep:    #080a0f;

	/* 中性色 —— ★ 第八轮：对齐 Anker 冷灰阶
	   （原 #ffffff/#f4f5f4/#171a1c/#41474a/#737a7d）
	   Anker 实测：正文 #1d1d1f、次级底 #f5f5f7 / #f1f3f5、
	   灰阶 accent-3..6 = #999/#888/#666/#444 */
	--kmf-ink:         #1d1d1f;
	--kmf-ink-2:       #424245;
	--kmf-ink-3:       #6e6e73;
	--kmf-line:        #e8e8ed;
	--kmf-line-2:      #d2d2d7;
	--kmf-bg:          #ffffff;
	--kmf-bg-2:        #f5f5f7;
	--kmf-surface:     #ffffff;
	/* 新增：Anker 的「瓷砖底 / 次级按钮底」冷调浅灰 */
	--kmf-tile:        #f1f3f5;

	/* 语义色 */
	--kmf-ok:          #15803d;
	--kmf-warn:        #b45309;
	--kmf-err:         #b91c1c;
	--kmf-info:        #1e5f8a;

	/* 字体 —— 单一无衬线家族（Anker 全站仅 MontForAnker 一种）。
	   本站用 Inter + 系统栈逼近其几何无衬线观感：
	   靠字重（正文 500、标题 700）与负字距制造「精密感」，
	   而非更换字体。 */
	--kmf-font-body:   "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
	--kmf-font-head:   "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
	--kmf-font-mono:   ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;

	/* ★ 字距 —— Anker 连正文都收紧（-0.32px / 14px ≈ -0.023em），
	   标题更紧（-0.04em）。这是「精密感」的关键细节。 */
	--kmf-ls-body:     -0.011em;
	--kmf-ls-title:    -0.032em;

	/* 尺度 —— Anker 内容区 1280px / 全宽叙事区 1440px。
	   本站沿用 1440 作为宽容器（与既有四/五轮宽屏成果一致），
	   新增 1280 作为「内容型页面」（博客式正文、图文块）的窄档。 */
	--kmf-wrap:        1440px;
	--kmf-wrap-wide:   1680px;
	--kmf-wrap-narrow: 760px;
	/* Anker 网格 gap 实测 12-16px（紧凑）/ 24px（常规） */
	--kmf-gap:         24px;
	--kmf-pad:         clamp(20px, 3.2vw, 44px);

	/* 圆角 —— ★ 第八轮：全面直角化（Anker 实测 border-radius: 0px）。
	   仅头像/胶囊标签等必要圆形另行处理。 */
	--kmf-r-sm:        0px;
	--kmf-r:           0px;
	--kmf-r-lg:        0px;

	/* 阴影 —— ★ 第八轮：全部去掉（Anker 实测 box-shadow: none）。
	   层次靠背景色差（白 ↔ #f5f5f7）+ 1px 细线（#e8e8ed）表达。
	   保留变量名以兼容既有引用，值置为 none。 */
	--kmf-shadow:      none;
	--kmf-shadow-lg:   none;

	/* 动效 */
	--kmf-ease:        cubic-bezier(.4, 0, .2, 1);
	--kmf-dur:         .22s;
}

/* --------------------------------------------------------------------------
   1b. 旧令牌兼容层
   --------------------------------------------------------------------------
   为什么需要：inc/ 下 7 个功能模块（nb-pdp / nb-variant-page / nb-seo /
   nb-geo / nb-search / nb-cart / nb-page-nav，合计约 8800 行）在输出 HTML 时
   硬编码了 260+ 个 nb-* 类名，这些结构对应的是**已上线的商品详情页**，
   每一处都经过实测校对，重命名风险远大于收益。

   因此这里把旧令牌名映射到新设计系统：模块 HTML 不动，但它们读到的
   颜色 / 圆角 / 阴影 / 字体全部跟随 :root 的当前语义 ——
   第六轮起是「冷灰白中性 + 松柏绿强调 + 黑铬 CTA」的欧美零售语言。
   换句话说 —— 结构复用，视觉全新。这正是「同功能、不同模板」的落点。
   -------------------------------------------------------------------------- */
:root {
	/* 品牌色 */
	--nb-primary:    var(--kmf-pine);
	--nb-primary-d:  var(--kmf-pine-d);
	--nb-primary-l:  var(--kmf-pine-wash);
	--nb-accent:     var(--kmf-clay);
	--nb-accent-d:   var(--kmf-clay-d);

	/* 中性色 —— ★ 第八轮：对齐 Anker 冷灰阶 */
	--nb-ink:        #1d1d1f;
	--nb-ink-2:      #333336;
	--nb-body:       #424245;
	--nb-text:       #424245;
	--nb-muted:      #6e6e73;
	--nb-line:       #e8e8ed;
	--nb-line-warm:  #f1f3f5;
	--nb-soft:       #f5f5f7;
	--nb-cream:      #f5f5f7;

	/* 语义色 */
	--nb-ok:         #15803d;
	--nb-star:       #d97706;

	/* 阴影 —— ★ 第八轮：全部去掉（Anker 实测 box-shadow: none），
	   层次改由背景色差 + 1px 细线表达。变量名保留、值置 none。 */
	--nb-sh-sm:      none;
	--nb-sh-md:      none;
	--nb-sh-lg:      none;

	/* 圆角 —— ★ 第八轮：全面直角化（Anker 实测 0px） */
	--nb-r-sm:       0px;
	--nb-r:          0px;
	--nb-r-lg:       0px;
	--nb-pill:       0px;

	/* 布局 */
	--nb-wrap:       1280px;
	--nb-gutter:     24px;
	--nb-sec:        72px;
	--nb-card-ratio: 1 / 1;

	/* 字体 —— 标题衬线、正文 Inter，跨模块统一 */
	--nb-font:       var(--kmf-font-body);
	--nb-font-head:  var(--kmf-font-head);

	/* 过渡 */
	--nb-t:          .22s cubic-bezier(.4, 0, .2, 1);
}

/* ==========================================================================
   2. 基础重置
   ========================================================================== */

*, *::before, *::after { box-sizing: border-box; }

html {
	-webkit-text-size-adjust: 100%;
	scroll-behavior: smooth;
}

body {
	margin: 0;
	font-family: var(--kmf-font-body);
	font-size: 15px;
	line-height: 1.65;
	color: var(--kmf-ink);
	background: var(--kmf-bg);
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

img, svg, video { max-width: 100%; height: auto; display: block; }
a { color: var(--kmf-pine); text-decoration: none; transition: color var(--kmf-dur) var(--kmf-ease); }
a:hover { color: var(--kmf-pine-l); }

h1, h2, h3, h4, h5 {
	font-family: var(--kmf-font-head);
	font-weight: 600;
	line-height: 1.2;
	letter-spacing: -.015em;
	color: var(--kmf-ink);
	margin: 0 0 .6em;
}

h1 { font-size: clamp(30px, 4.2vw, 46px); }
h2 { font-size: clamp(24px, 3vw, 34px); }
h3 { font-size: clamp(19px, 2.2vw, 24px); }
h4 { font-size: 17px; }

p { margin: 0 0 1.1em; }
ul, ol { margin: 0 0 1.2em; padding-left: 1.3em; }

button, input, select, textarea {
	font-family: inherit;
	font-size: inherit;
	color: inherit;
}

:focus-visible {
	outline: 2px solid var(--kmf-pine);
	outline-offset: 2px;
}

.screen-reader-text {
	position: absolute !important;
	width: 1px; height: 1px;
	overflow: hidden;
	clip: rect(0 0 0 0);
	white-space: nowrap;
}

.kmf-wrap {
	width: 100%;
	max-width: var(--kmf-wrap);
	margin: 0 auto;
	/* 横向内边距改为随视口缩放的变量：窄屏 20px 保证可读，
	   宽屏放到 44px，避免内容贴边显局促。 */
	padding: 0 var(--kmf-pad);
}

/* 宽版容器：给需要「比正文更铺开」的区块用（通栏横幅、品牌故事等）。 */
.kmf-wrap-wide { max-width: var(--kmf-wrap-wide); }

.kmf-wrap-narrow { max-width: var(--kmf-wrap-narrow); }

/* ==========================================================================
   3. 排版工具类
   ========================================================================== */

.kmf-eyebrow {
	font-family: var(--kmf-font-body);
	font-size: 11px;
	font-weight: 600;
	letter-spacing: .16em;
	text-transform: uppercase;
	color: var(--kmf-clay);
	margin-bottom: 12px;
}

.kmf-lede {
	font-size: 17px;
	line-height: 1.7;
	color: var(--kmf-ink-2);
}

.kmf-divider {
	height: 1px;
	background: var(--kmf-line);
	border: 0;
	margin: 0;
}

.kmf-section {
	/* ★ 2026-10-07 第四轮：原为 clamp(48px, 7vw, 88px)。
	   88px 在 1440 视口下偏大，且 vw 系数导致 1920 下顶到上限、节奏失真。
	   改为「以视口宽度的 5.4% 为基准，480px 起跳、上限 96px」，
	   宽屏得到更舒展的分段感，窄屏不塌成一条。 */
	padding: clamp(48px, 5.4vw, 96px) 0;
}

.kmf-section-tight { padding: clamp(32px, 4vw, 52px) 0; }

/* ==========================================================================
   4. 按钮
   ★ 第八轮：按 Anker 实测规格重做。
     · 主按钮 = 黑底白字（不再用彩色底）—— Anker 全站 CTA 均为 #080a0f
     · 圆角 0（Anker 实测 border-radius: 0px）
     · padding 11px 20px 10px、字 14px/700、高约 38px
     · 无阴影、无边框；悬停只轻微加深底色
     · 强调色（松柏绿）降级为小面积点缀，不再用于按钮底
   ========================================================================== */

.kmf-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 8px;
	/* Anker 实测 padding: 11px 20px 10px（下边少 1px 补偿视觉重心） */
	padding: 11px 22px 10px;
	font-size: 14px;
	font-weight: 700;
	letter-spacing: -.005em;
	line-height: 1.35;
	border: 1px solid transparent;
	border-radius: 0;
	cursor: pointer;
	text-align: center;
	text-decoration: none;
	transition: background var(--kmf-dur) var(--kmf-ease),
	            border-color var(--kmf-dur) var(--kmf-ease),
	            color var(--kmf-dur) var(--kmf-ease),
	            opacity var(--kmf-dur) var(--kmf-ease);
}

/* ★ 主按钮 —— Anker 式黑底白字直角 */
.kmf-btn-primary {
	background: var(--kmf-clay);
	border-color: var(--kmf-clay);
	color: #fff;
}
.kmf-btn-primary:hover {
	background: var(--kmf-clay-d);
	border-color: var(--kmf-clay-d);
	color: #fff;
}

/* 强调按钮（保留槽位；第八轮与主按钮同款，强调色不再刷按钮底） */
.kmf-btn-accent {
	background: var(--kmf-clay);
	border-color: var(--kmf-clay);
	color: #fff;
}
.kmf-btn-accent:hover { background: var(--kmf-clay-d); border-color: var(--kmf-clay-d); color: #fff; }

/* ★ 次按钮 —— Anker 实测浅灰底 + 深字（#f5f6f7 / #1e2024） */
.kmf-btn-ghost {
	background: var(--kmf-tile);
	border-color: var(--kmf-tile);
	color: var(--kmf-ink);
}
.kmf-btn-ghost:hover { background: #e6e9eb; border-color: #e6e9eb; color: var(--kmf-ink); }

/* 描边按钮 —— 用于浅色底上的第三层级动作 */
.kmf-btn-outline {
	background: transparent;
	border-color: var(--kmf-line-2);
	color: var(--kmf-ink);
}
.kmf-btn-outline:hover { background: var(--kmf-clay); border-color: var(--kmf-clay); color: #fff; }

.kmf-btn-block { display: flex; width: 100%; }
/* 大号：仅用于 hero 等需要更强存在感的场景，克制使用 */
.kmf-btn-lg { padding: 14px 28px 13px; font-size: 15px; }
.kmf-btn-sm { padding: 8px 16px 7px; font-size: 13px; }

.kmf-btn[disabled], .kmf-btn.is-disabled {
	opacity: .4;
	pointer-events: none;
}

/* ==========================================================================
   5. 公告条
   ========================================================================== */

.kmf-announce {
	/* ★ 第六轮：松柏绿 → 炭黑。欧美零售 promo bar 常规是黑/深灰。 */
	background: var(--kmf-ink-deep);
	color: #fff;
	font-size: 12.5px;
	letter-spacing: .04em;
	text-align: center;
	padding: 0;
	/* ★ 可滚动提示：窄屏下顶条是横向滑动的，但原生滚动条已隐藏，
	   用户看不出「右边还有内容」。这里用一层右侧渐隐做视觉暗示。
	   渐隐层用 ::after 挂在 .kmf-announce 上（而非 .kmf-wrap 内部 ——
	   后者是滚动容器，放在里面会跟着内容一起滑走）。
	   pointer-events:none 保证不挡滑动与点击。
	   宽屏（≥783px）下内容不溢出，渐隐没有意义也会误导入，
	   因此在下方断点里关掉。 */
	position: relative;
}
.kmf-announce::after {
	content: "";
	position: absolute;
	top: 0; right: 0; bottom: 0;
	width: 28px;
	pointer-events: none;
	background: linear-gradient(to right, rgba(21, 25, 27, 0), var(--kmf-ink-deep));
}
@media (min-width: 783px) {
	.kmf-announce::after { display: none; }
}

/* ★★ 2026-10-07 重写：公告条由「文字自然换行」改为「flex 单行 + 横向滑动」★★
   改之前的实测数据（同一份 HTML，只变视口）：
     1440px → 41px 高 / 1 行
      834px → 65px 高 / 2 行
      390px → 112px 高 / 4 行
      360px → 130px 高 / 4 行（末项 "Support …" 自身还折了 2 行）

   根因两条：
   1. `.kmf-wrap` 是 display:block，4 个 `.kmf-announce-item`（inline-flex）靠行内流自然换行，
      容器一窄就逐项往下掉；项内文字也还能再折，于是 360px 下变成 4 行 + 项内折行。
   2. 每个 item 原来带 margin-inline:20px（左右各 20px），4 项在 350px 容器里光外边距就吃掉 160px。

   改法：
   - 作用域限定在 `.kmf-announce .kmf-wrap`，不碰全站共用的 `.kmf-wrap`；
   - 改 flex，间距交给 gap（不再用 margin-inline），横向内边距按视口收窄；
   - 桌面 nowrap 居中平铺，窄屏 nowrap + overflow-x:auto 横向滑动 —— 高度恒为单行，
     不再随视口变化，也不会出现项内二次折行。
   - `-webkit-overflow-scrolling: touch` + 隐藏滚动条，移动端滑动更顺。 */
.kmf-announce .kmf-wrap {
	display: flex;
	flex-wrap: nowrap;
	align-items: center;
	justify-content: center;
	gap: 40px;
	max-width: none;
	padding: 9px 20px;
	overflow-x: auto;
	overflow-y: hidden;
	-webkit-overflow-scrolling: touch;
	scrollbar-width: none;
	-ms-overflow-style: none;
}
.kmf-announce .kmf-wrap::-webkit-scrollbar { display: none; }

.kmf-announce a { color: #fff; text-decoration: underline; text-underline-offset: 2px; }

/* ==========================================================================
   6. 站点头
   ========================================================================== */

.kmf-header {
	background: var(--kmf-surface);
	border-bottom: 1px solid var(--kmf-line);
	position: sticky;
	top: 0;
	/* ★ 2026-10-07：200 → 950。移动端抽屉(.kmf-nav)是 z-index 900、遮罩 890。
	   页头若低于二者，汉堡按钮会被遮罩/抽屉盖住 —— 抽屉一打开就再也点不到关闭按钮，
	   是死锁式交互缺陷。页头提到 950 后：抽屉与遮罩均在其下，
	   抽屉从页头下沿展开、汉堡始终可点。 */
	z-index: 950;
}

.kmf-header-inner {
	display: flex;
	align-items: center;
	gap: 24px;
	height: 68px;
}

.kmf-brand {
	display: flex;
	align-items: center;
	gap: 10px;
	flex-shrink: 0;
	font-family: var(--kmf-font-head);
	font-size: 21px;
	font-weight: 700;
	letter-spacing: .06em;
	color: var(--kmf-ink);
}
.kmf-brand:hover { color: var(--kmf-pine); }
.kmf-brand img { height: 32px; width: auto; }

/* 主导航
   ★ 2026-10-07：去掉 margin-left:auto —— 页头已改为三栏网格（.kmf-header-top），
   导航所在的是中间的 1fr 栏，用 justify-self:center 做视觉居中；
   保留 margin-left:auto 会在网格里叠加出一段多余左侧空隙，故移除。 */
.kmf-nav {
	margin-left: 0;
	justify-self: center;
	min-width: 0;
}
.kmf-nav ul {
	display: flex;
	align-items: center;
	/* ★ 2026-10-07：原为 gap:26px。当时导航项 <a> 的 padding 是「22px 0」，
	   水平内边距为 0 —— 实测每个顶级项的点击热区只有文字宽度（「商店」仅 28px，
	   WCAG 2.2 建议最小 24×24 已勉强，触屏上极易点错；F字间距靠 26px 空白硬撑）。
	   现改为「<li> 提供水平内边距 + gap 收窄」，热区变大而视觉间距不变。 */
	gap: 4px;
	margin: 0; padding: 0;
	list-style: none;
}
.kmf-nav li { position: relative; }
/* 点击热区：水平 12px 内边距（两侧共 24px 热区），配合 gap:4px 形成 32px 视觉间距 */
.kmf-nav > ul > li { padding: 0 12px; }
.kmf-nav > ul > li > a {
	font-size: 14px;
	font-weight: 500;
	color: var(--kmf-ink-2);
	padding: 22px 0;
	display: block;
	position: relative;
}
/* 下划线严格贴合文字宽度（不含 <li> 的水平内边距），
   所以 left/right 用 -0 而非继承 li 的 padding 区 */
.kmf-nav > ul > li > a::after {
	content: "";
	position: absolute;
	left: 0; right: 0; bottom: 0;
	height: 2px;
	background: var(--kmf-clay);
	transform: scaleX(0);
	transform-origin: left;
	transition: transform var(--kmf-dur) var(--kmf-ease);
}
.kmf-nav > ul > li > a:hover,
.kmf-nav > ul > li.current-menu-item > a,
.kmf-nav > ul > li.current-menu-parent > a { color: var(--kmf-pine); }
.kmf-nav > ul > li > a:hover::after,
.kmf-nav > ul > li.current-menu-item > a::after,
.kmf-nav > ul > li.current-menu-parent > a::after { transform: scaleX(1); }

/* 二级菜单 */
.kmf-nav ul.sub-menu {
	position: absolute;
	top: 100%; left: -12px;
	min-width: 210px;
	background: var(--kmf-surface);
	border: 1px solid var(--kmf-line);
	border-top: 2px solid var(--kmf-pine);
	padding: 6px 0;
	flex-direction: column;
	align-items: stretch;
	gap: 0;
	opacity: 0;
	visibility: hidden;
	transform: translateY(-4px);
	transition: all var(--kmf-dur) var(--kmf-ease);
	z-index: 210;
}
.kmf-nav li:hover > ul.sub-menu,
.kmf-nav li:focus-within > ul.sub-menu {
	opacity: 1;
	visibility: visible;
	transform: translateY(0);
}
.kmf-nav ul.sub-menu li a {
	display: block;
	padding: 9px 16px;
	font-size: 13.5px;
	color: var(--kmf-ink-2);
}
.kmf-nav ul.sub-menu li a:hover {
	background: var(--kmf-pine-wash);
	color: var(--kmf-pine);
}
/* 三级菜单转为侧向展开 */
.kmf-nav ul.sub-menu ul.sub-menu {
	top: -6px; left: 100%;
	border-top: 1px solid var(--kmf-line);
	border-left: 1px solid var(--kmf-line);
}

/* 头部动作区 */
.kmf-header-actions {
	display: flex;
	align-items: center;
	gap: 6px;
	flex-shrink: 0;
	justify-self: end;      /* 三栏网格的第 3 栏，右对齐 */
}

/* ★ 页头里的 Account / Help 链接（2026-10-07 修复）
   问题：这两条链接复用了 .kmf-head-link 这个类名，而该类名是给「区块标题行的
   更多链接」设计的（只剩 border-bottom 下划线、无 display:flex）。
   放进页头后后果有两条：
     1. SVG 图标与 <span> 文字是行内元素，没有 gap，图标与文字直接贴在一起甚至重叠；
     2. 下划线（border-bottom）贴在整个链接盒底部，视觉上像一条游离的横线。
   修法：在 .kmf-header-actions 作用域内重定义 —— flex 布局 + gap 6px + 内边距，
   并把下划线改成 hover 时才出现（与导航项一致），不再常驻。 */
.kmf-header-actions .kmf-head-link {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 7px 10px;
	border-bottom: 0;
	border-radius: var(--kmf-r);
	font-size: 13.5px;
	font-weight: 600;
	line-height: 1;
	color: var(--kmf-ink-2);
	white-space: nowrap;
	transition: background var(--kmf-dur) var(--kmf-ease),
	            color var(--kmf-dur) var(--kmf-ease);
}
.kmf-header-actions .kmf-head-link svg {
	width: 17px; height: 17px;
	flex-shrink: 0;
}
.kmf-header-actions .kmf-head-link:hover {
	background: var(--kmf-pine-wash);
	color: var(--kmf-pine);
}
/* 窄屏只留图标，去掉文字，避免与导航抢空间 */
@media (max-width: 1180px) {
	.kmf-header-actions .kmf-head-link span { display: none; }
	.kmf-header-actions .kmf-head-link { padding: 7px 8px; }
}

.kmf-icon-btn {
	position: relative;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 38px; height: 38px;
	border: 1px solid transparent;
	border-radius: var(--kmf-r);
	background: transparent;
	color: var(--kmf-ink-2);
	cursor: pointer;
	transition: all var(--kmf-dur) var(--kmf-ease);
}
.kmf-icon-btn:hover {
	background: var(--kmf-pine-wash);
	color: var(--kmf-pine);
}
.kmf-icon-btn svg { width: 19px; height: 19px; }

.kmf-cart-count {
	position: absolute;
	top: 3px; right: 3px;
	min-width: 17px; height: 17px;
	padding: 0 4px;
	background: var(--kmf-clay);
	color: #fff;
	font-size: 10.5px;
	font-weight: 700;
	line-height: 17px;
	text-align: center;
	border-radius: 9px;
}

/* 移动端菜单按钮 */
.kmf-burger {
	display: none;
	width: 38px; height: 38px;
	border: 1px solid var(--kmf-line);
	border-radius: var(--kmf-r);
	background: transparent;
	cursor: pointer;
	padding: 0;
	position: relative;
}
.kmf-burger span {
	position: absolute;
	left: 10px; right: 10px;
	height: 1.5px;
	background: var(--kmf-ink);
	transition: all var(--kmf-dur) var(--kmf-ease);
}
.kmf-burger span:nth-child(1) { top: 13px; }
.kmf-burger span:nth-child(2) { top: 18px; }
.kmf-burger span:nth-child(3) { top: 23px; }
.kmf-burger.is-open span:nth-child(1) { top: 18px; transform: rotate(45deg); }
.kmf-burger.is-open span:nth-child(2) { opacity: 0; }
.kmf-burger.is-open span:nth-child(3) { top: 18px; transform: rotate(-45deg); }

/* ==========================================================================
   7. Hero
   ========================================================================== */

/* ★★ 2026-10-07 第四轮重构：Hero 由「容器内两栏」改为「满宽出血（full-bleed）」★★

   改之前的实测问题（1440px 视口）：
   1. 右侧图片只占容器的一半左右，但 .kmf-hero 的背景色铺满整个视口宽 ——
      图片右边缘到视口右边缘之间出现一大片空底色，两侧留白不对称。
   2. 文案块与图片垂直居中对齐，但文案内容比图片矮很多，
      结果 stats 指标条下方还有一大段空白，视觉重心上浮。
   3. 整体被 1240px 容器箍住，1440 视口下两侧各留 100px，气势不足。

   改法（现代宽屏电商常见做法）：
   - Hero 本身作为满宽舞台，内部用「左文案 + 右图」两栏；
   - 左文案通过 clamp 内边距贴齐全站容器左边界（与下方区块左边缘对齐）；
   - 右图突破容器、直接贴到视口右边缘，并撑满 hero 全高（object-fit: cover）；
   - 两栏高度对齐（stretch），文案区自身用 flex 纵向分布，
     让 eyebrow 顶到上、stats 沉到底，消除中间空档。
   - 图片给 4/5 → 改为自适应高度（由文案高度驱动），
     保证桌面端 hero 高度稳定、移动端回落为「图上文下」。 */
.kmf-hero {
	position: relative;
	background: var(--kmf-bg-2);
	overflow: hidden;
}

.kmf-hero-inner {
	display: grid;
	/* 左文案稍宽，给标题足够的行长；右侧图片可压缩。 */
	grid-template-columns: minmax(0, 1.06fr) minmax(0, 1fr);
	gap: clamp(32px, 4vw, 72px);
	align-items: stretch;
	max-width: var(--kmf-wrap-wide);
	margin: 0 auto;
	/* 左侧内边距 = 让 box 内容起点与 .kmf-wrap 的左内边距对齐：
	   (视口 - 容器宽)/2 + 容器内边距。用 max() 兜住「视口小于容器」的情况。 */
	padding-left: max(var(--kmf-pad), calc((100vw - var(--kmf-wrap)) / 2 + var(--kmf-pad)));
	padding-right: 0;
	padding-top: clamp(36px, 4.2vw, 64px);
	padding-bottom: clamp(36px, 4.2vw, 64px);
}

.kmf-hero-copy {
	min-width: 0;
	display: flex;
	flex-direction: column;
	/* 文案内部纵向铺开：eyebrow 顶、stats 底，中间自然留白。 */
	justify-content: center;
	gap: 0;
}

.kmf-hero h1 {
	/* ★ 2026-10-07 第五轮收紧：原 clamp(34px, 3.5vw, 58px) 在 1440 视口下
	   解析为 50.4px，配合 max-width:16ch 把
	   "Furniture and everyday essentials that arrive this week, not next month."
	   排成 5 行（截图 h01 可见），左侧文案柱被拉得过高、与右侧图失衡。
	   新档位按「1440 视口下占 3 行、1920 下占 3 行」定：
	     1440 → 3.05vw = 43.9px
	     1680 → 51.2px（封顶 52）
	   max-width 同步从 16ch 放宽到 19ch —— 允许每行多容纳 2-3 个字符，
	   避免因字号变小反而行数不变。 */
	font-size: clamp(32px, 3.05vw, 52px);
	line-height: 1.1;
	margin-bottom: 22px;
	letter-spacing: -.026em;
	max-width: 19ch;
}

/* 只给 hero 的导语段落设大字号。
   不要写成 .kmf-hero p —— 那会把 eyebrow、指标条里的
   .kmf-hero-stat-l / .kmf-hero-stat-n 一并放大打乱版式。 */
.kmf-hero-copy > p.kmf-lede {
	font-size: clamp(15.5px, 1.05vw, 17.5px);
	line-height: 1.68;
	color: var(--kmf-ink-2);
	margin-bottom: 30px;
	max-width: 54ch;
}

.kmf-hero-cta {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-bottom: 0;
}

/* stats 沉到文案区底部：用 margin-top:auto 吃掉剩余空间，
   这样无论标题几行，指标条都稳定贴在与图片底边对齐的位置。 */
.kmf-hero-stats {
	display: flex;
	flex-wrap: wrap;
	gap: clamp(24px, 3vw, 46px);
	padding-top: 28px;
	margin-top: auto;
	border-top: 1px solid var(--kmf-line-2);
}

/* 右侧图片：突破容器、贴视口右缘、撑满 hero 全高 */
.kmf-hero-media {
	position: relative;
	overflow: hidden;
	border-radius: 0;
	min-height: 100%;
}
.kmf-hero-media img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
}

.kmf-hero-stat-n {
	font-family: var(--kmf-font-head);
	font-size: 25px;
	font-weight: 700;
	/* ★ 第八轮：令牌已重指向 Anker 正文黑（原松柏绿 #1b5e4a）。
	   负字距跟随全站标题规则，制造 Anker 式的「精密感」。 */
	color: var(--kmf-pine);
	line-height: 1.1;
	letter-spacing: var(--kmf-ls-title);
}
.kmf-hero-stat-l {
	font-size: 12.5px;
	color: var(--kmf-ink-3);
	letter-spacing: .02em;
}

/* ==========================================================================
   8. 区块标题
   ========================================================================== */

/* ★★ 2026-10-07 第四轮修复：区块标题的三个子元素被横向摊开 ★★

   HTML 有两种写法混用：
     · 多数区块：<div class="kmf-head"><div><eyebrow+h2+p></div> <a 按钮></div>
     · Best Sellers：<div class="kmf-head"><p.eyebrow> <h2> <p.说明></div>
       —— 三个元素**平级**，没有内层包裹 div。
   .kmf-head 是 flex + justify-content:space-between，
   于是平级写法下 eyebrow / h2 / 说明 被强行拉到左中右三点，
   渲染成「小字在左、标题居中、说明在右」的散落布局（截图可见，基线还互不齐）。

   修法：不再依赖「有没有内层 div」，改用两条兜底规则：
     1. 子元素默认按列方向排（把平级的 eyebrow/h2/p 收成一列）；
     2. 内部的 div 分组保持原样（分组自然竖排，因为它是块级）。
   再让所有直接子元素在交叉轴按起点对齐，消灭基线错位。 */
.kmf-head {
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: 20px;
	margin-bottom: clamp(28px, 4vw, 44px);
	flex-wrap: wrap;
}
/* 平级写法兜底：eyebrow / h2 / p 直接挂在 .kmf-head 下时，收成一列。
   用 :not(:last-child) 之外的通用规则会误伤右侧按钮，故只针对这三个标签。 */
.kmf-head > .kmf-eyebrow,
.kmf-head > h1,
.kmf-head > h2 {
	flex: 1 1 100%;
	margin-bottom: 0;
}
.kmf-head > .kmf-eyebrow { margin-bottom: 8px; }
.kmf-head > h2 { margin-bottom: 0; }
/* 平级写法下 h2 与说明同占一行：说明自动换到第二行（flex 100% 起新行） */
.kmf-head > p:not(.kmf-eyebrow) {
	flex: 1 1 100%;
	margin: 8px 0 0;
}
/* 有内层 div 的写法：让分组占据剩余宽度，按钮贴右 */
.kmf-head > div { flex: 1 1 auto; min-width: 0; }
.kmf-head h2 { margin-bottom: 0; }
.kmf-head p {
	margin: 8px 0 0;
	color: var(--kmf-ink-3);
	font-size: 14.5px;
}
.kmf-head-link {
	font-size: 13.5px;
	font-weight: 600;
	white-space: nowrap;
	padding-bottom: 2px;
	border-bottom: 1px solid var(--kmf-pine);
	flex: 0 0 auto;
	align-self: flex-end;
}

/* ==========================================================================
   9. 品类网格（.kmf-cats / .kmf-cat）
   --------------------------------------------------------------------------
   ★ 2026-10-07 第四轮重做：由「3:4 竖长图卡」改为「紧凑内容卡」。

   改之前实测到的四个问题（1440px 视口）：
     1. 卡片 3:4 竖长，但内容（名称/描述/按钮）全挤在底部 1/3，
        上半部分是一大块只有图标的空区，卡片显得又高又空；
     2. 该区块高度 1259px，11 张卡排成 5+5+1 —— 最后一行只 1 张，右边空 4 格；
     3. 首字母水印 em 定位在 bottom:-14px，被 overflow:hidden 裁掉下半截，
        渲染出一排脏兮兮的巨大字母残影（H / K / S / P）；
     4. 每张卡描述文案重复（多张都是 "Quality essentials at a fair price."），
        在窄卡里被折成两行还占位，信息量却是零。

   重做要点：
     - 固定 4 列（1440 容器下每张约 330px，足够放下类目名一行）；
     - 卡片改为「图标靠上 + 文字区在下」的紧凑纵向结构，取消 3:4 拉伸，
       高度由内容决定，用 aspect-ratio 兜一个下限即可；
     - 水印从「右下被裁」改为「右上完整圆角浮水印」，同时降到极低透明度；
     - 描述钳制两行，超出省略，避免长短不一撑歪卡片。
   ========================================================================== */

.kmf-cats {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: clamp(14px, 1.4vw, 22px);
	/* ★ 2026-10-07 第五轮：让同一行的卡片严格等高。
	   grid 默认 align-items:stretch 已把每行卡片拉到等高，
	   但 .kmf-cat 内部是 flex column + margin-top:auto，
	   内容多的卡（标题折两行 + 描述两行）会把「行高」顶上去，
	   于是同排四张卡下沿参差（截图 h02 第 1 行：Kitchen 比 Sports 高 15px）。
	   用 grid-auto-rows:1fr 让所有行等分，配合 .kmf-cat{height:100%} 锁死。 */
	grid-auto-rows: 1fr;
}

.kmf-cat {
	position: relative;
	display: flex;
	flex-direction: column;
	overflow: hidden;
	border-radius: var(--kmf-r-lg);
	/* 高度由 grid-auto-rows:1fr 统一决定；height:100% 让卡片撑满网格单元。
	   min-height 只作为单列布局（<640px）时的兜底下限。 */
	height: 100%;
	min-height: 232px;
	/* ★ 第六轮：深绿底 → 炭黑底（--kmf-ink-deep）。
	   欧美家居站的类目瓦片是黑/白/灰 + 图，彩色大面积铺底会显「主题化」。 */
	background: var(--kmf-ink-deep);
	color: #fff;
	text-decoration: none;
	isolation: isolate;
	transition: transform var(--kmf-dur) var(--kmf-ease),
	            box-shadow var(--kmf-dur) var(--kmf-ease);
}
.kmf-cat:hover {
	transform: translateY(-3px);
	box-shadow: 0 10px 28px rgba(15, 18, 20, .22);
}

/* 媒体区：绝对铺满卡片，作为裁切框 —— 这样图片无论原始比例如何都被 cover */
.kmf-cat-media {
	position: absolute;
	inset: 0;
	z-index: 0;
}
.kmf-cat-media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	transition: transform .5s var(--kmf-ease);
}
.kmf-cat:hover .kmf-cat-media img { transform: scale(1.05); }

/* 无缩略图时的设计化兜底（★ 2026-10-07 新增，第四轮调整）
   替代 WooCommerce 的灰白占位图。品牌松柏绿渐变底 + 类目图标 + 类目名首字母水印。
   配图到位后（thumbnail_id 有值）这段自动不再生效，无需改代码。

   第四轮改动：图标不再用 place-items:center 顶在正中（竖向长卡时代正中是空的，
   紧凑卡里正中会与文字打架），改为「顶部留白 + 图标左上」，与右侧水印形成对角平衡。 */
.kmf-cat-fallback {
	position: absolute;
	inset: 0;
	display: block;
	/* ★ 第八轮：深色渐变 → Anker 式浅灰底。
	   原为 radial + linear 双层深色渐变（#343b3e→#1e2326→ink-deep），
	   是「炭黑瓦片」观感的真正来源 —— 它铺满整卡并盖住 ::after 遮罩。
	   Anker 实测类目瓷砖用 #f5f5f7 浅灰底承托内容，故整体校正。 */
	color: var(--kmf-ink);
	background: var(--kmf-tile);
}
.kmf-cat-fallback .kmf-cat-ico {
	position: absolute;
	left: 22px;
	top: 22px;
	width: 38px;
	height: 38px;
	opacity: .82;
	/* ★ 第八轮：投影在浅灰底上无意义，去掉；描边靠 svg 自身 currentColor */
	filter: none;
	transition: transform .4s var(--kmf-ease);
}
.kmf-cat:hover .kmf-cat-fallback .kmf-cat-ico { transform: scale(1.08); }

/* 首字母水印：右上角大字，只作肌理。
   ★ 2026-10-07 第五轮降噪：透明度 .10 → .055，字号 96 → 88，并轻微右移出血。
   原因：截图 h02 里 H / K / S / O 四个 96px 字母在松柏绿底上对比过强，
   与左上角类目图标各占一角，整张卡像「两个元素在抢位」，
   视觉重心从类目名被拉走。降到 .055 后只剩隐约肌理，不参与构图。 */
.kmf-cat-fallback em {
	position: absolute;
	right: 10px;
	top: -2px;
	font-family: var(--kmf-font-head);
	font-size: 88px;
	font-style: normal;
	font-weight: 700;
	line-height: 1;
	/* ★ 第八轮：白水印 → 深色水印（浅灰底上白字不可见） */
	color: rgba(29, 29, 31, .05);
	pointer-events: none;
	user-select: none;
}

/* 底部渐变遮罩，保证白色文字在任何底图上都可读。
   紧凑卡里文字只占下半，遮罩高度收到 78% 让过渡更平缓。 */
.kmf-cat::after {
	content: "";
	position: absolute;
	inset: auto 0 0 0;
	height: 78%;
	z-index: 1;
	background: linear-gradient(to top, rgba(13,16,18,.92), rgba(13,16,18,.42) 52%, rgba(13,16,18,0));
	pointer-events: none;
}
.kmf-cat-body {
	position: relative;
	z-index: 2;
	margin-top: auto;
	padding: 20px 22px 21px;
	display: flex;
	flex-direction: column;
	gap: 7px;
	color: #fff;
}
/* 名称 + 计数同一行，两端对齐（计数靠右），彻底解决 "Home & Furniture45" 粘连
   ★ 修正：名称改为允许折两行（长类目名如 "Kitchen & Appliances" 单行放不下，
   早期用 nowrap + ellipsis 会截成 "Kitchen & Appli…"，可读性反而更差）。
   计数徽章固定不压缩，靠 baseline 对齐。 */
.kmf-cat-name {
	display: flex;
	/* ★ 2026-10-07 第五轮修复：baseline → flex-start。
	   原因：.kmf-cat-name > span:first-child 是 -webkit-box（多行钳制），
	   这类元素的 baseline 由最后一个行盒决定，标题折成两行时
	   baseline 会掉到第二行底部，把计数徽章一起拽下去 ——
	   截图 h02 里 "Outdoor & Garden" 的徽章掉到了标题右下外侧。
	   改用 flex-start 后徽章稳定贴第一行顶部，与标题首行对齐。 */
	align-items: flex-start;
	justify-content: space-between;
	gap: 10px;
	margin: 0;
	font-size: 18.5px;
	line-height: 1.22;
	color: #fff;
	text-shadow: 0 1px 6px rgba(0,0,0,.45);
	letter-spacing: -.01em;
}
.kmf-cat-name > span:first-child {
	/* ★ 2026-10-07 第五轮修复：补 flex:1 1 auto。
	   原写法只有 min-width:0，但 flex 子项默认 flex:0 1 auto，
	   -webkit-box 的 max-content 宽度会把「Outdoor & Garden」
	   这种长标题撑到占满整行，徽章被挤到第二行（截图 h02 可见）。
	   给 flex:1 1 auto + min-width:0 后，标题让出徽章所需宽度，
	   自己折成两行（line-clamp:2 兜住）。 */
	flex: 1 1 auto;
	min-width: 0;
	overflow-wrap: break-word;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}
.kmf-cat-count {
	flex: 0 0 auto;
	/* flex-start 对齐后，徽章顶边与标题首行顶边齐平；
	   标题行高 1.22 × 18.5px ≈ 22.6px，徽章行高 1.7 × 11.5px ≈ 19.6px，
	   差 ~3px。补 2px 让它视觉上落在首行中线附近。 */
	margin-top: 2px;
	font-family: var(--kmf-font-body);
	font-size: 11.5px;
	font-weight: 700;
	line-height: 1.7;
	padding: 0 8px;
	border-radius: 999px;
	background: rgba(255,255,255,.22);
	color: #fff;
	opacity: 1;
	text-shadow: none;
}
.kmf-cat-sub {
	margin: 0;
	font-size: 13px;
	line-height: 1.48;
	color: rgba(255,255,255,.84);
	/* 钳两行：文案长短不一时卡片高度仍一致 */
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
	/* ★ 2026-10-07 第五轮修复：固定占 2 行高度。
	   实测（diag_cat.js）：只写 line-clamp 时，
	   描述正好一行的卡片（Outdoor & Garden「Patio, garden and backyard
	   living made easy.」）subH=19px，两行的卡片 subH=38px。
	   .kmf-cat-body 是 margin-top:auto 贴底 → 一行的卡片整体内容
	   下沉 19px，同排四张卡的标题基线因此错位（1207 vs 1226）。
	   用 min-height 锁死 2 行高度，让所有卡的正文块等高。 */
	min-height: calc(1.48em * 2);
}
.kmf-cat-go {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	margin-top: 6px;
	font-size: 12.5px;
	font-weight: 700;
	/* ★ 第八轮：白字 → 近黑（浅灰底上白字不可读） */
	color: var(--kmf-ink);
	letter-spacing: .03em;
	text-transform: uppercase;
}
.kmf-cat-go svg {
	width: 14px; height: 14px;
	transition: transform var(--kmf-dur) var(--kmf-ease);
}
.kmf-cat:hover .kmf-cat-go svg { transform: translateX(3px); }

/* 「Shop All Products」收尾卡片：无缩略图，用深色底 + 大箭头做视觉终止符 */
.kmf-cat-all {
	background: linear-gradient(145deg, #2a3033, var(--kmf-ink-deep));
}
.kmf-cat-all::after { display: none; }
.kmf-cat-all .kmf-cat-fallback { display: none; }
.nb-tile-arrow {
	position: absolute;
	left: 22px;
	top: 22px;
	width: 44px;
	height: 44px;
	display: grid;
	place-items: center;
	border-radius: 50%;
	background: rgba(255,255,255,.16);
	color: #fff;
	transition: background var(--kmf-dur) var(--kmf-ease);
}
.nb-tile-arrow svg { width: 21px; height: 21px; transition: transform var(--kmf-dur) var(--kmf-ease); }
.kmf-cat-all:hover .nb-tile-arrow { background: rgba(255,255,255,.28); }
.kmf-cat-all:hover .nb-tile-arrow svg { transform: translateX(3px); }

/* 窄屏：两列，标题收一档 */
@media (max-width: 1100px) {
	.kmf-cats { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 782px) {
	.kmf-cats { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
	.kmf-cat { min-height: 196px; }
	.kmf-cat-name { font-size: 15.5px; }
	.kmf-cat-sub { display: none; }
	.kmf-cat-body { padding: 15px 16px 16px; }
	.kmf-cat-fallback .kmf-cat-ico { left: 16px; top: 16px; width: 32px; height: 32px; }
	.kmf-cat-fallback em { font-size: 72px; right: 10px; }
	.nb-tile-arrow { left: 16px; top: 16px; width: 38px; height: 38px; }
}

/* --------------------------------------------------------------------------
   「按空间逛」卡片网格（.nb-rooms / .nb-room）
   ★ 2026-10-07 新增 —— 这是本轮发现的**布局塌陷**：
   functions.php 的 [nb_rooms] 短代码输出了 .nb-rooms / .nb-room / .nb-room-img /
   .nb-room-go 这一整组类名，但 style.css 里从来没有任何一条对应规则。
   后果：<a class="nb-room"> 只是行内元素，4 张卡片纵向堆叠、每张被图片的
   width="800" 属性撑到 1192×656，整个区块从预期的 ~700px 涨到 2886px，
   首页因此出现 2 个异常高区块（Shop by Space 2886px、Best Sellers 2403px）。
   卡片视觉与 .kmf-cat 做区分：那边是「图片铺满 + 图上压字」，
   这里是「图片在上 + 白底文案区在下」，避免全站卡片形态同质。
   -------------------------------------------------------------------------- */
.nb-rooms {
	display: grid;
	gap: 18px;
	grid-template-columns: repeat(4, minmax(0, 1fr));
}
.nb-rooms-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.nb-rooms-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }

.nb-room {
	position: relative;
	display: flex;
	flex-direction: column;
	overflow: hidden;
	border: 1px solid var(--kmf-line);
	border-radius: var(--kmf-r-lg);
	background: var(--kmf-surface);
	color: inherit;
	text-decoration: none;
	transition: border-color var(--kmf-dur) var(--kmf-ease),
	            box-shadow var(--kmf-dur) var(--kmf-ease),
	            transform var(--kmf-dur) var(--kmf-ease);
}
.nb-room:hover {
	border-color: var(--kmf-pine);
	box-shadow: var(--kmf-shadow);
	transform: translateY(-3px);
}
/* 图片区固定 4:3。
   ★★ 2026-10-07 第五轮修复 —— 这里此前同时写了 `height:auto` 和
   `aspect-ratio:3/2`，是**无效组合**：<img> 带 width="800" height="533"
   属性时属于「有内在纵横比的替换元素」，`height:auto` 会让它按源图比例
   撑高，"aspect-ratio" 只是「若无内在比例时生效的建议值」，被完全忽略。
   四张源图实际比例不一（living-room / outdoor / bedroom / office），
   于是卡片图片高度参差 —— 截图中 Outdoor & Patio 明显矮一截，
   Home Office 也矮，整排卡片下沿锯齿状。

   修法：给 .nb-room 显式声明 flex 基准，图片用 `flex: 0 0 auto` +
   `width:100%` + `height:auto` 之外的确定高度来源 —— 即用
   `aspect-ratio` 配合**清掉 height 属性影响**的 `height:auto !important`
   不可行，故改用最稳的「百分比高度锚定」：父级 .nb-room 不设高度，
   图片自身用 `aspect-ratio:4/3` + `min-height:0`，
   并显式写 `height:auto` 的同时**覆盖内在尺寸**——靠 `object-fit:cover`
   在 aspect-ratio 生效后裁切。关键在 aspect-ratio 必须能生效：
   对 <img> 而言，只有当 CSS 的 height 解析为 auto **且** 未从 HTML
   属性取到确定值时才会启用。实测该项目 WP 会给图片加
   `style="height:auto"` 或 `width/height` 属性，因此**最可靠的做法是
   给图片套 aspect-ratio 的同时把图片设为 `position:absolute; inset:0`，
   由父级伪元素撑出比例**。见下方 .nb-room-media 方案。 */
.nb-room-media {
	position: relative;
	display: block;
	width: 100%;
	aspect-ratio: 4 / 3;
	overflow: hidden;
	background: var(--kmf-bg-2);
	flex: 0 0 auto;
}
.nb-room-img {
	position: absolute;
	inset: 0;
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
	transition: transform .5s var(--kmf-ease);
}
.nb-room:hover .nb-room-img { transform: scale(1.04); }

/* 文案区：h3 + p + Explore，纵向排开，Explore 沉到卡片底部 */
.nb-room h3 {
	margin: 14px 16px 6px;
	font-size: 17.5px;
	line-height: 1.3;
	color: var(--kmf-ink);
}
.nb-room p {
	margin: 0 16px;
	font-size: 13.5px;
	line-height: 1.5;
	color: var(--kmf-ink-2);
	flex: 1 1 auto;
}
.nb-room-go {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	margin: 14px 16px 16px;
	font-size: 13px;
	font-weight: 700;
	color: var(--kmf-clay);
	letter-spacing: .01em;
}
.nb-room-go svg {
	width: 14px; height: 14px;
	transition: transform var(--kmf-dur) var(--kmf-ease);
}
.nb-room:hover .nb-room-go svg { transform: translateX(3px); }

/* --------------------------------------------------------------------------
   通栏横幅（.nb-band）
   ★★ 2026-10-07 第四轮新增 —— 又一个「有 HTML 无 CSS」的塌陷区块。★★
   functions.php 输出 <section class="nb-band"> 内含
     <img class="nb-band-bg">（背景图）+ <div class="kmf-wrap"> +
     <div class="nb-band-copy">（eyebrow / h2 / p / 按钮 / .nb-band-points 清单），
   但 style.css 里 nb-band / nb-band-bg / nb-band-copy / nb-band-points
   **一条规则都没有**（grep 命中 0）。
   后果：背景图以 width=1200 的原始尺寸挤在文字上方当普通插图，
   文案块贴着图下方排成一行普通文字，整个区块 1103px 高、毫无横幅感。
   本次补齐：背景图绝对铺满 + 深色遮罩、文案浮在图上（左对齐、垂直居中）、
   标题放大到宽屏尺度、要点清单横排打勾。
   -------------------------------------------------------------------------- */
.nb-band {
	position: relative;
	overflow: hidden;
	isolation: isolate;
	/* ★ 第六轮：深绿底 → 炭黑（遮罩同步转黑），绿只留给按钮与要点图标 */
	background: var(--kmf-ink-deep);
	color: #fff;
	min-height: clamp(380px, 42vw, 620px);
	display: flex;
	align-items: center;
}
.nb-band-bg {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
	z-index: 0;
}
/* 遮罩：左侧深、右侧透，让文字压在图上仍清楚 */
.nb-band::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
	background: linear-gradient(100deg,
		rgba(13,16,18,.80) 0%,
		rgba(13,16,18,.60) 38%,
		rgba(13,16,18,.24) 72%,
		rgba(13,16,18,.06) 100%);
	pointer-events: none;
}
.nb-band .kmf-wrap {
	position: relative;
	z-index: 2;
	width: 100%;
}
.nb-band-copy {
	max-width: 640px;
}
.nb-band-copy .kmf-eyebrow {
	color: rgba(255,255,255,.80);
	margin-bottom: 14px;
}
.nb-band-copy h2 {
	margin: 0 0 18px;
	font-family: var(--kmf-font-head);
	font-size: clamp(30px, 3.4vw, 52px);
	line-height: 1.14;
	letter-spacing: -.024em;
	color: #fff;
	max-width: 18ch;
}
.nb-band-copy > p {
	margin: 0 0 28px;
	font-size: clamp(15px, 1.05vw, 17px);
	line-height: 1.66;
	color: rgba(255,255,255,.88);
	max-width: 52ch;
}
.nb-band .kmf-btn-row {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-bottom: 30px;
}
.nb-band-points {
	display: flex;
	flex-wrap: wrap;
	gap: 10px 26px;
	margin: 0;
	padding: 0;
	list-style: none;
}
.nb-band-points li {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	font-size: 13.5px;
	font-weight: 500;
	color: rgba(255,255,255,.92);
}
.nb-band-points li svg {
	width: 15px;
	height: 15px;
	flex-shrink: 0;
	color: var(--kmf-clay-l);
	stroke: var(--kmf-clay-l);
}
@media (max-width: 900px) {
	.nb-band { min-height: clamp(340px, 70vw, 460px); }
	.nb-band-copy { max-width: none; }
	.nb-band-copy h2 { max-width: none; }
	.nb-band::after {
		background: linear-gradient(to top,
			rgba(13,16,18,.92) 0%,
			rgba(13,16,18,.70) 55%,
			rgba(13,16,18,.34) 100%);
	}
}

@media (max-width: 1100px) {
	.nb-rooms { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 560px) {
	.nb-rooms,
	.nb-rooms-2,
	.nb-rooms-3,
	.nb-rooms-4 { grid-template-columns: 1fr; gap: 14px; }
	.nb-room h3 { font-size: 16.5px; }
}

/* ==========================================================================
   10. 商品网格与卡片
   ========================================================================== */

.kmf-products {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 22px;
}
.kmf-products.cols-3 { grid-template-columns: repeat(3, 1fr); }
.kmf-products.cols-2 { grid-template-columns: repeat(2, 1fr); }

/* --------------------------------------------------------------------------
   10a. 真实商品循环接驳层
   --------------------------------------------------------------------------
   背景：上面的 .kmf-products / .kmf-card 全套样式原本只服务于自建标记，
   但线上列表页（/shop/、类目页、首页 [products] 短代码）全部走 WooCommerce
   原生循环，输出的是 <ul class="products columns-4"> + <li class="product ...">，
   一个 .kmf-* 类名都没有 —— 设计系统等于空转，卡片退化成浏览器默认样式。
   处理方式：在 CSS 侧把原生选择器映射到设计系统，PHP 侧只补挂
   kmf-card / -media / -body / -cat / -title / -price / -quick（见 functions.php 第 8 节）。
   这样主题文件不覆盖 WooCommerce 模板，升级不会冲突。
   -------------------------------------------------------------------------- */

/* 网格：用 grid 接管 WooCommerce 的 float 布局。gap 与 .kmf-products 对齐。 */
ul.products {
	display: grid;
	grid-template-columns: repeat(var(--nb-cols, 4), minmax(0, 1fr));
	gap: 22px;
	margin: 0 0 26px;
	padding: 0;
	list-style: none;
	clear: both;
}
/* 覆盖 WooCommerce 的 width/float/clear，避免与 grid 打架
   ★★ 2026-10-07 重大修复：伪元素必须从网格中彻底移除 ★★
   WooCommerce 自带 clearfix：ul.products::before / ::after 被设为
   { content: " "; display: table }。ul 改成 display:grid 之后，这两个伪元素
   会被当成**网格子项**各占一格，后果是：
     · ::before 白占第 1 列 → 首个商品被顶到第 2 列（实测首个 li 的 left=428 而非 124）
     · ::after 白占最后一格
     · 12 个商品被排成 3+4+4+1 共 **4 行**（实测 grid-template-rows 有 4 条），
       Best Sellers 区块因此从预期的 ~1700px 涨到 2403px
   早期只写 content:none 之所以无效：WooCommerce 样式表在主题之后加载，
   同特异性（ul.products::before）下后加载者胜出，把 content 又改回了 " "。
   因此这里改用 display:none !important —— 既提升声明强度，也把生成盒彻底移除，
   双保险不依赖加载顺序。 */
ul.products::before,
ul.products::after {
	content: none !important;
	display: none !important;
}
ul.products li.product,
ul.products li.product.first,
ul.products li.product.last {
	float: none !important;
	width: auto !important;
	margin: 0 !important;
	clear: none !important;
}

/* 列数：由 WooCommerce 输出的 columns-N 类名驱动，同步给 --nb-cols */
ul.products.columns-2 { --nb-cols: 2; }
ul.products.columns-3 { --nb-cols: 3; }
ul.products.columns-4 { --nb-cols: 4; }
ul.products.columns-5 { --nb-cols: 5; }
ul.products.columns-6 { --nb-cols: 6; }

/* ★ 响应式列数必须与上面同特异性（或更高）。
   踩坑记录（2026-10-07）：媒体查询里最初写成裸的 `ul.products { --nb-cols: 3 }`，
   而上面是 `ul.products.columns-4` —— 类选择器特异性(0,1,1) 高于元素选择器(0,0,2)，
   且媒体查询本身不提升特异性，所以断点全部失效：390px 的手机上仍是 4 列，
   每张卡片只有 63~75px 宽，图片与文字完全不可读（实测确认）。
   修法：把断点选择器也写成 `ul.products[class*="columns-"]`，特异性提到(0,1,1)，
   与基础规则同级；再靠源码顺序（断点在后）取胜。最后一个断点用 1 列。 */
@media (max-width: 1100px) {
	ul.products[class*="columns-"] { --nb-cols: 3; }
}
@media (max-width: 860px) {
	ul.products[class*="columns-"] { --nb-cols: 2; gap: 16px; }
}
@media (max-width: 560px) {
	ul.products[class*="columns-"] { --nb-cols: 1; gap: 18px; }
}

/* li 本体：让 <a> 与卡片撑满，等高由 .kmf-card 的 flex 列实现 */
ul.products li.product > a.woocommerce-LoopProduct-link {
	display: block;
	height: auto;
}
/* WooCommerce 的加购按钮在 <a> 之外，卡片高度按内容自适应即可 */
ul.products li.product .kmf-card-media > a { display: block; }

/* 缺货：整卡降透明度，并禁用快捷加购的悬停层 */
ul.products li.product.kmf-card--oos .kmf-card-media img { opacity: .55; }

/* 价格：适配 WooCommerce 输出的 <span class="price"> 结构 */
.kmf-card-price > .price,
.kmf-card-price .price {
	display: flex;
	align-items: baseline;
	gap: 8px;
	margin: 0;
	font-size: 17px;
	font-weight: 700;
	color: var(--kmf-ink);
}
.kmf-card-price .price del,
.kmf-card-price .price del .woocommerce-Price-amount {
	font-size: 13.5px;
	font-weight: 500;
	color: var(--kmf-ink-3);
	opacity: 1;
	text-decoration: line-through;
}
.kmf-card-price .price ins {
	text-decoration: none;
	color: var(--kmf-clay);
	font-weight: 700;
}
.kmf-card-price .woocommerce-Price-currencySymbol { font-size: .82em; }

/* 快捷加购：复用 WooCommerce 的加购链接，套上设计系统的按钮观感 */
.kmf-card-quick .add_to_cart_button,
.kmf-card-quick .button,
.kmf-card-quick a.button {
	display: block;
	width: 100%;
	text-align: center;
	padding: 9px 12px;
	font-size: 12.5px;
	font-weight: 600;
	line-height: 1.3;
	border-radius: var(--kmf-r-sm);
	border: 1px solid transparent;
	background: rgba(255, 255, 255, .95);
	color: var(--kmf-ink);
	text-decoration: none;
	transition: background var(--kmf-dur) var(--kmf-ease),
	            color var(--kmf-dur) var(--kmf-ease);
}
.kmf-card-quick .add_to_cart_button:hover,
.kmf-card-quick .button:hover,
.kmf-card-quick a.button:hover {
	background: #fff;
	color: var(--kmf-pine);
}
.kmf-card-quick .added_to_cart {
	display: block;
	margin-top: 6px;
	font-size: 12px;
	font-weight: 600;
	color: #fff;
	text-align: center;
	text-decoration: underline;
}

/* 卡片文字区细节：标题最多三行，避免长短不一撑破网格。
   ★ 2026-10-07 第四轮：真正负责对齐的 min-height 写在下面的 .kmf-card-title 里，
   这里只保留截断。 */
.kmf-card-body .kmf-card-title {
	display: -webkit-box;
	-webkit-line-clamp: 3;
	-webkit-box-orient: vertical;
	overflow: hidden;
}
/* WooCommerce 会在标题后插入 <div class="nb-card-meta">，统一底部对齐 */
.kmf-card-body > .nb-card-meta { margin-bottom: 8px; }

/* 直角细边框卡片 —— 与 newbulig 的大圆角阴影卡片形成对比 */
.kmf-card {
	background: var(--kmf-surface);
	border: 1px solid var(--kmf-line);
	border-radius: var(--kmf-r);
	overflow: hidden;
	display: flex;
	flex-direction: column;
	transition: border-color var(--kmf-dur) var(--kmf-ease),
	            box-shadow var(--kmf-dur) var(--kmf-ease);
}
.kmf-card:hover {
	border-color: var(--kmf-line-2);
	box-shadow: var(--kmf-shadow-lg);
}

.kmf-card-media {
	position: relative;
	display: block;
	aspect-ratio: 1 / 1;
	overflow: hidden;
	background: var(--kmf-bg-2);
}
.kmf-card-media img {
	width: 100%; height: 100%;
	object-fit: cover;
	transition: transform .45s var(--kmf-ease);
}
.kmf-card:hover .kmf-card-media img { transform: scale(1.04); }

/* 角标 */
.kmf-badge {
	position: absolute;
	top: 10px; left: 10px;
	z-index: 3;
	padding: 4px 9px;
	font-size: 11px;
	font-weight: 700;
	letter-spacing: .05em;
	text-transform: uppercase;
	border-radius: var(--kmf-r-sm);
	background: var(--kmf-ink);
	color: #fff;
}
.kmf-badge-sale { background: var(--kmf-clay); }
.kmf-badge-new  { background: var(--kmf-pine); }
.kmf-badge-hot  { background: var(--kmf-clay); }

/* 快速加购 */
.kmf-card-quick {
	position: absolute;
	inset: auto 0 0 0;
	z-index: 3;
	padding: 10px;
	background: linear-gradient(to top, rgba(28,25,23,.5), rgba(28,25,23,0));
	transform: translateY(100%);
	opacity: 0;
	transition: all .28s var(--kmf-ease);
}
.kmf-card:hover .kmf-card-quick { transform: translateY(0); opacity: 1; }
.kmf-card-quick .kmf-btn {
	width: 100%;
	padding: 9px 12px;
	font-size: 12.5px;
	background: rgba(255,255,255,.95);
	border-color: transparent;
	color: var(--kmf-ink);
}
.kmf-card-quick .kmf-btn:hover { background: #fff; color: var(--kmf-pine); }

.kmf-card-body {
	padding: 15px 16px 17px;
	display: flex;
	flex-direction: column;
	flex: 1;
}

.kmf-card-cat {
	font-size: 11px;
	font-weight: 600;
	letter-spacing: .08em;
	text-transform: uppercase;
	color: var(--kmf-ink-3);
	margin-bottom: 7px;
}

.kmf-card-title {
	font-family: var(--kmf-font-body);
	font-size: 14.5px;
	font-weight: 500;
	line-height: 1.45;
	margin: 0 0 9px;
	color: var(--kmf-ink);
	/* ★ 2026-10-07 第四轮修复：标题固定占 3 行高度，让同排卡片的价格严格对齐。
	   改之前的实测：12 张卡外层高度都是 495px（grid 的 stretch 已拉平），
	   但标题行数不同 —— 3 行的 priceMT=0px、2 行的 priceMT=21.75px，
	   价格因此在卡片内的**纵向位置**上下跳动 21.75px，肉眼看起来「价格错位」。
	   修法：-webkit-line-clamp 只截断不占位，这里补 min-height = 3 行行高，
	   把「最多 3 行」变成「恒定 3 行」，价格与按钮自然沉到同一水平线。 */
	min-height: calc(1.45em * 3);
}
.kmf-card-title a { color: inherit; }
.kmf-card-title a:hover { color: var(--kmf-pine); }

/* 评分 */
.kmf-rating {
	display: flex;
	align-items: center;
	gap: 5px;
	margin-bottom: 9px;
	font-size: 12px;
	color: var(--kmf-ink-3);
}
/* ★ 第六轮：星星色不再跟 clay（clay 已转黑铬），固定琥珀 ——
   星级是跨市场通用的颜色信号，欧美站同样是橙金色星。 */
.kmf-stars { display: inline-flex; gap: 1px; color: var(--nb-star); }
.kmf-stars svg { width: 13px; height: 13px; }

.kmf-card-price {
	margin-top: auto;
	display: flex;
	align-items: baseline;
	gap: 8px;
}
.kmf-price-now {
	font-size: 17px;
	font-weight: 700;
	color: var(--kmf-ink);
}
.kmf-price-was {
	font-size: 13.5px;
	color: var(--kmf-ink-3);
	text-decoration: line-through;
}

/* ==========================================================================
   11. 价值主张条
   ========================================================================== */

.kmf-usps {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 1px;
	background: var(--kmf-line);
	border: 1px solid var(--kmf-line);
	border-radius: var(--kmf-r);
	overflow: hidden;
}
.kmf-usp {
	background: var(--kmf-surface);
	padding: 26px 22px;
}
.kmf-usp-icon {
	width: 34px; height: 34px;
	margin-bottom: 13px;
	color: var(--kmf-pine);
}
.kmf-usp h3 {
	font-family: var(--kmf-font-body);
	font-size: 14.5px;
	font-weight: 600;
	margin: 0 0 5px;
}
.kmf-usp p {
	font-size: 13px;
	line-height: 1.6;
	color: var(--kmf-ink-3);
	margin: 0;
}

/* ==========================================================================
   12. 品牌故事（图文交错）
   ========================================================================== */

.kmf-story {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: clamp(32px, 6vw, 72px);
	align-items: center;
}
.kmf-story-media {
	aspect-ratio: 4 / 3;
	overflow: hidden;
	border-radius: var(--kmf-r-lg);
}
.kmf-story-media img { width: 100%; height: 100%; object-fit: cover; }
.kmf-story.flip .kmf-story-media { order: 2; }

/* 数字指标 */
.kmf-metrics {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 26px;
	padding: 30px 0;
	border-top: 1px solid var(--kmf-line);
	border-bottom: 1px solid var(--kmf-line);
}
.kmf-metric-n {
	font-family: var(--kmf-font-head);
	font-size: 34px;
	font-weight: 700;
	color: var(--kmf-pine);
	line-height: 1.1;
}
.kmf-metric-l {
	font-size: 13px;
	color: var(--kmf-ink-3);
}

/* ==========================================================================
   13. 页头（内页横幅）
   ========================================================================== */

.kmf-pagehead {
	background: var(--kmf-bg-2);
	border-bottom: 1px solid var(--kmf-line);
	padding: clamp(34px, 5vw, 58px) 0;
}
.kmf-pagehead h1 { margin: 0 0 8px; }
.kmf-pagehead p {
	margin: 0;
	color: var(--kmf-ink-3);
	font-size: 15px;
	max-width: 62ch;
}
.kmf-breadcrumb {
	font-size: 12.5px;
	color: var(--kmf-ink-3);
	margin-bottom: 14px;
}
.kmf-breadcrumb a { color: var(--kmf-ink-3); }
.kmf-breadcrumb a:hover { color: var(--kmf-pine); }
.kmf-breadcrumb span { margin: 0 6px; opacity: .55; }

/* ==========================================================================
   14. 商店工具条
   ========================================================================== */

.kmf-shopbar {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 18px;
	flex-wrap: wrap;
	padding: 16px 0;
	border-bottom: 1px solid var(--kmf-line);
	margin-bottom: 26px;
}
.kmf-shopbar-count { font-size: 13.5px; color: var(--kmf-ink-3); }
.kmf-shopbar-count strong { color: var(--kmf-ink); }
.kmf-shopbar-right { display: flex; align-items: center; gap: 12px; }

.kmf-orderby {
	padding: 8px 30px 8px 12px;
	font-size: 13px;
	border: 1px solid var(--kmf-line-2);
	border-radius: var(--kmf-r);
	background-color: var(--kmf-surface);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%2378716c' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 11px center;
	-webkit-appearance: none;
	appearance: none;
	cursor: pointer;
}

/* ==========================================================================
   15. 分页
   ========================================================================== */

.kmf-pagination {
	display: flex;
	justify-content: center;
	gap: 6px;
	margin: 44px 0 0;
	padding: 0;
	list-style: none;
}
.kmf-pagination .page-numbers {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 38px; height: 38px;
	padding: 0 11px;
	border: 1px solid var(--kmf-line);
	border-radius: var(--kmf-r);
	background: var(--kmf-surface);
	color: var(--kmf-ink-2);
	font-size: 13.5px;
	font-weight: 500;
}
.kmf-pagination .page-numbers:hover {
	border-color: var(--kmf-pine);
	color: var(--kmf-pine);
}
.kmf-pagination .page-numbers.current {
	background: var(--kmf-pine);
	border-color: var(--kmf-pine);
	color: #fff;
}
.kmf-pagination .page-numbers.dots {
	border-color: transparent;
	background: transparent;
}

/* ==========================================================================
   16. 商品详情页
   ========================================================================== */

.kmf-pdp {
	display: grid;
	grid-template-columns: 1.08fr .92fr;
	gap: clamp(32px, 5vw, 60px);
	align-items: start;
}

.kmf-pdp-gallery { position: sticky; top: 92px; }
.kmf-pdp-image {
	aspect-ratio: 1 / 1;
	overflow: hidden;
	border-radius: var(--kmf-r-lg);
	background: var(--kmf-bg-2);
	margin-bottom: 12px;
}
.kmf-pdp-image img { width: 100%; height: 100%; object-fit: cover; }
.kmf-pdp-thumbs { display: flex; gap: 9px; flex-wrap: wrap; }
.kmf-pdp-thumb {
	width: 74px; height: 74px;
	border: 1px solid var(--kmf-line);
	border-radius: var(--kmf-r);
	overflow: hidden;
	cursor: pointer;
	transition: border-color var(--kmf-dur) var(--kmf-ease);
}
.kmf-pdp-thumb img { width: 100%; height: 100%; object-fit: cover; }
.kmf-pdp-thumb:hover,
.kmf-pdp-thumb.is-active { border-color: var(--kmf-pine); }

.kmf-pdp-title {
	font-size: clamp(23px, 3vw, 31px);
	margin: 0 0 12px;
}
.kmf-pdp-meta {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 14px;
	font-size: 13px;
	color: var(--kmf-ink-3);
	padding-bottom: 18px;
	margin-bottom: 20px;
	border-bottom: 1px solid var(--kmf-line);
}
.kmf-pdp-price {
	display: flex;
	align-items: baseline;
	gap: 11px;
	margin-bottom: 22px;
}
.kmf-pdp-price .now {
	font-family: var(--kmf-font-head);
	font-size: 32px;
	font-weight: 700;
	color: var(--kmf-ink);
}
.kmf-pdp-price .was {
	font-size: 18px;
	color: var(--kmf-ink-3);
	text-decoration: line-through;
}
.kmf-pdp-price .save {
	padding: 3px 9px;
	background: var(--kmf-clay-wash);
	color: var(--kmf-clay);
	font-size: 12.5px;
	font-weight: 700;
	border-radius: var(--kmf-r-sm);
}

/* 变体选择 */
.kmf-variants { margin-bottom: 22px; }
.kmf-variant-row { margin-bottom: 16px; }
.kmf-variant-label {
	display: block;
	font-size: 12.5px;
	font-weight: 600;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--kmf-ink-3);
	margin-bottom: 8px;
}
.kmf-variant-opts { display: flex; flex-wrap: wrap; gap: 8px; }
.kmf-variant-opt {
	padding: 8px 15px;
	border: 1px solid var(--kmf-line-2);
	border-radius: var(--kmf-r);
	background: var(--kmf-surface);
	font-size: 13.5px;
	cursor: pointer;
	transition: all var(--kmf-dur) var(--kmf-ease);
}
.kmf-variant-opt:hover { border-color: var(--kmf-pine); color: var(--kmf-pine); }
.kmf-variant-opt.is-active {
	background: var(--kmf-pine);
	border-color: var(--kmf-pine);
	color: #fff;
	font-weight: 600;
}
.kmf-variant-opt.is-disabled {
	opacity: .4;
	text-decoration: line-through;
	cursor: not-allowed;
}

/* 库存状态 */
.kmf-stock {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	font-size: 13.5px;
	margin-bottom: 20px;
}
.kmf-stock::before {
	content: "";
	width: 7px; height: 7px;
	border-radius: 50%;
	background: currentColor;
}
.kmf-stock.in { color: var(--kmf-ok); }
.kmf-stock.low { color: var(--kmf-warn); }
.kmf-stock.out { color: var(--kmf-err); }

/* 采购行动区 */
.kmf-buybox { margin-bottom: 26px; }
.kmf-qty {
	display: inline-flex;
	align-items: center;
	border: 1px solid var(--kmf-line-2);
	border-radius: var(--kmf-r);
	overflow: hidden;
	background: var(--kmf-surface);
}
.kmf-qty button {
	width: 38px; height: 44px;
	border: 0;
	background: transparent;
	color: var(--kmf-ink-2);
	font-size: 17px;
	cursor: pointer;
	transition: background var(--kmf-dur) var(--kmf-ease);
}
.kmf-qty button:hover { background: var(--kmf-pine-wash); color: var(--kmf-pine); }
.kmf-qty input {
	width: 46px; height: 44px;
	border: 0;
	border-left: 1px solid var(--kmf-line);
	border-right: 1px solid var(--kmf-line);
	text-align: center;
	font-size: 15px;
	font-weight: 600;
	-moz-appearance: textfield;
	appearance: textfield;
}
.kmf-qty input::-webkit-outer-spin-button,
.kmf-qty input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }

.kmf-buy-actions {
	display: flex;
	gap: 10px;
	margin-top: 14px;
	flex-wrap: wrap;
}
.kmf-buy-actions .kmf-btn-primary { flex: 1; min-width: 190px; }

/* 保障列表 */
/* ★★ 2026-10-07 第四轮重做：由「文档式行内流水」改为「4 张等宽卡片」★★

   改之前：.kmf-guarantees 是 grid + gap:11px 的单列堆叠，
   每个 .kmf-guarantee 内部又写成 display:flex、h3 与 p 并排 ——
   渲染效果是四段「加粗小标题 + 紧随其后的一长句」，像文档列表而不像电商页面：
     · 4 条信息挤在左侧窄列，右侧大片空白；
     · 标题与说明没有视觉分隔，扫读时找不到锚点；
     · 无图标、无卡片边界，层级完全靠字重表达，弱。
   改法：4 列等宽卡片，每张 = 图标 + 标题 + 说明 + 顶部分隔线。
   HTML 结构不变（h3 + p），靠 ::before 生成图标位（按 nth-child 取不同图形做不到，
   故用统一的分隔线 + 序号色块表达层级，避免引入新的图标依赖）。 */
.kmf-guarantees {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: clamp(16px, 1.6vw, 26px);
	border-top: 0;
	padding-top: 0;
	margin-top: clamp(28px, 3vw, 44px);
}
.kmf-guarantee {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 0;
	font-size: 13.5px;
	color: var(--kmf-ink-2);
	background: var(--kmf-surface);
	border: 1px solid var(--kmf-line);
	border-top: 3px solid var(--kmf-pine);
	border-radius: var(--kmf-r-lg);
	padding: 24px 24px 26px;
	transition: border-color var(--kmf-dur) var(--kmf-ease),
	            box-shadow var(--kmf-dur) var(--kmf-ease),
	            transform var(--kmf-dur) var(--kmf-ease);
}
.kmf-guarantee:hover {
	transform: translateY(-3px);
	box-shadow: var(--kmf-shadow-lg);
}
.kmf-guarantee h3 {
	margin: 0 0 10px;
	font-family: var(--kmf-font-head);
	font-size: 19px;
	font-weight: 700;
	line-height: 1.28;
	color: var(--kmf-ink);
	letter-spacing: -.012em;
}
.kmf-guarantee p {
	margin: 0;
	font-size: 13.5px;
	line-height: 1.62;
	color: var(--kmf-ink-2);
}
.kmf-guarantee svg { width: 17px; height: 17px; color: var(--kmf-pine); flex-shrink: 0; margin-top: 2px; }

@media (max-width: 1100px) {
	.kmf-guarantees { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 620px) {
	.kmf-guarantees { grid-template-columns: 1fr; gap: 14px; }
	.kmf-guarantee { padding: 20px 20px 22px; }
}

/* 详情选项卡 */
.kmf-tabs { margin-top: clamp(48px, 6vw, 72px); }
.kmf-tabs-nav {
	display: flex;
	gap: 2px;
	border-bottom: 1px solid var(--kmf-line);
	margin-bottom: 30px;
	overflow-x: auto;
}
.kmf-tabs-nav button {
	padding: 13px 22px;
	border: 0;
	background: transparent;
	font-size: 14px;
	font-weight: 500;
	color: var(--kmf-ink-3);
	cursor: pointer;
	border-bottom: 2px solid transparent;
	margin-bottom: -1px;
	white-space: nowrap;
	transition: all var(--kmf-dur) var(--kmf-ease);
}
.kmf-tabs-nav button:hover { color: var(--kmf-ink); }
.kmf-tabs-nav button.is-active {
	color: var(--kmf-pine);
	border-bottom-color: var(--kmf-clay);
	font-weight: 600;
}
.kmf-tab-panel { display: none; }
.kmf-tab-panel.is-active { display: block; }
.kmf-tab-panel > *:last-child { margin-bottom: 0; }

/* 规格表 */
.kmf-spec { width: 100%; border-collapse: collapse; font-size: 14px; }
.kmf-spec th, .kmf-spec td {
	padding: 12px 16px;
	border: 1px solid var(--kmf-line);
	text-align: left;
}
.kmf-spec th {
	background: var(--kmf-bg-2);
	font-weight: 600;
	color: var(--kmf-ink-2);
	width: 190px;
}

/* ==========================================================================
   17. 购物车与结账
   ========================================================================== */

.kmf-cart-wrap { display: grid; grid-template-columns: 1fr 370px; gap: clamp(28px, 4vw, 46px); align-items: start; }

.kmf-cart-table { width: 100%; border-collapse: collapse; }
.kmf-cart-table th {
	text-align: left;
	font-size: 11.5px;
	font-weight: 600;
	letter-spacing: .08em;
	text-transform: uppercase;
	color: var(--kmf-ink-3);
	padding: 0 0 12px;
	border-bottom: 1px solid var(--kmf-line-2);
}
.kmf-cart-table td { padding: 18px 12px 18px 0; border-bottom: 1px solid var(--kmf-line); vertical-align: middle; }
.kmf-cart-thumb { width: 76px; height: 76px; object-fit: cover; border-radius: var(--kmf-r); border: 1px solid var(--kmf-line); }
.kmf-cart-name { font-size: 14.5px; font-weight: 500; margin-bottom: 4px; }
.kmf-cart-var { font-size: 12.5px; color: var(--kmf-ink-3); }
.kmf-cart-price { font-weight: 600; white-space: nowrap; }

/* 订单摘要卡 */
.kmf-summary {
	background: var(--kmf-surface);
	border: 1px solid var(--kmf-line);
	border-radius: var(--kmf-r);
	padding: 24px;
	position: sticky;
	top: 92px;
}
.kmf-summary h2 {
	font-family: var(--kmf-font-body);
	font-size: 16px;
	font-weight: 600;
	margin: 0 0 20px;
	padding-bottom: 14px;
	border-bottom: 1px solid var(--kmf-line);
}
.kmf-summary-row {
	display: flex;
	justify-content: space-between;
	gap: 14px;
	padding: 8px 0;
	font-size: 14px;
	color: var(--kmf-ink-2);
}
.kmf-summary-row.total {
	padding-top: 15px;
	margin-top: 9px;
	border-top: 1px solid var(--kmf-line);
	font-size: 17px;
	font-weight: 700;
	color: var(--kmf-ink);
}
.kmf-summary .kmf-btn { margin-top: 18px; }

/* ==========================================================================
   18. 账户
   ========================================================================== */

.kmf-account { display: grid; grid-template-columns: 230px 1fr; gap: clamp(28px, 4vw, 46px); align-items: start; }
.kmf-account-nav { border: 1px solid var(--kmf-line); border-radius: var(--kmf-r); overflow: hidden; }
.kmf-account-nav a {
	display: block;
	padding: 12px 16px;
	font-size: 14px;
	color: var(--kmf-ink-2);
	border-bottom: 1px solid var(--kmf-line);
	background: var(--kmf-surface);
}
.kmf-account-nav a:last-child { border-bottom: 0; }
.kmf-account-nav a:hover,
.kmf-account-nav a.is-active {
	background: var(--kmf-pine-wash);
	color: var(--kmf-pine);
	font-weight: 500;
}

/* 表单 */
.kmf-form { max-width: 620px; }
.kmf-field { margin-bottom: 17px; }
.kmf-field label {
	display: block;
	font-size: 13px;
	font-weight: 600;
	margin-bottom: 6px;
	color: var(--kmf-ink-2);
}
.kmf-field input[type="text"],
.kmf-field input[type="email"],
.kmf-field input[type="password"],
.kmf-field input[type="tel"],
.kmf-field input[type="number"],
.kmf-field textarea,
.kmf-field select {
	width: 100%;
	padding: 11px 14px;
	border: 1px solid var(--kmf-line-2);
	border-radius: var(--kmf-r);
	background: var(--kmf-surface);
	font-size: 14.5px;
	transition: border-color var(--kmf-dur) var(--kmf-ease);
}
.kmf-field input:focus,
.kmf-field textarea:focus,
.kmf-field select:focus {
	outline: none;
	border-color: var(--kmf-pine);
	box-shadow: 0 0 0 3px var(--kmf-pine-wash);
}
.kmf-field textarea { min-height: 128px; resize: vertical; }
.kmf-field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; }

.kmf-form-msg { padding: 12px 16px; border-radius: var(--kmf-r); font-size: 14px; margin-bottom: 18px; }
.kmf-form-msg.ok { background: #e9f5ed; color: var(--kmf-ok); border: 1px solid #b7e0c4; }
.kmf-form-msg.err { background: #fdecec; color: var(--kmf-err); border: 1px solid #f5c6c6; }

/* ==========================================================================
   19. 通知条
   ========================================================================== */

.kmf-notice {
	padding: 13px 18px;
	border-radius: var(--kmf-r);
	font-size: 14px;
	margin-bottom: 20px;
	border: 1px solid;
	display: flex;
	align-items: flex-start;
	gap: 10px;
}
.kmf-notice-success { background: #e9f5ed; border-color: #b7e0c4; color: var(--kmf-ok); }
.kmf-notice-error   { background: #fdecec; border-color: #f5c6c6; color: var(--kmf-err); }
.kmf-notice-info    { background: var(--kmf-tile); border-color: var(--kmf-line-2); color: var(--kmf-pine); }

/* ==========================================================================
   20. 页脚
   ========================================================================== */

.kmf-footer {
	background: var(--kmf-ink);
	color: rgba(255,255,255,.68);
	margin-top: clamp(56px, 7vw, 88px);
	padding: clamp(44px, 6vw, 68px) 0 0;
	font-size: 14px;
}
.kmf-footer a { color: rgba(255,255,255,.68); }
.kmf-footer a:hover { color: #fff; }

.kmf-footer-top {
	display: grid;
	grid-template-columns: 1.5fr repeat(3, 1fr);
	gap: clamp(28px, 4vw, 52px);
	padding-bottom: 42px;
	border-bottom: 1px solid rgba(255,255,255,.11);
}
.kmf-footer-brand {
	font-family: var(--kmf-font-head);
	font-size: 20px;
	font-weight: 700;
	color: #fff;
	letter-spacing: .06em;
	margin-bottom: 14px;
}
.kmf-footer-about { font-size: 13.5px; line-height: 1.7; max-width: 40ch; }
.kmf-footer h3 {
	font-family: var(--kmf-font-body);
	font-size: 12px;
	font-weight: 600;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: #fff;
	margin: 0 0 16px;
}
.kmf-footer ul { list-style: none; margin: 0; padding: 0; }
.kmf-footer li { margin-bottom: 9px; }
.kmf-footer-contact li { display: flex; gap: 9px; align-items: flex-start; }
.kmf-footer-contact svg { width: 15px; height: 15px; margin-top: 3px; flex-shrink: 0; color: var(--kmf-clay-l); }

.kmf-footer-bottom {
	display: flex;
	justify-content: space-between;
	align-items: center;
	gap: 18px;
	flex-wrap: wrap;
	padding: 22px 0;
	font-size: 12.5px;
	color: rgba(255,255,255,.5);
}
/* ★ 2026-10-07 修复 320px 视口下的页面横向溢出（实测 docScrollWidth 390 vs clientWidth 320，溢出 70px）
   病灶：`.kmf-footer-bottom > .kmf-wrap` 是 flex（space-between），左侧版权文字默认 min-width:auto 不可收缩，
   右侧 `.kmf-footer-payments` 也没有 flex-wrap —— 5 个支付徽标（VISA/MASTERCARD/AMEX/DISCOVER/PAYPAL）
   静态总宽 366px，在 320px 容器里既不会换行也不会收缩，直接把文档撑宽 70px。
   修法：左侧允许收缩并允许自身换行；支付行允许折行；窄屏下收紧徽标内边距与间距。 */
.kmf-footer-bottom > .kmf-wrap {
	flex-wrap: wrap;
	gap: 14px;
}
.kmf-footer-bottom > .kmf-wrap > span:first-child {
	min-width: 0;
	flex: 1 1 auto;
	overflow-wrap: break-word;
}
.kmf-footer-payments {
	display: flex;
	flex-wrap: wrap;
	gap: 9px;
	align-items: center;
	min-width: 0;
}
.kmf-footer-payments span {
	padding: 4px 10px;
	border: 1px solid rgba(255,255,255,.19);
	border-radius: var(--kmf-r-sm);
	font-size: 11px;
	letter-spacing: .04em;
	white-space: nowrap;
}
@media (max-width: 480px) {
	.kmf-footer-payments { gap: 6px; }
	.kmf-footer-payments span { padding: 3px 7px; font-size: 10px; letter-spacing: .02em; }
}

/* ==========================================================================
   21. 吐司（加购反馈）
   ========================================================================== */

.kmf-toast-area {
	position: fixed;
	right: 20px; bottom: 20px;
	z-index: 999;
	display: flex;
	flex-direction: column;
	gap: 9px;
	pointer-events: none;
}
.kmf-toast {
	display: flex;
	align-items: center;
	gap: 11px;
	padding: 13px 18px;
	background: var(--kmf-ink);
	color: #fff;
	font-size: 14px;
	border-radius: var(--kmf-r);
	box-shadow: var(--kmf-shadow-lg);
	animation: kmf-toast-in .3s var(--kmf-ease);
	pointer-events: auto;
	max-width: 340px;
}
.kmf-toast.is-out { animation: kmf-toast-out .25s var(--kmf-ease) forwards; }
.kmf-toast svg { width: 17px; height: 17px; color: #6ee7a8; flex-shrink: 0; }

@keyframes kmf-toast-in {
	from { opacity: 0; transform: translateY(14px); }
	to   { opacity: 1; transform: translateY(0); }
}
@keyframes kmf-toast-out {
	to { opacity: 0; transform: translateY(8px); }
}

/* ==========================================================================
   22. 搜索页
   ========================================================================== */

.kmf-searchform {
	display: flex;
	max-width: 620px;
	margin-bottom: 30px;
	border: 1px solid var(--kmf-line-2);
	border-radius: var(--kmf-r);
	overflow: hidden;
	background: var(--kmf-surface);
}
.kmf-searchform input[type="search"] {
	flex: 1;
	padding: 13px 16px;
	border: 0;
	font-size: 15px;
	-moz-appearance: textfield;
	appearance: textfield;
}
.kmf-searchform input[type="search"]:focus { outline: none; }
.kmf-searchform button {
	padding: 0 22px;
	border: 0;
	background: var(--kmf-pine);
	color: #fff;
	cursor: pointer;
	font-size: 14px;
	font-weight: 600;
}
.kmf-searchform button:hover { background: var(--kmf-pine-d); }

/* ==========================================================================
   23. 404
   ========================================================================== */

.kmf-404 {
	text-align: center;
	padding: clamp(60px, 10vw, 120px) 0;
}
.kmf-404-code {
	font-family: var(--kmf-font-head);
	font-size: clamp(74px, 13vw, 128px);
	font-weight: 700;
	line-height: 1;
	color: var(--kmf-pine);
	letter-spacing: -.04em;
}
.kmf-404 p { color: var(--kmf-ink-3); margin-bottom: 28px; }

/* ==========================================================================
   24. 动效
   ========================================================================== */

.kmf-reveal {
	opacity: 0;
	transform: translateY(16px);
	transition: opacity .6s var(--kmf-ease), transform .6s var(--kmf-ease);
}
.kmf-reveal.is-in { opacity: 1; transform: translateY(0); }

@media (prefers-reduced-motion: reduce) {
	*, *::before, *::after {
		animation-duration: .01ms !important;
		transition-duration: .01ms !important;
	}
	.kmf-reveal { opacity: 1; transform: none; }
	html { scroll-behavior: auto; }
}

/* ==========================================================================
   25. 响应式
   ========================================================================== */

@media (max-width: 1100px) {
	.kmf-products { grid-template-columns: repeat(3, 1fr); }
	.kmf-usps { grid-template-columns: repeat(2, 1fr); }
	.kmf-footer-top { grid-template-columns: 1fr 1fr; }
}

@media (max-width: 900px) {
	/* ★ Hero 回落为「上图下文」。
	   注意：桌面端 .kmf-hero-media img 是 position:absolute + inset:0，
	   靠父级撑高。切到单列后父级没有高度来源，必须显式给 aspect-ratio，
	   并把 img 拉回常规流（否则高度塌成 0，图片整块消失）。
	   这里把 img 的 absolute 显式解除，不依赖桌面规则的覆盖顺序。 */
	.kmf-hero-inner {
		grid-template-columns: 1fr;
		padding-left: var(--kmf-pad);
		padding-right: var(--kmf-pad);
		padding-top: 0;
		padding-bottom: clamp(32px, 6vw, 52px);
		gap: 28px;
	}
	.kmf-hero-media {
		order: -1;
		min-height: 0;
		aspect-ratio: 16 / 10;
		border-radius: 0;
	}
	.kmf-hero-media img {
		position: static;
		inset: auto;
		width: 100%;
		height: 100%;
		object-fit: cover;
	}
	.kmf-hero h1 {
		max-width: none;
		font-size: clamp(30px, 7vw, 42px);
		line-height: 1.16;
	}
	.kmf-hero-copy > p.kmf-lede { max-width: none; }
	.kmf-hero-stats { margin-top: 0; padding-top: 24px; }
	.kmf-story { grid-template-columns: 1fr; }
	.kmf-story.flip .kmf-story-media { order: 0; }
	.kmf-pdp { grid-template-columns: 1fr; }
	.kmf-pdp-gallery { position: static; }
	.kmf-cart-wrap { grid-template-columns: 1fr; }
	.kmf-summary { position: static; }
	.kmf-account { grid-template-columns: 1fr; }
	.kmf-metrics { grid-template-columns: repeat(2, 1fr); }
}

@media (max-width: 782px) {
	.kmf-burger { display: block; }

	.kmf-nav {
		position: fixed;
		/* ★ 2026-10-07：原为写死的 inset: 68px。
		   ★ 2026-10-08 第十轮：页头由三段（公告条 36 + 顶栏 64 + 搜索行 61 = 161px）
		   收敛为两段（公告条 34 + 顶栏 103 = 137px）。
		   始终由 JS（initMobileNav → syncTop()）按页头实测底边写入
		   --kmf-drawer-top，这里只消费；JS 未执行时回退到 137px（当前实测值）。 */
		inset: var(--kmf-drawer-top, 137px) 0 auto 0;
		max-height: calc(100vh - var(--kmf-drawer-top, 137px));
		background: var(--kmf-surface);
		border-bottom: 1px solid var(--kmf-line);
		padding: 12px 20px 22px;
		overflow-y: auto;
		-webkit-overflow-scrolling: touch;
		transform: translateY(-12px);
		opacity: 0;
		visibility: hidden;
		z-index: 900;
		transition: transform var(--kmf-dur) var(--kmf-ease),
		            opacity var(--kmf-dur) var(--kmf-ease),
		            visibility var(--kmf-dur) var(--kmf-ease);
		box-shadow: var(--kmf-shadow-lg);
	}
	.kmf-nav.is-open { transform: translateY(0); opacity: 1; visibility: visible; }

	/* 抽屉遮罩：点击关闭。层级关系 —— 页头(.kmf-header) 950 > 抽屉 900 > 遮罩 890，
	   因此页头始终露在最上层、汉堡随时可点；遮罩从页头下沿开始铺满剩余视口。 */
	.kmf-nav-mask {
		position: fixed;
		top: var(--kmf-drawer-top, 137px);
		left: 0; right: 0; bottom: 0;
		z-index: 890;
		background: rgba(16, 19, 20, .52);
		opacity: 0;
		visibility: hidden;
		transition: opacity var(--kmf-dur) var(--kmf-ease),
		            visibility var(--kmf-dur) var(--kmf-ease);
	}
	body.kmf-nav-lock { overflow: hidden; }
	body.kmf-nav-lock .kmf-nav-mask { opacity: 1; visibility: visible; }
	.kmf-nav ul { flex-direction: column; align-items: stretch; gap: 0; }
	.kmf-nav > ul > li > a { padding: 13px 0; border-bottom: 1px solid var(--kmf-line); }
	.kmf-nav > ul > li > a::after { display: none; }
	.kmf-nav ul.sub-menu {
		position: static;
		opacity: 1; visibility: visible; transform: none;
		border: 0; border-left: 2px solid var(--kmf-line-2);
		padding: 0 0 0 14px;
		display: none;
	}
	.kmf-nav li.is-open > ul.sub-menu { display: block; }
	.kmf-nav ul.sub-menu ul.sub-menu { position: static; border: 0; display: none; }

	.kmf-products,
	.kmf-products.cols-3,
	.kmf-products.cols-2 { grid-template-columns: repeat(2, 1fr); gap: 14px; }
	.kmf-cats { grid-template-columns: repeat(2, 1fr); }
	.kmf-head { flex-direction: column; align-items: flex-start; }
	.kmf-field-row { grid-template-columns: 1fr; }
	.kmf-header-inner { gap: 12px; }
	.kmf-brand { font-size: 18px; }
	.kmf-brand img { height: 27px; }
	.kmf-hero-stats { gap: 22px; }
	.kmf-footer-bottom { flex-direction: column; text-align: center; }
}

@media (max-width: 560px) {
	body { font-size: 14.5px; }
	.kmf-products,
	.kmf-products.cols-3,
	.kmf-products.cols-2 { grid-template-columns: 1fr; }
	.kmf-usps { grid-template-columns: 1fr; }
	.kmf-cats { grid-template-columns: 1fr; }
	.kmf-footer-top { grid-template-columns: 1fr; }
	.kmf-metrics { grid-template-columns: 1fr; gap: 18px; }
	.kmf-hero-cta { flex-direction: column; }
	.kmf-hero-cta .kmf-btn { width: 100%; }
	.kmf-buy-actions { flex-direction: column; }
	.kmf-buy-actions .kmf-btn { width: 100%; min-width: 0; }
	.kmf-toast-area { left: 14px; right: 14px; }
	.kmf-toast { max-width: none; }
}

/* ==========================================================================
   27. 模板骨架
   --------------------------------------------------------------------------
   独立主题自有模板（header / footer / index / archive / page / single /
   search / 404）所依赖的容器与排版件。
   ========================================================================== */

/* 页面骨架 */
.kmf-page { display: flex; flex-direction: column; min-height: 100vh; }
.kmf-main { flex: 1 0 auto; }

/* 统一容器：与页头 / 页脚共用同一条左边线 */
.kmf-wrap {
	width: 100%;
	max-width: calc(var(--kmf-wrap) + 48px);
	margin-inline: auto;
	padding-inline: 24px;
}
.kmf-wrap-narrow {
	width: 100%;
	max-width: calc(var(--kmf-wrap-narrow) + 48px);
	margin-inline: auto;
	padding-inline: 24px;
}
.kmf-container {
	width: 100%;
	max-width: calc(var(--kmf-wrap) + 48px);
	margin-inline: auto;
	padding: clamp(30px, 4vw, 52px) 24px clamp(56px, 7vw, 96px);
}

/* 页头内的两行结构：上排品牌 / 导航 / 动作，下排搜索
   ★ 2026-10-07 重排（原 flex + .kmf-nav{margin-left:auto}）
   原样：flex 行里 brand(148) + nav(441) + actions(215) + gap(44) = 848px，
   容器 1240px，剩余 392px 全被 margin-left:auto 塞到 brand 与 nav 之间，
   表现为「品牌靠左、导航被甩到最右、中间一片空洞」。
   改成三栏网格：brand 左 / nav 视觉居中 / actions 右，左右两端被填满，
   中间空白按剩余空间均分，任何宽度下都不会出现单侧大空洞。 */
.kmf-header-top {
	display: grid;
	grid-template-columns: auto 1fr auto;
	align-items: center;
	gap: 22px;
	min-height: 64px;
}
/* ★ 搜索行（2026-10-07 调整）
   原样：搜索表单固定 620px，在 1240px 的容器里只占左半边，右侧 620px 留白，
   视觉上像是「没做完」。改成撑满容器并给一个合理的上限，
   既保持搜索框够长（长尾关键词输得下），又不至于在超宽屏上拉成一条线。
   注意：搜索表单的实际类名是 .kmf-searchform（由 get_search_form 输出），
   它自己带 max-width:620px，所以这里必须用同特异性或更高的选择器覆盖。 */
.kmf-header-search {
	padding-bottom: 13px;
	/* ★ 2026-10-07：搜索行不再让表单独占左半边。
	   在 ≥981px 时改为「表单 + 快捷入口」两栏，表单取剩余宽度（上限 760px），
	   右侧出现一行常用类目快捷链接，填满原先的空白带，同时提升导航效率。
	   窄屏（≤980px）自动降级为单栏，快捷链接隐藏。 */
	display: flex;
	align-items: center;
	gap: 18px;
}
.kmf-header-search .kmf-searchform,
.kmf-header-search form.search-form,
.kmf-header-search form {
	display: flex;
	align-items: stretch;
	gap: 0;
	flex: 1 1 auto;
	min-width: 0;
	width: auto;
	max-width: 760px;
	margin-bottom: 0;
}
.kmf-header-search input[type="search"],
.kmf-header-search input[type="text"] {
	flex: 1 1 auto;
	min-width: 0;
	width: auto;
	max-width: none;
	height: 46px;
	border-top-right-radius: 0;
	border-bottom-right-radius: 0;
}
.kmf-header-search button,
.kmf-header-search input[type="submit"] {
	flex: 0 0 auto;
	height: 46px;
	padding-inline: 22px;
	border-top-left-radius: 0;
	border-bottom-left-radius: 0;
	white-space: nowrap;
}
/* 搜索行右侧的快捷入口（桌面可见，用于填满搜索框右侧的空白带） */
.kmf-header-quick {
	display: flex;
	align-items: center;
	gap: 6px;
	flex: 0 0 auto;
	margin-left: auto;
	white-space: nowrap;
}
.kmf-header-quick a {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 8px 12px;
	border: 1px solid var(--kmf-line);
	border-radius: 999px;
	font-size: 13px;
	font-weight: 600;
	line-height: 1;
	color: var(--kmf-ink-2);
	background: var(--kmf-surface);
	transition: border-color var(--kmf-dur) var(--kmf-ease),
	            color var(--kmf-dur) var(--kmf-ease),
	            background var(--kmf-dur) var(--kmf-ease);
}
.kmf-header-quick a svg { width: 15px; height: 15px; flex-shrink: 0; }
.kmf-header-quick a:hover {
	border-color: var(--kmf-pine);
	color: var(--kmf-pine);
	background: var(--kmf-pine-wash);
}
/* 窄屏：搜索框收窄，快捷入口隐藏，避免挤压导航 */
@media (max-width: 1100px) {
	.kmf-header-search { gap: 0; }
	.kmf-header-quick { display: none; }
}
@media (max-width: 860px) {
	.kmf-header-search .kmf-searchform,
	.kmf-header-search form { max-width: 100%; }
}

/* =========================================================================
   页头响应式重排（★ 2026-10-07 新增）
   -------------------------------------------------------------------------
   为什么放在这里而不是上面 782px 那个断点块里：
   源码顺序决定同特异性规则的胜负。.kmf-header-top 的网格定义在上方（约 1816 行），
   而移动端断点块在它之前（约 1698 行）。若把 .kmf-header-top 的栅格改写放进
   782px 块，会被后面这条基础规则原样覆盖 —— 实测表现就是断点完全不生效。
   因此页头相关的栅格改写统一放在本块（位于基础规则之后），靠源码顺序取胜。

   桌面（≥783px）：三栏 —— 品牌 | 导航（居中）| 动作区（靠右）
   移动（≤782px）：三栏 —— 品牌（吃满剩余）| 汉堡 | 动作区（靠右）
                    其中 .kmf-nav 已是 position:fixed 抽屉，脱离文档流，
                    不再占用栅格栏位（这正是原布局被挤成 148|38|116 的原因）。
   ========================================================================= */
/* ★ 2026-10-08 第十轮：本块（783px 以上）的网格改写已被第 32 节接管。
   保留仅为记录历史 —— 全部规则加注释停用，避免与新布局打架。
@MEDIA-DISABLED (min-width: 783px) {
	.kmf-header-top { grid-template-columns: auto 1fr auto; }
	.kmf-brand { grid-column: 1; grid-row: 1; }
	.kmf-nav { grid-column: 2; grid-row: 1; justify-self: center; }
	.kmf-header-actions { grid-column: 3; grid-row: 1; justify-self: end; }
	.kmf-burger { display: none; }
}
*/
/* 下述 ≤782px 块仍生效（品牌压缩 / 汉堡显示 / 图标热区），
   但其中与网格落位有关的 4 行由第 32.5 节覆盖。 */
@media (max-width: 782px) {
	.kmf-header-top {
		grid-template-columns: 1fr auto auto;
		gap: 10px;
	}
	.kmf-nav { justify-self: stretch; }

	/* 品牌文字在窄屏压缩，避免与汉堡抢位 */
	.kmf-brand-name { font-size: 17px; letter-spacing: .04em; white-space: nowrap; }
	.kmf-brand { font-size: 17px; }
	.kmf-brand img { height: 26px; }
	.kmf-header-actions { gap: 2px; }
	.kmf-icon-btn { padding: 6px; }
}

/* 超窄屏（≤400px）：品牌再收一档，保证汉堡与动作区不被挤出容器 */
@media (max-width: 400px) {
	.kmf-brand-name { font-size: 15px; }
	.kmf-header-actions .kmf-head-link { padding: 6px 5px; }
	.kmf-icon-btn { padding: 5px; }
}

/* 品牌文字版式（无 logo 图时的回退） */
.kmf-brand-name {
	font-family: var(--kmf-font-head);
	font-size: 21px;
	font-weight: 700;
	letter-spacing: .07em;
	color: var(--kmf-ink);
}
.kmf-brand a:hover .kmf-brand-name { color: var(--kmf-pine); }
.custom-logo-link img { max-height: 36px; width: auto; }

/* 公告条项
   ★ 2026-10-07：原为 margin-inline: 20px 控制间距。在 390px 视口下 4 项 × 40px = 160px
   外边距，占容器（350px）近一半，是顶条被撑高的直接推手之一。
   现改为由父级 flex gap 统一控制间距，item 自身不再带横向外边距；
   同时白名单 nowrap 禁止项内二次折行（360px 下 "Support maxzhumi@Outlook.com" 曾折 2 行）。 */
.kmf-announce-item {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	flex: 0 0 auto;
	white-space: nowrap;
}
.kmf-announce-item svg { opacity: .8; flex-shrink: 0; }

/* 窄屏：收紧间距与内边距，保证首项不被容器 padding 挤出可视区。
   gap 收到 22px、横向 padding 收到 14px，4 项合计宽度仍超出 390px 视口，
   因此保留横向滑动；但滑动时首尾需要留白，否则 "Free shipping" 会贴着屏幕左缘。 */
@media (max-width: 782px) {
	.kmf-announce .kmf-wrap {
		justify-content: flex-start;
		gap: 22px;
		padding: 8px 14px;
	}
}
@media (max-width: 480px) {
	.kmf-announce { font-size: 12px; letter-spacing: .02em; }
	.kmf-announce .kmf-wrap { gap: 18px; padding: 8px 12px; }
}

/* 二级菜单（Walker 输出 .kmf-nav-sub，与 .kmf-nav ul.sub-menu 共用规则） */
.kmf-nav .kmf-nav-sub { position: absolute; }

/* ★ 视口边界约束（2026-10-07 补）。
   踩坑记录：子菜单是 position:absolute 且默认从父项左边缘向右展开（宽度 210px）。
   主导航的最后一个顶级项（"Shop all"）位于容器右侧 —— 它的子菜单展开后右边缘
   落到 1492px，而视口是 1440px（桌面滚动条占位后 innerWidth=1440），
   于是**每个页面都被撑出 52px 横向滚动条**（实测 documentElement.scrollWidth
   = 1492，比 innerWidth 大 52）。
   为什么这个 bug 很难通过肉眼发现：横向滚动条只在页面底部，且 52px 很窄；
   但它会影响所有断点的「是否溢出」判定，也会让移动端手势出现意外的横向位移。
   修法：不写死父项序号，改用「右对齐 + 允许贴边」两条规则：
     · 给子菜单一个不超出视口的 max-width；
     · 靠右的父项（.kmf-nav li:last-child / 倒数第二项）的子菜单改为右对齐，
       即 right:0; left:auto —— 让它朝左展开。
   同时给 .kmf-nav 容器加 overflow 可见但 scrollWidth 不溢出的保险。 */
.kmf-nav .kmf-nav-sub {
	max-width: calc(100vw - 40px);
}
.kmf-nav > li:last-child > .kmf-nav-sub,
.kmf-nav > li:nth-last-child(2) > .kmf-nav-sub,
.kmf-nav li.menu-item:last-child > .kmf-nav-sub {
	left: auto;
	right: 0;
}
/* 兜底：任何仍然越界的子菜单都退回父项左边缘内侧 */
.kmf-nav li { position: relative; }

/* 搜索表单 —— 页头与页内共用 */
.kmf-searchform {
	display: flex;
	align-items: stretch;
	width: 100%;
	border: 1px solid var(--kmf-line-2);
	border-radius: var(--kmf-r);
	background: var(--kmf-surface);
	overflow: hidden;
	transition: border-color var(--kmf-dur) var(--kmf-ease);
}
.kmf-searchform:focus-within { border-color: var(--kmf-pine); }
.kmf-searchform label { flex: 1 1 auto; margin: 0; display: block; }
.kmf-searchform label > span { display: none; }
.kmf-searchform input[type="search"] {
	width: 100%;
	height: 44px;
	border: 0;
	padding: 0 16px;
	background: transparent;
	font-size: 14.5px;
	color: var(--kmf-ink);
	outline: none;
	-webkit-appearance: none;
	appearance: none;
}
.kmf-searchform input[type="search"]::placeholder { color: var(--kmf-ink-3); }
.kmf-searchform button[type="submit"] {
	flex-shrink: 0;
	width: 52px;
	border: 0;
	border-left: 1px solid var(--kmf-line);
	background: var(--kmf-pine);
	color: #fff;
	cursor: pointer;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	transition: background var(--kmf-dur) var(--kmf-ease);
}
.kmf-searchform button[type="submit"]:hover { background: var(--kmf-pine-d); }
.kmf-searchform button[type="submit"] svg { width: 18px; height: 18px; }
/* 没有 <label> 包裹时的裸 input */
input[type="search"].kmf-searchform-input {
	width: 100%;
	height: 44px;
	border: 1px solid var(--kmf-line-2);
	border-radius: var(--kmf-r);
	padding: 0 16px;
	background: var(--kmf-surface);
}

/* 内页通栏页头（裸页面用） */
.kmf-pagehead {
	background: var(--kmf-bg-2);
	border-bottom: 1px solid var(--kmf-line);
	padding: clamp(30px, 4vw, 48px) 0;
}
.kmf-pagehead h1 { margin-bottom: 0; }
.kmf-pagehead .kmf-lede { margin: 10px 0 0; color: var(--kmf-ink-3); font-size: 14.5px; }

/* 正文排版 */
.kmf-prose { max-width: 78ch; }

/* 全宽内容容器：与 .kmf-prose 相对。
   page.php 判定页面含 WooCommerce 循环时用它替换 .kmf-prose，
   否则商品网格会被 78ch（≈630px）的行宽护栏压成左半边一条。
   见 page.php 里的 $is_woo_archive 判定与随附的踩坑记录。 */
.kmf-wide { max-width: none; width: 100%; }

/* 双保险：万一 WooCommerce 结构仍落在 .kmf-prose 内（例如短代码被写进长文页面），
   让商品网格与商店工具条突破行宽护栏，不至于只剩 630px。
   只放行「结构性容器」，正文段落、表格、引用仍受 78ch 保护。 */
.kmf-prose > .woocommerce,
.kmf-prose > .kmf-products,
.kmf-prose .woocommerce > ul.products,
.kmf-prose > ul.products,
.kmf-prose .woocommerce-products-header,
.kmf-prose .kmf-shopbar,
.kmf-prose .woocommerce-result-count,
.kmf-prose .woocommerce-ordering,
.kmf-prose nav.woocommerce-pagination {
	width: 100%;
	max-width: 100%;
}
.kmf-prose > .woocommerce,
.kmf-prose > .kmf-products,
.kmf-prose > ul.products {
	margin-left: 0;
	margin-right: 0;
}

/* ★ 首页（kmf-section 区块）同样会被 page.php 的 .kmf-prose 压窄。
   实测（2026-10-07）：首页 Best Sellers 的 ul.products 只有 562px，
   4 张卡片各 129px；对照容器链发现 .kmf-wrap 在 kmf-prose 内被 78ch 截断
   （628px ≈ 78ch，完全吻合）。
   为什么不能只靠 page.php 的判断：首页内容是 HTML 区块 + [products] 短代码，
   raw content 里查不到 "woocommerce" 字样，字符串嗅探必然漏判。
   所以再加一层 CSS 兜底 —— .kmf-wrap 与 .kmf-section 是主题自己的版式容器，
   自带 max-width 与内边距，本来就与「正文行宽」无关，应当直接放行。 */
.kmf-prose .kmf-wrap,
.kmf-prose > .kmf-section,
.kmf-prose .kmf-section > .kmf-wrap {
	width: 100%;
	max-width: 100%;
	margin-left: auto;
	margin-right: auto;
}
/* ★ 注意：这里曾经写过「用 100vw + calc(50% - 50vw) 把 hero 拉通栏」的 hack。
   实测（2026-10-07）**所有页面出现 52px 横向溢出**（documentElement.scrollWidth
   比 innerWidth 大 52px，即桌面滚动条宽度）。原因是 100vw 把滚动条也计入宽度，
   在「有纵向滚动条」的页面上必然多出一截，触发横向滚动条。
   现在 page.php 已经用 .kmf-wide 替换了结构型页面的 .kmf-prose，hero 天然位于
   全宽容器内，不需要这个 hack。故删除，改用 max-width:100% 的保守写法。 */
.kmf-prose > .kmf-hero,
.kmf-prose > .nb-page-hero,
.kmf-prose > .kmf-strip,
.kmf-prose > .kmf-band {
	width: 100%;
	max-width: 100%;
}

.kmf-prose > *:first-child { margin-top: 0; }
.kmf-prose h2 { margin-top: 1.6em; }
.kmf-prose h3 { margin-top: 1.3em; }
.kmf-prose ul, .kmf-prose ol { padding-left: 1.25em; }
.kmf-prose li { margin-bottom: .45em; }
.kmf-prose blockquote {
	margin: 1.5em 0;
	padding: 4px 0 4px 20px;
	border-left: 3px solid var(--kmf-clay);
	color: var(--kmf-ink-2);
	font-style: italic;
}
.kmf-prose img { border-radius: var(--kmf-r); }
.kmf-prose table {
	width: 100%;
	border-collapse: collapse;
	margin: 1.4em 0;
	font-size: 14.5px;
}
.kmf-prose th, .kmf-prose td {
	padding: 10px 12px;
	border: 1px solid var(--kmf-line);
	text-align: left;
}
.kmf-prose th { background: var(--kmf-bg-2); font-weight: 600; }

/* 文章容器 */
.kmf-article { padding-bottom: 20px; }

/* 评论区 */
.kmf-comments {
	max-width: 78ch;
	margin-top: clamp(40px, 5vw, 64px);
	padding-top: clamp(28px, 4vw, 40px);
	border-top: 1px solid var(--kmf-line);
}
.kmf-comments-title { margin-bottom: 22px; }
.kmf-comment-list { list-style: none; padding: 0; margin: 0 0 32px; }
.kmf-comment-list .comment-body {
	padding: 18px 0;
	border-bottom: 1px solid var(--kmf-line);
}
.kmf-comment-list .avatar { border-radius: var(--kmf-r); }
.comment-respond .comment-form { display: grid; gap: 14px; }
.comment-respond label { display: block; font-size: 13.5px; font-weight: 600; margin-bottom: 6px; }
.comment-respond input[type="text"],
.comment-respond input[type="email"],
.comment-respond input[type="url"],
.comment-respond textarea {
	width: 100%;
	border: 1px solid var(--kmf-line-2);
	border-radius: var(--kmf-r);
	padding: 11px 14px;
	background: var(--kmf-surface);
}
.comment-respond textarea { min-height: 130px; }
.comment-form-cookies-consent { display: flex; align-items: center; gap: 8px; }
.comment-form-cookies-consent input { width: auto; }
.form-submit { margin-bottom: 0; }

/* 无结果 */
.kmf-no-results { text-align: center; padding: clamp(30px, 5vw, 60px) 0; max-width: 560px; margin-inline: auto; }
.kmf-no-results .kmf-searchform { max-width: 420px; margin: 0 auto 24px; }
.kmf-no-results .kmf-btn-row { justify-content: center; }

/* 按钮行 */
.kmf-btn-row { display: flex; flex-wrap: wrap; gap: 12px; }
.kmf-sec-foot { margin-top: clamp(28px, 4vw, 44px); text-align: center; }

/* 区块变体 */
.kmf-section-cream { background: var(--kmf-bg-2); }
.kmf-section-tight { padding-block: clamp(30px, 4vw, 48px); }

/* 页脚补充 */
.kmf-footer-brand .kmf-brand-name {
	display: inline-block;
	font-size: 22px;
	color: var(--kmf-surface);
	margin-bottom: 14px;
}
.kmf-footer-legal { margin-top: 1rem; }
.kmf-footer-contact svg { flex-shrink: 0; opacity: .7; }

/* 侧栏（本主题默认不用，保留扩展位） */
.kmf-sidebar { margin-top: 30px; }
.kmf-widget ul { list-style: none; padding: 0; }
.kmf-widget-title { font-size: 17px; }

/* 面包屑 */
.kmf-breadcrumb {
	font-size: 13px;
	color: var(--kmf-ink-3);
	padding: 16px 0 0;
}
.kmf-breadcrumb a { color: var(--kmf-ink-3); }
.kmf-breadcrumb a:hover { color: var(--kmf-pine); }
.kmf-breadcrumb .sep { margin-inline: 8px; opacity: .5; }

/* ==========================================================================
   26. 功能层 —— 由 inc/ 模块输出的结构（商品详情 / 归档 / 搜索 / 评价 / A+ /
       guides / 站内导航 / 页脚内链）
   -------------------------------------------------------------------------
   以下规则的 HTML 由 inc/*.php 输出、类名固定为 nb-*，因此保持原样；
   它们读到的全部是第 1b 节映射过的 --nb-* 令牌，颜色 / 圆角 / 阴影 /
   字体已是松柏绿 + 赤陶 + 直角的新视觉语言。
   ========================================================================== */

/* ==========================================================================
   25. 商品详情页 · 图片库（自建结构，替换 flexslider）
   --------------------------------------------------------------------------
   结构由 inc/nb-pdp.php 的 nb_product_gallery() 输出：
     .nb-gallery > .nb-gallery__stage > a > img
                 > ul.nb-gallery__thumbs > li > button > img
   主图固定 1:1 画框 + contain 居中；缩略图 6 列方格，悬停/点击切换。
   ========================================================================== */
.nb-gallery {
  width: 38% !important;
  float: left;
  margin: 0 6% 0 0;
}
.nb-gallery--empty { display: none; }

.nb-gallery__stage {
  position: relative;
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r);
  overflow: hidden;
  background: #fff;
}
.nb-gallery__zoom { display: block; cursor: zoom-in; }
.nb-gallery__stage .nb-gallery__img {
  display: block;
  width: 100% !important;
  height: auto !important;
  max-width: none !important;
  aspect-ratio: 1 / 1;
  object-fit: contain;
  object-position: center;
  margin: 0 !important;
  border-radius: 0;
}

.nb-gallery__thumbs {
  display: grid !important;
  grid-template-columns: repeat(6, minmax(0, 1fr));
  gap: .5rem;
  margin: .85rem 0 0 !important;
  padding: 0 !important;
  list-style: none;
}
.nb-gallery__thumbs li { margin: 0 !important; width: auto !important; }

/* NB-VARIANT-GALLERY: 7-8 张时扩列，其余商品维持 6 列（2026-10-01） */
.nb-gallery[data-count="7"] .nb-gallery__thumbs { grid-template-columns: repeat(7, minmax(0, 1fr)); }
.nb-gallery[data-count="8"] .nb-gallery__thumbs { grid-template-columns: repeat(8, minmax(0, 1fr)); }
.nb-gallery__thumb {
  display: block;
  width: 100%;
  padding: 0;
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-sm);
  background: #fff;
  cursor: pointer;
  overflow: hidden;
  line-height: 0;
  transition: border-color var(--nb-t), box-shadow var(--nb-t);
}
.nb-gallery__thumb img {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 1 / 1;
  object-fit: contain;
  padding: 4px;
  margin: 0;
}
.nb-gallery__thumb:hover { border-color: var(--nb-primary); }
.nb-gallery__thumb.is-active {
  border-color: var(--nb-primary);
  box-shadow: 0 0 0 1px var(--nb-primary) inset;
}
.nb-gallery__thumb:focus-visible { outline: 2px solid var(--nb-primary); outline-offset: 2px; }

/* 灯箱 */
.nb-lb {
  position: fixed;
  inset: 0;
  z-index: 99999;
  display: none;
  align-items: center;
  justify-content: center;
  padding: 4vmin;
  background: rgba(8, 14, 24, .93);
}
.nb-lb.is-open { display: flex; }
.nb-lb img {
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  object-fit: contain;
  border-radius: 10px;
  background: #fff;
}
.nb-lb__close {
  position: absolute;
  top: 1.4rem;
  right: 1.6rem;
  width: 46px;
  height: 46px;
  border: 0;
  border-radius: 50%;
  background: rgba(255, 255, 255, .16);
  color: #fff;
  font-size: 1.7rem;
  line-height: 1;
  cursor: pointer;
}
.nb-lb__close:hover { background: rgba(255, 255, 255, .3); }

@media (max-width: 900px) {
  .nb-gallery { width: 100% !important; float: none; margin: 0 0 1.8rem; }
  .nb-gallery__thumbs { grid-template-columns: repeat(6, minmax(0, 1fr)); gap: .4rem; }
}
@media (max-width: 480px) {
  .nb-gallery__thumbs { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .nb-gallery[data-count="7"] .nb-gallery__thumbs,
  .nb-gallery[data-count="8"] .nb-gallery__thumbs { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

/* ==========================================================================
   26. 商品详情页 · 加购区（按钮缩小 + 数量框方形）
   ========================================================================== */
.woocommerce div.product form.cart {
  align-items: center;
  gap: .6rem;
  margin: 0 0 1.3rem !important;
}
.woocommerce div.product form.cart .quantity { flex: 0 0 auto; }

.woocommerce div.product form.cart .quantity input[type="number"],
.woocommerce div.product form.cart .quantity input.qty,
.woocommerce div.product form.cart .quantity .qty {
  width: 54px !important;
  min-width: 54px !important;
  max-width: 54px !important;
  height: 54px !important;
  min-height: 54px !important;
  padding: 0 !important;
  border: 1px solid var(--nb-line);
  border-radius: 8px;
  text-align: center;
  font-size: 1rem;
  font-weight: 600;
  color: var(--nb-ink);
  background: #fff;
}

.woocommerce div.product form.cart button.single_add_to_cart_button,
.woocommerce div.product form.cart .button,
.woocommerce div.product form.cart button[type="submit"] {
  flex: 0 1 auto !important;
  width: auto !important;
  min-width: 0 !important;
  height: 52px;
  min-height: 52px;
  padding: 0 2rem !important;
  font-size: .92rem !important;
  font-weight: 700;
  letter-spacing: -.005em;
  line-height: 1;
  /* ★ 第八轮：改为 Anker 式黑底白字直角。
     此前是品牌绿底 + 8px 圆角 + 彩色投影，与 Anker 的
     「黑 CTA + 直角 + 无阴影」语言冲突。 */
  background: var(--kmf-clay) !important;
  border-color: var(--kmf-clay) !important;
  color: #fff !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  transition: background var(--kmf-dur) var(--kmf-ease);
}
.woocommerce div.product form.cart button.single_add_to_cart_button:hover,
.woocommerce div.product form.cart .button:hover {
  background: var(--kmf-clay-d) !important;
  border-color: var(--kmf-clay-d) !important;
}

/* 库存行弱化：欧美 PDP 不强调精确库存数，灰色小字即可 */
.woocommerce div.product .summary p.stock.in-stock {
  color: var(--kmf-ink-3);
  font-size: 13px;
  margin: 0 0 1.1rem;
}

/* 亚马逊评分行 */
.nb-amz-rating { display: flex; align-items: center; gap: .5rem; margin: 0 0 .9rem; }
.nb-amz-rating__txt { font-size: .84rem; color: var(--nb-muted); }
.nb-stars { display: inline-flex; gap: 1px; line-height: 0; }
.nb-stars__i { fill: #d8d8d8; }
.nb-stars__i--on { fill: #f2a01c; }

/* ==========================================================================
   27. 商品详情页 · Tabs 排版修正
   --------------------------------------------------------------------------
   Storefront 的商品 tabs 是「左栏竖排 tab + 右栏内容」布局：
     ul.tabs  → float: left;  width: auto（内容宽）
     .panel   → float: right; width: 78%
   第 16 节把 tab 条改成横向 flex 但没有清浮动，导致内容整体右移约 484px，
   看起来像「变形」。这里把两者都拉回整宽，变成标准的顶部横排 tabs。
   ========================================================================== */
.woocommerce div.product .woocommerce-tabs { clear: both; overflow: visible; }

.woocommerce div.product .woocommerce-tabs ul.tabs {
  float: none !important;
  width: 100% !important;
  display: flex;
  flex-wrap: wrap;
  gap: 0 2.2rem;
  margin: 0 0 2rem !important;
  padding: 0 !important;
  background: none;
  border-bottom: 1px solid var(--nb-line);
}
.woocommerce div.product .woocommerce-tabs .panel,
.woocommerce div.product .woocommerce-tabs .woocommerce-Tabs-panel {
  float: none !important;
  width: 100% !important;
  max-width: none !important;
  padding: 0 !important;
  margin: 0 !important;
  clear: both;
}

/* 面板标题保留在无障碍树与文档大纲里，但视觉上不重复（tab 条已经写了） */
.woocommerce div.product .woocommerce-tabs .panel > h2:first-child {
  position: absolute !important;
  display: block !important;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* 描述区排版 */
.woocommerce div.product .woocommerce-tabs .panel p,
.woocommerce div.product .woocommerce-tabs .panel li {
  font-size: .96rem;
  line-height: 1.78;
  color: var(--nb-body);
}
.woocommerce div.product .woocommerce-tabs .panel h3 {
  font-size: 1.12rem;
  margin: 2rem 0 .8rem;
}
.woocommerce div.product .woocommerce-tabs .panel h3:first-of-type { margin-top: 0; }
.woocommerce div.product .woocommerce-tabs .panel ul { padding-left: 1.15rem; }
.woocommerce div.product .woocommerce-tabs .panel li { margin-bottom: .55rem; }

/* 规格表（Additional information） */
.woocommerce table.shop_attributes {
  width: 100%;
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r);
  border-collapse: separate;
  border-spacing: 0;
  overflow: hidden;
  margin: 0;
  font-size: .92rem;
}
.woocommerce table.shop_attributes th,
.woocommerce table.shop_attributes td {
  padding: .8rem 1.15rem;
  border-bottom: 1px solid var(--nb-line);
  border-top: 0;
  background: #fff;
  vertical-align: top;
  line-height: 1.6;
}
.woocommerce table.shop_attributes tr:last-child th,
.woocommerce table.shop_attributes tr:last-child td { border-bottom: 0; }
.woocommerce table.shop_attributes th {
  width: 34%;
  font-weight: 700;
  color: var(--nb-ink);
  background: var(--nb-soft);
}
.woocommerce table.shop_attributes td { color: var(--nb-body); }
.woocommerce table.shop_attributes td p { margin: 0; padding: 0; font-size: inherit; }
.woocommerce table.shop_attributes tr:nth-child(even) td { background: #fcfcfc; }

/* ==========================================================================
   28. 商品详情页 · 客户评论总结
   ========================================================================== */
.nb-rev-sum {
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r);
  background: var(--nb-cream);
  padding: 1.7rem 1.9rem;
  margin: 0 0 2.4rem;
}
.nb-rev-sum__head { display: flex; align-items: baseline; gap: 1.2rem; flex-wrap: wrap; margin-bottom: .9rem; }
.nb-rev-sum__head h3 { margin: 0; font-size: 1.25rem; }
.nb-rev-sum__score { display: flex; align-items: center; gap: .45rem; font-size: .9rem; color: var(--nb-muted); }
.nb-rev-sum__score b { font-size: 1.1rem; color: var(--nb-ink); }
.nb-rev-sum__lead { font-size: 1rem; line-height: 1.8; color: var(--nb-ink-2); margin: 0 0 1.4rem; }
.nb-rev-sum__topics {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1.1rem 1.6rem;
  margin: 0 0 1.2rem !important;
  padding: 0 !important;
  list-style: none;
}
.nb-rev-sum__topics li { margin: 0 !important; }
.nb-rev-sum__topic {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: .6rem;
  margin-bottom: .4rem;
}
.nb-rev-sum__topic b { font-size: .92rem; color: var(--nb-ink); }
.nb-rev-sum__topic span { font-size: .76rem; color: var(--nb-muted); white-space: nowrap; }
.nb-rev-sum__topicbar {
  height: 5px;
  border-radius: 999px;
  background: #e6e2dc;
  overflow: hidden;
  margin-bottom: .5rem;
}
.nb-rev-sum__topicbar i { display: block; height: 100%; background: var(--nb-ok); border-radius: 999px; }
.nb-rev-sum__topics p { font-size: .85rem !important; line-height: 1.62 !important; color: var(--nb-muted); margin: 0 !important; }
.nb-rev-sum__note { font-size: .8rem; color: var(--nb-muted); margin: 0; }
.nb-rev-sum__note a { color: var(--nb-primary); }
@media (max-width: 900px) {
  .nb-rev-sum__topics { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .nb-rev-sum { padding: 1.3rem; }
}
@media (max-width: 560px) {
  .nb-rev-sum__topics { grid-template-columns: 1fr; }
}

/* 原生评论区（站内暂无评论时只有一个空提示，收敛一下） */
.woocommerce #reviews .woocommerce-noreviews {
  border: 1px dashed var(--nb-line);
  border-radius: var(--nb-r);
  padding: 1.1rem 1.3rem;
  font-size: .92rem;
  color: var(--nb-muted);
  background: #fff;
}

/* ==========================================================================
   29. 商品详情页 · A+ 图文内容（v2.4.0 重做）
   --------------------------------------------------------------------------
   结构由 inc/nb-pdp.php 的 nb_aplus_section() 输出，分三层：
     .nb-aplus__heroes  > figure.nb-aplus__hero        宽幅横幅，通栏居中
     .nb-aplus__details > .nb-aplus__dwrap > .nb-aplus__ditem
                                                       细节小图（左图右文横排）
     aside.nb-aplus__brand                            品牌区（LOGO + 文案 + 数据卡）

   两条硬规则，改之前先读：
     1. 横幅与细节图的容器都带 inline max-width = 该图原始像素宽 —— 目的就是
        「绝不放大」。这批图里有 44% 原始宽度不足 400px（最小 166px），一旦
        改成 width:100% 就会被拉到 4 倍以上，立刻糊成一片。
     2. 横幅图由 PHP 换成 1464px 原图并自带 srcset，这里不要再写死尺寸。
   ========================================================================== */
.nb-aplus {
  margin: 3.4rem 0 0;
  border-top: 1px solid var(--nb-line);
  padding-top: 2.6rem;
}
.nb-aplus__title { font-size: 1.45rem; margin: 0 0 1.8rem; }

/* ---------- 1. 主视觉：宽幅横幅 ---------- */
.nb-aplus__heroes {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  justify-items: center;
  gap: 1.8rem;
}
.nb-aplus__hero {
  margin: 0;
  width: 100%;
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r);
  overflow: hidden;
  background: #fff;
}
.nb-aplus__hero img { display: block; width: 100%; height: auto; }
.nb-aplus__hcap {
  display: block;
  padding: .95rem 1.3rem 1.15rem;
  border-top: 1px solid var(--nb-line);
}
.nb-aplus__hcap strong { display: block; font-size: 1rem; margin-bottom: .32rem; }
.nb-aplus__hcap span { display: block; font-size: .89rem; line-height: 1.66; color: var(--nb-muted); }
.nb-aplus__hcap span + span { margin-top: .4rem; }

/* ---------- 2. 细节图组 ---------- */
.nb-aplus__details { margin: 2.9rem 0 0; }
.nb-aplus__sub {
  margin: 0 0 1.2rem;
  font-size: .76rem;
  font-weight: 700;
  letter-spacing: .13em;
  text-transform: uppercase;
  color: var(--nb-muted);
  text-align: center;
}
.nb-aplus__dwrap {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: stretch;
  gap: 1.4rem;
}
.nb-aplus__ditem {
  /* flex-basis 用 auto 而不是固定值：只有一张 166px 小图 + 一个场景标签时，
     卡片会收紧到内容宽度（约 300px）居中；写成固定 400px 就会拉成 452px
     上限，内部留出两百多像素的空白，标签跟图片离得老远。 */
  flex: 0 1 auto;
  min-width: 280px;
  max-width: 452px;
  display: flex;
  align-items: flex-start;
  gap: 1.1rem;
  padding: 1rem;
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r);
  background: #fff;
}
.nb-aplus__dfig {
  flex: 0 0 auto;
  margin: 0;
  border-radius: var(--nb-r-sm);
  overflow: hidden;
  background: var(--nb-soft);
}
.nb-aplus__dfig img { display: block; width: 100%; height: auto; }
.nb-aplus__dbody { flex: 0 1 auto; min-width: 0; max-width: 250px; padding-top: .1rem; }
.nb-aplus__chip {
  display: inline-block;
  margin-bottom: .45rem;
  padding: .17rem .62rem;
  border: 1px solid #cfdcea;
  border-radius: var(--nb-pill);
  background: var(--nb-primary-l);
  font-size: .71rem;
  font-weight: 700;
  letter-spacing: .04em;
  color: var(--nb-primary);
}
.nb-aplus__dbody h4 { font-size: .96rem; margin: 0 0 .32rem; line-height: 1.4; }
.nb-aplus__dbody p { font-size: .85rem; line-height: 1.62; color: var(--nb-muted); margin: 0 0 .45rem; }
.nb-aplus__dbody p:last-child { margin-bottom: 0; }

/* ---------- 3. 品牌区 ---------- */
.nb-aplus__brand {
  margin: 2.9rem 0 0;
  padding: 1.5rem 1.7rem 1.7rem;
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-lg);
  background: var(--nb-soft);
}
.nb-aplus__eyebrow {
  margin: 0 0 1.15rem;
  font-size: .73rem;
  font-weight: 700;
  letter-spacing: .15em;
  text-transform: uppercase;
  color: var(--nb-primary);
}
.nb-aplus__binner {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 1.5rem 2.1rem;
}
/* LOGO 与数据卡用 <img> 的 width 属性决定固有尺寸，这里只兜住窄屏溢出；
   不要写 width:100%，否则 315px 的 LOGO 会被拉满整行。 */
.nb-aplus__blogo,
.nb-aplus__bcard { flex: 0 0 auto; margin: 0; }
.nb-aplus__blogo img,
.nb-aplus__bcard img { display: block; max-width: 100%; height: auto; }
.nb-aplus__bcard img {
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r);
  background: #fff;
}
/* 品牌正文限宽：不限的话一行会拉到 640px 以上（近百字符），读起来很累 */
.nb-aplus__btxt { flex: 1 1 320px; min-width: 0; max-width: 520px; }
.nb-aplus__btxt h3 { font-size: 1.12rem; margin: 0 0 .55rem; }
.nb-aplus__btxt p { font-size: .92rem; line-height: 1.72; color: var(--nb-body); margin: 0 0 .6rem; }
.nb-aplus__btxt p:last-child { margin-bottom: 0; }
/* 没有品牌文案、只剩一张品牌图时（实测 5 个商品属于这种）不要套灰底卡片框：
   框一画出来，四周的空白就变成「框内的空」，非常显眼；去掉框之后同样的空白
   只是正常的页面留白。 */
.nb-aplus__brand--bare {
  background: none;
  border: 0;
  border-radius: 0;
  padding: 0;
  text-align: center;
}
.nb-aplus__brand--bare .nb-aplus__binner { justify-content: center; }
.nb-aplus__brand--bare .nb-aplus__btxt { display: none; }

@media (max-width: 900px) {
  .nb-aplus__binner { gap: 1.3rem; }
  .nb-aplus__blogo { max-width: 208px !important; }
  .nb-aplus__bcard { max-width: 268px !important; }
}
@media (max-width: 640px) {
  .nb-aplus { margin-top: 2.6rem; padding-top: 2rem; }
  .nb-aplus__heroes { gap: 1.3rem; }
  .nb-aplus__ditem { flex: 1 1 100%; max-width: 100%; }
  .nb-aplus__brand { padding: 1.25rem 1.15rem 1.35rem; }
}
@media (max-width: 470px) {
  .nb-aplus__ditem { flex-direction: column; align-items: center; text-align: center; }
}

/* ==========================================================================
   30. 内链块
   ========================================================================== */
.nb-pdp-links {
  margin: 3rem 0 0;
  padding: 1.8rem 2rem;
  background: var(--nb-soft);
  border-radius: var(--nb-r);
}
.nb-pdp-links h2 { font-size: 1.1rem; margin: 0 0 1rem; }
.nb-pdp-links ul { list-style: none; margin: 0 !important; padding: 0 !important; display: flex; flex-wrap: wrap; gap: .55rem; }
.nb-pdp-links li { margin: 0 !important; }
.nb-pdp-links__cats a {
  display: inline-block;
  padding: .48em 1.05em;
  background: #fff;
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-pill);
  font-size: .87rem;
  color: var(--nb-ink-2);
  text-decoration: none;
  transition: border-color var(--nb-t), color var(--nb-t);
}
.nb-pdp-links__cats a:hover { border-color: var(--nb-primary); color: var(--nb-primary); }
.nb-pdp-links__help { margin-top: 1.1rem !important; }
.nb-pdp-links__help a { font-size: .84rem; color: var(--nb-muted); text-decoration: underline; }
.nb-pdp-links__help a:hover { color: var(--nb-primary); }

/* 归档页子类目内链 */
.nb-arc-links { margin: 3rem 0 0; border-top: 1px solid var(--nb-line); padding-top: 2.2rem; }
.nb-arc-links h2 { font-size: 1.2rem; margin: 0 0 1.1rem; }
.nb-arc-links ul { list-style: none; margin: 0 !important; padding: 0 !important; display: flex; flex-wrap: wrap; gap: .55rem; }
.nb-arc-links li { margin: 0 !important; }
.nb-arc-links a {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  padding: .5em 1.1em;
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-pill);
  font-size: .88rem;
  color: var(--nb-ink-2);
  text-decoration: none;
  background: #fff;
  transition: border-color var(--nb-t), color var(--nb-t);
}
.nb-arc-links a:hover { border-color: var(--nb-primary); color: var(--nb-primary); }
.nb-arc-links a span { font-size: .74rem; color: var(--nb-muted); }

/* ==========================================================================
   31. 面包屑（末级短标题 + 桌面端一行 70% 宽度内显示完整）
   ========================================================================== */
.storefront-breadcrumb > .col-full {
  max-width: var(--nb-wrap);
  width: 100%;
  margin-left: auto;
  margin-right: auto;
  padding-left: var(--nb-gutter);
  padding-right: var(--nb-gutter);
  box-sizing: border-box;
}
.woocommerce-breadcrumb {
  display: block;
  max-width: 70%;
  margin: 0 !important;
  text-align: left !important;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
@media (max-width: 1100px) {
  .woocommerce-breadcrumb { max-width: 88%; }
}
@media (max-width: 700px) {
  .woocommerce-breadcrumb { max-width: 100%; font-size: .78rem; }
}

/* ==========================================================================
   32. 页脚全类目内链墙
   ========================================================================== */
.nb-foot-cats {
  max-width: var(--nb-wrap);
  margin: 0 auto;
  padding: 2rem var(--nb-gutter) 0;
  border-top: 1px solid rgba(255, 255, 255, .18);
}
.nb-foot-cats h2 {
  font-size: .78rem;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, .70);
  margin: 0 0 1rem;
}
.nb-foot-cats ul {
  list-style: none;
  margin: 0 !important;
  padding: 0 !important;
  display: flex;
  flex-wrap: wrap;
  gap: .4rem;
}
.nb-foot-cats li { margin: 0 !important; }
.nb-foot-cats a {
  display: inline-block;
  padding: .34em .8em;
  font-size: .79rem;
  /* color 由第 15 节 .site-footer a:not(.button):not(.components-button)
     统一决定（rgba(255,255,255,.88)，13.06:1）。此处不再重复声明：
     写 .nb-foot-cats a（0,1,1）根本压不过 Storefront 的 inline 规则
     （0,3,1），留着只会形成「看似生效实则被忽略」的假象。 */
  text-decoration: none;
  border: 1px solid rgba(255, 255, 255, .36);   /* 3.30:1，满足 WCAG 1.4.11 对组件边界的 3:1 */
  border-radius: var(--nb-pill);
  transition: color var(--nb-t), border-color var(--nb-t);
}
.nb-foot-cats a:hover { color: #fff; border-color: rgba(255, 255, 255, .55); }
@media (max-width: 700px) {
  .nb-foot-cats { padding-top: 1.6rem; }
  .nb-foot-cats a { font-size: .75rem; padding: .3em .68em; }
}

/* =========================================================================
   33. 404 页面（2026-09-23 新增）
   -------------------------------------------------------------------------
   背景：vhost 里的 error_page 404 /404.html 会把所有 404 替换成 nginx
   静态页，主题 404 模板永远不会显示 —— 访客在死链上看到白板，站内也
   没有任何出口。该指令已注释，交还 WordPress 渲染，本区块负责让 404
   页有品牌感、有搜索、有真实内链。
   ========================================================================= */

.nb-404 { padding-bottom: 3rem; }

.nb-404-hero { text-align: center; padding: 3.2rem 0 1.4rem; }
.nb-404-code {
  margin: 0 0 .2rem;
  font-size: clamp(3rem, 8vw, 5.4rem);
  font-weight: 800;
  line-height: 1;
  letter-spacing: -.03em;
  color: var(--nb-primary);
  opacity: .16;
}
.nb-404 .nb-404-hero h1 {
  margin: 0 0 .7rem;
  font-size: clamp(1.45rem, 3vw, 2.1rem);
  color: var(--nb-ink);
}
.nb-404-lead {
  max-width: 44rem;
  margin: 0 auto 1.5rem;
  color: var(--nb-body);
  font-size: 1.02rem;
  line-height: 1.65;
}
.nb-404-search { max-width: 33rem; margin: 0 auto 1.5rem; }
/* 搜索框与按钮同一行：label 占满剩余宽度，submit 靠右 */
.nb-404-search .search-form {
  display: flex;
  gap: .5rem;
  align-items: stretch;
  margin: 0;
}
.nb-404-search .search-form label {
  flex: 1 1 auto;
  min-width: 0;
  margin: 0;
  display: block;
}
.nb-404-search .search-field,
.nb-404-search input[type="search"],
.nb-404-search input[type="text"] {
  height: 52px;
  border-radius: var(--nb-r);
  border: 1px solid var(--nb-line);
  padding: 0 1rem;
  font-size: 1rem;
  width: 100%;
}
.nb-404-search .search-submit,
.nb-404-search button[type="submit"] {
  height: 52px;
  border-radius: var(--nb-r);
  padding: 0 1.4rem;
  background: var(--nb-primary);
  color: #fff;
  border: 0;
  font-weight: 700;
  cursor: pointer;
}
.nb-404 .nb-btn-row { justify-content: center; }

.nb-404-cats {
  padding: 2.2rem 0 2.6rem;
  border-top: 1px solid var(--nb-line);
  margin-top: 1rem;
}
.nb-404-cats h2 { margin: 0 0 1.1rem; font-size: 1.18rem; color: var(--nb-ink); }
.nb-404-cat-grid {
  list-style: none;
  margin: 0 !important;
  padding: 0 !important;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(212px, 1fr));
  gap: .65rem;
}
.nb-404-cat-grid li { margin: 0 !important; }
.nb-404-cat-grid a {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .6rem;
  padding: .78rem 1rem;
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r);
  background: #fff;
  text-decoration: none;
  color: var(--nb-ink);
  font-weight: 600;
  transition: border-color var(--nb-t), box-shadow var(--nb-t), transform var(--nb-t), color var(--nb-t);
}
.nb-404-cat-grid a:hover {
  border-color: var(--nb-primary);
  box-shadow: var(--nb-sh-sm);
  transform: translateY(-1px);
  color: var(--nb-primary);
}
.nb-404-cat-n {
  flex: 0 0 auto;
  font-size: .78rem;
  font-weight: 700;
  color: var(--nb-muted);
  background: var(--nb-soft);
  border-radius: var(--nb-pill);
  padding: .12rem .52rem;
}
.nb-404-help { margin: 1.4rem 0 0; color: var(--nb-muted); font-size: .95rem; }
.nb-404-help a { color: var(--nb-primary); font-weight: 600; }

@media (max-width: 640px) {
  .nb-404-hero { padding-top: 2.2rem; }
  .nb-404-cat-grid { grid-template-columns: 1fr 1fr; }
}

/* -------------------------------------------------------------------------
   34. 类目 hero chips：回到父类目的入口
   -------------------------------------------------------------------------
   顶级类目的 chips 改为展示「自己的子类目」，子类目改为「父类目 + 兄弟」。
   其中父类目那一个用描边样式区分，让访客一眼看出这是上一级。
   ========================================================================= */
.nb-ah-chip--back {
  border-color: var(--nb-primary) !important;
  color: var(--nb-primary) !important;
  font-weight: 700;
}
.nb-ah-chip--back::before {
  content: "\2039\00a0";
  font-weight: 700;
}

/* -------------------------------------------------------------------------
   35. 移动端 Menu 按钮：去掉 Storefront 叠加的汉堡横线（v2.3.2）
   -------------------------------------------------------------------------
   Storefront 的 button.menu-toggle 用 ::before / ::after 两条 2px 横线，
   再配合 span::before 组成汉堡图标；我们的移动端样式同样用 ::before 画了
   三条渐变线。同名伪元素 ::before 被我们的规则覆盖，但 ::after 与
   span::before 仍然显示，三组线叠在一起糊成一团（放大看像乱码图形）。
   这里把 Storefront 那两条显式关掉，只保留我们画的那一个。

   同批修复的另一处（购物车徽标压住信任栏）见主体样式第 1729 行附近的
   .site-header { position: relative; } —— 那里才是根因所在。
   ========================================================================= */
@media (max-width: 767px) {
  .main-navigation .menu-toggle::after,
  .main-navigation .menu-toggle span::before {
    display: none;
  }
}

/* ==========================================================================
   36. 商品详情页 · ASIN / UPC 展示（v2.5.0 新增 / v2.8.0 移除 SKU）
   --------------------------------------------------------------------------
   ★ v2.8.0 需求（原文）：「删除产品显示页面 Product SKU 和 sku 字段内容」。

   页面上一共有三处 SKU，本次一并下线：
     ① 自建块 .nb-sku 里的「Product SKU」行（PHP 侧已移除节点）
     ② WooCommerce 原生行 —— .product_meta 里的第一个
        <span class="sku_wrapper">SKU: <span class="sku">NB-…</span></span>
        ★ 全站隐藏（含简单商品）。v2.7.0 之前只对变体商品隐藏，
          因为变体商品父 SKU 被清空后模板会渲染出假的「SKU: N/A」；
          而简单商品的这一行与自建块重复显示同一个 SKU，
          正是 Chris 反馈的「同一 SKU 显示两次」。
     ③ 规格表 Specifications 里的 SKU 行（PHP 侧已不再补该行）

   保留的是 ASIN 与 UPC —— 买家/客服真正需要、且对外可核对的标识符。
   **DOM 与结构化数据里的 SKU 未删除**，只是不再展示。

   布局要点（改动前必看）：
     · 自建块用 woocommerce_product_meta_end 插在 .product_meta 的**末尾**，
       靠 CSS flex order 提到前面。用 flex column 是关键：若用 absolute /
       负 margin 硬挪，父容器高度不会跟着变，会压住下方内容。
     · .product_meta 的 DOM 顺序是 sku_wrapper → posted_in → tagged_as → nb-sku；
       sku_wrapper 设 display:none 后不参与 flex 排序，剩余项按
       order 2 / 3 / 4 排，自建块仍在最前，与隐藏前视觉一致。
   ========================================================================== */

.woocommerce div.product .product_meta { display: flex; flex-direction: column; }
/* ★ v2.8.0：原生 SKU 行全站隐藏（不再只针对 .product-type-variable）。
   隐藏而非 PHP 移除，是为了把 SKU 留在 DOM 里备查，且无需过滤 woocommerce_product_meta。 */
.woocommerce div.product .product_meta > .sku_wrapper { display: none; }
.woocommerce div.product .product_meta > .nb-sku      { order: 2; }
.woocommerce div.product .product_meta > .posted_in   { order: 3; }
.woocommerce div.product .product_meta > .tagged_as   { order: 4; }

.nb-sku {
  display: flex;
  flex-direction: column;
  gap: .3rem;
  margin: .2rem 0 .7rem;
  padding: .6rem .8rem;
  background: #fff;
  border: 1px solid var(--nb-line);
  border-left: 3px solid var(--nb-primary);
  border-radius: var(--nb-r-sm);
}
.nb-sku__row {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: .5rem;
  margin: 0;
}
.nb-sku__label {
  flex: 0 0 6.8rem;
  font-size: .67rem;
  font-weight: 700;
  letter-spacing: .07em;
  text-transform: uppercase;
  color: var(--nb-muted);
}
.nb-sku__val {
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
  font-size: .84rem;
  font-weight: 600;
  color: var(--nb-ink);
  background: var(--nb-soft);
  padding: .2em .55em;
  border-radius: 5px;
  word-break: break-all;
}
.nb-sku__copy {
  flex: 0 0 auto;
  margin-left: auto;
  padding: .22em .78em;
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-pill);
  background: #fff;
  color: var(--nb-primary);
  font-size: .68rem;
  font-weight: 700;
  letter-spacing: .05em;
  line-height: 1.6;
  cursor: pointer;
  transition: background var(--nb-t), color var(--nb-t), border-color var(--nb-t);
}
.nb-sku__copy:hover { background: var(--nb-primary); border-color: var(--nb-primary); color: #fff; }
.nb-sku__copy.is-done { background: var(--nb-ok); border-color: var(--nb-ok); color: #fff; }
@media (max-width: 560px) {
  .nb-sku__label { flex: 0 0 auto; }
  .nb-sku__row { gap: .35rem .5rem; }
  .nb-sku__val { font-size: .78rem; }
}

/* ==========================================================================
   37. 商品详情页 · 变体选择器（亚马逊风格，v2.5.0 新增）
   --------------------------------------------------------------------------
   亚马逊的变体交互是「轴标题 + 一排按钮/色块」，而不是下拉框：
   下拉框看不出有多少个选项、也看不出颜色。这里把 WooCommerce 的 <select>
   换成按钮组，但**原生 select 保留在 DOM 里**（视觉隐藏）——
   表单提交、WooCommerce 的可用性计算（哪些组合无货）都仍然由它承担，
   我们只做外观替换 + 事件转发，不重写任何业务逻辑。

   ★ v2.9.0 起行为变了：点按钮不再原地换图，而是**整页跳转**到该变体的
     独立 URL（/product/{父}/{变体}/，见 inc/nb-variant-page.php），
     与亚马逊的「一个变体一个页面」一致。原地联动只在服务端没给
     _urls 时作为降级保留。

   ★ v2.9.1 起可用性口径也变了（这是本节的第二个关键点）：
     · 按钮集合 = 服务端 nb_var_axes_json() 过滤后的取值 —— 只保留
       「至少存在于一个可售组合」的，真正的死键根本不会被渲染出来；
     · is-off 只表示「与其余轴当前取值凑不成精确组合，点它会连带切换
       另一个轴」，**不禁用、可点击**（详见下方 .is-off 注释）。
     因此本节的视觉规则要保证「弱化 ≠ 不可用」这件事一眼能分出来。
   ========================================================================== */

/* 原生 select：视觉隐藏但保留在无障碍树**之外**，因为按钮组已承担交互 */
.woocommerce div.product .variations select.nb-sw__native {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  min-height: 0 !important;
  padding: 0 !important;
  margin: -1px !important;
  border: 0 !important;
  overflow: hidden !important;
  clip: rect(0 0 0 0) !important;
  clip-path: inset(50%) !important;
  white-space: nowrap !important;
}

/* 轴块：标题在上、按钮组在下（Amazon 的堆叠式布局） */
.woocommerce div.product .variations,
.woocommerce div.product .variations tbody { display: block; width: 100%; border: 0; margin: 0; }
.woocommerce div.product .variations tr { display: block; margin: 0 0 1.05rem; }
.woocommerce div.product .variations th.label,
.woocommerce div.product .variations td.value {
  display: block;
  width: 100%;
  padding: 0;
  border: 0;
  background: none;
  text-align: left;
  vertical-align: top;
}
.woocommerce div.product .variations th.label { margin: 0 0 .5rem; }
.woocommerce div.product .variations th.label label {
  display: block;
  font-size: .82rem;
  font-weight: 700;
  color: var(--nb-ink);
  letter-spacing: .01em;
}
.woocommerce div.product .variations td.value { position: relative; }

.nb-sw { display: flex; flex-wrap: wrap; gap: .45rem; margin: 0; }

.nb-sw__opt {
  display: inline-flex;
  align-items: center;
  gap: .42rem;
  min-height: 42px;
  padding: .38rem .9rem;
  border: 1.5px solid var(--nb-line);
  border-radius: var(--nb-r-sm);
  background: #fff;
  color: var(--nb-ink);
  font-size: .85rem;
  font-weight: 600;
  line-height: 1.15;
  cursor: pointer;
  transition: border-color var(--nb-t), box-shadow var(--nb-t),
              background var(--nb-t), color var(--nb-t);
}
/* 悬停/聚焦 = 主图正在预览该取值，用主色呼应，让「鼠标动一下就能看图」
   这件事被看见（不然买家不知道可以悬停） */
.nb-sw__opt:hover:not(:disabled),
.nb-sw__opt:focus-visible { border-color: var(--nb-primary); color: var(--nb-primary); }
.nb-sw__opt:focus-visible { outline: 2px solid var(--nb-primary); outline-offset: 2px; }
.nb-sw__opt.is-on {
  border-color: var(--nb-ink);
  box-shadow: inset 0 0 0 1px var(--nb-ink);
  background: var(--nb-primary-l);
}

/* ★ v3.6.0 语义回正（报告 P0-2）：is-off = 「与其余轴当前取值凑不成组合」，
   真实不可得 —— 置灰、加删除线、不跳转，点击只给一条行内提示。
   v2.9.1 那版把 is-off 当成「能点、但会连带切换另一个轴」，撤掉了禁用观感；
   实测这正是错发的来源（选 Black 再点 King，入车的是 Grey + Queen），
   所以把「不可用」的视觉重新加回来，与 :disabled 同族但仍保留 click
   （disabled 的按钮收不到 click，提示就发不出来）。 */
.nb-sw__opt.is-off {
  color: #9aa6b2;
  border-color: var(--nb-line);
  background: #fbfcfd;
  cursor: not-allowed;
}
.nb-sw__opt.is-off .nb-sw__txt { text-decoration: line-through; }
.nb-sw__opt.is-off .nb-sw__dot { opacity: .45; }
.nb-sw__opt.is-off:hover { border-color: var(--nb-line); color: #9aa6b2; }

/* 不可用组合的行内提示（kmfurnila.js 的 showHint）。
   用 accent 系暖色，与站内 .nb-note 的蓝灰提示区分开 —— 这是一条
   「你这个组合不存在」的即时反馈，不是说明性文案。 */
.nb-sw__hint {
  margin: .5rem 0 0;
  padding: .45rem .65rem;
  border: 1px solid #f0d6bd;
  border-left: 3px solid var(--nb-accent);
  border-radius: var(--nb-r-sm);
  background: #fdf6ef;
  color: #8a4a16;
  font-size: .78rem;
  font-weight: 600;
  line-height: 1.45;
}
.nb-sw__hint[hidden] { display: none; }

/* 原生 select 里确实被 WooCommerce 标 disabled 的（降级模式）仍按禁用处理 */
.nb-sw__opt:disabled {
  color: #b3bcc7;
  border-color: var(--nb-line);
  background: repeating-linear-gradient(135deg, #fbfcfd, #fbfcfd 5px, #f1f4f8 5px, #f1f4f8 10px);
  cursor: not-allowed;
}
.nb-sw__opt:disabled .nb-sw__txt { text-decoration: line-through; }
.nb-sw__opt:disabled .nb-sw__dot { opacity: .35; }

.nb-sw--color .nb-sw__opt { padding-left: .62rem; }
.nb-sw__dot {
  flex: 0 0 auto;
  width: 18px;
  height: 18px;
  border-radius: 50%;
  box-shadow: inset 0 0 0 1px rgba(14, 31, 51, .16);
}
.nb-sw__txt { white-space: nowrap; }

/* 清空选择 */
.woocommerce div.product .variations .reset_variations {
  display: inline-block;
  margin: .1rem 0 0;
  font-size: .76rem;
  color: var(--nb-muted);
  text-decoration: underline;
}

@media (max-width: 560px) {
  .nb-sw__opt { min-height: 40px; padding: .34rem .72rem; font-size: .82rem; }
  .nb-sw { gap: .38rem; }
}

/* ==========================================================================
   38. 商品详情页 · 商品级 FAQ（v2.5.0 新增）
   --------------------------------------------------------------------------
   用 <details>/<summary> 原生折叠，不依赖 JS。可见文本与 nb-seo.php 输出的
   FAQPage 结构化数据逐字一致（同一份 nb_product_faq() 数据），
   避免出现「标记了但页面看不到」的作弊信号。
   ========================================================================== */

.nb-faq { margin: 2.4rem 0 1rem; }
.nb-faq h2 { margin: 0 0 1rem; font-size: 1.24rem; color: var(--nb-ink); }
.nb-faq__list { display: grid; gap: .55rem; }

.nb-faq__item {
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-sm);
  background: #fff;
  overflow: hidden;
}
.nb-faq__item > summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: .85rem 1rem;
  cursor: pointer;
  list-style: none;
  transition: background var(--nb-t);
}
.nb-faq__item > summary::-webkit-details-marker { display: none; }
.nb-faq__item > summary:hover { background: var(--nb-soft); }
.nb-faq__item > summary h3 {
  margin: 0;
  font-size: .95rem;
  font-weight: 600;
  color: var(--nb-ink);
}
.nb-faq__item > summary::after {
  content: '';
  flex: 0 0 auto;
  width: .5rem;
  height: .5rem;
  margin-right: .25rem;
  border-right: 2px solid var(--nb-muted);
  border-bottom: 2px solid var(--nb-muted);
  transform: rotate(45deg);
  transition: transform var(--nb-t);
}
.nb-faq__item[open] > summary { background: var(--nb-soft); }
.nb-faq__item[open] > summary::after { transform: rotate(-135deg); }
.nb-faq__ans { padding: 0 1rem 1rem; }
.nb-faq__ans p { margin: 0; color: var(--nb-body); font-size: .92rem; line-height: 1.7; }

/* ==========================================================================
   39. 销售区域提示（仅配送美国，v2.6.0 新增）
   --------------------------------------------------------------------------
   插在购物车 / 结账页内容最顶部（由 inc/nb-geo.php 用 render_block 过滤
   woocommerce/cart 与 woocommerce/checkout 插入）。
   用意：让访客在**开始填地址之前**就知道只发美国，而不是填完一整页
   再被「无可用配送方式」拒掉。
   ★ Blocks 版的购物车与结账由前端 JS 渲染，不触发经典模板钩子，
     所以提示必须走 render_block 在服务端注入。
   ========================================================================== */

.nb-geo-note {
  display: flex;
  align-items: flex-start;
  gap: .6rem;
  margin: 0 0 1.3rem;
  padding: .75rem 1rem;
  border: 1px solid var(--nb-line);
  border-left: 3px solid var(--nb-primary);
  border-radius: var(--nb-r-sm);
  background: var(--nb-primary-l);
  color: var(--nb-ink);
  font-size: .88rem;
  line-height: 1.6;
}
.nb-geo-note > svg {
  flex: 0 0 auto;
  margin-top: .15rem;
  color: var(--nb-primary);
}
.nb-geo-note b { font-weight: 700; }

@media (max-width: 767px) {
  .nb-geo-note { padding: .7rem .85rem; font-size: .84rem; }
}

/* ==========================================================================
   40. 变体独立页面（v2.9.0 新增）
   --------------------------------------------------------------------------
   背景：变体商品不再用「单页 + JS 原地换图」，改为**每个变体一个独立 URL**
   （/product/{父slug}/{变体slug}/），点色块整页跳转，与亚马逊一致。
   这一节只负责新增的可见元素，不引入任何与父商品页不同的布局差异。

   A. .nb-vp-axis —— H1 正下方的「当前变体」标识条
      为什么不用改 H1：本站商品标题本身常以颜色/尺寸结尾（"...Pink"），
      直接改 H1 会重复，且 H1 唯一性在前几轮已验收过，不宜扰动。
      变体词由 <title> 与 JSON-LD 承担 SEO，这一行负责让买家一眼确认
      「我现在看到的是哪个变体」——这正是本次改造的诉求。
   ========================================================================== */

.nb-vp-axis {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: .3rem .95rem;
  margin: .15rem 0 .95rem;
  font-size: .92rem;
  line-height: 1.5;
}
.nb-vp-axis__i {
  display: inline-flex;
  align-items: baseline;
  gap: .38rem;
}
.nb-vp-axis__k {
  color: var(--nb-muted);
}
.nb-vp-axis__v {
  font-weight: 700;
  color: var(--nb-primary);
  /* 变体值是买家要核对的信息，用主色突出，但不加背景以免与价格抢视线 */
}
/* 移动端：字号略收，与摘要区其余行对齐 */
@media (max-width: 767px) {
  .nb-vp-axis { font-size: .88rem; gap: .25rem .8rem; margin-bottom: .85rem; }
}

/* ==========================================================================
   41. v3.0.0 · 星级半星 + 正文增强 + 类目导购
   --------------------------------------------------------------------------
   本节的三个模块共用一条数据主线：把「已经在站内、但只在表格或标签页里」
   的信息，变成页面主体上可读、可被搜索引擎引用的内容。
   ========================================================================== */

/* --- 41a. 半星 ------------------------------------------------------------
   两层叠加：外层灰星打底，内层实心星被裁掉右半边。
   用 clip 而不是渐变，是为了避免 <defs id> 在同一页面重复出现（一个列表页
   会有几十组星级），也避免某些解析器对 url(#id) 的兼容问题。 */
.nb-stars__half { position: relative; display: inline-block; line-height: 0; }
.nb-stars__clip {
  position: absolute;
  left: 0; top: 0;
  width: 50%;
  height: 100%;
  overflow: hidden;
  display: block;
}
.nb-stars__clip svg { display: block; }

/* 商品卡里的星级与数字、评论数对齐 */
ul.products li.product .nb-stars--card { vertical-align: -1px; }
ul.products li.product .nb-stars--card .nb-stars__i { width: 13px; height: 13px; }
ul.products li.product .nb-stars--card .nb-stars__half { width: 13px; height: 13px; }
/* ★ 千万不要把 .nb-stars__clip 也写进上面这条 —— 它的宽度必须是 50%，
   若被设成 13px 就覆盖了裁切，半星会被画成整星（v3.0.5 实测踩到）。
   clip 的尺寸只由基础规则决定：width:50% / height:100%。 */

/* --- 41b. 详情页「真实使用体验」-------------------------------------------- */
.nb-owners {
  /* ★ 2026-10-03：原为 max-width:1080px + margin:auto（居中窄卡），比同页
     .wc-tabs-wrapper / .nb-aplus / .nb-faq / .nb-pdp-links（实测均 1392px，
     撑满 #primary）窄 312px、左右各留 180px 空白。改为撑满父容器。 */
  max-width: none;
  margin: 2.4rem 0 0;
  padding: 1.8rem 2.1rem;
  background: #fff;
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r);
}
/* 宽度放开后单栏正文会拉到 1300px+（约 150 字符/行），可读性反而下降。
   故内部改两栏：左栏放叙述内容（引言 / 评论归纳 / 购买前须知），右栏放
   可枚举的规格清单与出处说明。1000px 以下降回单栏。 */
.nb-owners__grid {
  display: grid;
  grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr);
  gap: 3rem;
  align-items: start;
}
.nb-owners__main,
.nb-owners__side { min-width: 0; }
.nb-owners__side {
  padding-left: 3rem;
  border-left: 1px solid var(--nb-line);
}
.nb-owners__main > :first-child,
.nb-owners__side > :first-child { margin-top: 0; }
@media (max-width: 1000px) {
  .nb-owners__grid { grid-template-columns: 1fr; gap: 1.4rem; }
  .nb-owners__side {
    padding-left: 0;
    border-left: 0;
    border-top: 1px solid var(--nb-line);
    padding-top: 1.3rem;
  }
}
.nb-owners__title { margin: 0 0 .9rem; font-size: 1.35rem; }
.nb-owners__lead { font-size: 1rem; line-height: 1.75; color: var(--nb-ink-2); margin: 0 0 1rem; }
.nb-owners__lead strong { color: var(--nb-ink); }
/* P1-2 兜底段落：亚马逊侧无 customer_say 时用规格生成的正文 */
.nb-owners__brief { font-size: 1rem; line-height: 1.75; color: var(--nb-ink-2); margin: 0 0 1.1rem; }
.nb-owners h3 {
  margin: 1.5rem 0 .7rem;
  font-size: .95rem;
  letter-spacing: .02em;
  text-transform: uppercase;
  color: var(--nb-muted);
}
.nb-owners__topics { margin: 0; }
.nb-owners__topics dt {
  font-weight: 700;
  color: var(--nb-ink);
  font-size: .98rem;
  margin-top: .9rem;
}
.nb-owners__topics dt span {
  font-weight: 500;
  font-size: .78rem;
  color: var(--nb-muted);
  margin-left: .45rem;
  white-space: nowrap;
}
.nb-owners__topics dd {
  margin: .25rem 0 0;
  font-size: .92rem;
  line-height: 1.7;
  color: var(--nb-ink-2);
}
.nb-owners__facts {
  margin: 0;
  padding-left: 1.15rem;
  list-style: disc;
}
.nb-owners__facts li {
  font-size: .92rem;
  line-height: 1.7;
  color: var(--nb-ink-2);
  margin-bottom: .4rem;
}
.nb-owners__src {
  margin: 1.4rem 0 0;
  padding-top: .9rem;
  border-top: 1px solid var(--nb-line);
  font-size: .8rem;
  line-height: 1.6;
  color: var(--nb-muted);
}
.nb-owners__src a { color: var(--nb-primary); }

/* --- 41c. 详情页「同品类商品」卡片 ----------------------------------------- */
/* ★ 2026-10-03：与 .nb-owners 同步去掉 1080px 窄卡限制 —— 该块同为商品页
   SEO 内容块，只改一块会制造新的左右缩进不一致。撑满后 3 列卡片由
   349px 增至 453px。 */
.nb-peers { max-width: none; margin: 2.4rem 0 0; }
.nb-peers > h2 { margin: 0 0 1rem; font-size: 1.35rem; }
.nb-peers__grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1rem;
  margin: 0 !important;
  padding: 0 !important;
  list-style: none !important;
}
.nb-peers__i { margin: 0 !important; list-style: none !important; }
.nb-peers__i > a {
  display: flex;
  flex-direction: column;
  height: 100%;
  padding: .9rem;
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r);
  background: #fff;
  transition: box-shadow var(--nb-t), transform var(--nb-t), border-color var(--nb-t);
}
.nb-peers__i > a:hover { transform: translateY(-3px); box-shadow: var(--nb-sh-md); border-color: #dfe5ee; }
.nb-peers__media {
  display: flex;
  align-items: center;
  justify-content: center;
  aspect-ratio: 1 / 1;
  margin-bottom: .6rem;
  overflow: hidden;
}
.nb-peers__media img { width: 100%; height: 100%; object-fit: contain; }
.nb-peers__t {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  font-size: .86rem;
  font-weight: 600;
  line-height: 1.45;
  color: var(--nb-ink);
  min-height: calc(2 * 1.45em);
}
.nb-peers__p { margin-top: .35rem; font-size: .95rem; font-weight: 700; color: var(--nb-ink); }
.nb-peers__p del { color: var(--nb-muted); font-weight: 500; font-size: .85em; }
.nb-peers__p ins { text-decoration: none; }

/* --- 41d. 类目页导购正文 --------------------------------------------------- */
.nb-arc-guide {
  clear: both;
  max-width: 1080px;
  margin: 2.6rem auto 0;
  padding: 1.7rem 1.9rem;
  background: #fff;
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r);
}
.nb-arc-guide > h2 { margin: 0 0 .9rem; font-size: 1.4rem; }
.nb-arc-guide p { font-size: .95rem; line-height: 1.8; color: var(--nb-ink-2); margin: 0 0 .95rem; }
.nb-arc-guide h3 {
  margin: 1.5rem 0 .7rem;
  font-size: .95rem;
  letter-spacing: .02em;
  text-transform: uppercase;
  color: var(--nb-muted);
}
.nb-arc-top { margin: 0 !important; padding: 0 !important; list-style: none !important; }
.nb-arc-top li {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
  padding: .6rem 0;
  border-bottom: 1px dashed var(--nb-line);
  margin: 0 !important;
  list-style: none !important;
}
.nb-arc-top li:last-child { border-bottom: 0; }
.nb-arc-top a { font-size: .93rem; font-weight: 600; color: var(--nb-primary); }
.nb-arc-top a:hover { text-decoration: underline; }
.nb-arc-top__m { font-size: .8rem; color: var(--nb-muted); white-space: nowrap; }
.nb-arc-faq details {
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-sm);
  margin-bottom: .6rem;
  background: #fff;
}
.nb-arc-faq summary {
  cursor: pointer;
  padding: .85rem 1rem;
  font-size: .92rem;
  font-weight: 600;
  color: var(--nb-ink);
  list-style: none;
}
.nb-arc-faq summary::-webkit-details-marker { display: none; }
.nb-arc-faq summary::after { content: '+'; float: right; color: var(--nb-muted); font-weight: 700; }
.nb-arc-faq details[open] summary::after { content: '\2212'; }
.nb-arc-faq__a { padding: 0 1rem 1rem; font-size: .9rem; line-height: 1.75; color: var(--nb-ink-2); }

@media (max-width: 900px) {
  .nb-peers__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 767px) {
  .nb-owners, .nb-arc-guide { padding: 1.2rem 1.1rem; margin-top: 1.8rem; }
  .nb-owners__title, .nb-peers > h2, .nb-arc-guide > h2 { font-size: 1.15rem; }
  .nb-arc-top li { flex-direction: column; align-items: flex-start; gap: .2rem; }
}
@media (max-width: 480px) {
  .nb-peers__grid { grid-template-columns: 1fr; }
}

/* ==========================================================================
   42. 搜索结果页（v3.1.0 新增）
   --------------------------------------------------------------------------
   搜索逻辑见 inc/nb-search.php；结果网格直接复用第 9 节的商品卡
   （ul.products li.product），此处不重复定义卡片样式。
   ========================================================================== */

/* 42a hero —— 复用 .nb-archive-hero，只补「按代码匹配」那一行 */
/* 搜索结果页复用同一个 hero，窄栏观感与类目页一致，一并放开为通栏 */
.nb-search-hero .nb-ah-desc { max-width: none; }
/* 2026-10-04：类目页 hero 重排时把 .nb-archive-hero 下的 h1 与 .nb-ah-count 外边距
   归零（改为靠 .nb-ah-head 撑间距）。搜索页复用了同一个类名，会跟着少掉
   0.45rem + 0.6rem 的垂直间距。这里显式补回来，保证搜索页与改动前完全一致。 */
.nb-search-hero h1 { margin: 0 0 .45rem; }
.nb-search-hero .nb-ah-count { margin: .6rem 0 0; }

.nb-search-code {
  margin: .5rem 0 0;
  font-size: .92rem;
  font-weight: 600;
  color: var(--nb-primary);
}
.nb-search-code code {
  background: var(--nb-primary-l);
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r-sm);
  padding: .1rem .5rem;
  font-size: .88rem;
  letter-spacing: .06em;
  color: var(--nb-primary-d);
}

/* 42b 空结果：给口径提示 + 重新搜索 + 类目入口，替代父主题的 “Nothing Found” */
.nb-search-empty {
  background: #fff;
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-r);
  box-shadow: var(--nb-sh-sm);
  padding: 2.6rem 2rem;
  margin: 1.4rem auto 2rem;
  max-width: 780px;
  text-align: center;
}
.nb-search-empty .nb-se-title {
  margin: 0 0 .8rem;
  font-size: clamp(1.2rem, 2.4vw, 1.5rem);
  color: var(--nb-ink);
}
.nb-search-empty .nb-se-tips {
  margin: 0 auto 1.5rem;
  max-width: 58ch;
  color: var(--nb-body);
  font-size: .95rem;
  line-height: 1.7;
}
.nb-search-empty .nb-se-form { max-width: 32rem; margin: 0 auto 1.8rem; }
/* 输入框与按钮同一行，与 404 页同款 */
.nb-search-empty .woocommerce-product-search,
.nb-search-empty .search-form {
  display: flex;
  gap: .5rem;
  align-items: stretch;
  margin: 0;
}
.nb-search-empty .woocommerce-product-search label,
.nb-search-empty .search-form label { flex: 1 1 auto; min-width: 0; margin: 0; display: block; }
.nb-search-empty .search-field,
.nb-search-empty input[type="search"] {
  height: 50px;
  width: 100%;
  border-radius: var(--nb-r);
  border: 1px solid var(--nb-line);
  padding: 0 1rem;
  font-size: 1rem;
}
.nb-search-empty button[type="submit"],
.nb-search-empty .search-submit {
  height: 50px;
  border-radius: var(--nb-r);
  padding: 0 1.4rem;
  background: var(--nb-primary);
  color: #fff;
  border: 0;
  font-weight: 700;
  cursor: pointer;
  white-space: nowrap;
}
.nb-search-empty button[type="submit"]:hover { background: var(--nb-primary-d); }

.nb-search-empty .nb-se-follow {
  margin: 0 0 .9rem;
  font-size: .82rem;
  text-transform: uppercase;
  letter-spacing: .1em;
  color: var(--nb-muted);
}
.nb-se-cats { display: flex; flex-wrap: wrap; gap: .5rem; justify-content: center; }
.nb-se-cats .nb-ah-chip { font-size: .9rem; }
.nb-se-cats .nb-ah-chip span { color: inherit; opacity: .7; font-weight: 400; }

@media (max-width: 767px) {
  .nb-search-empty { padding: 1.8rem 1.1rem; }
  .nb-search-empty .nb-se-form { max-width: none; }
}
/* nb-ia-nav-d-20260927 */
/* ==========================================================================
   IA 重构补丁 D：移动端 handheld 导航 = 原生手风琴 + 可见展开按钮
   --------------------------------------------------------------------------
   桌面：Storefront 原生三级下拉（hover 右展），无需改动。
   触屏：Storefront 自带手风琴 ——
     `.handheld-navigation ul.menu .sub-menu{visibility:hidden;opacity:0;max-height:0}`
     `.handheld-navigation ul.menu .sub-menu.toggled-on{visibility:visible;max-height:9999px;opacity:1}`
   由它的 JS 在每个 `.menu-item-has-children > a` 后注入
   `<button class="dropdown-toggle">` 来切换。但该按钮默认透明、无图标，
   用户既看不到也点不到 —— 于是「展开菜单后只看到 5 个顶层项，
   11 个一级类目 / 43 个二级类目全部不可达」。本补丁只做三件事：
     1) 把按钮显形为右侧雪佛龙 + 47x58px 触控区；
     2) 中和主题桌面下拉规则（.main-navigation ul.menu ul.sub-menu 无媒体查询，
        触屏下也生效）为静态堆叠；
     3) 顶层 ul 强制块级流 —— 主题 `.main-navigation ul.menu{display:flex}` 是
        后代选择器，同样命中 handheld 内那个 ul，会把顶层 5 项排成一行
        （Contact 直接被挤出屏外，实测 handheld 高仅 94px）。
   左侧文字仍是普通链接（进类目页），右侧箭头专管展开，互不干扰。
   Storefront JS 对 current-menu-ancestor 分支会自动 toggled-on ——
   即「当前所在类目」的上级在移动端自动展开，白得一份面包屑式定位。
   ========================================================================== */
@media (max-width: 767px) {
  /* 3) 顶层改块级流（必须先复位，否则下面全是横向排列） */
  .handheld-navigation ul.menu {
    display: block !important;
    flex-wrap: wrap !important;
    margin: .35rem 0 0 !important;
    padding: 0 !important;
    width: auto !important;
    min-width: 0 !important;
  }
  .handheld-navigation ul.menu > li {
    display: block !important;
    float: none !important;
    width: auto !important;
  }
  .handheld-navigation ul.menu > li > a { display: block !important; }

  /* 2) 中和桌面下拉外观（主题规则无媒体查询，触屏下同样命中） */
  .handheld-navigation ul.menu .sub-menu,
  .handheld-navigation ul.menu ul.sub-menu,
  .handheld-navigation ul.menu ul.sub-menu ul.sub-menu {
    position: static !important;
    top: auto !important;
    left: auto !important;
    width: auto !important;
    min-width: 0 !important;
    margin: 0 !important;
    background: transparent !important;
    border: 0 !important;
    border-radius: 0 !important;
    box-shadow: none !important;
    transform: none !important;
    overflow: visible !important;
    padding: .06rem 0 .3rem .9rem !important;
  }

  /* 层级视觉：二级 / 三级左侧细分隔线，缩进递增 */
  .handheld-navigation ul.menu > li > ul.sub-menu {
    border-left: 2px solid var(--nb-line) !important;
    margin: .1rem 0 .45rem .3rem !important;
  }
  .handheld-navigation ul.menu ul.sub-menu ul.sub-menu {
    border-left: 2px solid var(--nb-line) !important;
    margin: 0 0 .3rem .2rem !important;
  }
  .handheld-navigation ul.menu ul.sub-menu li { border-bottom: 0 !important; }
  .handheld-navigation ul.menu > li > ul.sub-menu > li > a { font-weight: 600; }

  /* 1) 展开按钮显形 */
  .handheld-navigation ul.menu .menu-item-has-children > a { padding-right: 3.1em !important; }
  /* 顶层父级文字后的 5px 小箭头（主题 .main-navigation ul.menu > li.menu-item-has-children > a::after）
     在触屏下与右侧按钮箭头重复，且它属于 <a> 内部 —— 点它会跳转而非展开，误导性强，隐藏之 */
  .handheld-navigation ul.menu > li.menu-item-has-children > a::after { display: none !important; }
  .handheld-navigation .dropdown-toggle {
    display: block !important;
    position: absolute !important;
    top: 0 !important;
    right: 0 !important;
    left: auto !important;
    width: 3em !important;
    height: 100% !important;
    max-height: 58px !important;
    min-height: 44px !important;
    margin: 0 !important;
    border: 0 !important;
    border-radius: 0 !important;
    background: transparent !important;
    color: var(--nb-ink) !important;
    cursor: pointer;
  }
  .handheld-navigation .dropdown-toggle::after {
    content: "" !important;
    display: block !important;
    width: 8px !important;
    height: 8px !important;
    margin: 0 auto !important;
    border-right: 2px solid currentColor !important;
    border-bottom: 2px solid currentColor !important;
    transform: rotate(45deg) translate(-1px, -1px) !important;
    transition: transform .25s ease;
  }
  .handheld-navigation .dropdown-toggle.toggled-on::after {
    transform: rotate(225deg) translate(-2px, -2px) !important;
  }

  /* 4) 容器限高滚动 */
  .main-navigation.toggled .handheld-navigation {
    max-height: calc(100vh - 150px) !important;
    overflow-y: auto !important;
    -webkit-overflow-scrolling: touch;
  }
}
/* nb-nav-hover-fix-20260927 */
/* ==========================================================================
   桌面下拉「鼠标下移即消失」修复（2026-09-27）
   --------------------------------------------------------------------------
   现象：悬停「Shop by Category」下拉会展开，但指针继续下移去点二级菜单时
        面板立刻消失，只能用点击维持展开。
   实测成因（Chrome 1440x900，非推测）：
     1) 视觉间隙变成命中死区。子主题给面板留了 top: calc(100% + 8px)，
        父项 <li> 的命中盒下沿到面板上沿之间是一条 8px 空带。
        实测指针停在该带内时 elementFromPoint 命中的是 .col-full，
        面板 computed visibility 立刻回到 hidden。
     2) 父主题把桌面下拉也当触屏处理。Storefront navigation.js 判据为
        ('ontouchstart' in window || navigator.maxTouchPoints) && innerWidth > 767，
        而 Chrome 桌面版 'ontouchstart' in window 恒为 true ——
        于是桌面下拉同样被打上 sub-menu--is-touch-device，默认 display:none。
        display 不参与过渡：丢掉 hover 的瞬间面板直接消失，连淡出都没有，
        也就没有「淡出期间仍可命中」的缓冲。
   修法：
     A) 上面 .main-navigation ul.menu ul.sub-menu 已补 display: block，
        隐藏态变为「有布局 + visibility/opacity」，淡出可过渡且期间仍可命中；
     B) 本节的透明桥把顶层父项命中区向下延伸，覆盖 8px 间隙，
        并留出隐藏态 translateY(6px) 的滑动余量。
        桥只在 :hover / .focus 时生成 —— 不悬停时不生成，
        因此不会在导航栏下方留下遮挡内容点击的透明条。
   作用域：仅桌面（>=768px）的 .primary-navigation。
        移动端是 .handheld-navigation 手风琴（补丁 D 接管），不受影响。
   ========================================================================== */
@media (min-width: 768px) {
  .main-navigation .primary-navigation ul.menu > li.menu-item-has-children:hover::before,
  .main-navigation .primary-navigation ul.menu > li.menu-item-has-children.focus::before {
    content: "";
    position: absolute;
    top: 100%;
    left: 0;
    width: 100%;
    min-width: 248px;
    height: 16px;
  }
}
/* nb-sticky-nowrap-20260927 */
/* ==========================================================================
   sticky add-to-cart：按钮文案「Add to cart / Select options」始终单行显示
   --------------------------------------------------------------------------
   现象：桌面窄窗口（实测 Chromium 900px 宽）下吸顶条按钮文字折成两行
        （Add to / cart），按钮高 51px → 76px，吸顶条整体变高。
   根因：.storefront-sticky-add-to-cart__content 是 flex 容器，按钮只有
        margin-left:auto，computed = flex:0 1 auto（可收缩）+ white-space:normal
        （可断行）→ 标题较长时按钮被压到 121px < 所需 125px，文字换行。
   修法：按钮不收缩 + 不断行；info 允许收缩，避免按钮被 overflow:hidden 裁掉。
   注意：只作用于 Storefront 吸顶条，不触及其它 .button / .single_add_to_cart_button。
   ========================================================================== */
.storefront-sticky-add-to-cart__content {
  flex-wrap: nowrap !important;
}
.storefront-sticky-add-to-cart__content-product-info {
  flex: 1 1 auto !important;
  min-width: 0 !important;
}
.storefront-sticky-add-to-cart__content-title {
  overflow: hidden !important;
  text-overflow: ellipsis !important;
  white-space: nowrap !important;
}
.storefront-sticky-add-to-cart__content-price {
  white-space: nowrap !important;
}
.storefront-sticky-add-to-cart__content-button {
  flex: 0 0 auto !important;
  white-space: nowrap !important;
  overflow-wrap: normal !important;
  word-break: normal !important;
  text-align: center !important;
}

/* =========================================================================
   A+ 文案层（v3.5.0 / 第 31 轮 SEO-GEO 升级）
   -------------------------------------------------------------------------
   为什么需要这一段：
     · 3.4.9 之前 A+ 每张图只有 <img>，图上的标题与说明是烧进像素里的，
       爬虫与生成式引擎都读不到 → 本段给 figcaption 里的 h3 / p / .chip 定位与配色。
     · ★ CSS 同名选择器「后者胜出」：本段全部用后置覆盖，不改动上面的老规则，
       这样回滚时只要删掉本段，老样式立即恢复。
     · 语义标签换了（strong/span → h3/p），老规则 .nb-aplus__hcap strong 不再命中，
       所以必须为 h3 / p 重新给一套 —— 不是「加样式」而是「补样式」。
   ========================================================================= */

/* ---------- figcaption 内的标题（H3 级，落在商品页 H2 之下） ---------- */
.nb-aplus__htitle {
  margin: 0 0 .38rem;
  font-size: 1.06rem;
  font-weight: 700;
  line-height: 1.34;
  letter-spacing: -.01em;
  color: var(--nb-text);
}
.nb-aplus__htext {
  margin: 0;
  font-size: .91rem;
  line-height: 1.68;
  color: var(--nb-muted);
}
/* 说明里出现尺寸/承重等数字时不做任何自动加粗，避免把营销词堆成关键词农场 */
.nb-aplus__htext strong { font-weight: 700; color: var(--nb-text); }

/* ---------- 关键词行 ---------- */
.nb-aplus__hkeys {
  margin: .62rem 0 0;
  display: flex;
  flex-wrap: wrap;
  gap: .34rem;
}
.nb-aplus__hkeys .nb-aplus__chip { margin-bottom: 0; }

/* chip 现在可能是 <a>（可点），补 hover / focus / 静态态 */
.nb-aplus__chip {
  text-decoration: none;
  transition: background-color .16s ease, border-color .16s ease, color .16s ease;
}
a.nb-aplus__chip:hover,
a.nb-aplus__chip:focus {
  background: var(--nb-primary);
  border-color: var(--nb-primary);
  color: #fff;
}
a.nb-aplus__chip:focus-visible {
  outline: 2px solid var(--nb-primary);
  outline-offset: 2px;
}
/* 链不到站内目标的关键词退化为纯标签，不给可点暗示 */
.nb-aplus__chip--static {
  cursor: default;
}

/* ---------- 细节图组：说明与 chip 的间距 ---------- */
.nb-aplus__dbody .nb-aplus__chip { margin-bottom: .34rem; }
.nb-aplus__dbody > p { margin: 0 0 .5rem; }
.nb-aplus__dbody > p:last-child { margin-bottom: 0; }

/* ---------- 移动端：说明文字与关键词占更多纵向空间，压到 15px 以下不好读 ---------- */
@media (max-width: 767px) {
  .nb-aplus__htitle { font-size: 1rem; }
  .nb-aplus__htext { font-size: .875rem; line-height: 1.62; }
  .nb-aplus__hcap { padding: .85rem 1rem 1rem; }
  .nb-aplus__dbody { max-width: none; }
}

/* ==========================================================================
   短描述规格行的联动标记（P1-1，2026-10-04）
   --------------------------------------------------------------------------
   短描述里的 <ul class="nb-sd-specs"> 原先写死某个具体变体的规格，
   与买家实际所选不符。现在由 inc/nb-pdp.php 的 nb_sd_bind_variant_specs()
   把「值恰好等于某个变体轴取值」的行绑到该轴，并在切换时由
   assets/kmfurnila.js 同步。
   这里不加任何视觉变化 —— 规格文字还是原来的样子，只是值变成"对的"。
   ========================================================================== */

/* ==========================================================================
   评分来源标识（P1-3，2026-10-04）
   --------------------------------------------------------------------------
   站点评分与评论数取自亚马逊同一 ASIN，不是本店买家的评价。
   列表页此前只渲染星标 + 数字，一个字的来源都不提，买家会把它当成本站评分；
   这与 PDP 上已经写明来源的口径也不统一。
   ★ 结构化数据里**不能**因此补 aggregateRating —— 第三方评分写回 JSON-LD
     会违反 Google「评分须来自本站真实用户评价」的政策（见 inc/nb-seo.php）。
   ========================================================================== */
ul.products li.product .nb-rating-src {
  margin-left: .32rem;
  padding: .06rem .3rem;
  border: 1px solid var(--nb-line);
  border-radius: var(--nb-pill);
  background: var(--nb-soft);
  color: var(--nb-muted);
  font-size: .6rem;
  font-weight: 700;
  letter-spacing: .03em;
  text-transform: uppercase;
  vertical-align: 1px;
  white-space: nowrap;
}

/* PDP 评分行里的来源链接：跟正文同色，只靠下划线区分 */
.nb-amz-rating__txt a {
  color: inherit;
  text-decoration: underline;
  text-underline-offset: 2px;
}
.nb-amz-rating__txt a:hover,
.nb-amz-rating__txt a:focus { color: var(--nb-primary); }

/* ==========================================================================
   ★★ 2026-10-07 第五轮新增：超宽屏断点 ★★

   背景：第四轮把容器基准从 1240 提到 1440 后，1440 视口已基本满宽，
   但 1600 / 1920 / 2560 视口下内容仍停在 1440，两侧留白 240~560px，
   又一次出现「内容挤中间」的问题——只是换了个视口尺寸。
   本轮补两档，让容器随视口继续生长，同时保持单行字符数在可读区间内：
     1600~1919 → 容器 1560（两侧各 20~160px）
     1920+     → 容器 1680（= --kmf-wrap-wide，两侧 120px+）
   注意：这里只调容器宽度，不动字号。-clamp 里的 vw 系数已按
   1440 基准标定，再放大字号会让标题回退到 5 行。
   ========================================================================== */
@media (min-width: 1600px) {
	/* 1520 而非 1560：实测 1560 时 1600 视口只剩两侧 24px 留白（几乎满宽），
	   而 1920 档有 120px —— 两档之间落差过大，缩放到 1600→1920 时
	   版面会突然「松一下」。1520 让 1600 视口留白 40px，
	   与 1440 档的 24px、1920 档的 120px 形成平滑过渡。 */
	:root { --kmf-wrap: 1520px; }
	.kmf-hero h1 { font-size: clamp(46px, 2.9vw, 56px); max-width: 20ch; }
	.kmf-hero-copy > p.kmf-lede { max-width: 58ch; }
	.kmf-cats { gap: clamp(18px, 1.2vw, 26px); }
	.kmf-cat { min-height: 250px; }
	.nb-room h3 { font-size: 18.5px; }
}

@media (min-width: 1920px) {
	:root { --kmf-wrap: 1680px; }
	.kmf-section { padding: clamp(64px, 4.2vw, 112px) 0; }
	.kmf-hero h1 { font-size: clamp(52px, 2.75vw, 60px); }
	.kmf-hero-copy > p.kmf-lede { font-size: 18px; max-width: 62ch; }
	.kmf-hero-stat-n { font-size: 28px; }
	.kmf-cats { gap: 26px; }
	.kmf-cat { min-height: 266px; }
	.kmf-cat-name { font-size: 19.5px; }
	.kmf-cat-sub { font-size: 13.5px; }
	.kmf-card-title { font-size: 15px; }
	.kmf-guarantee h3 { font-size: 20px; }
}

/* ==========================================================================
   ★★ 2026-10-07 晚 · 第六轮追加：PDP（商品详情页）两栏布局 ★★

   踩坑记录：single.php 此前让 product 与博客文章共用同一套输出 ——
   博客式 kmf-pagehead（大 H1 + 发布日期横幅）+ kmf-prose（78ch ≈ 630px
   行宽护栏）。1440 视口实测：主图 239×239（= 630 × 38% float）、
   摘要栏 302px（= 630 × 48% float）、右侧 55% 全空白 —— 商品页看起来
   像一篇贴了张小图的博客文章。

   single.php 已分流（product → 无 pagehead + kmf-wide）；本段负责布局：
     · .product 用 grid 排「左图库 46% + 右摘要 54%」两栏
     · tabs / nb-owners / nb-faq / nb-pdp-links / related 全宽跨两栏
     · 下方组件的 float / width:38% / width:48% 全部显式打掉
       （nb-gallery 既有规则带 !important，覆盖必须同样 !important）
     · 摘要栏排版按欧美 PDP 放大：标题 24-34px、价格 22-28px
     · ≤900px 回落单列（图上文下）
   ========================================================================== */

/* 内容容器与评论列：product 下全部放开到容器宽 */
.kmf-article.product .kmf-comments { max-width: none; }

/* 两栏网格。grid 容器自动成为 float 的 BFC 语境，
   但 Woo 默认 css 给 summary 的 float:right 48% 与
   nb-pdp 给 gallery 的 float:left 38% width:38% !important
   必须显式打掉，否则 grid 列宽会被内在宽度干扰。 */
.kmf-article.product .product {
	display: grid;
	grid-template-columns: minmax(0, 46fr) minmax(0, 54fr);
	gap: clamp(30px, 3.6vw, 60px);
	align-items: start;
}

.kmf-article.product .product > .nb-gallery {
	grid-column: 1;
	float: none !important;
	width: 100% !important;
	margin: 0 !important;
	/* 图库随视口缩放，主图 1:1 框最大 ~640px，超宽下不再变大 */
	max-width: 660px;
}

.kmf-article.product .product > .summary {
	grid-column: 2;
	float: none !important;
	width: 100% !important;
	margin: 0 !important;
	/* ★ 2026-10-07 深夜修正：撤销 sticky。实测（Playwright 对照实验）外层
	   div.product.type-product 带 overflow:hidden（主题防横向溢出保护层，
	   computed overflow-y 亦为 hidden）→ 它成为 summary 的 sticky 滚动容器。
	   摘要栏相对该容器自然位置仅 1px，被 top:178px 约束钉在
	   「容器顶 + 178px」= 399px，比左图（top 221）永久下坠 178px，
	   且该容器自身不滚动，sticky 吸附永远不生效 —— 纯负作用。
	   要恢复 sticky 需移除祖先 overflow:hidden，会引发全站横向溢出回归，
	   不值得。两栏 align-items:start 顶对齐即为最终形态。 */
}

/* 结构性区块一律全宽跨两栏 */
.kmf-article.product .product > .woocommerce-tabs,
.kmf-article.product .product > .nb-owners,
.kmf-article.product .product > .nb-faq,
.kmf-article.product .product > .nb-pdp-links,
.kmf-article.product .product > .related {
	grid-column: 1 / -1;
	float: none;
	width: 100% !important;
}

/* float 尾巴兜底：万一某层 Woo css 仍在浮动，防 .product 高度塌陷 */
.kmf-article.product .product::after {
	content: "";
	display: block;
	clear: both;
}

/* ---- 摘要栏排版（欧美 PDP 尺度） ---- */
.kmf-article.product .summary .product_title {
	font-family: var(--kmf-font-head);
	font-size: clamp(24px, 2.3vw, 34px);
	line-height: 1.18;
	letter-spacing: -.02em;
	font-weight: 700;
	color: var(--kmf-ink);
	margin: 0 0 14px;
}
.kmf-article.product .summary .price {
	font-size: clamp(22px, 1.9vw, 28px);
	font-weight: 700;
	color: var(--kmf-ink);
}
.kmf-article.product .summary .price del {
	font-size: .72em;
	color: var(--kmf-ink-3);
	font-weight: 500;
}
.kmf-article.product .summary .price ins {
	text-decoration: none;
}

/* 移动端：单列（图上文下）。sticky 已在基础规则撤销，无需补偿 */
@media (max-width: 900px) {
	.kmf-article.product .product {
		grid-template-columns: 1fr;
		gap: 22px;
	}
	.kmf-article.product .product > .nb-gallery,
	.kmf-article.product .product > .summary {
		grid-column: 1;
		max-width: none;
	}
	.kmf-article.product .summary .product_title {
		font-size: clamp(21px, 5.6vw, 26px);
	}
}

/* ==========================================================================
   28. ★ 第八轮「Anker 化」统一层
   --------------------------------------------------------------------------
   参照 www.anker.com 实测规格实施的全局覆写。放在文件最末，
   确保优先级高于前面各节的历史规则。

   Anker 实测基准（Playwright computed style）：
     · 主 CTA：底 #080a0f、字 #fff、radius 0、padding 11px 20px 10px、
               字 14px/700、无阴影
     · 次 CTA：底 #f5f6f7、字 #1e2024、其余同上
     · 卡片/图片容器/输入框：radius 0、box-shadow none
     · 正文 14px/600、行高 1.5、letter-spacing -0.32px
     · 区块标题 32px/700、行高 1.0、letter-spacing -0.04em
     · 层次靠背景色差（#fff ↔ #f5f5f7）+ 1px 细线（#e8e8ed）
   ========================================================================== */

/* --------------------------------------------------------------------------
   28.1 全局排版收紧
   Anker 连正文都用 600 字重 + 负字距 —— 这是「精密感」的来源，
   也是本站此前 15px/400/1.65 显得松散廉价的主因。
   -------------------------------------------------------------------------- */
body {
	font-size: 14px;
	line-height: 1.5;
	font-weight: 500;
	letter-spacing: -0.011em;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

/* 正文段落 —— 保持可读性，行高略高于 UI 文本 */
p, .kmf-prose p, .kmf-article p {
	line-height: 1.62;
}

/* 标题 —— 负字距收紧，字重提到 700（Anker 全站标题 700/800） */
h1, h2, h3, h4, h5, h6 {
	font-weight: 700;
	letter-spacing: -0.032em;
}

h1 { line-height: 1.08; }
h2 { line-height: 1.12; }
h3 { line-height: 1.2; letter-spacing: -0.024em; }

/* 小号 UI 文本（标签、说明、元信息）统一灰阶与字距 */
.kmf-muted, .muted, .kmf-meta, .kmf-note {
	letter-spacing: -0.005em;
}

/* --------------------------------------------------------------------------
   28.2 WooCommerce 全量按钮统一 —— 消灭品牌紫 #7f54b3 与残余圆角
   Woo 默认按钮（结账、账户、加入购物车、优惠券、数量更新等）
   在主题未显式覆盖时会透出紫色底 + 圆角。这里一次性收口。
   -------------------------------------------------------------------------- */
.woocommerce a.button,
.woocommerce button.button,
.woocommerce input.button,
.woocommerce #respond input#submit,
.woocommerce a.button.alt,
.woocommerce button.button.alt,
.woocommerce input.button.alt,
.woocommerce #respond input#submit.alt,
.woocommerce .woocommerce-message .button,
.woocommerce .cart .button,
.woocommerce .cart input.button,
.woocommerce-checkout #place_order,
.woocommerce .checkout-button,
.woocommerce-account .woocommerce-Button,
.woocommerce form .form-row input.button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	background: var(--kmf-clay) !important;
	border: 1px solid var(--kmf-clay) !important;
	color: #fff !important;
	border-radius: 0 !important;
	box-shadow: none !important;
	padding: 11px 22px 10px !important;
	font-size: 14px !important;
	font-weight: 700 !important;
	letter-spacing: -.005em;
	line-height: 1.35 !important;
	text-transform: none;
	min-height: 0;
	transition: background var(--kmf-dur) var(--kmf-ease),
	            border-color var(--kmf-dur) var(--kmf-ease);
}

.woocommerce a.button:hover,
.woocommerce button.button:hover,
.woocommerce input.button:hover,
.woocommerce #respond input#submit:hover,
.woocommerce a.button.alt:hover,
.woocommerce button.button.alt:hover,
.woocommerce input.button.alt:hover,
.woocommerce #respond input#submit.alt:hover,
.woocommerce-checkout #place_order:hover,
.woocommerce .checkout-button:hover,
.woocommerce-account .woocommerce-Button:hover {
	background: var(--kmf-clay-d) !important;
	border-color: var(--kmf-clay-d) !important;
	color: #fff !important;
}

/* 次级动作（查看购物车、继续购物等）—— Anker 式浅灰底 */
.woocommerce .cart .button.wc-backward,
.woocommerce .return-to-shop .button,
.woocommerce a.added_to_cart,
.woocommerce .woocommerce-message .button.wc-forward {
	background: var(--kmf-tile) !important;
	border-color: var(--kmf-tile) !important;
	color: var(--kmf-ink) !important;
}
.woocommerce .cart .button.wc-backward:hover,
.woocommerce .return-to-shop .button:hover,
.woocommerce a.added_to_cart:hover {
	background: #e6e9eb !important;
	border-color: #e6e9eb !important;
	color: var(--kmf-ink) !important;
}

/* --------------------------------------------------------------------------
   28.3 表单控件 —— 直角 + 浅灰底（Anker 输入框语言）
   -------------------------------------------------------------------------- */
.woocommerce input[type="text"],
.woocommerce input[type="email"],
.woocommerce input[type="tel"],
.woocommerce input[type="number"],
.woocommerce input[type="password"],
.woocommerce input[type="search"],
.woocommerce textarea,
.woocommerce select,
.woocommerce .select2-container--default .select2-selection--single,
.woocommerce form .form-row input.input-text,
.woocommerce form .form-row textarea {
	background: var(--kmf-bg) !important;
	border: 1px solid var(--kmf-line-2) !important;
	border-radius: 0 !important;
	box-shadow: none !important;
	padding: 12px 14px !important;
	font-size: 14px !important;
	font-weight: 500;
	color: var(--kmf-ink);
	transition: border-color var(--kmf-dur) var(--kmf-ease);
}

.woocommerce input[type="text"]:focus,
.woocommerce input[type="email"]:focus,
.woocommerce input[type="tel"]:focus,
.woocommerce input[type="number"]:focus,
.woocommerce input[type="password"]:focus,
.woocommerce input[type="search"]:focus,
.woocommerce textarea:focus,
.woocommerce select:focus {
	border-color: var(--kmf-ink) !important;
	outline: none;
	box-shadow: none !important;
}

/* 数量选择器 —— 直角描边成组，Anker 式细线 */
.woocommerce .quantity input.qty {
	border-radius: 0 !important;
	border-color: var(--kmf-line-2) !important;
	background: var(--kmf-bg) !important;
	font-weight: 600;
}

/* --------------------------------------------------------------------------
   28.4 全局去投影 —— Anker 实测 box-shadow: none
   层次改由「背景色差 + 1px 细线」表达。此处只清除装饰性投影，
   保留功能性浮层（下拉菜单、抽屉、吐司）的必要投影。
   -------------------------------------------------------------------------- */
.kmf-card, .kmf-cat, .kmf-product, ul.products li.product,
.kmf-value, .kmf-brand-block, .kmf-banner,
.woocommerce div.product .woocommerce-tabs,
.woocommerce div.product .related.products,
.nb-card, .nb-panel, .nb-box {
	box-shadow: none !important;
}

/* --------------------------------------------------------------------------
   28.5 图片容器直角化 —— Anker 的产品图容器无圆角
   -------------------------------------------------------------------------- */
.kmf-product-img, .kmf-card-media, .kmf-cat-media, .kmf-cat,
.nb-gallery, .nb-gallery-item, .nb-pdp-media,
.woocommerce-product-gallery, .woocommerce-product-gallery__image,
.woocommerce div.product div.images img,
ul.products li.product img, ul.products li.product a img,
.kmf-hero-media, .kmf-hero img, .nb-room-media, .nb-room-img {
	border-radius: 0 !important;
}

/* --------------------------------------------------------------------------
   28.6 区块标题 —— Anker 式紧凑层级（32px/700 / 行高 1.05）
   -------------------------------------------------------------------------- */
.kmf-sec-head h2, .kmf-section-title, .kmf-sec-title {
	font-size: clamp(24px, 2.4vw, 32px);
	font-weight: 700;
	line-height: 1.06;
	letter-spacing: -0.036em;
}

.kmf-sec-head p, .kmf-sec-sub {
	font-size: 14px;
	line-height: 1.55;
	color: var(--kmf-ink-3);
	letter-spacing: -0.008em;
}

/* --------------------------------------------------------------------------
   28.7 商品卡片 —— 对齐 Anker 商品卡规格
   Anker 实测：卡片 268×179（约 3:2）、白底、radius 0、无边框无阴影、
   图片满铺；文字为紧凑三段式（标题 → 价格 → 辅助信息）。
   本站保留 4:3 图框（家具品类需要更大展示面积），但去掉一切装饰。
   -------------------------------------------------------------------------- */
ul.products li.product,
.kmf-product {
	background: transparent;
	border: 0;
	border-radius: 0;
	box-shadow: none;
	padding: 0;
}

/* 卡片图片容器：直角、纯白/极浅灰底、无内边距 */
ul.products li.product .kmf-card-media,
ul.products li.product a img,
.kmf-product-img {
	border-radius: 0;
	background: var(--kmf-bg-2);
}

/* 卡片标题：14px / 500，近黑，行高紧凑（Anker 文字层级） */
ul.products li.product .woocommerce-loop-product__title,
ul.products li.product h2,
ul.products li.product h3,
.kmf-card-title {
	font-size: 14px;
	font-weight: 500;
	line-height: 1.42;
	letter-spacing: -0.012em;
	color: var(--kmf-ink);
	margin: 0;
}

/* 卡片价格：加粗、近黑，字重差异制造层级（不用彩色）
   ★ 2026-10-08 修复：上一版写成 `ul.products li.product .price`（特异性 0,2,3）
   仍被 WooCommerce 自带样式表压过 —— 实测线上 .price 计算值是
   font-size 12px / weight 400 / color rgb(149,142,9)（暗黄），
   即 Woo 的 .woocommerce-Price-amount { color: inherit } + 链接色在起作用。
   现改为「高特异性选择器 + !important」双保险，并对 .woocommerce-Price-amount
   与 .woocommerce-Price-currencySymbol 一并声明，避免只改外层 span 而内层不跟。 */
ul.products li.product .kmf-card-price .price,
ul.products li.product .kmf-card-price .price .woocommerce-Price-amount,
ul.products li.product .kmf-card-price .price .woocommerce-Price-amount bdi,
ul.products li.product .price,
.kmf-card-price > .price {
	font-size: 15px !important;
	font-weight: 700 !important;
	letter-spacing: -0.018em;
	color: var(--kmf-ink) !important;
	line-height: 1.35;
}
/* 货币符号略小，跟随数字颜色（Woo 默认给它单独的字号/颜色） */
ul.products li.product .kmf-card-price .woocommerce-Price-currencySymbol,
.kmf-card-price .woocommerce-Price-currencySymbol {
	font-size: .82em !important;
	color: inherit !important;
	font-weight: inherit !important;
}

/* 促销价 —— ★ 第八轮：从黑铬改为「黑 + 灰划线」的中性表达，
   Anker 不用彩色标价，折扣靠数字本身与 OFF 标签传达 */
ul.products li.product .price ins,
.kmf-card-price .price ins,
ul.products li.product .price ins .woocommerce-Price-amount {
	color: var(--kmf-ink) !important;
	text-decoration: none;
	font-weight: 700 !important;
}
ul.products li.product .price del,
.kmf-card-price .price del,
ul.products li.product .price del .woocommerce-Price-amount {
	color: var(--kmf-ink-3) !important;
	font-weight: 500 !important;
	opacity: 1;
}

/* ★ 2026-10-08 修复：卡片 <li> 上的 overflow:hidden 会把「划线原价」
   在两行价格（促销价 + 原价）时裁掉下半截 —— 实测 $49.99 下方
   的删除线原价被切。改为 visible，让价格区自然撑开卡片高度；
   图片溢出仍由 .kmf-card-media 自己的 overflow 控制，不影响版式。 */
ul.products li.product {
	overflow: visible;
}

/* 卡片网格间距 —— Anker 实测 gap 16-24px */
ul.products {
	gap: var(--kmf-gap);
	row-gap: 36px;
}

/* --------------------------------------------------------------------------
   28.8 类目瓷砖 —— ★ 从「炭黑瓦片」改为 Anker 式「浅灰底 + 深字」
   Anker 实测：类目瓷砖 = #f5f5f7 浅灰底承托产品图 + 下方居中深色标签，
   不用深色底。本站原为炭黑瓦片（第六轮遗留），此处校正。
   -------------------------------------------------------------------------- */
.kmf-cat {
	background: var(--kmf-tile) !important;
	border: 0 !important;
	border-radius: 0 !important;
	box-shadow: none !important;
}
.kmf-cat::after { background: none !important; }

.kmf-cat-name,
.kmf-cat-name > span:first-child,
.kmf-cat-name strong {
	color: var(--kmf-ink) !important;
}

.kmf-cat-sub,
.kmf-cat p {
	color: var(--kmf-ink-3) !important;
}

/* 类目瓷砖内的图标/插画：深色描边（浅底上可读） */
.kmf-cat svg,
.kmf-cat-icon svg {
	color: var(--kmf-ink) !important;
	stroke: var(--kmf-ink);
	opacity: .82;
}

/* 数量徽章：浅底上的深色小徽章 */
.kmf-cat-badge,
.kmf-cat-count {
	background: rgba(29, 29, 31, .07) !important;
	color: var(--kmf-ink) !important;
	border-radius: 0 !important;
}

/* Shop Now / Explore 链接：深色 + 下划线（Anker 的文本型 CTA） */
.kmf-cat-cta,
.kmf-cat-explore,
.kmf-cat a.kmf-link {
	color: var(--kmf-ink) !important;
	font-weight: 700;
	letter-spacing: -0.005em;
}

/* --------------------------------------------------------------------------
   28.9 归档/页面 hero（/shop/ 与类目页）—— ★ 第八轮补：H1 收敛到 Anker 尺度
   目检发现（2026-10-08）：/shop/ 的 H1「Shop」实测 46px/700，
   而 Anker 区块大标题实测 32px/700 —— 46px 在灰色 hero 区里显得头重脚轻，
   且与下方 14px 商品卡形成断崖式层级落差。

   ★ 更正：上一版按 nb-archive-hero 写选择器，完全没命中的原因已查明 ——
     /shop/ 是 **WooCommerce 商店页 = 一个 WP page（id7）**，走 page.php 渲染，
     输出容器是 `.kmf-pagehead`（不是 archive.php 的 .nb-archive-hero）。
     同一份样式必须同时覆盖两条渲染路径：
       · .kmf-pagehead  → 商店页 / 普通页面（page.php）
       · .nb-archive-hero → 类目页 / 标签页（archive.php）
   -------------------------------------------------------------------------- */
.kmf-pagehead h1,
.nb-archive-hero h1,
.nb-search-hero h1 {
	font-size: clamp(28px, 3vw, 36px) !important;
	font-weight: 700 !important;
	line-height: 1.1 !important;
	letter-spacing: -0.034em !important;
	color: var(--kmf-ink) !important;
	margin: 0 0 6px;
}

/* hero 区块自身：收紧上下内边距（原值偏大，首屏被 hero 吃掉） */
.nb-archive-hero,
.nb-search-hero {
	padding-top: clamp(28px, 3.4vw, 48px) !important;
	padding-bottom: clamp(24px, 2.8vw, 40px) !important;
	background: var(--kmf-bg-2);
	border-bottom: 0;
}
/* 商店页 / 普通页面 hero：同样收紧（pagehead 原 padding 48px 上下） */
.kmf-pagehead {
	padding-top: clamp(24px, 3vw, 40px) !important;
	padding-bottom: clamp(20px, 2.6vw, 34px) !important;
	background: var(--kmf-bg-2);
	border-bottom: 0;
}
.kmf-pagehead .kmf-lede {
	font-size: 14.5px !important;
	line-height: 1.6 !important;
	color: var(--kmf-ink-2) !important;
	letter-spacing: -0.008em;
	margin: 8px 0 0 !important;
	max-width: 76ch;
}

/* hero 内的行距与元素间距一并收紧 */
.nb-ah-head {
	gap: 12px !important;
	align-items: baseline;
}
.nb-ah-count {
	color: var(--kmf-ink-3);
	font-size: 13px;
	letter-spacing: -0.005em;
}
.nb-ah-desc {
	font-size: 14.5px !important;
	line-height: 1.6 !important;
	color: var(--kmf-ink-2);
	letter-spacing: -0.008em;
	max-width: 76ch;
}

/* hero 里的类目切换 chips：Anker 式小号直角标签 */
.nb-ah-chips a,
.nb-ah-chips .kmf-chip {
	border-radius: 0 !important;
	font-size: 12.5px !important;
	font-weight: 600;
	letter-spacing: -0.002em;
	background: var(--kmf-bg);
	border: 1px solid var(--kmf-line-2);
	color: var(--kmf-ink);
	padding: 7px 13px 6px;
}
.nb-ah-chips a:hover {
	background: var(--kmf-clay);
	border-color: var(--kmf-clay);
	color: #fff;
}

/* 工具条（结果计数 + 排序）：细分割线、直角下拉 */
.kmf-shopbar {
	border-bottom: 1px solid var(--kmf-line);
	padding: 14px 0;
}
.kmf-shopbar .woocommerce-result-count {
	font-size: 13px;
	color: var(--kmf-ink-3);
	letter-spacing: -0.005em;
}
.kmf-shopbar select,
.kmf-shopbar .orderby {
	border-radius: 0 !important;
	border: 1px solid var(--kmf-line-2);
	font-size: 13px;
	font-weight: 500;
	color: var(--kmf-ink);
	padding: 8px 12px;
	background: var(--kmf-bg);
}

/* --------------------------------------------------------------------------
   28.10 商品卡「快捷加购」层 —— ★ 第八轮补：修正被 28.2 节误伤
   目检发现（2026-10-08）：/shop/ 每张商品卡下方都常驻一条黑色实心
   「Add to cart」横条，视觉噪音极大，与 Anker「商品卡保持纯净」的做法冲突。

   根因（两层叠加）：
     ① 28.2 节的 `.woocommerce a.button { background: var(--kmf-clay) !important }`
        带 !important，而卡片加购链接同时带 .button 与 .woocommerce 祖先，
        于是设计系统里 `.kmf-card-quick .button { background: rgba(255,255,255,.95) }`
        （无 !important、且在文件更早位置）被完全压过 → 白胶囊变黑实心。
     ② `.kmf-card-quick` 本应靠 `.kmf-card:hover` 才滑入
        （opacity 0 / translateY(100%)），但按钮被染黑后对比过强，
        在滚动截图里像「常驻条带」。

   修法：把快捷加购层的按钮**从 28.2 的通用规则里摘出来**，
   用更高特异性 + !important 还原成 Anker 式的「hover 浮出白色胶囊」。
   Anker 实测商品卡本身不放加购按钮，加购在 PDP；
   本站保留快捷加购作为效率增强，但**只在 hover 时出现**，静息态零干扰。
   -------------------------------------------------------------------------- */
ul.products li.product .kmf-card-quick .button,
ul.products li.product .kmf-card-quick a.button,
ul.products li.product .kmf-card-quick .add_to_cart_button {
	display: block !important;
	width: 100% !important;
	background: rgba(255, 255, 255, .96) !important;
	border: 1px solid transparent !important;
	color: var(--kmf-ink) !important;
	border-radius: 0 !important;
	box-shadow: none !important;
	padding: 10px 12px !important;
	font-size: 12.5px !important;
	font-weight: 700 !important;
	letter-spacing: -.002em;
	line-height: 1.3 !important;
	min-height: 0 !important;
	text-align: center;
}
ul.products li.product .kmf-card-quick .button:hover,
ul.products li.product .kmf-card-quick a.button:hover,
ul.products li.product .kmf-card-quick .add_to_cart_button:hover {
	background: var(--kmf-clay) !important;
	border-color: var(--kmf-clay) !important;
	color: #fff !important;
}

/* 静息态彻底隐藏（含键盘焦点之外的情况），只在卡片 hover / 键盘聚焦时浮出。
   ★ 必须用 opacity + visibility 双关：仅 opacity:0 时元素仍可被点击，
    会造成「看不见却点得到」的隐形热区。 */
ul.products li.product .kmf-card-quick {
	opacity: 0;
	visibility: hidden;
	transform: translateY(100%);
	transition: opacity .22s var(--kmf-ease), transform .22s var(--kmf-ease),
	            visibility 0s linear .22s;
	/* Anker 式的极浅渐隐，比原先的 rgba(28,25,23,.5) 重遮罩更轻 */
	background: linear-gradient(to top, rgba(29, 29, 31, .34), rgba(29, 29, 31, 0));
	padding: 10px;
}
ul.products li.product:hover .kmf-card-quick,
ul.products li.product:focus-within .kmf-card-quick {
	opacity: 1;
	visibility: visible;
	transform: translateY(0);
	transition: opacity .22s var(--kmf-ease), transform .22s var(--kmf-ease),
	            visibility 0s;
}
/* 触屏设备（无 hover）直接常驻，否则永远点不到加购 */
@media (hover: none) {
	ul.products li.product .kmf-card-quick {
		opacity: 1;
		visibility: visible;
		transform: none;
	}
}

/* ==========================================================================
   29. Anker 大图叙事改造 —— ★ 第九轮（2026-10-08 夜间）

   触发：Chris 以用户视角对比 anker.com 后反馈「网站外观太丑太方了」。

   ★★ 先纠正上一轮的认知偏差 ★★
   第八轮把 Anker 总结为「全直角 + 黑白灰」，据此把全站圆角清零。
   第九轮复测发现这个结论**不完整**：
     · Anker 首页实测 **18 处 border-radius: 9999px** —— 全是控件类元素：
       轮播指示点（8px 圆点 / 32px 长胶囊）、**40px 圆形图标按钮**、
       **48px 圆形图标按钮**（#f5f6f7 底，承载服务/信任图标）、侧边竖排标签。
     · 即 Anker 是「**直角为主 + 胶囊控件点缀**」的混合体系。
   我方把圆角一律清零，反而强化了「方」的观感 —— 因为没有胶囊做视觉调剂。

   ★★ 「方」的真正来源（实测对比，非主观感受）★★
   | 维度        | Anker 实测              | 本站改前          |
   | Hero 高     | **600px**（1440 全宽 2.4:1）| ~330px 且只占半宽 |
   | 叙事大图    | **700px 高**（1440, 2.06:1）| 无                |
   | 双图块      | 648×512（1.27）         | 无                |
   | 区块高      | 448 / 512 / 576（**大块**）| 密集小方块        |
   | 类目墙      | 无此类构件              | **12 个灰底方块** |
   | 图片处理    | object-cover 满铺 + hover 缩放 | 平铺静态     |

   结论：Anker 的「高级感」来自 **600–700px 满屏大图 + 大块节奏 + 图片交互**，
   我方「丑、方」是因为 **全是小块 + 灰底 + 小图 + 无交互**。

   本节做四件事：
     29.1 Hero → 满屏沉浸大图（文字压图上，黑色 CTA）
     29.2 类目墙 → 大图叙事卡（真实图片铺满，消除灰底方块）
     29.3 区块节奏 → 大块间距 + 无缝衔接
     29.4 胶囊点缀 + 图片 hover 交互（补回 Anker 实际有的圆形控件）
   ========================================================================== */


/* --------------------------------------------------------------------------
   29.1 Hero —— 满屏沉浸大图（Anker 式）

   手法：**纯 CSS 重排，不改 HTML**。
   原结构 .kmf-hero-inner 是 grid 两列（文案 | 图片）。
   这里把两列改为「单列 + 图片绝对定位做背景层」，
   文案以 grid-area 叠加在图片之上，得到满屏大图效果。
   —— 这样零 HTML 改动、可控性最好，也避免了页面内容（REST）与模板双改的风险。
   -------------------------------------------------------------------------- */

/* 外层：让 hero 真正满宽（脱离 .kmf-wrap 的容器约束） */
.kmf-hero {
	background: var(--kmf-ink-deep);
	/* 满宽出血：抵消 .kmf-container / .kmf-wide 的居中与内边距 */
	width: 100vw;
	max-width: 100vw;
	margin-left: calc(50% - 50vw);
	margin-right: calc(50% - 50vw);
	overflow: hidden;
}

/* 内层：单列网格 + 定高，成为图片的定位容器 */
.kmf-hero .kmf-wrap {
	max-width: none;
	padding: 0;
}
.kmf-hero-inner {
	display: grid;
	grid-template-columns: 1fr;
	grid-template-rows: 1fr;
	align-items: end;
	gap: 0;
	position: relative;
	max-width: none;
	/* Anker 实测 hero 高 600px @1440（2.4:1）。用 aspect-ratio 让它随宽度等比缩放，
	   min/max 兜住极端视口。 */
	aspect-ratio: 2.4 / 1;
	min-height: 420px;
	max-height: 660px;
	padding: 0;
	margin: 0;
}

/* 图片层：绝对铺满，object-fit: cover 保证不变形（Anker 同手法） */
.kmf-hero-media {
	position: absolute;
	inset: 0;
	z-index: 1;
	grid-row: 1;
	grid-column: 1;
	min-height: 0;
	overflow: hidden;
}
.kmf-hero-media img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center 42%;
	/* 满屏大图需要更高的原始分辨率：改用 1536×1024 全尺寸图，不用 800 宽缩略图 */
}

/* 压图遮罩：左下深、右上透，保证白字可读（Anker 的原图本身就有暗部，
   我方生活场景图偏亮，必须自己加一层） */
.kmf-hero-media::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 2;
	background:
		linear-gradient(to right, rgba(12, 14, 18, .78) 0%, rgba(12, 14, 18, .55) 38%, rgba(12, 14, 18, .12) 68%, rgba(12, 14, 18, .05) 100%),
		linear-gradient(to top, rgba(12, 14, 18, .42) 0%, rgba(12, 14, 18, 0) 42%);
	pointer-events: none;
}

/* 文案层：叠在图片上，左对齐、底部对齐（Anker 的 hero 文案就是压图居中/偏左） */
.kmf-hero-copy {
	position: relative;
	z-index: 3;
	grid-row: 1;
	grid-column: 1;
	align-self: end;
	justify-content: flex-end;
	max-width: min(680px, 52vw);
	/* 文案左边距 = 容器左内边距（与全站 .kmf-wrap 对齐） */
	padding: 0 clamp(24px, 4vw, 64px) clamp(34px, 4vw, 56px);
	margin: 0;
	color: #fff;
}

/* eyebrow：图上小字改为高对比白（原为深灰，压图不可读） */
.kmf-hero .kmf-eyebrow {
	color: rgba(255, 255, 255, .82);
	font-size: 12px;
	letter-spacing: .14em;
	margin-bottom: 14px;
}

/* H1：白色大标题，Anker 的 hero 标题是「大、紧、白」 */
.kmf-hero h1 {
	color: #fff !important;
	font-size: clamp(30px, 3.6vw, 54px);
	line-height: 1.06;
	letter-spacing: -.034em;
	max-width: 17ch;
	margin-bottom: 18px;
	text-shadow: 0 1px 24px rgba(0, 0, 0, .28);
}

/* 导语：白色次级 */
.kmf-hero-copy > p.kmf-lede {
	color: rgba(255, 255, 255, .86) !important;
	font-size: clamp(14.5px, 1vw, 16.5px);
	line-height: 1.62;
	max-width: 46ch;
	margin-bottom: 26px;
}

/* CTA：主按钮纯黑实心（Anker 的 hero 按钮就是黑底白字），次按钮改透明描边 */
.kmf-hero-cta .kmf-btn-primary {
	background: #080a0f !important;
	border-color: #080a0f !important;
	color: #fff !important;
}
.kmf-hero-cta .kmf-btn-primary:hover {
	background: #fff !important;
	border-color: #fff !important;
	color: #080a0f !important;
}
.kmf-hero-cta .kmf-btn-outline {
	background: rgba(255, 255, 255, .10) !important;
	border-color: rgba(255, 255, 255, .48) !important;
	color: #fff !important;
	backdrop-filter: blur(6px);
}
.kmf-hero-cta .kmf-btn-outline:hover {
	background: rgba(255, 255, 255, .96) !important;
	border-color: #fff !important;
	color: #080a0f !important;
}

/* stats 条：压图上，改用半透明白分隔线 + 白字 */
.kmf-hero-stats {
	border-top: 1px solid rgba(255, 255, 255, .26);
	padding-top: 20px;
	gap: clamp(20px, 2.6vw, 40px);
	margin-top: 26px;
}
.kmf-hero-stat-n {
	color: #fff !important;
	font-size: clamp(19px, 1.5vw, 24px);
}
.kmf-hero-stat-l {
	color: rgba(255, 255, 255, .72) !important;
	font-size: 12px;
}

/* 移动端：hero 改回「上图下文」的竖排（压图上在窄屏文字会挤成一团） */
@media (max-width: 860px) {
	.kmf-hero {
		width: auto;
		margin-left: 0;
		margin-right: 0;
	}
	.kmf-hero-inner {
		aspect-ratio: auto;
		min-height: 0;
		max-height: none;
		display: flex;
		flex-direction: column;
	}
	.kmf-hero-media {
		position: relative;
		inset: auto;
		aspect-ratio: 4 / 3;
	}
	.kmf-hero-media::after {
		background: linear-gradient(to top, rgba(12, 14, 18, .28), rgba(12, 14, 18, 0) 40%);
	}
	.kmf-hero-copy {
		position: static;
		max-width: none;
		padding: 28px 20px 34px;
		background: var(--kmf-ink-deep);
	}
	.kmf-hero h1 { font-size: clamp(26px, 7.4vw, 38px); max-width: none; }
	.kmf-hero-copy > p.kmf-lede { max-width: none; }
}


/* --------------------------------------------------------------------------
   29.2 类目墙 —— 从「12 个灰底方块」改为 Anker 式大图叙事卡

   这是「太方」最直观的来源：12 个 #f1f3f5 灰方块，每块塞
   图标 + 标题 + 一句灰字 + SHOP NOW，4 行整齐排列 —— 密集、同质、无视觉重心。
   Anker 首页完全没有这种构件；它的分类入口是「**大图 + 图上文字**」。

   但类目真实缩略图尚未补齐（54 个类目缺图，属历史待办）。
   因此分两层处理：
     · 有图的类目 → 图片铺满、文字压图上（真正的 Anker 观感）
     · 无图的类目 → 保留图标兜底，但**去掉灰底块**、改为「白底 + 大图标 + 细线框」，
       并把网格从 4 列改为 3 列（块更大、更疏），密度降下来
   这样即使图片没补齐，也不再是「12 个灰方块」的观感。
   -------------------------------------------------------------------------- */

/* 网格：4 列 → 3 列（块更大更疏），窄屏逐级回落 */
.kmf-cats {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: clamp(14px, 1.5vw, 22px);
}
@media (max-width: 1100px) { .kmf-cats { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px)  { .kmf-cats { grid-template-columns: 1fr; } }

/* 类目卡：Anker 式「图片为主 + 图上文字」 */
.kmf-cat {
	position: relative;
	display: block;
	overflow: hidden;
	background: var(--kmf-bg);
	border: 1px solid var(--kmf-line);
	border-radius: 0;
	transition: border-color .24s var(--kmf-ease), box-shadow .24s var(--kmf-ease);
}
.kmf-cat:hover {
	border-color: var(--kmf-line-2);
	box-shadow: 0 6px 28px rgba(12, 14, 18, .10);
}

/* 图片/兜底层：定比例砖块，Anker 的双图块实测 648×512 ≈ 1.27:1 */
.kmf-cat-media {
	position: relative;
	display: block;
	aspect-ratio: 1.27 / 1;
	overflow: hidden;
	background: var(--kmf-tile);
}
.kmf-cat-media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	/* Anker 用 group-hover:scale —— 图片在 hover 时轻微放大 */
	transform: scale(1);
	transition: transform .5s var(--kmf-ease);
}
.kmf-cat:hover .kmf-cat-media img { transform: scale(1.05); }

/* 无图兜底：去掉灰底渐变，改为浅灰底 + 居中大图标（不再是「深色块」的观感） */
.kmf-cat-fallback {
	position: absolute;
	inset: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	color: var(--kmf-ink-3);
	background: var(--kmf-tile);
}
.kmf-cat-fallback .kmf-cat-ico {
	width: 62px;
	height: 62px;
	opacity: .5;
	filter: none;
}
/* 兜底层的大水印字（首字母）：保留但更淡 */
.kmf-cat-fallback em {
	font-size: 128px;
	color: rgba(29, 29, 31, .045);
}

/* 文字区：从「块内四行」改为图片下方两行（类目标题 + 计数） */
.kmf-cat-body {
	padding: 14px 2px 2px;
	background: transparent;
}
.kmf-cat-name {
	font-size: 15px;
	font-weight: 700;
	letter-spacing: -.018em;
	color: var(--kmf-ink);
	margin: 0 0 3px;
}
.kmf-cat-count {
	font-size: 12.5px;
	color: var(--kmf-ink-3);
	margin: 0;
	letter-spacing: -.004em;
}

/* 若类目卡内的 SHOP NOW 链接仍存在，收敛成低调的箭头文字 */
.kmf-cat-go {
	margin-top: 8px;
	font-size: 12.5px;
	font-weight: 700;
	color: var(--kmf-ink);
	letter-spacing: -.004em;
}
.kmf-cat-go::after {
	content: " \2192";
	display: inline-block;
	transition: transform .24s var(--kmf-ease);
}
.kmf-cat:hover .kmf-cat-go::after { transform: translateX(3px); }


/* --------------------------------------------------------------------------
   29.3 区块节奏 —— 大块间距 + 大留白（Anker 的“呼吸感”）

   改前：所有 .kmf-section 一律上下 50px 左右，节奏完全均匀 → 单调。
   Anker：区块高度 448 / 512 / 576px 的大块，块间或无缝、或大留白。
   这里给区块引入「大档」间距，并把区块内首尾元素外边距收干净，
   避免 padding 与大标题 margin 叠加成过大的空洞。
   -------------------------------------------------------------------------- */
.kmf-section {
	padding-top: clamp(56px, 6.2vw, 96px);
	padding-bottom: clamp(56px, 6.2vw, 96px);
}
/* 相邻两个区块之间不叠加双倍间距 */
.kmf-section + .kmf-section { padding-top: clamp(48px, 5.2vw, 80px); }

/* 区块标题组：Anker 的区块标题是 32px/700 + 右侧说明文字并排 */
.kmf-head {
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: 24px;
	margin-bottom: clamp(24px, 2.6vw, 38px);
}
.kmf-head h2 {
	font-size: clamp(25px, 2.6vw, 36px) !important;
	line-height: 1.08 !important;
	letter-spacing: -.036em !important;
	margin: 0 0 8px !important;
}
.kmf-head p {
	font-size: 14.5px !important;
	line-height: 1.55 !important;
	color: var(--kmf-ink-3) !important;
	max-width: 62ch;
	margin: 0 !important;
}
.kmf-head .kmf-eyebrow { margin-bottom: 10px; }

/* 奶油/浅灰区块：Anker 会用 #f5f5f7 承载「数据/信任」类内容 */
.kmf-section-cream { background: var(--kmf-bg-2); }

/* 首屏以下第一个区块：紧贴 hero，不留白（Anker 的块是密贴的） */
.kmf-hero + .kmf-section { padding-top: clamp(48px, 5vw, 76px); }


/* --------------------------------------------------------------------------
   29.4 胶囊点缀 + 图片交互 —— 补回 Anker 实际有的圆形控件

   ★ 认知纠正：Anker 首页有 18 处 9999px 胶囊，全是控件：
     轮播点、**40px 圆形图标按钮**、**48px 圆形服务图标**、侧边竖排标签。
     第八轮把圆角一律清零，反而丢了这层「软性点缀」。
   本节按 Anker 实测尺寸补回：
     · 数量角标 / 状态点 → 圆形或胶囊
     · 服务/信任图标 → 48px 圆形 #f5f6f7 底（Anker 同款）
     · 商品卡图片 → hover 轻微放大（Anker 的 group-hover:scale）
   -------------------------------------------------------------------------- */

/* 商品卡图片 hover 放大 —— Anker 卡片的标配交互 */
ul.products li.product .kmf-card-media,
ul.products li.product .kmf-card-media img {
	transition: transform .5s var(--kmf-ease);
}
ul.products li.product:hover .kmf-card-media img { transform: scale(1.045); }
ul.products li.product .kmf-card-media { overflow: hidden; }

/* 服务/信任图标：48px 圆形浅灰底（Anker 实测 bg rgb(245,246,247) / 48×48 / radius 9999px） */
.kmf-trust-ico,
.kmf-svc-ico,
.kmf-hero-stats .kmf-ico {
	width: 48px;
	height: 48px;
	border-radius: 9999px;
	background: #f5f6f7;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	color: var(--kmf-ink);
	transition: background .22s var(--kmf-ease);
}
.kmf-svc-ico:hover { background: #eceef1; }

/* 圆形小控件：轮播/箭头按钮（Anker 实测 40px / rgba(0,0,0,.2) 底） */
.kmf-arrow-btn,
.kmf-scroll-btn {
	width: 40px;
	height: 40px;
	border-radius: 9999px;
	background: rgba(29, 29, 31, .06);
	border: 0;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	cursor: pointer;
	transition: background .2s var(--kmf-ease), color .2s var(--kmf-ease);
}
.kmf-arrow-btn:hover,
.kmf-scroll-btn:hover { background: var(--kmf-ink-deep); color: #fff; }

/* 计数角标（类目商品数）：胶囊 */
.kmf-cat-badge,
.kmf-count-pill {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 26px;
	height: 22px;
	padding: 0 9px;
	border-radius: 9999px;
	background: var(--kmf-tile);
	color: var(--kmf-ink-2);
	font-size: 11.5px;
	font-weight: 700;
	letter-spacing: -.004em;
}

/* 状态圆点（有货/新品） */
.kmf-dot {
	width: 8px;
	height: 8px;
	border-radius: 9999px;
	display: inline-block;
	background: var(--kmf-ink);
}

/* 旗帜/优惠竖排标签（Anker 侧边 GET 50% OFF 同款） */
.kmf-side-flag {
	position: fixed;
	right: 0;
	top: 46%;
	z-index: 60;
	writing-mode: vertical-rl;
	border-radius: 9999px 0 0 9999px;
	background: var(--kmf-ink-deep);
	color: #fff;
	font-size: 12px;
	font-weight: 700;
	letter-spacing: .08em;
	padding: 16px 9px;
	cursor: pointer;
	box-shadow: 0 4px 18px rgba(0, 0, 0, .18);
}
@media (max-width: 860px) { .kmf-side-flag { display: none; } }



/* ==========================================================================
   30. 第九轮修正 —— Hero 比例收敛 + 类目墙配图策略 + 场景衬底
   ==========================================================================
   问题（线上实测）：
     Hero copy 高 611px > Hero 600px 容器 → 文案溢出；
     H1 51.84px 占 4 行，右侧图主体被挤压；
     类目墙借来的商品图视觉杂乱（生活场景图 / 白底拼贴混用）且 cover 裁切主体。
   对策：
     30.1 收敛 H1 字号与文案层宽度，压缩纵向节奏，留出底部呼吸；
     30.2 类目卡图片统一 contain + 浅灰衬底，消除杂图裁切；
     30.3 用 :has() 为含场景图的类目卡走 cover 满铺（场景图适合满铺）。
   ========================================================================== */

/* ---- 30.1 Hero 比例收敛 ---- */
.kmf-hero-inner {
	aspect-ratio: 2.5 / 1;
	min-height: 480px;
	max-height: 620px;
}
.kmf-hero-copy {
	max-width: min(620px, 46vw);
	padding-bottom: clamp(20px, 2.4vw, 34px);
	gap: 0;
}
.kmf-hero h1 {
	font-size: clamp(26px, 3.05vw, 44px) !important;
	line-height: 1.12;
	letter-spacing: -.022em;
	margin: 10px 0 14px;
	max-width: 15.5em;
}
.kmf-hero .kmf-eyebrow {
	font-size: 11px;
	letter-spacing: .14em;
	opacity: .9;
}
.kmf-hero .kmf-lede {
	font-size: clamp(13.5px, 1.02vw, 15.5px);
	line-height: 1.55;
	max-width: 34em;
	margin: 0 0 20px;
	opacity: .92;
}
.kmf-hero-cta {
	margin-bottom: 22px;
	gap: 10px;
}
.kmf-hero-cta .kmf-btn-lg {
	height: 46px;
	padding: 0 22px;
	font-size: 14px;
}
.kmf-hero-stats {
	padding-top: 14px;
	gap: clamp(16px, 2.4vw, 34px);
}
.kmf-hero-stat-n {
	font-size: clamp(19px, 1.7vw, 25px);
	line-height: 1.1;
}
.kmf-hero-stat-l {
	font-size: 11.5px;
	margin-top: 3px;
}
.kmf-hero-media img {
	object-position: center 46%;
}

/* ---- 30.2 类目卡图片：统一 contain + 浅灰衬底，消除杂图裁切 ---- */
.kmf-cat-media {
	aspect-ratio: 1.27 / 1;
	background: var(--kmf-tile);
	display: flex;
	align-items: center;
	justify-content: center;
	overflow: hidden;
	position: relative;
}
.kmf-cat-media img {
	width: 100%;
	height: 100%;
	object-fit: contain;
	object-position: center;
	transform: scale(1);
	transition: transform .5s cubic-bezier(.22, .61, .36, 1);
	mix-blend-mode: multiply;
}
.kmf-cat:hover .kmf-cat-media img {
	transform: scale(1.045);
}
/* 借来的商品图多为白底 → multiply 让白底融进衬底，去除方块感 */
.kmf-cat-media img[src*="/uploads/"] {
	mix-blend-mode: multiply;
}
/* 主题场景图 / 内嵌图适合满铺 cover */
.kmf-cat-media img[src*="/themes/"] {
	object-fit: cover;
	mix-blend-mode: normal;
}

/* ---- 30.3 平板 / 手机回落 ---- */
@media (max-width: 1100px) {
	.kmf-hero-copy { max-width: min(560px, 62vw); }
	.kmf-hero h1 { font-size: clamp(24px, 3.4vw, 38px) !important; }
}
@media (max-width: 860px) {
	.kmf-hero-inner { aspect-ratio: auto; min-height: 0; max-height: none; }
	.kmf-hero-copy { max-width: none; padding-bottom: 0; }
	.kmf-hero h1 { font-size: clamp(24px, 6vw, 34px) !important; max-width: none; }
}


/* ---- 30.4 场景图满铺（场景图为环境摄影，适合 cover 而非 contain） ---- */
.kmf-cat-media img.kmf-cat-scene {
	object-fit: cover;
	object-position: center;
	mix-blend-mode: normal;
	background: none;
}
.kmf-cat:hover .kmf-cat-media img.kmf-cat-scene {
	transform: scale(1.045);
}
/* Shop All 卡（无图，箭头块）：与场景图卡保持同一视觉高度 */
.kmf-cat-all .kmf-cat-media {
	background: var(--kmf-bg-2);
}


/* ==========================================================================
   31. 第九轮 —— 环境叙事大图满宽化（对标 Anker 700px 满屏叙事图）
   ==========================================================================
   线上实测：.nb-band 为 1392x605（1440 视口下左右各留 24px），
             Anker 的叙事大图为 1440x700 满屏。
   对策：满宽出血（100vw + 负 margin 抵消容器内缩）+ 提到 700px，
         并优化遮罩让图片右侧更通透、文字侧更实。
   ========================================================================== */

.nb-band {
	width: 100vw;
	max-width: 100vw;
	margin-left: calc(50% - 50vw);
	margin-right: calc(50% - 50vw);
	min-height: clamp(460px, 48vw, 700px);
}

/* 遮罩改为「左实右透」的两段式：文字侧保证对比度，图片侧尽量露出环境细节 */
.nb-band::after {
	background: linear-gradient(96deg,
		rgba(13, 16, 18, .86) 0%,
		rgba(13, 16, 18, .70) 30%,
		rgba(13, 16, 18, .34) 58%,
		rgba(13, 16, 18, .06) 85%,
		rgba(13, 16, 18, 0) 100%);
}

/* 内容列在满宽后需要重新对齐到 1312px 栅格（与 Anker 一致的内容列宽） */
.nb-band .kmf-wrap {
	max-width: 1312px;
	margin: 0 auto;
	padding-left: clamp(20px, 4vw, 64px);
	padding-right: clamp(20px, 4vw, 64px);
}

.nb-band-copy {
	max-width: 620px;
}
.nb-band-copy h2 {
	font-size: clamp(28px, 3vw, 46px);
	line-height: 1.1;
	letter-spacing: -.026em;
}
.nb-band-copy > p {
	font-size: clamp(14px, 1.05vw, 16px);
	line-height: 1.58;
	max-width: 36em;
}

/* 图片主体靠右构图时不要被遮罩压掉 */
.nb-band-bg {
	object-position: center 52%;
}

@media (max-width: 1200px) {
	.nb-band { min-height: clamp(420px, 52vw, 560px); }
	.nb-band-copy { max-width: 520px; }
}
@media (max-width: 860px) {
	.nb-band {
		min-height: 0;
		aspect-ratio: 1.4 / 1;
		align-items: flex-end;
	}
	.nb-band-copy { max-width: none; padding-bottom: 8px; }
	.nb-band::after {
		background: linear-gradient(to top,
			rgba(13, 16, 18, .88) 0%,
			rgba(13, 16, 18, .60) 42%,
			rgba(13, 16, 18, .16) 78%,
			rgba(13, 16, 18, 0) 100%);
	}
	.nb-band .kmf-wrap { max-width: none; }
}


/* ---- 30.5 移动端 Hero 修正（v1 遗漏导致图片被绝对定位压成 0 尺寸） ----
   症状：390px 下 Hero 变成纯黑块，.kmf-hero-media 计算尺寸 0x0。
   根因：29.1 把 .kmf-hero-media 设为 position:absolute + inset:0，
         移动端只改了 aspect-ratio，没有把媒体层恢复为文档流。
   修正：<=860px 时「上图下文」竖排 —— 媒体层回到 relative，给出真实高度。 */
@media (max-width: 860px) {
	.kmf-hero-inner {
		display: flex;
		flex-direction: column;
		aspect-ratio: auto;
		min-height: 0;
		max-height: none;
		padding: 0;
	}
	.kmf-hero-media {
		position: relative;
		inset: auto;
		z-index: 1;
		order: -1;
		width: 100%;
		aspect-ratio: 4 / 3;
		overflow: hidden;
	}
	.kmf-hero-media img {
		position: absolute;
		inset: 0;
		width: 100%;
		height: 100%;
		object-fit: cover;
		object-position: center 46%;
	}
	.kmf-hero-media::after {
		display: none;
	}
	.kmf-hero-copy {
		position: relative;
		z-index: 3;
		order: 2;
		grid-row: auto;
		grid-column: auto;
		align-self: auto;
		background: var(--kmf-ink-deep);
		color: #fff;
		padding: 26px clamp(18px, 5vw, 26px) 30px;
		max-width: none;
	}
}


/* =========================================================================
   32. 导航重设计（★ 2026-10-08 第十轮）
   -------------------------------------------------------------------------
   需求原文：「请重新设计导航，将搜索框的位置改到页面右侧。将搜索框：
             1、改小；边框加角度，显得圆润」

   改造前的三段式页头（公告条 36 + 顶栏 64 + 搜索行 61 = 161px）：
     ┌─ .kmf-header-top ── 网格 [auto | 1fr | auto] ────────────────┐
     │ 品牌          （幽灵项）          主导航（居中）    Account Help 车 │
     └──────────────────────────────────────────────────────────────┘
     ┌─ .kmf-header-search ── flex ─────────────────────────────────┐
     │ 搜索框 620px（左对齐，占左半边）   …右半边 620px 大留白…        │
     └──────────────────────────────────────────────────────────────┘
   三个问题：① 搜索框贴在左侧、离「用户视线终点」最远；
             ② 占半行宽却只有 46px 高，比例失衡、观感笨重；
             ③ 自己带 620px 上限，右侧半行是纯空白，看着像没做完。

   改造后的两段式（公告条 36 + 导航行 74 = 110px，页头整体矮 51px）：
     ┌─ .kmf-header-top ── 网格 [1fr | auto] ────────────────────────┐
     │ 品牌 ←──────── 弹性空白 ────────→ 主导航（贴右）  搜索框  快捷  Account Help 车 │
     └──────────────────────────────────────────────────────────────┘
   搜索框位置从「左侧半行」变为「页面右侧」，与工具链收成一条右对齐工具带。

   ★ 为什么用网格而不是只改 flex 对齐：
     .kmf-header-search 里除搜索表单外还有 .kmf-header-quick（3 个胶囊）
     与页面动作区，只把表单右推会变成「表单靠右 + 快捷入口被挤出界」。
     改成「工具区整体作为顶栏右侧的 auto 列」后，五项一起右对齐，
     且左侧 1fr 空白由导航列的 margin-left:auto 自然吸收。

   ★ 断点顺序（本机无 CSS 打包器，全部靠源码顺序定胜负）：
     基准 = 桌面；先写 1100px（第一档收缩），再写 860px（移动端复位）。
     移动端的复位必须完整列出每一处被改写的属性，缺一项就出幽灵布局
     —— 第九轮 Hero 被绝对定位压成 0×0 就是漏复位造成的。
   ========================================================================= */

/* ---- 32.1 导航行：外层三列网格 + display:contents 提升内层 ---- */
/* ★ 为什么用 display:contents 而不是嵌套网格：
   品牌在 DOM 里位于 .kmf-nav-row 之内（这样桌面能靠内层网格排在左列），
   但移动端又必须脱离出去与汉堡/工具区同排。若用嵌套网格，移动端就得
   把品牌「搬运」到别处 —— 纯 CSS 做不到。display:contents 的作用是
   让 .kmf-nav-row 这个盒子本身不产生任何格式化上下文，其子元素
   （品牌、导航）直接成为 .kmf-header-top 的网格项。于是：
     桌面 —— 品牌落第 1 列、导航落第 2 列、工具带落第 3 列
     移动 —— 把 .kmf-nav-row 复位回 display:flex，品牌与导航重新成组
   一次 DOM 结构同时满足两种断点，且不需要任何 JS 搬运。 */
@media (min-width: 861px) {
	.kmf-header-top {
		display: grid;
		grid-template-columns: auto 1fr auto;
		/* 列间距 26px：品牌↔导航留呼吸位、导航↔工具带留一道明显的分野 */
		column-gap: 26px;
		row-gap: 0;
		align-items: center;
		min-height: 74px;
	}
	/* 让 nav-row 的盒子「透明」，品牌与导航升格为本行的网格项 */
	.kmf-nav-row { display: contents; }

	.kmf-brand {
		grid-column: 1;
		grid-row: 1;
		justify-self: start;
	}
	/* 主导航：第 2 列，整列铺满后把 ul 推到右沿，
	   使导航与右侧工具带之间只留 26px 列间距，视觉上连成一体。
	   ★ no-wrap：导航项文字（"Shipping & Returns" 等）默认会在窄列里折行，
	   而 .kmf-nav 是 1fr 列 —— 列宽由剩余空间决定，一旦空间不足，
	   flex 子项会先换行再溢出，表现为页头突然变高、导航变两行。
	   这里强制 ul 不换行，让「空间不足」的问题显式暴露为溢出而非静默折行。 */
	.kmf-nav {
		grid-column: 2;
		grid-row: 1;
		justify-self: stretch;
		display: flex;
		justify-content: flex-end;
		min-width: 0;
		overflow: visible;
	}
	.kmf-nav > ul {
		justify-content: flex-end;
		flex-wrap: nowrap;
		white-space: nowrap;
	}
	.kmf-nav > ul > li > a { white-space: nowrap; }
}

/* ---- 32.2 工具区（搜索 + 快捷 + 动作）—— 顶栏第 3 列 ---- */
@media (min-width: 861px) {
	.kmf-header-search {
		grid-column: 3;
		grid-row: 1;
		display: flex;
		align-items: center;
		justify-content: flex-end;   /* ★ 需求「搜索框改到页面右侧」的核心一行 */
		gap: 10px;
		padding-bottom: 0;
		min-width: 0;
	}
	/* 动作区从「独立列」并入工具带，左侧一道细线做分野 */
	.kmf-header-search .kmf-header-actions {
		grid-column: auto;
		grid-row: auto;
		justify-self: auto;
		flex: 0 0 auto;
		gap: 2px;
		margin-left: 2px;
		padding-left: 10px;
		border-left: 1px solid var(--kmf-line);
	}
	/* 表单独占宽度：小胶囊，不再撑满半行 */
	.kmf-header-search .kmf-searchform,
	.kmf-header-search form.search-form,
	.kmf-header-search form {
		flex: 0 1 auto;
		width: clamp(186px, 17vw, 268px);
		max-width: none;
		min-width: 0;
	}
	.kmf-header-quick {
		flex: 0 0 auto;
		margin-left: 0;
		gap: 6px;
	}
}

/* ---- 32.3 搜索框本体：改小 + 胶囊圆角 ---- */
/* 位置限定在页头工具区，避免影响 404 页 / 搜索空结果页里的同名表单
   （那两处另有 .nb-404-search / .nb-search-empty 作用域，且需要大尺寸）。 */
.kmf-header-search .kmf-searchform {
	/* ★ 需求「边框加角度，显得圆润」：
	   表单容器与内部控件之间不留缝、各自去掉内侧圆角 —— 圆角只由容器统一裁切
	   （容器已有 overflow:hidden，这正是能做出「一体胶囊」的前提）。 */
	border-radius: 999px;
	border-color: var(--kmf-line-2);
	background: var(--kmf-tile);
	transition: border-color var(--kmf-dur) var(--kmf-ease),
	            background var(--kmf-dur) var(--kmf-ease);
}
.kmf-header-search .kmf-searchform:hover { border-color: var(--kmf-line); }
.kmf-header-search .kmf-searchform:focus-within {
	border-color: var(--kmf-pine);
	background: var(--kmf-surface);
}/* ★ 需求「改小」：高度 44 → 36px，字号 14.5 → 13px，左右内边距 16 → 15px。
   36px 同时满足 WCAG 2.2 Target Size (Enhanced) 的 24×24 下限与
   主流触屏 44px 建议在桌面指针场景下的最小可接受值。 */
.kmf-header-search .kmf-searchform input[type="search"],
.kmf-header-search input.search-field {
	height: 36px;
	padding: 0 6px 0 15px;
	font-size: 13px;
	border-radius: 0;          /* 圆角交给容器 */
}
.kmf-header-search .kmf-searchform input[type="search"]::placeholder,
.kmf-header-search input.search-field::placeholder {
	color: var(--kmf-ink-3);
	font-size: 13px;
}
/* get_search_form() 的输出在「classic」分支下是 <input type="submit">，
   在「html5」分支下是 <button type="submit"><svg/></button>。
   两条分支都要小一号且继承容器圆角，故用并集选择器统一。 */
.kmf-header-search .kmf-searchform button[type="submit"],
.kmf-header-search input.search-submit {
	height: 36px;
	width: auto;
	min-width: 42px;
	padding: 0 14px;
	border: 0;
	border-left: 1px solid var(--kmf-line);
	border-radius: 0;          /* 圆角交给容器 */
	background: var(--kmf-pine);
	color: #fff;
	font-size: 12.5px;
	font-weight: 600;
	letter-spacing: .01em;
	cursor: pointer;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	transition: background var(--kmf-dur) var(--kmf-ease);
}
.kmf-header-search .kmf-searchform button[type="submit"]:hover,
.kmf-header-search input.search-submit:hover { background: var(--kmf-pine-d); }
.kmf-header-search .kmf-searchform button[type="submit"] svg {
	width: 15px; height: 15px;
}
/* 线上实测的经典分支：<input class="search-field"> + <input class="search-submit">
   直接兄弟选择器给它们补上容器式外观（不依赖 .kmf-searchform 包裹）。 */
.kmf-header-search input.search-field {
	border: 0;
	background: transparent;
	color: var(--kmf-ink);
	outline: none;
	-webkit-appearance: none;
	appearance: none;
}
.kmf-header-search input.search-field:focus { outline: none; }

/* ---- 32.4 第一档收缩：861–1100px ---- */
/* 该区间导航 11 项 + 搜索 + 3 快捷 + 3 动作必然挤不下，
   优先保导航与搜索框，逐级丢掉「快捷入口 → 动作区文字」。 */
@media (min-width: 861px) and (max-width: 1100px) {
	.kmf-header-top { column-gap: 16px; }
	.kmf-nav > ul > li { padding: 0 8px; }
	.kmf-header-search { gap: 8px; }
	.kmf-header-search .kmf-searchform,
	.kmf-header-search form { width: clamp(168px, 20vw, 220px); }
	.kmf-header-quick { display: none; }   /* 快捷入口先让位 */
	.kmf-header-actions .kmf-head-link span { display: none; }
	.kmf-header-actions .kmf-head-link { padding: 7px 8px; }
}

/* ---- 32.5 移动端复位（≤860px）—— 不可省的完整清单 ---- */
/* ★ 移动端目标版式（与旧版一致的经典三段头）：
     行1：[ 品牌 ] ←——弹性——→ [ 汉堡 / 账户 / 购物车 ]
     行2：[ 搜索框（整行，贴右） ]
   实现要点：不用网格，改回 flex + 绝对定位。
   为什么放弃网格：工具区 .kmf-header-search 同时既要提供「行 1 右侧的图标」
   又要提供「行 2 的搜索框」，一个网格项无法同时占据两行两列 ——
   上一版就是栽在这里（actions 被塞在第 2 行的行内，挤在品牌下方）。
   改用 flex 行 + 让工具区把搜索框与图标拆成两段、由 order 交错排布。 */
@media (max-width: 860px) {
	.kmf-header-top {
		display: flex;
		flex-wrap: wrap;
		align-items: center;
		column-gap: 10px;
		row-gap: 0;
		min-height: 60px;
		padding-top: 8px;
	}
	/* nav-row 退化为普通 flex 盒（承载品牌） */
	.kmf-nav-row {
		display: flex;
		align-items: center;
		gap: 14px;
		min-width: 0;
		flex: 0 0 auto;
		order: 1;
	}
	.kmf-brand { justify-self: auto; }
	/* 主导航此时是 position:fixed 抽屉，脱离文档流。
	   display 必须显式复位 —— 32.1 里给它设过 display:flex，
	   而 782px 抽屉规则只用 inset/transform 定位、不覆盖 display，
	   不复位会得到一个「flex 容器形态的固定层」，内部 ul 的 flex-direction
	   改写（782px 块的 column）会与它叠加出双列错排。 */
	.kmf-nav {
		display: block;
		justify-self: auto;
		position: fixed;
	}
	.kmf-nav > ul { justify-content: flex-start; }

	/* 汉堡：紧贴品牌右侧
	   ★ position 必须保持 relative —— 三条横杠是 absolute + left/right:10px，
	   一旦让 .kmf-burger 变成 static，它们会挂到最近的定位祖先
	   （.kmf-header，position:sticky）上，渲染成三条横贯整个页头的线。 */
	.kmf-burger {
		position: relative;
		order: 2;
		flex: 0 0 auto;
		margin-left: 2px;
	}

	/* ★ 工具区在移动端「盒子透明」：display:contents 让它的两个孩子
	   （搜索表单、账户/购物车图标）直接成为 .kmf-header-top 的 flex 项，
	   从而能把图标放进第 1 行右侧、把搜索框整行推到第 2 行 ——
	   若保留盒子，两个孩子只能一起待在第 2 行（上一版的实际症状：
	   图标被挤到搜索框左侧、搜索框不再独占一行）。 */
	.kmf-header-search {
		display: contents;
	}
	/* 图标段：第 1 行，靠右（order 3 排在品牌 1 / 汉堡 2 之后） */
	.kmf-header-search .kmf-header-actions {
		order: 3;
		flex: 0 0 auto;
		margin-left: auto;
		padding-left: 0;
		border-left: 0;
		gap: 2px;
	}
	/* 搜索框：整行换行（flex-basis:100%），成为第 2 行 */
	.kmf-header-search form,
	.kmf-header-search .kmf-searchform,
	.kmf-header-search form.search-form {
		order: 4;
		flex: 0 0 100%;
		width: 100%;
		max-width: none;
		min-width: 0;
		margin-top: 8px;
		margin-bottom: 10px;
	}
	.kmf-header-quick { display: none; }

	/* 抽屉/遮罩的上沿高度由 JS 实测写入，此处无需再写死 */
}

/* 360px 级极窄屏：动作区只留图标（文字已在 1180px 档隐藏） */
@media (max-width: 420px) {
	.kmf-header-search { gap: 6px; }
	.kmf-header-search .kmf-searchform input[type="search"],
	.kmf-header-search input.search-field { padding-left: 13px; }
	.kmf-header-search .kmf-searchform button[type="submit"],
	.kmf-header-search input.search-submit { min-width: 38px; padding: 0 11px; }
}


/* ==========================================================================
   33. ★★ 第十一轮：北欧简约版式重排（2026-10-08）★★
   ==========================================================================
   背景：Chris 要求「根据我们的网站内容，重新选择更适合我们的店铺模板，
   要求：欧美风格，简单大气」。经确认三项前提：
     · 改造范围：整站视觉重排（重做首页版式骨架）
     · 风格取向：北欧简约（Scandinavian minimal）
     · 配色策略：★ 保留现有黑白灰体系，只调版式 ★

   所以本节**一行颜色都不改**，全部落在「尺度 / 节奏 / 留白 / 字重」四件事上。
   这也是风险最低的路径 —— 第八/九轮刚按 Anker 定稿的冷灰白中性色不动，
   只重构版式语法。

   --------------------------------------------------------------------------
   33.0 参考依据（本轮实测 12 个欧美/北欧家具站的计算样式）

   把「欧美家具站主流观感」拆成可量化的 6 项，逐项对齐：

   | 维度         | 实测区间（参考站）                        | 本站第十轮 | 本轮目标 |
   |--------------|-------------------------------------------|-----------|---------|
   | 主标题 h1    | 40–64px，字重 300–500                     | 52px/700  | 54px/500 |
   | 内容列宽     | 1200–1320px                               | 1440px    | 1320px  |
   | 区块内标题   | 24–36px                                   | 25–36px   | 30–38px |
   | 区块内边距   | 56–96px                                   | 56–96px   | 64–104px|
   | hero 高度    | 500–800px                                 | 600px     | 660px   |
   | 图片/文字比  | 图片为绝对主体，文字极少                  | 文字偏重  | 提图降字 |

   参考站实测明细（docH / 字体 / h1）：
     · scandinavian-designs  5148  CoreSans,Roboto        h1 48px / w300  ← 最贴近「北欧简约」
     · interiordefine        6038  CalibreRegular         h1 60px / w400
     · 2modern               5528  Open Sans              h1 64px / w400
     · burrow                6627  Suisse Intl            h1 40px / w500
     · finnish-designshop    9418  proxima-nova           hero 518(w=1320)
     · dwr                   6865  DWR Sans               h1 50px / w700
     · article               4394  proxima_nova_regular   h1 48px
     · made                  4695  DM Sans

   关键发现（与本站当前做法差异最大的三条）：
     1. **字重**：参考站 h1 普遍用 300–500 的「细字重」，本站用 700。
        欧美家具站的「大气」不靠加粗，靠**大字号 + 细字重 + 大留白**。
     2. **列宽**：参考站内容列 1200–1320px，本站 1440px 偏宽，
        导致图片被摊薄、文字行长过长（不利于「简单」的观感）。
     3. **节奏**：参考站 hero 500–800px，本站 600px 合适；
        但本站「类目墙 2224px」占全页 24%，严重超配。
   ========================================================================== */

:root {
	/* ★ 新增「阅读列宽」：内容型区块（类目墙 / 商品流 / 故事区）用窄列，
	   让图片密度更高、行长更短 —— 这是北欧简约的核心版式手法。
	   与 --kmf-wrap(1440px) 并存：整幅 banner / hero 继续吃满 1440，
	   内容区收在 1320，形成「外宽内收」的双层容器节奏。
	   命名用 -read 而非 -narrow，避免与既有 --kmf-wrap-narrow(760px) 混淆。 */
	--kmf-wrap-read:   1320px;

	/* ★ 字重档位：北欧家具站的标题字重区间。
	   300 = 极细（scandinavian-designs）
	   400 = 常规（interiordefine / 2modern）
	   500 = 中等（burrow 的 h1 就是 500）
	   本站取 500 —— 在 Inter 上能得到「克制但有分量」的观感，
	   比 400 更抗低分屏的虚化，比 700 更轻。 */
	--kmf-w-display:   500;
	--kmf-w-title:     600;   /* 区块内标题 */

	/* ★ 区块节奏（对齐参考站 56–104px 区间，整体上抬一档制造「疏」） */
	--kmf-sec-pad:     clamp(64px, 7vw, 104px);
	--kmf-sec-pad-tight: clamp(40px, 4.6vw, 64px);
}

/* --------------------------------------------------------------------------
   33.1 内容列收窄 —— 「外宽内收」双层容器

   为什么不用改 --kmf-wrap：那个令牌同时被页头、页脚、hero、通栏横幅引用，
   一改会连带页头宽度变化（页头刚在第十轮定稿，不能碰）。
   所以只给「内容型区块的 .kmf-wrap」收窄，通栏元素保持 1440。
   -------------------------------------------------------------------------- */
.kmf-section > .kmf-wrap,
.kmf-section > .kmf-wrap-wide {
	max-width: var(--kmf-wrap-read);
}

/* --------------------------------------------------------------------------
   33.2 主标题阶梯 —— 最大的一处观感改动：字号升、字重降

   改前：clamp(32px, 3.05vw, 52px) / 700 / ls -.026em
         → 1440 下 43.9px，粗体，偏「电商促销感」
   改后：clamp(38px, 3.75vw, 62px) / 500 / ls -.03em
         → 1440 下 54px，中等字重，接近 scandinavian-designs 的 h1 48px/w300
           与 interiordefine 的 60px/w400 的区间。

   行高从 1.1 放到 1.06 —— 大字号的北欧标题行距更紧，
   让多行标题聚成一整块「面」，而不是散成几行「线」。

   ★★ 必须带 !important 的原因（实测踩坑）★★
   第 30.1 节（第九轮）给 hero 写过一整套收敛规则，其中：
     .kmf-hero h1 { font-size: clamp(26px, 3.05vw, 44px) !important }
   带 !important 且选择器特异性相同（都是 0,1,1），
   按 CSS 级联规则，!important 声明永远压过普通声明 ——
   所以本节若不带 !important，改前改后字号**完全不变**
   （实测 1440 下仍是 43.92px，正是 3.05vw 的结果）。
   本节是对第九轮那套规则的有意修订，故同样以 !important 声明，
   并按源码顺序（6735 > 6107）取得最终控制权。
   -------------------------------------------------------------------------- */
.kmf-hero h1 {
	/* ★ 字距/字号二次校准（实测后回调）：
	   初版 clamp(38px, 3.75vw, 62px) 在 1440 下解析 54px，
	   配合 max-width:17ch 让 73 字符的标题排成 4 行 —— 实测 w=510px 是瓶颈。
	   参考站（scandinavian-designs 48px / interiordefine 60px）在相近
	   字数下普遍 2–3 行，靠的是**更宽的文字块**而不是更大字号。
	   故：上限 62→58px、vw 系数 3.75→3.4，max-width 17ch→20ch。
	   1440 下 → 48.96px（≈参考站 48px），1920 下 → 58px。 */
	font-size: clamp(36px, 3.4vw, 58px) !important;
	font-weight: var(--kmf-w-display) !important;
	line-height: 1.08 !important;
	letter-spacing: -.03em !important;
	max-width: 20ch !important;
	margin: 0 0 22px !important;
}

/* ★ 文案柱放宽 —— 第九轮设的是 max-width: min(620px, 46vw)，
   在 1440 下只有 620px，h1 被迫折行。
   北欧站的文案块普遍更宽（h1 占 2–3 行）。
   这里放到 min(760px, 52vw)：1440 → 748px、1920 → 760px。
   注意 hero 是「图片满铺 + 文案叠加」，文案柱过宽会盖住图片主体，
   52vw 是「文字块舒展」与「图片可辨识」的平衡点（实测图片右侧
   仍有约 45% 的无遮挡区域）。 */
.kmf-hero-copy {
	max-width: min(760px, 52vw) !important;
}

/* hero 导语：字数不变，但行长收窄 + 字号微升，让「文字块」更紧凑。
   ★ 第九轮把 lede 压到 clamp(13.5px, 1.02vw, 15.5px)，比本站正文还小，
   大标题下面出现「断层」。这里回升到 16–18px 区间，恢复阅读层级。 */
.kmf-hero-copy > p.kmf-lede,
.kmf-hero .kmf-lede {
	font-size: clamp(16px, 1.08vw, 18px) !important;
	line-height: 1.72 !important;
	max-width: 42ch !important;
	margin: 0 0 34px !important;
	opacity: 1 !important;
}

/* ★ hero 高度：解除第九轮的 aspect-ratio 锁定
   第九轮给 .kmf-hero-inner 设了 aspect-ratio: 2.5/1 + max-height: 620px，
   这是为了修当时「文案溢出 600px 容器」的问题。
   但副作用是：**hero 高度完全由视口宽度决定**，任何 padding 调整都不生效
   （实测 1920→620px、1440→576px、1280→512px，全是 宽/2.5）。
   本轮改用「内容驱动 + min-height 兜底」：
     · aspect-ratio: auto —— 高度交还给内容
     · min-height: clamp(520px, 36vw, 660px) —— 保证大屏有足够画面感
     · max-height: none —— 不再截断
   这样 h1 放大后 hero 自然跟着变高，而不是把文案压回去。 */
.kmf-hero-inner {
	aspect-ratio: auto !important;
	min-height: clamp(520px, 36vw, 660px) !important;
	max-height: none !important;
}

/* --------------------------------------------------------------------------
   33.3 区块内标题阶梯 —— 由 25–36px 提到 30–38px，字重降到 600

   参考站区块内标题实测 24–36px（interiordefine 的 "The ID Difference" 36px、
   finnish-design 的 "Comfort? Easiness? Style? 10/10." 34px）。
   本站当前 clamp(25px, 2.6vw, 36px) 已接近，本轮只上调一档并把字重 700→600，
   同时收紧字距，与 h1 形成「同族不同级」而非「粗细对立」。
   -------------------------------------------------------------------------- */
.kmf-head h2 {
	font-size: clamp(28px, 2.75vw, 38px) !important;
	font-weight: var(--kmf-w-title) !important;
	line-height: 1.1 !important;
	letter-spacing: -.032em !important;
}
.kmf-head p {
	font-size: 15px !important;
	line-height: 1.6 !important;
	max-width: 54ch;
}

/* --------------------------------------------------------------------------
   33.4 区块节奏放宽 —— 让页面「呼吸」

   参考站分区高度 300–900px 不等，块间留白普遍大于本站。
   把 .kmf-section 的上下 padding 由 clamp(56px,6.2vw,96px)
   提到 clamp(64px,7vw,104px)，相邻区块保持「不叠加」的处理。
   -------------------------------------------------------------------------- */
.kmf-section {
	padding-top: var(--kmf-sec-pad);
	padding-bottom: var(--kmf-sec-pad);
}
.kmf-section + .kmf-section { padding-top: var(--kmf-sec-pad-tight); }
.kmf-section-tight {
	padding-top: var(--kmf-sec-pad-tight);
	padding-bottom: var(--kmf-sec-pad-tight);
}
.kmf-hero + .kmf-section { padding-top: clamp(56px, 6vw, 88px); }

/* 区块标题组的下间距同步放宽，让标题与内容之间留出空气 */
.kmf-head { margin-bottom: clamp(28px, 3vw, 46px); }

/* --------------------------------------------------------------------------
   33.5 hero 的纵向留白（已并入 33.2 统一控制）

   ★ 这里保留节号以免歧义，但规则已上移到 33.2 ——
   因为 hero 高度、文案柱宽度、h1 字号三者必须一起改才有意义：
   单独加 padding 会被第九轮的 aspect-ratio 吃掉（见 33.2 的说明）。
   本节只保留 stats 上间距的微调，让指标条离 CTA 更远一点，
   在更高（520–660px）的 hero 里形成「上密下疏」的重心。 */
.kmf-hero-stats {
	padding-top: 34px !important;
	margin-top: auto;
}

/* --------------------------------------------------------------------------
   33.6 类目墙降密 —— 全页最大的一块「超配」，2224px 占全页 24%

   当前：4 列 × 11 张卡，每张 min-height 232px，区块总高 2224px。
   参考站的类目区普遍 296–714px，**单屏内看完**。
   处理：
     · 卡片 min-height 232 → 206px（仍足够容纳图标 + 类目名 + 一行描述）
     · 网格 gap 收到 14–20px，让 11 张卡排得更紧凑
     · 区块 padding 用 tight 档（40–64px），不再用大档
   预计区块高度可降 20–25%，仍在 1700px 左右 —— 因为 11 张卡本身
   就是三行，这是**内容量决定的下限**，靠 CSS 只能优化到这里。
   -------------------------------------------------------------------------- */
.kmf-cats {
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: clamp(14px, 1.5vw, 20px);
}
/* ★ 卡片实际高度由 .kmf-cat-media 的 aspect-ratio:1.27/1 决定，
   不是 min-height（实测 1440 下 cat h=362 而非 206）——
   所以必须同时收紧 media 的高宽比才真正降密。
   1.27:1 → 1.52:1：更扁的图框，11 张卡整体矮约 18%，
   同时更接近参考站类目瓦片的横幅比例。 */
.kmf-cat { min-height: 206px; }
.kmf-cat-media { aspect-ratio: 1.52 / 1 !important; }

/* --------------------------------------------------------------------------
   33.7 商品卡与商品流的留白调整

   参考站的商品网格 gap 通常 16–28px、卡片之间无边框、纯白底。
   本站 gap 已是 24px 量级，本轮只微调 + 让商品流区块标题下间距更大。
   -------------------------------------------------------------------------- */
ul.products {
	gap: clamp(20px, 2vw, 30px) !important;
}

/* --------------------------------------------------------------------------
   33.8 故事区 / 保障区 / 横幅 —— 统一到新节奏

   · .kmf-story：图片侧加大到 1.15fr，文字侧收到 .85fr
     （北欧站普遍「图大于文」，本站当前 1:1 太平）
   · .kmf-guarantees：四张卡的 padding 与 h3 字号统一上调，
     与区块内标题的新阶梯对齐
   · .nb-band：最小高度由 340–460px 提到 400–540px，向 hero 靠
   -------------------------------------------------------------------------- */
.kmf-story {
	grid-template-columns: 1.15fr .85fr;
	gap: clamp(36px, 6.5vw, 88px);
}
.kmf-story h2 {
	font-size: clamp(28px, 2.7vw, 38px);
	font-weight: var(--kmf-w-title);
	letter-spacing: -.032em;
	line-height: 1.12;
}

.kmf-guarantee { padding: 28px 26px 30px; }
.kmf-guarantee h3 {
	font-size: 20px;
	font-weight: var(--kmf-w-title);
	letter-spacing: -.014em;
}

.nb-band { min-height: clamp(400px, 34vw, 540px); }
.nb-band-copy h2 {
	font-size: clamp(28px, 2.9vw, 40px);
	font-weight: var(--kmf-w-display);
	letter-spacing: -.03em;
	line-height: 1.1;
}

/* --------------------------------------------------------------------------
   33.9 响应式回落

   大字号在窄屏需要更激进的收敛，否则会挤成 4–5 行。
   参考站窄屏普遍把 h1 降到 32–40px、字重保持 500。
   -------------------------------------------------------------------------- */
@media (max-width: 1100px) {
	:root { --kmf-wrap-read: 100%; }
}
@media (max-width: 860px) {
	.kmf-cats { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
	.kmf-cat { min-height: 180px; }
	.kmf-cat-media { aspect-ratio: 1.3 / 1 !important; }
	.kmf-story { grid-template-columns: 1fr; gap: 28px; }
	.kmf-story-media { aspect-ratio: 16 / 11; }
	.kmf-section { padding-top: clamp(48px, 9vw, 68px); padding-bottom: clamp(48px, 9vw, 68px); }
	.kmf-head { margin-bottom: 22px; }
	.kmf-hero-inner { padding-top: clamp(32px, 6vw, 48px); padding-bottom: clamp(32px, 6vw, 48px); }
	.kmf-hero h1 { max-width: none !important; }
	.kmf-hero-copy { max-width: none !important; }
}
/* ★ 极窄屏 h1 单独收敛 —— 实测 390px 下 36px 字号把 73 字符标题
   排成 5 行（box h=194），首屏英雄区被文字占满、图片几乎看不见。
   降到 clamp(26px, 7.6vw, 32px)：390 → 29.6px，配合 1.14 行高约 4 行。
   仍高于第九轮的 24px（那个值在小屏上偏「次要」，与 h1 语义不符）。 */
@media (max-width: 620px) {
	.kmf-hero h1 { font-size: clamp(26px, 7.6vw, 32px) !important; line-height: 1.14 !important; }
	.kmf-hero-copy > p.kmf-lede,
	.kmf-hero .kmf-lede { font-size: 15px !important; line-height: 1.62 !important; }
}
/* ★ 极窄屏保持 2 列，**不降到 1 列** ——
   实测 390px 下若降到 1 列，11 张卡竖排会让类目区块高 3807px（占全页 14%），
   且首屏完全看不到第二个区块。2 列 + 1.3:1 图框后高度降到约 1900px。
   参考站在 iPhone 宽度下也普遍保持 2 列类目瓦片。 */
@media (max-width: 620px) {
	.kmf-cats { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
	.kmf-cat { min-height: 150px; }
	.kmf-cat-media { aspect-ratio: 1.15 / 1 !important; }
}

/* ==========================================================================
   34. ★★ 第十二轮：商品卡图片完整显示 + 卡片收敛（2026-10-09）★★
   ==========================================================================
   问题（实测确诊，非猜测）：
     .kmf-card-media img { object-fit: cover } 在 1:1 图框里做**中心裁切**。
     结合实测的原图比例分布（0.70 ~ 1.58 齐全），裁切幅度差异极大：
       · 竖版 0.70（560x800）→ 裁掉约 30% 高度，产品被削头去脚
       · 横版 1.58（800x505）→ 裁掉约 37% 宽度，两端被切
       · 方形 1.00           → 无裁切
     于是同一排卡片里有的完整、有的缺边，观感参差。

   ★ 重要前提：文件层的缩略图已经修好（100% 等比不裁、600px 宽），
     所以这里的 cover 是**唯一剩余的裁切来源** —— 改成 contain 即可根治。
     这也印证了之前的判断：object-fit 只能重排已有像素，救不了文件里被裁掉的像素；
     反过来说，文件层修好之后，渲染层同样必须跟着改，否则白修。

   方案：
     34.1 图框 contain + 统一内边距（保证完整显示，并给产品图一致的呼吸空间）
     34.2 卡片文字区节奏（标题收敛两行、价格贴底、间距统一）
     34.3 悬停反馈
     34.4 列表页工具条（结果数 / 排序）收敛
   ========================================================================== */

/* ---- 34.1 商品图：contain，保证产品完整显示 ----
   内边距用 4.5%：既留出呼吸空间，又不至于让产品显得太小。
   衬底统一为纯白（--kmf-surface），使不同比例的图在同一底色上并列时不突兀。 */
ul.products li.product .kmf-card-media,
.kmf-card-media {
	aspect-ratio: 1 / 1;
	background: var(--kmf-surface);
	padding: 4.5%;
	box-sizing: border-box;
	overflow: hidden;
}
ul.products li.product .kmf-card-media img,
ul.products li.product .kmf-card-media a img,
.kmf-card-media img {
	width: 100%;
	height: 100%;
	object-fit: contain;
	object-position: center;
	display: block;
}

/* ---- 34.2 卡片文字区：收敛节奏，让同排卡片的价格与按钮对齐 ----
   标题从 3 行收到 2 行：4 列布局下每张卡约 300px 宽，
   3 行标题会把卡片拉得高低不一，2 行在北欧风格里也更清爽。
   价格用 margin-top:auto 沉到文字区底部，与图片框形成稳定的两段结构。 */
.kmf-card-body {
	display: flex;
	flex-direction: column;
	padding: 14px 2px 0;
}
.kmf-card-body .kmf-card-title {
	-webkit-line-clamp: 2;
	margin-bottom: 8px;
}
.kmf-card-body > .kmf-card-cat {
	margin-bottom: 7px;
	font-size: 10.5px;
	letter-spacing: .09em;
	color: var(--kmf-ink-3);
	text-transform: uppercase;
}
.kmf-card-body .kmf-card-price,
.kmf-card-body > .price { margin-top: auto; padding-top: 4px; }
.kmf-card-body .kmf-card-price > .price,
.kmf-card-body .kmf-card-price .price { font-size: 16px; }

/* 星级与价格的间距（评分存在时才生效，无评分卡片不受影响） */
.kmf-card-body .nb-stars--card { margin-bottom: 6px; }

/* ---- 34.3 悬停：contain 下轻微放大即可，幅度过大会让图溢出内边距 ---- */
ul.products li.product .kmf-card-media img,
.kmf-card-media img {
	transition: transform .5s var(--kmf-ease);
}
ul.products li.product:hover .kmf-card-media img { transform: scale(1.035); }

/* ---- 34.4 列表页工具条 ----
   WooCommerce 默认把「结果数」与「排序下拉」分别左右贴边，
   中间大片空白。这里收成同一行的紧凑版式，并统一控件高度。 */
.woocommerce-result-count {
	font-size: 13px;
	color: var(--kmf-ink-3);
	margin: 0;
	letter-spacing: -.005em;
}
.woocommerce-ordering { margin: 0; }
.woocommerce-ordering select {
	height: 38px;
	padding: 0 34px 0 12px;
	font-size: 13px;
	color: var(--kmf-ink);
	background-color: var(--kmf-surface);
	border: 1px solid var(--kmf-line-2);
	border-radius: var(--kmf-r-sm);
	appearance: none;
	background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236e6e73' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 12px center;
}
.woocommerce-ordering select:focus {
	outline: none;
	border-color: var(--kmf-pine);
}
/* 工具条整行：结果数在左、排序在右，上下留白统一 */
ul.products + .woocommerce-pagination { margin-top: clamp(32px, 3.6vw, 56px); }

/* ---- 34.5 移动端：两列时内边距略减，避免产品显得过小 ---- */
@media (max-width: 860px) {
	ul.products li.product .kmf-card-media,
	.kmf-card-media { padding: 3.5%; }
	.kmf-card-body { padding-top: 11px; }
}

/* ---- 34.6 修正：排序下拉框文字被裁 ----
   实测：给 select 设 height:38px 后，浏览器按 padding-box 计算内容高度，
   而 select 的文字垂直居中依赖 line-height；一旦 line-height 从 body
   继承了较大的值（本项目 body 是 1.6），文字就会被上下裁掉。
   截图确认症状：右上角只显示半截「Default sorting」。
   修法：不再固定 height，改用上下 padding 撑高 + 显式 line-height。 */
.woocommerce-ordering select {
	height: auto;
	line-height: 1.3;
	padding: 9px 34px 9px 12px;
	font-size: 13px;
}

/* ---- 34.7 商品标题：字号与行高微调，让两行容纳更多文字 ----
   实测商品标题普遍 120–150 字符（含大量规格描述），14px/1.42 下两行只能
   显示约 70 字符，截断过多（截图可见「...Small Programmable Stainless
   Steel Pot with Slow Cook...」）。
   调到 13.5px/1.38：两行可容纳约 90 字符，同时卡片更清爽。
   仍保持 2 行 clamp —— 北欧风格偏好在售罄感与信息量之间取「干净」。 */
ul.products li.product .woocommerce-loop-product__title,
ul.products li.product h2,
ul.products li.product h3,
.kmf-card-title {
	font-size: 13.5px;
	line-height: 1.38;
}

/* ---- 34.8 ★ 修正：用 !important 覆盖第 28.3 节的表单强制规则 ----
   实测定位（不是猜测）：
     第 28.3 节（line 5190-5210）给全部 WooCommerce 表单控件写了
       .woocommerce select { background: var(--kmf-bg) !important;
                             padding: 12px 14px !important;
                             font-size: 14px !important;
                             border-radius: 0 !important; }
     我的 34.6 规则没有 !important，按级联规则**必然输给它**
     —— 实测 computed padding 正是「12px 14px」，证实了这一点。
     同时 `background:` 是简写，会把 `background-image` 一并重置，
     所以下拉箭头也必须用 !important 才能挂上。

   为什么选择「在末尾加 !important」而不是去改 28.3：
     28.3 是「全站表单控件统一层」，服务于 20+ 个真实表单
     （结账、账户、搜索、评论），改它影响面大；
     而排序下拉只是列表页的一个小控件，就地覆盖风险最低。
     —— 保持「只追加、不改既有」的原则。 */
.woocommerce.woocommerce-ordering select,
.woocommerce-ordering select {
	height: auto !important;
	line-height: 1.3 !important;
	padding: 9px 34px 9px 12px !important;
	font-size: 13px !important;
	font-weight: 500 !important;
	border-radius: 2px !important;
	border: 1px solid var(--kmf-line-2) !important;
	background-color: var(--kmf-surface) !important;
	background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236e6e73' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E") !important;
	background-repeat: no-repeat !important;
	background-position: right 12px center !important;
	background-size: 12px 12px !important;
	appearance: none !important;
	-webkit-appearance: none !important;
	cursor: pointer;
}

/* 商品标题：同样受 28.7 影响，这里一并加固以避免依赖源码顺序 */
ul.products li.product .woocommerce-loop-product__title,
ul.products li.product h2,
ul.products li.product h3,
.kmf-card-body .kmf-card-title {
	font-size: 13.5px !important;
	line-height: 1.38 !important;
}

/* ---- 34.9 移动端商品列表：1 列 → 2 列 ----
   实测（390×844）：/product-category/kitchen-appliances/ 文档高 12449px，
   单页 16 个商品要滚动约 15 屏，浏览效率很低。
   主流电商移动端（Amazon / Wayfair / 北欧家具站）普遍用 2 列，
   一屏能看到 4–6 个商品，页面长度直接减半。

   注意：这里改的是**商品列表**（ul.products 的列数），
   与类目墙（.kmf-cats）是两套独立的网格，互不影响。
   第 28 章已有 `ul.products[class*="columns-"] { --nb-cols: 1 }`（560px 断点），
   此处用同特异性 + 更靠后的位置覆盖。 */
@media (max-width: 560px) {
	ul.products[class*="columns-"],
	ul.products.columns-2,
	ul.products.columns-3,
	ul.products.columns-4 {
		--nb-cols: 2;
		gap: 12px;
	}
	/* 两列时卡片变窄，文字区收紧：类目标签允许折行、标题字号再降 0.5px */
	.kmf-card-body { padding: 10px 0 0; }
	.kmf-card-body > .kmf-card-cat {
		font-size: 9.5px;
		letter-spacing: .06em;
		margin-bottom: 5px;
	}
	ul.products li.product .woocommerce-loop-product__title,
	.kmf-card-body .kmf-card-title { font-size: 12.5px !important; line-height: 1.35 !important; }
	.kmf-card-body .kmf-card-price > .price,
	.kmf-card-body .kmf-card-price .price { font-size: 14.5px; }
	ul.products li.product .kmf-card-media,
	.kmf-card-media { padding: 4%; }
}

/* 极窄屏（≤360px）两列会过挤，退回 1 列 */
@media (max-width: 360px) {
	ul.products[class*="columns-"] { --nb-cols: 1; }
}

/* ---- 34.10 ★ 修正：-webkit-line-clamp 不改变元素高度 ----
   实测（390px，12.5px/1.35）：computed `-webkit-line-clamp` 已是 2，
   但元素 getBoundingClientRect().height = 54px ≈ 3 行（16.875×3）。

   原因：`-webkit-line-clamp` 只做**视觉截断**（把第 N 行之后的内容裁掉并加省略号），
   不会改变盒子的高度计算 —— 高度仍按全部内容撑开。
   后果：视觉上显示 2 行，但占位 3 行，卡片底部多出一行空白，
   同排卡片的价格与按钮因此被推高、错位。

   修法：补 max-height（= 行高 × 目标行数），让盒子高度与视觉行数一致。
   用 calc(1.38em × 2) 而不是固定 px，这样桌面端（13.5px）与
   移动端（12.5px/1.35）两个断点都能自动适配。 */
.kmf-card-body .kmf-card-title {
	max-height: calc(1.38em * 2);
	overflow: hidden;
}
/* 移动端行高是 1.35，用 tighter 的 max-height 精确卡到两行 */
@media (max-width: 560px) {
	.kmf-card-body .kmf-card-title { max-height: calc(1.35em * 2); }
}

/* ---- 34.11 ★★ 修正：夺回 display，让 line-clamp 真正生效 ----
   实测 computed style 揭秘（390px）：
     display      = flow-root      ← 不是 -webkit-box！
     boxOrient    = vertical       （这些属性设了但没意义）
     lineClamp    = 2
     maxHeight    = 33.75px        （max-height 已生效）
     height       = 54.375px       ← 却仍是 3 行
   `max-height` 明明生效却不约束高度，唯一的解释是元素不是普通块级盒。

   真实原因：**WooCommerce 11.2 的 woocommerce.css 给
   `.woocommerce-loop-product__title` 加了 `display: flow-root`**
   （主题里搜不到 flow-root，是插件带的）。
   `-webkit-line-clamp` 只在 `display: -webkit-box` 下工作 ——
   display 被插件覆盖后，clamp 就成了一个无效属性：
   computed 里能看到值，但不产生任何截断效果。

   修法：显式把 display 夺回来，并同步声明 box-orient。
   用 !important 是因为插件规则与主题规则特异性相同、
   且插件样式表在主题之前加载（顺序上主题占优），
   但为免将来插件提高优先级，这里直接加固。

   ★ 这个坑值得记：凡是「属性值设对了但效果没有」的情况，
     第一件事就是查 `display` —— 大多数视觉属性的生效前提是盒模型类型正确。 */
.kmf-card-body .kmf-card-title,
ul.products li.product .woocommerce-loop-product__title,
ul.products li.product h3 {
	display: -webkit-box !important;
	-webkit-box-orient: vertical !important;
	-webkit-line-clamp: 2 !important;
	line-clamp: 2;
	overflow: hidden !important;
	max-height: calc(1.38em * 2) !important;
}
@media (max-width: 560px) {
	.kmf-card-body .kmf-card-title,
	ul.products li.product .woocommerce-loop-product__title,
	ul.products li.product h3 {
		max-height: calc(1.35em * 2) !important;
	}
}

/* ---- 34.12 ★★★ 真正的根因：min-height 压制了 max-height ----
   排查链（每一环都有实测数据，不是推测）：
     ① 我给标题设了 -webkit-line-clamp:2 + max-height:calc(1.38em*2)，
        都是 !important，但元素高度恒为 54px，毫无变化。
     ② 用 CSSOM 遍历确认规则**已被解析**：
        display=-webkit-box(important) clamp=2 maxH=calc(2.76em)(important)
        —— 规则没问题。
     ③ 逐项 dump 盒模型，抓到决定性一行：
           height : 54.375px
           minH   : 54.375px     ← 就是它
           maxH   : 33.75px
     ④ 定位到第 1650 行（2026-10-07 第四轮）：
           .kmf-card-title { min-height: calc(1.45em * 3); }
        计算值 1.45 × 3 × 12.5px = 54.375px —— 与实测**完全吻合**。
        这条规则当初是为了「把最多 3 行变成恒定 3 行，让同排卡片价格严格对齐」
        而刻意加的，注释里写得很清楚。

   ★ 关键规范：**当 min-height 大于 max-height 时，min-height 胜出**
     （CSS 2.1 §10.7）。所以我的 max-height 被彻底忽略，
     而 -webkit-line-clamp 只负责「视觉截断」不负责占位，
     两者叠加的结果就是：看着是 2 行，占位是 3 行，下方多出一行空白。

   正解：让 min-height 与目标行数保持一致（这正是原作者的思路），
   把「恒定 3 行」改成「恒定 2 行」。 */
.kmf-card-body .kmf-card-title,
ul.products li.product .woocommerce-loop-product__title,
ul.products li.product h3 {
	min-height: calc(1.38em * 2) !important;
	max-height: calc(1.38em * 2) !important;
}
@media (max-width: 560px) {
	.kmf-card-body .kmf-card-title,
	ul.products li.product .woocommerce-loop-product__title,
	ul.products li.product h3 {
		min-height: calc(1.35em * 2) !important;
		max-height: calc(1.35em * 2) !important;
	}
}

/* ---- 34.13 修正：box-sizing 让 max-height 含进了 padding ----
   实测：min/max-height 都设成 calc(1.38em × 2) = 37.26px（正好两行），
   但视觉上第二行被裁掉一半。
   原因：本项目全局是 box-sizing: border-box，而 WooCommerce 给
   `.woocommerce-loop-product__title` 带了 `padding: .5em 0`（12.5px）。
   border-box 下 max-height **包含 padding**，于是内容区只剩
   37.26 - 12.5 = 24.76px ≈ 1.33 行 → 第二行被切掉下缘。

   修法：把 padding 归零、改用 margin 提供同样的间距。
   这样 min/max-height 就等于纯内容高度，两行完整可见。 */
.kmf-card-body .kmf-card-title,
ul.products li.product .woocommerce-loop-product__title,
ul.products li.product h3 {
	padding: 0 !important;
	margin: 0 0 8px 0 !important;
	min-height: calc(1.38em * 2) !important;
	max-height: calc(1.38em * 2) !important;
}
@media (max-width: 560px) {
	.kmf-card-body .kmf-card-title,
	ul.products li.product .woocommerce-loop-product__title,
	ul.products li.product h3 {
		min-height: calc(1.35em * 2) !important;
		max-height: calc(1.35em * 2) !important;
		margin-bottom: 6px !important;
	}
}
