/*
 * 58120-theme · 前台样式（M04 博客园式三栏 + 掘金视觉 Token）
 * Design Token 见 docs/58120.cn-产品与UI设计说明书.md §六
 */
/* 一键同步结果浮层（M04.3 文章详情页） */
.s58120-modal-scrim {
	position: fixed;
	inset: 0;
	background: rgba(0, 0, 0, .45);
	display: flex;
	align-items: center;
	justify-content: center;
	z-index: 9999;
	padding: 16px;
}
.s58120-modal {
	background: var(--c-surface);
	width: 100%;
	max-width: 420px;
	border-radius: var(--radius-card);
	box-shadow: 0 8px 30px rgba(0, 0, 0, .22);
	overflow: hidden;
	font-family: var(--font);
}
.s58120-modal-head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 14px 16px;
	border-bottom: 1px solid var(--c-border-2);
	font-size: 15px;
}
.s58120-modal-x {
	border: 0;
	background: transparent;
	font-size: 22px;
	line-height: 1;
	color: var(--c-text-3);
	cursor: pointer;
}
.s58120-modal-list {
	list-style: none;
	margin: 0;
	padding: 12px 16px;
	max-height: 50vh;
	overflow: auto;
}
.s58120-modal-list li {
	display: flex;
	align-items: flex-start;
	gap: 8px;
	padding: 6px 0;
	font-size: 14px;
	color: var(--c-text-2);
	line-height: 1.5;
}
/* 结果行内容为单一 flex 项（此前文本+链接各自成项，长文案会碎成竖排） */
.s58120-modal-list li .s-txt { flex: 1; min-width: 0; }
/* 结果行内链接（下载/脚本/去发帖等）不折行 */
.s58120-modal-list li a { white-space: nowrap; }
.s58120-modal-list .dot {
	flex: none;
	width: 8px;
	height: 8px;
	border-radius: 50%;
	margin-top: 6px;
	background: var(--c-text-3);
}
.s58120-modal-list .s-synced .dot { background: var(--c-success); }
.s58120-modal-list .s-relay .dot { background: var(--c-primary); }
.s58120-modal-list .s-skipped .dot { background: var(--c-warning); }
.s58120-modal-list .s-failed .dot { background: var(--c-danger); }
.s58120-modal-list .s-pending .dot { background: var(--c-warning); animation: s58120-pulse 1s ease-in-out infinite; }
@keyframes s58120-pulse { 50% { opacity: 0.25; } }
.s58120-modal-list .s-synced { color: var(--c-success); }
.s58120-modal-list .s-failed { color: var(--c-danger); }
.s58120-modal-btn {
	display: block;
	margin: 0 16px 12px;
	padding: 10px 12px;
	background: var(--c-primary);
	color: var(--c-on-primary);
	text-align: center;
	text-decoration: none;
	border-radius: var(--radius-btn);
	font-size: 14px;
}
.s58120-modal-btn:hover { background: var(--c-primary-hover); color: var(--c-on-primary); }
.s58120-modal-close {
	width: calc(100% - 32px);
	margin: 0 16px 16px;
	padding: 9px 12px;
	background: var(--c-bg);
	border: 1px solid var(--c-border);
	border-radius: var(--radius-btn);
	font-size: 14px;
	color: var(--c-text-2);
	cursor: pointer;
}
.s58120-modal-close:hover { background: var(--c-border-2); }
.s58120-modal-login {
	padding: 0 16px 4px;
	border-top: 1px solid var(--c-border-2);
	margin-top: 4px;
	padding-top: 10px;
}
.s58120-modal-tip {
	font-size: 12.5px;
	color: var(--c-text-3);
	line-height: 1.6;
	margin: 0 0 8px;
}
.s58120-modal-login-link {
	display: inline-block;
	margin: 0 8px 8px 0;
	padding: 6px 10px;
	background: var(--c-bg);
	border: 1px solid var(--c-border);
	border-radius: var(--radius-btn);
	font-size: 13px;
	color: var(--c-text-2);
	text-decoration: none;
}
.s58120-modal-login-link:hover { background: var(--c-border-2); color: var(--c-text); }

/* 扩展安装引导弹窗（M14） */
.s58120-modal-ext { max-width: 520px; }
.s58120-modal-ext .s58120-modal-tip { padding: 0 16px; }
.s58120-ext-steps {
	margin: 4px 16px 8px 34px;
	padding: 0;
	font-size: 13px;
	line-height: 1.9;
	color: var(--c-text-2);
}
.s58120-ext-steps code {
	background: var(--c-border-2);
	border-radius: 4px;
	padding: 1px 5px;
	font-size: 12px;
}
.s58120-ext-steps a { color: var(--c-primary); }
.s58120-ext-foot {
	display: flex;
	gap: 8px;
	padding: 4px 16px 16px;
}
.s58120-ext-foot .s58120-modal-close {
	width: auto;
	margin: 0;
	flex: 1;
}
.s58120-ext-dl,
.s58120-ext-retry {
	flex: 1;
	text-align: center;
	border: 1px solid var(--c-border);
	border-radius: var(--radius-btn);
	padding: 9px 12px;
	font-size: 14px;
	cursor: pointer;
	text-decoration: none;
	color: var(--c-text-2);
	background: var(--c-bg);
}
.s58120-ext-dl {
	background: var(--c-primary);
	border-color: var(--c-primary);
	color: var(--c-on-primary);
}
.s58120-ext-dl:hover { background: var(--c-primary-hover); color: var(--c-on-primary); }
.s58120-ext-retry:hover { background: var(--c-border-2); }
.s58120-ext-retry:disabled { opacity: 0.6; cursor: not-allowed; }

/* 同步助手安装引导页（M14，/sync-helper/，CSDN 式图文教程） */
.s58120-helper {
	max-width: 760px;
	margin: 32px auto;
	padding: 0 16px;
}
.s58120-helper-card {
	background: var(--c-bg, #fff);
	border: 1px solid var(--c-border, #eaeaea);
	border-radius: 14px;
	padding: 28px 32px 32px;
	box-shadow: 0 2px 12px rgba(0, 0, 0, 0.04);
}
.s58120-helper-h1 { font-size: 22px; margin: 0 0 10px; }
.s58120-helper-lead { color: var(--c-text-2, #666); line-height: 1.8; margin: 0 0 16px; }
.s58120-helper-lead b { color: var(--c-text, #222); }
.s58120-helper-status {
	font-size: 13px;
	padding: 8px 12px;
	border-radius: 8px;
	margin: 0 0 18px;
	background: var(--c-border-2, #f4f4f5);
}
.s58120-helper-status.ok { color: #1a7f37; background: #e7f6ec; }
.s58120-helper-status.warn { color: #b54708; background: #fef3e6; }
.s58120-helper-h2 { font-size: 16px; margin: 18px 0 8px; }
.s58120-helper-p { color: var(--c-text-2, #666); line-height: 1.8; }
.s58120-helper-actions {
	display: flex;
	gap: 10px;
	margin: 14px 0 20px;
	flex-wrap: wrap;
}
.s58120-helper-actions .s58120-ext-dl,
.s58120-helper-actions .s58120-ext-retry {
	flex: 0 0 auto;
	min-width: 160px;
}
.s58120-helper-foot {
	margin-top: 22px;
	padding-top: 16px;
	border-top: 1px solid var(--c-border, #eaeaea);
	color: var(--c-text-2, #666);
	font-size: 13px;
}
.s58120-helper-foot a { color: var(--c-primary, #2f6fed); }

/* 同步平台选择面板（对齐 CSDN「同步到多平台」交互，M04.3） */
.s58120-modal-picker { max-width: 820px; border-radius: 12px; max-height: calc(100vh - 48px); display: flex; flex-direction: column; }
.s58120-modal-picker .s58120-modal-head { padding: 20px 24px 12px; font-size: 17px; border-bottom: none; flex: none; }
.s58120-modal-picker .s58120-modal-x { font-size: 24px; width: 32px; height: 32px; border-radius: 50%; }
.s58120-modal-picker .s58120-modal-x:hover { background: var(--c-bg); color: var(--c-text); }
/* 标题右上角：刷新登录状态图标 + 关闭按钮 */
.s58120-modal-head-btns { display: flex; align-items: center; gap: 8px; }
.s58120-prefresh {
	border: 0;
	background: transparent;
	font-size: 19px;
	width: 32px;
	height: 32px;
	border-radius: 50%;
	color: var(--c-text-3);
	cursor: pointer;
	line-height: 1;
	padding: 0;
}
.s58120-prefresh:hover { background: var(--c-bg); color: var(--c-primary); }
.s58120-prefresh:disabled { cursor: wait; }
.s58120-prefresh.is-busy { animation: s58120-spin 0.8s linear infinite; }
@keyframes s58120-spin { to { transform: rotate(360deg); } }
.s58120-modal-picker .s58120-modal-tip { padding: 0 24px; font-size: 13px; color: var(--c-text-3); }
.s58120-pmodes {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 12px;
	padding: 14px 24px 8px;
}
.s58120-pmode {
	display: flex;
	flex-direction: column;
	gap: 3px;
	padding: 13px 16px;
	border: 1px solid var(--c-border-2);
	border-radius: 10px;
	cursor: pointer;
	transition: border-color .12s, background .12s;
}
.s58120-pmode:hover { border-color: #b9c2ce; }
.s58120-pmode:has(input:checked) {
	border-color: var(--c-primary);
	background: color-mix(in srgb, var(--c-primary) 6%, transparent);
}
.s58120-pmode b { font-size: 14px; color: var(--c-text); }
.s58120-pmode i { font-style: normal; font-size: 12.5px; color: var(--c-text-3); }
.s58120-pnote {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 8px 24px 4px;
	padding: 11px 14px;
	border: 1px solid var(--c-border-2);
	border-radius: 10px;
	cursor: pointer;
	font-size: 13px;
	color: var(--c-text);
}
.s58120-pnote:has(input:checked) {
	border-color: var(--c-primary);
	background: color-mix(in srgb, var(--c-primary) 6%, transparent);
}
.s58120-pnote i { font-style: normal; color: var(--c-text-3); font-size: 12px; }
.s58120-pgrid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 12px;
	padding: 4px 24px 14px;
	max-height: 46vh;
	overflow-y: auto;
	overflow-x: hidden;
}
.s58120-pgrid::-webkit-scrollbar { width: 6px; }
.s58120-pgrid::-webkit-scrollbar-thumb { background: #d3d9e0; border-radius: 3px; }
.s58120-pgrid::-webkit-scrollbar-thumb:hover { background: #b9c2ce; }
.s58120-pcard {
	display: flex;
	flex-direction: column;
	gap: 8px;
	padding: 13px 16px;
	border: 1px solid var(--c-border-2);
	border-radius: 10px;
	cursor: pointer;
	position: relative;
	background: var(--c-surface);
	transition: border-color .14s, transform .14s, box-shadow .14s, background .14s;
}
.s58120-pcard:hover { border-color: #b9c2ce; transform: translateY(-2px); box-shadow: 0 6px 16px rgba(20, 28, 40, .08); }
/* 不可同步（未登录/未配置）：不预选、不可勾选，去登录后才可同步（CSDN 逻辑） */
.s58120-pcard-off { cursor: not-allowed; }
.s58120-pcard-off:hover { border-color: var(--c-border-2); transform: none; box-shadow: none; }
.s58120-pcard-off .s58120-pcheck { border-style: dashed; border-color: #d5dae1; }
.s58120-pcard:has(input:checked) { border-color: var(--pc, var(--c-primary)); background: color-mix(in srgb, var(--pc, var(--c-primary)) 5%, var(--c-surface)); }
.s58120-pcard input { position: absolute; opacity: 0; pointer-events: none; }
/* 右上角可见勾选框（CSDN 同款）：选中用平台品牌色填充 */
.s58120-pcheck {
	position: absolute;
	top: 12px;
	right: 12px;
	width: 18px;
	height: 18px;
	border: 1.5px solid var(--c-control);
	border-radius: 5px;
	background: var(--c-surface);
	transition: background .12s, border-color .12s;
}
.s58120-pcard:has(input:checked) .s58120-pcheck {
	background: var(--pc, var(--c-primary));
	border-color: var(--pc, var(--c-primary));
}
.s58120-pcard:has(input:checked) .s58120-pcheck::after {
	content: '✓';
	display: flex;
	align-items: center;
	justify-content: center;
	height: 100%;
	color: #fff;
	font-size: 12px;
	line-height: 1;
}
.s58120-pcard-logo {
	width: 36px;
	height: 36px;
	border-radius: 9px;
	color: #fff;
	font-size: 15px;
	font-weight: 600;
	display: flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	box-shadow: 0 2px 6px rgba(0, 0, 0, .12);
}
.s58120-pcard-logo svg { width: 22px; height: 22px; display: block; }
.s58120-pcard-head {
	display: flex;
	align-items: center;
	gap: 8px;
	padding-right: 22px;
	min-width: 0;
}
.s58120-pcard-name {
	font-size: 14px;
	font-weight: 600;
	color: var(--c-text);
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.s58120-pcard-sub {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 6px;
	min-width: 0;
}
.s58120-pcard-status { font-size: 12.5px; color: var(--c-text-3); white-space: nowrap; }
/* 选择器卡片上的同步状态（对齐 CSDN：进度/结果实时写在各平台卡片下方） */
.s58120-pcard-sync {
	display: block;
	margin-top: 6px;
	font-size: 12.5px;
	line-height: 1.5;
	color: var(--c-text-2, var(--c-text-3));
	word-break: break-word;
}
.s58120-pcard-sync a { color: var(--c-primary); }
.s58120-pcard-sync.s58120-ps-synced { color: var(--c-success); }
.s58120-pcard-sync.s58120-ps-failed { color: var(--c-danger); }
.s58120-pcard-sync.s58120-ps-skipped { color: var(--c-warning); }
.s58120-pcard-sync.s58120-ps-pending { animation: s58120-pulse 1s ease-in-out infinite; }
/* 同步进行中：锁定交互——隐藏发布方式/提示/出处选项，未选中的卡片变暗 */
.s58120-syncing .s58120-pmodes,
.s58120-syncing .s58120-modal-tip,
.s58120-syncing .s58120-pnote { display: none; }
.s58120-pcard-idle { opacity: 0.45; }
/* 「去登录 / 去发帖」：品牌色描边小按钮（CSDN 同款） */
.s58120-pcard-login {
	font-size: 12px;
	color: var(--pc, var(--c-primary));
	text-decoration: none;
	white-space: nowrap;
	border: 1px solid var(--pc, var(--c-primary));
	border-radius: 6px;
	padding: 2px 10px;
	transition: background .12s, color .12s;
}
.s58120-pcard-login:hover { background: var(--pc, var(--c-primary)); color: var(--c-on-primary); text-decoration: none; }
.s58120-cfg { color: var(--c-primary); text-decoration: none; font-size: 12.5px; white-space: nowrap; }
.s58120-cfg:hover { text-decoration: underline; }
.s58120-psect {
	grid-column: 1 / -1;
	font-size: 14px;
	font-weight: 600;
	color: var(--c-text);
	padding: 8px 0 0;
}
.s58120-pfoot {
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 12px 24px 18px;
	border-top: 1px solid var(--c-border-2);
	margin-top: 8px;
	font-size: 13px;
	color: var(--c-text-3);
}
.s58120-pfoot-btns { display: flex; gap: 10px; }
.s58120-pcancel,
.s58120-pgo {
	border: 1px solid var(--c-border-2);
	background: var(--c-surface);
	color: var(--c-text);
	border-radius: 8px;
	padding: 8px 20px;
	font-size: 13.5px;
	cursor: pointer;
}
.s58120-pgo { background: var(--c-primary); border-color: var(--c-primary); color: var(--c-on-primary); min-width: 96px; }
.s58120-pgo:hover { background: var(--c-primary-hover); }
.s58120-pgo:disabled { opacity: 0.5; cursor: not-allowed; }
/* 平台 Cookie 配置（弹窗内粘贴登录态） */
.s58120-pcookie {
	border: 1px solid var(--pc, var(--c-primary));
	background: var(--c-surface);
	color: var(--pc, var(--c-primary));
	border-radius: 6px;
	padding: 2px 8px;
	font-size: 12px;
	cursor: pointer;
	white-space: nowrap;
}
.s58120-pcookie:hover { background: var(--pc, var(--c-primary)); color: var(--c-on-primary); }
.s58120-cookie-modal { max-width: 480px; width: 92%; }
.s58120-cookie-input {
	display: block;
	width: calc(100% - 32px);
	box-sizing: border-box;
	margin: 0 16px;
	min-height: 120px;
	border: 1px solid var(--c-border-2);
	border-radius: 6px;
	padding: 8px 10px;
	font-size: 12.5px;
	font-family: Consolas, Menlo, monospace;
	color: var(--c-text);
	background: var(--c-bg);
	resize: vertical;
}
.s58120-cookie-input:focus { outline: none; border-color: var(--c-primary); }
.s58120-cookie-foot {
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 10px 16px 16px;
}
.s58120-cookie-login { font-size: 12.5px; color: var(--c-primary); text-decoration: none; }
.s58120-cookie-login:hover { text-decoration: underline; }
.s58120-cookie-save {
	border: none;
	background: var(--c-primary);
	color: var(--c-on-primary);
	border-radius: 6px;
	padding: 6px 18px;
	font-size: 13px;
	cursor: pointer;
}
.s58120-cookie-save:disabled { opacity: 0.5; cursor: not-allowed; }
@media (max-width: 720px) {
	.s58120-pgrid { grid-template-columns: repeat(2, 1fr); padding: 4px 16px 12px; }
	.s58120-pmodes { padding: 12px 16px 6px; }
	.s58120-modal-picker .s58120-modal-head { padding: 16px 16px 10px; }
	.s58120-modal-picker .s58120-modal-tip { padding: 0 16px; }
	.s58120-pnote { margin: 8px 16px 4px; }
	.s58120-pfoot { padding: 12px 16px 16px; }
}
@media (max-width: 480px) {
	.s58120-pgrid { grid-template-columns: 1fr; }
	.s58120-pmodes { grid-template-columns: 1fr; }
}

:root {
	/* 配色模式（M04-IA13）：
	   `light dark` = 两种都支持，**由浏览器按 `prefers-color-scheme` 选**（默认跟随系统）；
	   用户在顶栏选浅/深时，JS 会给 <html> 写 `data-theme="light|dark"`，
	   下面 `:root[data-theme=…]` 规则改写 `color-scheme`，浏览器随即改用指定配色 ——
	   于是「自动」与「手动」共用同一套 light-dark() 取值，不存在第二份深色定义。
	   顺带把原生控件（滚动条 / 输入框 / 勾选框 / 日期选择器）一起带入对应配色。 */
	color-scheme: light dark;
	/* 主色令牌（2026-10-07 可访问性收口）：
	   品牌亮绿 #2DAE67 与白底只有 **2.86:1** —— 既不能当小字文字色（绿字），
	   也不能当按钮底色（白字），两者都不达 WCAG AA(4.5:1)。
	   故把 `--c-primary` 定义为 **AA 安全绿 #17804A（4.97:1）**，承担所有
	   「文字色 / 按钮底色 / 边框」角色；品牌亮绿另立 `--c-primary-bright`，
	   只用于**不承载小字**的装饰（色条、下划线、图标）。
	   实测（_e2e/a11y_audit.js）：改前单页最高 166 处对比度违规，改后见 CHANGELOG。 */
	--c-primary: #17804A;
	--c-primary-hover: #135F37; /* 悬停更深（7.7:1）：原 #239A59 只有 3.0:1，悬停反而掉出 AA */
	--c-primary-bright: #2DAE67;
	--c-primary-soft: rgba(45, 174, 103, .08);
	/* S2（2026-10-11）主色**深色档**：做大面积深底区块用（Hero 深底、焦点大卡、页脚强调带）。
	   此前主色只有一档 + 一个装饰亮绿，缺「深」这一层，导致「大气」所需的
	   大块压场色无处可取（整屏90% 是灰底 + 白卡，明度层级只有两级）。
	   对比度：#0B3D24 在白底 10.8:1，作深底时配白字 14.2:1 —— 均远超 AA。

	   ⚠ 纪律（与 --c-primary-bright 同源）：**只作底色，不承载小字文字**。
	     需要深底上的文字色时请取 #FFFFFF。*/
	--c-primary-deep: #0B3D24;
	/* 主色**浅色档**：浅底上的品牌文字/图标底/标签底（如场景带图标底、场景卡 hover 底）。 */
	--c-primary-tint: #E8F5EE;
	/* 实心主色底上的文字（按钮 / chips / 分页当前页）。抽成令牌是为了深色模式：
	   深色下主色变亮绿，白字会掉到 2.1:1，必须换成深墨绿（≈9:1）。 */
	--c-on-primary: #FFFFFF;
	/* 表单控件描边（复选/输入框边缘）：WCAG 1.4.11 要求 ≥3:1，浅色 #c9ced6 恰好达标 */
	--c-control: #c9ced6;
	--c-accent: #FF7A45;
	--c-success: #52B03A;
	--c-warning: #F5A623;
	--c-danger: #E8402A;
	--c-bg: #F5F6F8;
	--c-surface: #FFFFFF;
	--c-border: #ECEEF0;
	--c-border-2: #F2F3F5;
	--c-text: #1D2129;
	--c-text-2: #4E5969;
	/* 三级文字（日期 / 计数 / 页脚等小字）：由 #86909C（白底 3.24:1）加深到 #666D78。
	   取 #666D78 而非 #6B7280：三级文字大量出现在**页面灰底 #F5F6F8** 上，
	   #6B7280 在那里的实测比值只有 4.47（差 0.03 未达 AA），再深一档才稳过。 */
	--c-text-3: #666D78;
	--c-code-bg: #F6F8FA;
	--radius-card: 12px;
	--radius-btn: 8px;
	--radius-tag: 6px;
	/* 控件高度四档：全站交互控件只允许用这四档（历史上的 40px / 47px 等魔数已收敛到这里） */
	--ctl-sm: 32px;   /* 标签 / 列表行 / 次级输入 */
	--ctl: 34px;      /* 普通按钮 / 下拉 / 面板小控件 */
	--ctl-lg: 36px;   /* 顶栏输入 / 图标按钮 */
	--ctl-hero: 44px; /* 主 CTA（首页搜索）与顶栏场景条 */
	/* 阴影颜色单独成令牌再拼成 box-shadow：`light-dark()` 只接受 <color>，
	   整条 `0 1px 2px rgba(...)` 不是颜色，包不进去（这点踩过一次）。 */
	--c-shadow-sm: rgba(0, 21, 41, .04);
	--c-shadow: rgba(0, 21, 41, .06);
	--c-shadow-lg: rgba(0, 21, 41, .10);
	--shadow-sm: 0 1px 2px var(--c-shadow-sm);
	--shadow: 0 2px 10px var(--c-shadow);
	--shadow-lg: 0 10px 28px var(--c-shadow-lg);
	--container: 1200px;
	--gap: 16px;
	--container-pad: 16px;
	/* 顶栏高度 = 字标高 48px + 上下留白 8px；改字标尺寸时同步这里，粘性偏移自动跟随 */
	--header-h: 64px;
	--sticky-top: calc(var(--header-h) + 56px); /* 顶栏 + 分类 chips 条 + 间距，各粘性栏统一基准 */
	--font: -apple-system, "PingFang SC", "Microsoft YaHei", "Source Han Sans", sans-serif;
	--font-code: "JetBrains Mono", Consolas, Menlo, monospace;
	/* 「内嵌面」：比卡片底更深/更浅一档的小面板（场景卡、.kb-panel 等），
	   让卡片内部有层次而不需要用边框（P2 视觉语言「三层浮起」）。 */
	--c-tile: #F5F6F8;
}

/* ------------------------------------------------------------
   手动切换配色模式（M04-IA13）
   `data-theme` 由 header.php 的防闪内联脚本在首次绘制前写入；这里只负责把
   「用户选择」翻译成 `color-scheme`，其余配色全部由 light-dark() 自动跟随。
   ------------------------------------------------------------ */
:root[data-theme="light"] { color-scheme: light; }
:root[data-theme="dark"] { color-scheme: dark; }

/* 双值令牌：**同一处**给出浅 / 深两种取值，由 color-scheme 决定用哪一个。
   包在 `@supports` 里是为了优雅降级 —— 不支持 `light-dark()` 的旧浏览器
   会整块跳过，退回上面 `:root` 的浅色值（而不是让 var() 失效导致整站变透明）。
   ⚠ 令牌值必须在 `:root`（含上面的 @supports）**之外**的地方引用才安全，
   故此处只放颜色类令牌，尺寸 / 圆角等与配色无关的令牌保持单值。 */
@supports (color: light-dark(#fff, #000)) {
	:root {
		--c-primary: light-dark(#17804A, #4ECB84);
		--c-primary-hover: light-dark(#135F37, #6FDD9F);
		--c-primary-bright: light-dark(#2DAE67, #45C077);
		--c-primary-soft: light-dark(rgba(45, 174, 103, .08), rgba(78, 203, 132, .16));
		/* S2 深/浅档的深色模式取值。⚠ 注意方向与主色相反：
		   深色模式下深底需要**提亮**（否则与 --c-bg #14161A 糊在一起、失去边界），
		   浅色档则需**压暗**（浅色在深底上刺眼）。这与 3708-3715 封面渐变
		   「压暗」的方向也相反 —— 那批是渐变亮端，此处是整块底色。 */
		--c-primary-deep: light-dark(#0B3D24, #16261D);
		--c-primary-tint: light-dark(#E8F5EE, #17281E);
		--c-on-primary: light-dark(#FFFFFF, #0E1A13);
		--c-control: light-dark(#c9ced6, #6B7686);
		--c-accent: light-dark(#FF7A45, #FF9B6B);
		--c-success: light-dark(#52B03A, #6FCF97);
		--c-warning: light-dark(#F5A623, #F5B95B);
		--c-danger: light-dark(#E8402A, #FF8A7A);
		--c-bg: light-dark(#F5F6F8, #14161A);
		--c-surface: light-dark(#FFFFFF, #1C1F25);
		--c-border: light-dark(#ECEEF0, #2B3038);
		--c-border-2: light-dark(#F2F3F5, #23272E);
		--c-text: light-dark(#1D2129, #E8EAED);
		--c-text-2: light-dark(#4E5969, #B4BBC6);
		--c-text-3: light-dark(#666D78, #99A1AE);
		--c-code-bg: light-dark(#F6F8FA, #0F1116);
		--c-tile: light-dark(#F5F6F8, #23262D);
		--c-shadow-sm: light-dark(rgba(0, 21, 41, .04), rgba(0, 0, 0, .5));
		--c-shadow: light-dark(rgba(0, 21, 41, .06), rgba(0, 0, 0, .55));
		--c-shadow-lg: light-dark(rgba(0, 21, 41, .10), rgba(0, 0, 0, .6));
	}
}

* { box-sizing: border-box; }

body {
	margin: 0;
	font-family: var(--font);
	background: var(--c-bg);
	color: var(--c-text);
	font-size: 14px;
	line-height: 1.7;
	-webkit-font-smoothing: antialiased;
	/* 长不可断串（URL / 型号 / 哈希）不得撑破视口：采集稿正文里的「原文：<https://…>」
	   在 390px 下会把整页顶出 100~190px 横向滚动条（实测：抽样 14 篇中 4 篇、
	   全部来自当日自动采集批次）。break-word 只在会溢出时才断词，不影响 min-content。 */
	overflow-wrap: break-word;
}

a { color: var(--c-primary); text-decoration: none; }
a:hover { color: var(--c-primary-hover); }
img { max-width: 100%; }

/* 仅屏幕阅读器可见（与 WP 核心同名约定，核心给评论列表也用这一套）。
   用途：给区块补可访问名 / 补标题层级，而**视觉零变化**——
   例：单篇页正文前的 `<h2 class="screen-reader-text">正文</h2>`。 */
.screen-reader-text {
	position: absolute !important;
	width: 1px; height: 1px;
	overflow: hidden;
	clip: rect(1px, 1px, 1px, 1px);
	clip-path: inset(50%);
	white-space: nowrap; word-wrap: normal;
	border: 0; padding: 0; margin: -1px;
}

.container { max-width: var(--container); margin: 0 auto; padding: 0 var(--container-pad); }

/* ---------- 顶部条（博客园式深色顶栏） ---------- */
.site-header {
	background: var(--c-surface);
	border-bottom: 1px solid var(--c-border);
	box-shadow: var(--shadow-sm);
	position: sticky;
	top: 0;
	z-index: 50;
}
.topbar {
	display: flex;
	align-items: center;
	gap: 16px;
	height: var(--header-h);
	transition: height .18s ease;
}
.brand {
	font-size: 20px;
	font-weight: 700;
	color: var(--c-text);
	display: flex;
	align-items: center;
	gap: 8px;
}
.brand .dot {
	width: 22px; height: 22px; border-radius: 6px;
	background: linear-gradient(135deg, var(--c-primary), var(--c-accent));
	display: inline-block;
}
/* 站点品牌标（图形随主题 assets/logo/，字面量走配置）：优先 logo 图，缺省回退内联 SVG mark */
.brand-mark { width: 30px; height: 30px; flex: none; display: block; }
/* 58120 整幅字标：高 48px（「58120」约 34px、下排站名约 10px），宽按原比例约 109px */
.brand-logo { height: 48px; width: auto; flex: none; display: block; transition: height .18s ease; }
.brand-name { letter-spacing: .2px; }

/* 顶栏滚动收缩（桌面/平板 ≥769px）：首屏 80px（品牌优先）→ 滚动 60px（阅读空间优先）。
   由 assets/main.js 切换 html.is-scrolled；高度与字标尺寸统一由 --header-h 驱动，粘性栏偏移自动跟随。
   移动端顶栏本就自适应高度（.topbar{height:auto}），不参与收缩。 */
@media (min-width: 769px) {
	html.is-scrolled { --header-h: 52px; }
	html.is-scrolled .brand-logo { height: 38px; }
}
.search-box {
	flex: 1;
	max-width: 420px;
	margin-left: auto;
	position: relative;
}
.search-box input {
	width: 100%;
	height: var(--ctl-lg);
	border: 1px solid var(--c-border);
	border-radius: var(--radius-btn);
	padding: 0 12px 0 34px;
	font-size: 14px;
	background: var(--c-bg);
	color: var(--c-text);
	transition: border-color .15s, background .15s;
}
.search-box input:hover { background: var(--c-surface); border-color: var(--c-control); }
.search-box input:focus { outline: none; background: var(--c-surface); border-color: var(--c-primary); }
.search-box input::placeholder { color: var(--c-text-3); }
/* 搜索图标改为内联 SVG（data URI）：emoji 在 Windows 下由系统彩色字体渲染，
   与全站线性扁平风格冲突，且 macOS / Android / Windows 字形差异明显。 */
.search-box::before {
	content: "";
	position: absolute;
	left: 11px; top: 50%;
	width: 15px; height: 15px;
	transform: translateY(-50%);
	background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2386909C' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='m16.6 16.6 3.9 3.9'/%3E%3C/svg%3E");
	background-size: 15px 15px;
	background-repeat: no-repeat;
	pointer-events: none;
}
.topnav {
	display: flex;
	gap: 18px;
	font-size: 14px;
}
.topnav a { color: var(--c-text-2); }
.topnav a:hover { color: var(--c-primary); }
.top-actions { display: flex; gap: 10px; align-items: center; }
.btn {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	height: var(--ctl);
	padding: 0 14px;
	border-radius: var(--radius-btn);
	font-size: 14px;
	border: 1px solid transparent;
	cursor: pointer;
	transition: .15s;
}
.btn-primary { background: var(--c-primary); color: var(--c-on-primary); }
.btn-primary:hover { background: var(--c-primary-hover); color: var(--c-on-primary); }
.btn-ghost { border-color: var(--c-border); color: var(--c-text-2); background: transparent; }
.btn-ghost:hover { border-color: var(--c-primary); color: var(--c-primary); }

/* ---------- 分类 chips 条 ---------- */
.cat-bar {
	background: var(--c-surface);
	border-bottom: 1px solid var(--c-border-2);
	overflow-x: auto;
}
/* 顶栏场景条（对外导航轴）：下划线 tab 式。
   与第 1 行文字导航形成「主行 / 栏目行」的视觉层级差（原先两行都是胶囊/文字，权重相同）。
   此处曾是 15 大类胶囊条，与左侧「知识分类」同源重复，见 CHANGELOG IA-01 / IA-02。 */
.cat-chips {
	display: flex;
	gap: 2px;
	padding: 0 16px;
	white-space: nowrap;
}
.cat-chips a {
	position: relative;
	display: inline-flex; align-items: center;
	height: var(--ctl-hero);
	padding: 0 13px;
	border-radius: 0;
	font-size: 13.5px;
	color: var(--c-text-2);
	background: transparent;
}
.cat-chips a:hover { color: var(--c-primary); }
.cat-chips a.active { color: var(--c-primary); font-weight: 600; }
.cat-chips a.active::after {
	content: '';
	position: absolute; left: 12px; right: 12px; bottom: 0;
	height: 2px; border-radius: 2px;
	/* 装饰性色条用品牌亮绿（不承载文字，无需 AA） */
	background: var(--c-primary-bright);
}

/* ---------- 三栏布局（博客园式：左竖排菜单 + 信息流 + 右排行边栏） ---------- */
.layout {
	display: grid;
	grid-template-columns: 72px minmax(0, 1fr) 300px;
	gap: var(--gap);
	padding-top: var(--gap);
	align-items: start;
}
.col-nav, .col-right { position: sticky; top: var(--sticky-top); }
/* Grid/Flex 项默认 min-width:auto 会被长内容撑宽，统一收敛 */
.col-nav, .col-main, .col-right { min-width: 0; }
/* 左侧竖排小菜单（对齐博客园左栏） */
.col-nav {
	background: var(--c-surface);
	border: 1px solid var(--c-border-2);
	border-radius: var(--radius-card);
	padding: 6px 0;
}
.col-nav a {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 3px;
	padding: 10px 0;
	font-size: 12px;
	color: var(--c-text-2);
}
.col-nav a .ic { font-size: 17px; line-height: 1; display: inline-flex; align-items: center; justify-content: center; height: 18px; }
.col-nav a .ic svg { width: 18px; height: 18px; display: block; }
.col-nav a:hover { color: var(--c-primary); background: var(--c-bg); }
.card {
	background: var(--c-surface);
	border: 1px solid var(--c-border-2);
	border-radius: var(--radius-card);
	padding: 14px;
	margin-bottom: var(--gap);
	box-shadow: var(--shadow-sm);
}
.card h3,
.card h2.kb-sec-h {
	margin: 0 0 10px;
	font-size: 14px;
	color: var(--c-text);
	display: flex;
	align-items: center;
	justify-content: space-between;
}
/* 区块标题的「更多 →」：原为 --c-text-3（#86909C，白底约 3.0:1，未达 WCAG AA 4.5:1），
   改用 --c-text-2（约 6.9:1）。层级靠字号（12px vs 14px）而非对比度不足来体现。 */
.card h3 .more,
.card h2.kb-sec-h .more { font-size: 12px; color: var(--c-text-2); font-weight: 400; }

/* 分类树 */
.cat-tree { list-style: none; margin: 0; padding: 0; }
.cat-tree > li { border-bottom: 1px solid var(--c-border-2); }
.cat-tree > li:last-child { border-bottom: none; }
.cat-tree .cat-top {
	display: flex; justify-content: space-between; align-items: center;
	padding: 8px 0; font-weight: 600; color: var(--c-text);
}
.cat-tree .cat-top .count { color: var(--c-text-3); font-weight: 400; font-size: 12px; }
.cat-tree .cat-sub { list-style: none; margin: 0 0 6px; padding: 0 0 0 12px; }
.cat-tree .cat-sub li { padding: 4px 0; }
.cat-tree .cat-sub a { color: var(--c-text-2); font-size: 13px; }
.cat-tree .cat-sub a:hover { color: var(--c-primary); }

/* 标签云 */
.tag-cloud { display: flex; flex-wrap: wrap; gap: 6px; }
.tag-cloud a {
	font-size: 12px;
	padding: 3px 10px;
	border-radius: var(--radius-tag);
	background: var(--c-bg);
	color: var(--c-text-2);
}
.tag-cloud a:hover { background: var(--c-primary); color: var(--c-on-primary); }

/* 归档日历（简化） */
.archive-cal { font-size: 12px; color: var(--c-text-2); }

/* ---------- 信息流 ---------- */
.feed-tabs {
	display: flex;
	gap: 4px;
	background: var(--c-surface);
	border: 1px solid var(--c-border-2);
	border-radius: var(--radius-card);
	padding: 6px;
	margin-bottom: var(--gap);
}
.feed-tabs a {
	padding: 7px 18px;
	border-radius: var(--radius-btn);
	font-size: 14px;
	color: var(--c-text-2);
}
.feed-tabs a.active { background: var(--c-primary); color: var(--c-on-primary); }

.post-card {
	background: var(--c-surface);
	border: 1px solid var(--c-border-2);
	border-radius: var(--radius-card);
	padding: 16px 20px 12px;
	margin-bottom: var(--gap);
	box-shadow: var(--shadow-sm);
	transition: box-shadow .18s, border-color .18s, transform .18s;
}
.post-card:hover { box-shadow: var(--shadow-lg); border-color: #e3e7ec; transform: translateY(-2px); }
.badge {
	display: inline-block;
	font-size: 11px;
	padding: 1px 7px;
	border-radius: var(--radius-tag);
	margin-right: 6px;
	vertical-align: middle;
}
/* 徽标是 11px 小字，浅底 + 亮色字普遍不达 AA（实测 badge-orig 原为 2.50:1）：
   统一改用与 `.kb-post-type.is-*` 同一批已按 AA 挑过的深色值。 */
.badge-top { background: #FFF3E8; color: #A8442A; }
.badge-fine { background: #E8F3FF; color: #2F5FA8; }
.badge-orig { background: #E8F8EE; color: #1E7A36; }
/* 列表项主体：缩略图 + 标题/摘要（博客园式） */
.post-row { display: flex; gap: 14px; }
.post-thumb {
	flex: none;
	width: 110px; height: 74px;
	border-radius: var(--radius-btn);
	overflow: hidden;
	background: var(--c-bg);
}
.post-main { flex: 1; min-width: 0; }
.post-card h2 {
	margin: 0 0 6px;
	font-size: 17px;
	font-weight: 600;
	line-height: 1.4;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}
.post-card h2 a { color: var(--c-primary); }
.post-card h2 a:hover { color: var(--c-primary-hover); }
.post-excerpt {
	color: var(--c-text-2);
	font-size: 13px;
	margin: 0 0 10px;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}
.post-meta {
	display: flex;
	align-items: center;
	gap: 10px;
	font-size: 12px;
	color: var(--c-text-3);
	flex-wrap: wrap;
	border-top: 1px solid var(--c-border-2);
	padding-top: 8px;
}
.post-meta .author { color: var(--c-primary); }
.post-meta .author:hover { color: var(--c-primary-hover); }
.post-meta .tags a { color: var(--c-primary); }
.post-meta .dot-sep::before { content: "·"; margin: 0 4px; color: var(--c-border); }

/* 右栏热榜 */
.rank-list { list-style: none; margin: 0; padding: 0; counter-reset: r; }
.rank-list li {
	display: flex; align-items: center; gap: 8px;
	padding: 7px 0; border-bottom: 1px solid var(--c-border-2);
	font-size: 13px;
}
.rank-list li:last-child { border-bottom: none; }
.rank-list .idx {
	width: 18px; height: 18px; flex: none;
	border-radius: 4px; background: var(--c-bg);
	color: var(--c-text-3); font-size: 12px;
	display: flex; align-items: center; justify-content: center;
}
/* 前三名徽标：原用亮色底 + 白字，实测白字对比度仅 2.03 / 2.59 / 4.04（均不达 AA）。
   保留「前三名有颜色」的语言，改用同色系深底（5.4 / 5.3 / 5.1:1）。 */
.rank-list li:nth-child(1) .idx { background: #C0392B; color: #fff; }
.rank-list li:nth-child(2) .idx { background: #A8550A; color: #fff; }
.rank-list li:nth-child(3) .idx { background: #7E6A0B; color: #fff; }
.rank-list .t { flex: 1; color: var(--c-text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rank-list .v { color: var(--c-text-3); font-size: 12px; }

.author-rank { display: flex; align-items: center; gap: 8px; padding: 6px 0; font-size: 13px; }
.author-rank .ava { width: 28px; height: 28px; border-radius: 50%; background: var(--c-primary); color: var(--c-on-primary); display: flex; align-items: center; justify-content: center; font-size: 12px; }

.notice { font-size: 13px; color: var(--c-text-2); line-height: 1.6; }

/* ---------- 文章详情 ---------- */
.article-wrap { display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: var(--gap); padding-top: var(--gap); align-items: start; }
.article {
	background: var(--c-surface);
	border: 1px solid var(--c-border-2);
	border-radius: var(--radius-card);
	padding: 28px 32px;
	box-shadow: var(--shadow-sm);
}
.article h1 { font-size: 26px; line-height: 1.4; margin: 0 0 14px; }
.article-meta { display: flex; align-items: center; gap: 14px; color: var(--c-text-3); font-size: 13px; padding-bottom: 14px; border-bottom: 1px solid var(--c-border-2); margin-bottom: 18px; flex-wrap: wrap; }
.article-meta .act { margin-left: auto; display: flex; gap: 8px; }
.article-body { font-size: 16px; line-height: 1.8; color: var(--c-text); }
.article-body h2, .article-body h3 { margin: 1.4em 0 .6em; line-height: 1.4; }
.article-body pre { background: var(--c-code-bg); padding: 14px; border-radius: var(--radius-btn); overflow-x: auto; }
.article-body code { font-family: var(--font-code); font-size: 13px; background: var(--c-code-bg); padding: 2px 6px; border-radius: 4px; }
.article-body pre code { background: none; padding: 0; }
.article-body blockquote { border-left: 3px solid var(--c-primary); margin: 1em 0; padding: 4px 14px; color: var(--c-text-2); background: var(--c-bg); }
/* 正文图（2026-10-23）：行内 → 块级居中。原为行内左对齐，窄图贴左、宽图撑满，
   同一篇里参差；块级 + margin:auto 后所有正文图都走同一套居中对齐。 */
.article-body img { border-radius: var(--radius-btn); margin: 12px auto; display: block; max-width: 100%; height: auto; }
/* 正文配图显示窗：figure 统一居中定宽（≤720px，正文窗 ~760px 内收一档更耐看），
   图注小字居中 —— 注入的 .stock-fig 带「图库来源 + 摄影师」署名图注（合规要求），
   此前无任何样式，与正文默认字号混在一起。 */
.article-body figure { max-width: 720px; margin: 18px auto; }
.article-body figure img { max-width: 100%; height: auto; }
.article-body figcaption { margin-top: 8px; font-size: 13px; line-height: 1.6; color: var(--c-text-3); text-align: center; }
/* 图库配图（.stock-fig）：固定窗口高 + cover 裁切。
   注入的是 1280×848 通用素材，按自然比例在 720px 窗里会塌出 ≈478px 竖高，
   把正文节奏打散；280px 窗口 + 圆角 + 图注，形态与文章头图（300px）一致。
   只约束 .stock-fig：正文里若有技术截图/表格图，保留自然比例（上面 figure 规则）。 */
.article-body .stock-fig img { height: 280px; object-fit: cover; }
.article-body table { border-collapse: collapse; width: 100%; margin: 1em 0; }
.article-body th, .article-body td { border: 1px solid var(--c-border); padding: 8px 12px; }

/* 封面图：详情头图 + 信息流缩略图
   2026-10-23：max-height 420 → 300px。420px 时 1280×848 的配图几乎按原比例
   全量展出（正文窗宽 ~760px 自然高 ≈ 505px），头图把标题与正文推出首屏；
   300px 窗口 + object-fit: cover 裁切后，头图仍是完整横幅但不再抢首屏。 */
.article-cover {
	width: 100%; max-height: 300px; object-fit: cover;
	border-radius: var(--radius-btn); margin: 0 0 16px; display: block;
}
.post-cover {
	width: 100%; height: 100%; object-fit: cover;
	display: block;
}

.author-card { text-align: center; }
.author-card .ava { width: 56px; height: 56px; border-radius: 50%; background: var(--c-primary); color: var(--c-on-primary); display: flex; align-items: center; justify-content: center; font-size: 20px; margin: 0 auto 8px; }
.author-card .name { font-size: 16px; font-weight: 600; }
.author-card .sig { color: var(--c-text-3); font-size: 12px; margin: 6px 0 10px; }

.article-foot { margin-top: 22px; padding-top: 14px; border-top: 1px solid var(--c-border-2); font-size: 13px; color: var(--c-text-3); display: flex; gap: 14px; flex-wrap: wrap; }
.pager { display: flex; justify-content: space-between; margin-top: 14px; font-size: 13px; }

/*
 * 详情页侧栏（2026-10-07 结构修正）。
 *
 * 改前：只有 `.toc` 自身 `position: sticky`，约束框是整个 `<aside>`（含下方「相关条目」卡片）
 * → 目录下滑时会**盖住**那张卡片（布局门禁实测 31 次相交）；且长文章目录（实测 28 小节 ≈ 1012px）
 * 高于一屏，底部条目永远看不到。
 *
 * 改后：**整个侧栏**作为粘性块（目录与相关条目一起移动，不再互相覆盖），
 * 目录本身限高 + 内部滚动。侧栏总高仍可能超过一屏（长目录），但不再出现「卡盖卡」。
 */
.article-wrap > aside { position: sticky; top: var(--sticky-top); align-self: start; }
.toc {
	background: var(--c-surface);
	border: 1px solid var(--c-border-2);
	border-radius: var(--radius-card);
	padding: 14px;
	position: static;
	box-shadow: var(--shadow-sm);
	max-height: calc(100vh - var(--sticky-top) - 200px);
	overflow-y: auto;
	overscroll-behavior: contain;
}
.toc h3 { margin: 0 0 8px; font-size: 14px; }
.toc ol { margin: 0; padding-left: 18px; font-size: 13px; }
.toc a { color: var(--c-text-2); }

/* ---------- 分类/聚合页 ---------- */
.archive-head { background: var(--c-surface); border: 1px solid var(--c-border-2); border-radius: var(--radius-card); padding: 20px; margin-bottom: var(--gap); box-shadow: var(--shadow-sm); }
.archive-head h1 { margin: 0 0 6px; font-size: 22px; }
.archive-head p { margin: 0; color: var(--c-text-3); font-size: 13px; }
.sub-chips { display: flex; gap: 8px; flex-wrap: wrap; margin: 14px 0 0; }
.sub-chips a { padding: 4px 12px; border-radius: 16px; font-size: 13px; background: var(--c-bg); color: var(--c-text-2); }
.sub-chips a.active, .sub-chips a:hover { background: var(--c-primary); color: var(--c-on-primary); }

/* ---------- 通用 ---------- */
.breadcrumb { font-size: 13px; color: var(--c-text-3); padding: 12px 0; }
.breadcrumb a { color: var(--c-text-2); }
/* 分隔符原为 --c-border（白底约 1.08:1，几乎看不见）→ 用三级文字色（4.5:1） */
.breadcrumb .sep { margin: 0 6px; color: var(--c-text-3); }
.pagination { display: flex; gap: 6px; justify-content: center; padding: 16px 0; }
.pagination a, .pagination span { padding: 6px 12px; border-radius: var(--radius-btn); background: var(--c-surface); border: 1px solid var(--c-border-2); color: var(--c-text-2); }
.pagination .current { background: var(--c-primary); color: var(--c-on-primary); border-color: var(--c-primary); }
.empty { text-align: center; color: var(--c-text-3); padding: 40px 0; }

.site-footer { background: var(--c-surface); border-top: 1px solid var(--c-border); margin-top: 24px; padding: 24px 0; color: var(--c-text-3); font-size: 12px; text-align: center; }

/* ---------- 响应式：最大化利用屏幕，兼容 PC / 平板 / 手机 ---------- */

/* 超宽屏：逐级撑开容器，侧栏与间隙略增，充分利用窗口

   ⚠ 2026-10-11 修复（TK-20261011-UI-001 · B2）：本阶梯此前是**死代码**——
   IA-18 在文件末尾（3638-3640）追加了一条**无媒体查询**的
   `:root { --container: 1200px }`，同特异性下后写者赢 ⇒ 下面四档全部失效，
   1440px 与 3840px 都是 1200px。**死代码被删不等于阶梯复活**（删了就没了），
   真正的修复是撤掉那个覆盖层，故该块已删除，本阶梯恢复生效。

   1920 / 2560 两档同时**下调**（1840→1680、2200→1920）：1920 屏装 1840 时
   两侧各仅剩 40px，那是「顶满」不是「大���」；2200 会让一行超过 60 个汉字。
   ⚠ 1536 档**不再声明 --gap**：原 `--gap: 20px` 只在本阶梯失效期间是死的，
   阶梯一恢复它就会生效，导致大屏段间距反而比桌面小 —— 与「大屏更疏」相悖。
   --gap 现由 3923 的 28px 统一控制。 */
@media (min-width: 1280px) {
	:root { --container: 1320px; }
}
@media (min-width: 1536px) {
	:root { --container: 1520px; }
}
@media (min-width: 1920px) {
	:root { --container: 1680px; }
}
@media (min-width: 2560px) {
	:root { --container: 1920px; }
}

/* 移动端触发按钮，默认隐藏 */
.cat-toggle, .menu-toggle { display: none; }

/* 中屏（≤1180）：隐藏左竖排菜单，侧栏略窄，主内容最大化 */
@media (max-width: 1180px) {
	.layout { grid-template-columns: minmax(0, 1fr) 300px; }
	.col-nav { display: none; }
}

/* 平板 / 手机（≤768）：单栏主信息流，右栏内容堆叠至底部，导航可下拉 */
@media (max-width: 768px) {
	:root { --container-pad: 12px; }
	.topbar { flex-wrap: wrap; height: auto; padding: 8px 0; gap: 10px; }
	.brand { flex: 1 1 auto; font-size: 18px; }
	.brand-logo { height: 38px; }
	.search-box { order: 3; flex-basis: 100%; max-width: none; margin: 2px 0 0; }
	.topnav { display: none; }
	.topnav.open {
		display: flex; flex-basis: 100%; flex-wrap: wrap; gap: 14px;
		order: 4; padding: 4px 0 2px;
	}
	.menu-toggle {
		display: inline-flex; align-items: center; justify-content: center;
		width: 34px; height: 34px; font-size: 16px;
		border: 1px solid var(--c-border); border-radius: var(--radius-btn);
		background: var(--c-surface); color: var(--c-text-2); cursor: pointer;
	}
	.cat-toggle { order: 2; }
	.top-actions { order: 2; margin-left: auto; }

	/* 必须用 minmax(0, 1fr)：纯 1fr 的最小值是 min-content，会被内容撑宽导致整页横向溢出 */
	.layout { grid-template-columns: minmax(0, 1fr); }
	.col-right { position: static; display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--gap); }
	.article { padding: 16px; }
	.article-wrap { grid-template-columns: minmax(0, 1fr); }
	.toc { display: none; }
	/* 正文配图窗（2026-10-23）：手机正文窗宽 ~343px，280px 竖高仍占近一屏，
		收到 220px；figure 定宽 720px 在窄屏由 max-width 自然收缩，无需另写。 */
	.article-body .stock-fig img { height: 220px; }
}

/* 小手机（≤480）：右栏堆叠为单列，控件更紧凑 */
@media (max-width: 480px) {
	.col-right { grid-template-columns: minmax(0, 1fr); }
	.post-card { padding: 14px; }
	.article h1 { font-size: 22px; }
	.brand { font-size: 16px; }
	.brand-logo { height: 34px; }
}

/* ---------- 个人中心 / 工作台统一外壳 ----------
 * 2026-10-08（逐菜单实测后修正）：全站登录态页面**只剩一套侧栏**（template-parts/user-nav.php），
 * studio-nav.php 已删除；`/me/`、`/console/` 的本页入口降级为「本页分区」子项（.console-nav-more）。
 * 原 `.me-tabs` 是只有一项「文章」的标签栏（无意义，且导致页面没有 h1）→ 换成 `.console-h1`。
 */
.console-nav-more { margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--c-border-2); }
.console-nav-title { margin: 0 0 6px; padding: 0 12px; font-size: 12px; color: var(--c-text-3); }
.console-h1 { margin: 0 0 14px; font-size: 20px; font-weight: 700; color: var(--c-text); }

.me-status { display: flex; flex-wrap: wrap; gap: 4px 18px; margin-bottom: 10px; }
.me-st { font-size: 13px; color: var(--c-text-2); padding: 4px 0; }
.me-st:hover { color: var(--c-primary); }
.me-st.active { color: var(--c-primary); font-weight: 600; }

.me-filters { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin-bottom: 14px; }
.me-select { height: 34px; padding: 0 10px; font-size: 13px; color: var(--c-text-2); background: var(--c-surface); border: 1px solid var(--c-border); border-radius: var(--radius-btn); font-family: var(--font); }
.me-search { flex: 0 1 240px; height: 34px; padding: 0 12px; font-size: 13px; border: 1px solid var(--c-border); border-radius: var(--radius-btn); font-family: var(--font); }
.me-search:focus { outline: none; border-color: var(--c-primary); }

.me-table { background: var(--c-surface); border: 1px solid var(--c-border-2); border-radius: var(--radius-card); overflow: hidden; }
/* 操作列用 `max-content` 而不是固定 240px：登录态实测「同步多平台 + 数据/编辑/浏览/删除」
   在 240px 下会被挤到换行（出现「同步多平 台」「删 除」）。改成按内容自适应宽度，
   标题列仍为 minmax(0,1fr) 可收缩，不会横向溢出。 */
.me-row { display: grid; grid-template-columns: minmax(0, 1fr) 44px 44px 44px 44px max-content; gap: 10px; align-items: center; padding: 14px 16px; border-top: 1px solid var(--c-border); font-size: 13px; }
.me-row:first-child { border-top: none; }
.me-thead { color: var(--c-text-3); font-size: 12px; background: var(--c-bg); }
.me-thead .me-ops-col { text-align: right; }

.me-cell-title { display: flex; align-items: center; gap: 12px; min-width: 0; }
.me-cover { flex-shrink: 0; width: 108px; height: 64px; border-radius: var(--radius-btn); background: var(--c-bg); border: 1px solid var(--c-border); overflow: hidden; }
.me-cover img { width: 100%; height: 100%; object-fit: cover; display: block; }
.me-title-text { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.me-title-line { display: flex; align-items: center; gap: 8px; min-width: 0; }
.me-title { font-size: 14px; font-weight: 600; color: var(--c-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
a.me-title:hover { color: var(--c-primary); }
.me-date { font-size: 12px; color: var(--c-text-3); }
.me-num { color: var(--c-text-2); text-align: center; }

.me-badge { flex-shrink: 0; font-size: 11px; line-height: 1; padding: 3px 7px; border-radius: 3px; }
.me-badge-ok { color: #1a9e55; background: rgba(26, 158, 85, .1); }
.me-badge-warn { color: #d48806; background: rgba(212, 136, 6, .12); }
.me-badge-info { color: var(--c-primary); background: rgba(110, 128, 255, .1); }
.me-badge-muted { color: var(--c-text-3); background: rgba(0, 0, 0, .06); }
.me-badge-danger { color: #e5484d; background: rgba(229, 72, 77, .1); }

.me-tbadge { flex-shrink: 0; font-size: 11px; line-height: 1; padding: 3px 7px; border-radius: 3px; }
.me-tbadge.t-orig { color: #2f6bff; background: rgba(47, 107, 255, .1); }
.me-tbadge.t-repost { color: #ff7a45; background: rgba(255, 122, 69, .12); }
.me-tbadge.t-trans { color: #9254de; background: rgba(146, 84, 222, .1); }

.me-ops { display: flex; gap: 0; justify-content: flex-end; align-items: center; flex-wrap: nowrap; }
.me-ops > * { flex: none; white-space: nowrap; }
.me-op { font-size: 13px; color: var(--c-primary); padding: 0 10px; position: relative; cursor: pointer; }
.me-op + .me-op::before { content: ''; position: absolute; left: 0; top: 4px; bottom: 4px; width: 1px; background: var(--c-border); }
.me-op:hover { color: var(--c-primary-hover); text-decoration: underline; }
.me-op-del { color: #e5484d; }
.me-op-del:hover { color: #c73840; }
.me-op-dim { color: var(--c-text-3); }
.me-op-dim:hover { color: var(--c-text-2); text-decoration: none; }
/* 同步多平台：胶囊按钮，按同步进度浅蓝→深蓝着色（内联 background） */
.sync-btn { border: 1px solid var(--c-border); border-radius: 999px; padding: 3px 12px; background: var(--c-surface); }
.sync-btn:hover { text-decoration: none; filter: brightness(1.05); }

.me-empty { text-align: center; padding: 48px 20px; }
.me-empty p { color: var(--c-text-3); margin: 0 0 14px; }
.me-pager { display: flex; justify-content: center; gap: 6px; margin-top: 16px; }
.me-pager .page-numbers { display: inline-block; min-width: 34px; padding: 6px 10px; text-align: center; font-size: 13px; color: var(--c-text-2); background: var(--c-surface); border: 1px solid var(--c-border-2); border-radius: var(--radius-btn); }
.me-pager .page-numbers.current { color: var(--c-on-primary); background: var(--c-primary); border-color: var(--c-primary); }
.me-pager .page-numbers:hover:not(.current) { color: var(--c-primary); border-color: var(--c-primary); }

/* 数据弹窗（借鉴 CSDN「发布至今总数据」面板） */
.me-modal-scrim { position: fixed; inset: 0; background: rgba(0, 0, 0, .45); z-index: 200; display: flex; align-items: center; justify-content: center; padding: 20px; }
.me-modal { width: 100%; max-width: 720px; max-height: 86vh; overflow-y: auto; background: var(--c-surface); border-radius: var(--radius-card); padding: 22px 24px; }
.me-modal-head { display: flex; justify-content: flex-end; margin: -6px -8px 0 0; }
.me-modal-x { border: none; background: none; font-size: 20px; color: var(--c-text-3); cursor: pointer; padding: 4px 8px; }
.me-modal-x:hover { color: var(--c-text); }
.me-modal-title { font-size: 17px; font-weight: 700; color: var(--c-text); margin-bottom: 10px; padding-right: 24px; }
.me-modal-meta { display: flex; align-items: center; gap: 10px; padding-bottom: 14px; border-bottom: 1px solid var(--c-border); margin-bottom: 18px; }
.me-modal-sec { margin: 0 0 12px; font-size: 14px; color: var(--c-text); }
.me-stat-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; }
.me-stat-card { background: var(--c-bg); border: 1px solid var(--c-border); border-radius: var(--radius-btn); padding: 16px 12px; text-align: center; display: flex; flex-direction: column; gap: 8px; }
.me-stat-card .k { font-size: 12px; color: var(--c-text-2); }
.me-stat-card .v { font-size: 22px; font-weight: 700; color: var(--c-text); }
.me-modal-tip { font-size: 12px; color: var(--c-text-3); margin: 14px 0 0; }
.me-modal-loading { color: var(--c-text-3); font-size: 13px; }

.me-range { float: right; font-weight: 400; }
.me-range-btn { border: 1px solid var(--c-border); background: var(--c-surface); color: var(--c-text-2); font-size: 12px; padding: 3px 10px; cursor: pointer; }
.me-range-btn:first-child { border-radius: var(--radius-btn) 0 0 var(--radius-btn); }
.me-range-btn:last-child { border-radius: 0 var(--radius-btn) var(--radius-btn) 0; margin-left: -1px; }
.me-range-btn.active { color: var(--c-on-primary); background: var(--c-primary); border-color: var(--c-primary); }

.me-trend-svg-wrap { width: 100%; border: 1px solid var(--c-border); border-radius: var(--radius-btn); background: var(--c-bg); padding: 8px; }
.me-trend-svg { width: 100%; height: 180px; display: block; }
.me-trend-legend { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--c-text-2); margin-top: 8px; }
.me-trend-legend i { width: 14px; height: 3px; border-radius: 2px; margin-left: 14px; display: inline-block; }
.me-trend-legend i:first-child { margin-left: 0; }
.me-trend-legend .dot-impr { background: #fc5531; }
.me-trend-legend .dot-view { background: #1e80ff; }

/* 同步分发数据（自适应维度） */
.me-ss { display: flex; flex-direction: column; gap: 12px; }
.me-ss-refresh { align-self: flex-start; border: 1px solid var(--c-primary); color: var(--c-primary); background: var(--c-surface); padding: 6px 14px; border-radius: var(--radius-btn); cursor: pointer; font-size: 13px; }
.me-ss-refresh:hover { background: rgba(110, 128, 255, .08); }
.me-ss-card { border: 1px solid var(--c-border); border-radius: var(--radius-btn); padding: 12px 14px; background: var(--c-bg); }
.me-ss-head { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
.me-ss-head .me-tbadge { font-size: 12px; }

/* ---------- M08 · 关注按钮激活态 ---------- */
.author-card .follow-count { font-size: 12px; color: var(--c-text-3); margin: 4px 0 10px; }
.follow-btn[data-following="1"] {
	background: var(--c-bg);
	color: var(--c-text-2);
	border: 1px solid var(--c-border);
}
.follow-btn[data-following="1"]:hover { color: var(--c-primary); border-color: var(--c-primary); }

/* ---------- 归档日历（博客园式，get_calendar 输出 #wp-calendar） ---------- */
#wp-calendar { width: 100%; border-collapse: collapse; font-size: 12px; }
#wp-calendar caption { font-weight: 600; padding: 4px 0 8px; color: var(--c-text); }
#wp-calendar thead th { color: var(--c-text-3); font-weight: 400; padding: 4px 0; }
#wp-calendar tbody td { padding: 2px 0; text-align: center; }
#wp-calendar tbody td a {
	display: block; background: var(--c-primary); color: var(--c-on-primary);
	border-radius: 4px; text-decoration: none; line-height: 1.9;
}
#wp-calendar tbody td a:hover { background: var(--c-primary-hover); }
#wp-calendar tbody td#today { background: color-mix(in srgb, var(--c-primary) 14%, transparent); border-radius: 4px; font-weight: 700; }
#wp-calendar tbody td.pad { background: transparent; }
#wp-calendar tfoot td { padding-top: 6px; }
#wp-calendar tfoot a { color: var(--c-primary); font-size: 12px; }

/* ---------- 统一创作中心 /console/（CSDN 式） ---------- */
.console { display: grid; grid-template-columns: 210px minmax(0, 1fr); min-height: calc(100vh - var(--header-h)); background: var(--c-surface); border: 1px solid var(--c-border-2); border-radius: var(--radius-card); margin-top: var(--gap); overflow: hidden; }
.console-side { border-right: 1px solid var(--c-border-2); padding: 18px 14px; background: var(--c-bg); }
/* 品牌两行是**有意为之**：侧栏内容宽仅 ~181px，「58120 智能网络 · 个人中心」必然折行且折点难看
   （实测 9/11 页都是那个观感）。改为站名 + 分区名各占一行，宽度无关、永不产生意外折行。 */
.console-brand { display: flex; flex-direction: column; gap: 2px; margin-bottom: 16px; padding: 0 8px; }
.console-brand b { font-size: 14px; font-weight: 700; color: var(--c-text); }
.console-brand span { font-size: 12px; font-weight: 500; color: var(--c-text-3); }
.console-nav a { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-radius: 8px; color: var(--c-text-2); cursor: pointer; font-size: 14px; margin-bottom: 4px; }
.console-nav a:hover { background: var(--c-border-2); color: var(--c-text); }
.console-nav a.active { background: color-mix(in srgb, var(--c-primary) 10%, transparent); color: var(--c-primary); font-weight: 600; }
.console-back { display: block; margin-top: 18px; padding: 8px 12px; color: var(--c-text-3); font-size: 13px; }
.console-back:hover { color: var(--c-primary); }
.console-main { padding: 20px 24px; overflow: auto; }
.console-panel { display: none; }
.console-panel.active { display: block; }
.console-h2 { margin: 0 0 6px; font-size: 18px; }
.console-h3 { margin: 22px 0 10px; font-size: 15px; }
.console-sub { color: var(--c-text-3); font-size: 13px; margin: 0 0 16px; }
.console-sub a { color: var(--c-primary); }
.console .editor-shell { background: transparent; min-height: auto; padding-bottom: 76px; }
.console .editor-topbar { border-radius: var(--radius-card) var(--radius-card) 0 0; }
.console .editor-body { padding-left: 0; padding-right: 0; }
.console-rank { list-style: none; margin: 0; padding: 0; }
.console-rank li { display: flex; align-items: center; gap: 10px; padding: 9px 0; border-bottom: 1px solid var(--c-border-2); }
.console-rank .idx { width: 20px; height: 20px; flex: none; border-radius: 5px; background: var(--c-bg); color: var(--c-text-3); font-size: 12px; display: flex; align-items: center; justify-content: center; }
.console-rank a { flex: 1; color: var(--c-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.console-rank a:hover { color: var(--c-primary); }
.console-rank .v { color: var(--c-text-3); font-size: 13px; }
.console-sync-bar { display: flex; gap: 10px; align-items: center; margin-bottom: 10px; }
.console-sync-bar .me-select { max-width: 420px; }
.console-tip { color: var(--c-text-3); font-size: 12.5px; margin: 4px 0 18px; }
.console-platforms { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 10px; }
.console-pf { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 10px 12px; border: 1px solid var(--c-border-2); border-radius: 8px; font-size: 13px; }
.console-pf b { color: var(--c-text); font-weight: 500; }
.console-pf a { color: var(--c-primary); font-size: 12px; white-space: nowrap; }
.console-pf-muted { color: var(--c-text-3); font-size: 12px; }

/* 手机（≤768）：`.console` 是 `210px | 1fr` 的固定两栏，390px 下编辑区只剩 130px 宽
   （实测 `main.console-main` clientWidth=130、横向可拖），等于没法在手机上写稿。
   这里收成单栏：侧栏导航转横向 chip 条，主区占满。 */
@media (max-width: 768px) {
	.console { grid-template-columns: minmax(0, 1fr); min-height: 0; }
	.console-side { border-right: 0; border-bottom: 1px solid var(--c-border-2); padding: 12px 12px 10px; }
	.console-brand { margin: 0 0 10px; padding: 0; }
	/* 侧栏导航：横向滚动条，避免纵向吃掉半屏 */
	.console-nav { display: flex; gap: 6px; overflow-x: auto; padding-bottom: 2px; -webkit-overflow-scrolling: touch; }
	.console-nav a { flex: none; white-space: nowrap; margin-bottom: 0; padding: 7px 12px; border: 1px solid var(--c-border-2); font-size: 13px; }
	.console-nav::-webkit-scrollbar { height: 0; }
	.console-back { margin-top: 8px; padding: 4px 0; }
	.console-main { padding: 14px 12px; overflow: visible; }
}

/* ---------- M08 · 收藏按钮激活态 ---------- */
.fav-btn[data-faved="1"] { color: #ffb400; border-color: #ffb400; }
.fav-btn[data-faved="1"] b { color: #ffb400; }

/* ---------- M08 · 评论区（CSDN 式卡片） ---------- */
.comments-area {
	margin-top: 28px;
	padding-top: 20px;
	border-top: 1px solid var(--c-border);
}
.comments-title {
	font-size: 17px;
	margin: 0 0 16px;
	display: flex;
	align-items: center;
	gap: 8px;
}
.comments-title .c-count {
	font-size: 13px;
	color: var(--c-text-3);
	font-weight: 400;
}
.comment-form-wrap { margin-bottom: 22px; }
.comment-form-wrap .logged-in-as,
.comment-form-wrap .must-log-in {
	font-size: 13px;
	color: var(--c-text-3);
	margin: 0 0 8px;
}
.comment-form-wrap .logged-in-as a,
.comment-form-wrap .must-log-in a { color: var(--c-primary); }
.comment-form-wrap textarea {
	width: 100%;
	border: 1px solid var(--c-border);
	border-radius: var(--radius-btn);
	padding: 12px 14px;
	font-family: var(--font);
	font-size: 14px;
	resize: vertical;
	background: var(--c-bg);
	color: var(--c-text);
}
.comment-form-wrap textarea:focus { outline: none; border-color: var(--c-primary); }
.comment-form-wrap .form-submit { margin-top: 10px; }
.comment-form-wrap .submit {
	background: var(--c-primary);
	color: var(--c-on-primary);
	border: none;
	border-radius: var(--radius-btn);
	padding: 8px 22px;
	font-size: 14px;
	cursor: pointer;
}
.comment-form-wrap .submit:hover { opacity: .9; }

.comment-list { list-style: none; margin: 0; padding: 0; }
.comment-item {
	display: flex;
	gap: 12px;
	padding: 16px 0;
	border-top: 1px solid var(--c-border);
}
.comment-list .children {
	list-style: none;
	margin: 0 0 0 48px;
	padding: 0;
}
.c-avatar img { border-radius: 50%; display: block; }
.c-body { flex: 1; min-width: 0; }
.c-head { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; }
.c-author { font-weight: 600; font-size: 14px; color: var(--c-text); }
.c-badge {
	font-size: 11px;
	color: var(--c-on-primary);
	background: var(--c-primary);
	border-radius: 4px;
	padding: 1px 6px;
}
.c-date { font-size: 12px; color: var(--c-text-3); }
.c-content { font-size: 14px; line-height: 1.75; color: var(--c-text); word-wrap: break-word; }
.c-content p { margin: 0 0 8px; }
.c-content code {
	background: var(--c-bg);
	border: 1px solid var(--c-border-2);
	border-radius: 4px;
	padding: 1px 5px;
	font-size: 13px;
}
.c-actions { margin-top: 6px; font-size: 13px; }
.c-actions a { color: var(--c-text-3); margin-right: 12px; }
.c-actions a:hover { color: var(--c-primary); }
.comment-empty { color: var(--c-text-3); font-size: 14px; padding: 16px 0; }
.comment-pager { margin-top: 12px; font-size: 13px; }
.comment-pager a { color: var(--c-primary); margin-right: 10px; }
.me-ss-url { font-size: 12px; color: var(--c-primary); }
.me-ss-url:hover { text-decoration: underline; }
.me-ss-at { font-size: 12px; color: var(--c-text-3); margin-left: auto; }
.me-ss-edit { margin-left: auto; font-size: 12px; color: var(--c-text-2); border: 1px solid var(--c-border); background: var(--c-surface); padding: 3px 10px; border-radius: var(--radius-btn); cursor: pointer; }
.me-ss-at + .me-ss-edit { margin-left: 10px; }
.me-ss-edit:hover { color: var(--c-primary); border-color: var(--c-primary); }
.me-ss-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; }
.me-ss-cell { display: flex; flex-direction: column; gap: 4px; }
.me-ss-cell span { font-size: 12px; color: var(--c-text-3); }
.me-ss-cell b { font-size: 16px; font-weight: 700; color: var(--c-text); }
.me-ss-editarea { margin-top: 10px; }
.me-ss-form { border-top: 1px dashed var(--c-border); padding-top: 10px; }
.me-ss-fields { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; }
.me-ss-fl { display: flex; flex-direction: column; gap: 4px; font-size: 12px; color: var(--c-text-2); }
.me-ss-fl-wide { grid-column: 1 / -1; }
.me-ss-fl input { height: 32px; padding: 0 10px; border: 1px solid var(--c-border); border-radius: var(--radius-btn); font-family: var(--font); font-size: 13px; }
.me-ss-fl input:focus { outline: none; border-color: var(--c-primary); }
.me-ss-form-btns { display: flex; gap: 8px; margin-top: 10px; }
.me-ss-save { border: none; background: var(--c-primary); color: var(--c-on-primary); padding: 6px 16px; border-radius: var(--radius-btn); cursor: pointer; font-size: 13px; }
.me-ss-cancel { border: 1px solid var(--c-border); background: var(--c-surface); color: var(--c-text-2); padding: 6px 16px; border-radius: var(--radius-btn); cursor: pointer; font-size: 13px; }
.me-ss-total { display: flex; align-items: center; gap: 14px; padding: 12px 14px; border: 1px solid var(--c-primary); border-radius: var(--radius-btn); background: rgba(110, 128, 255, .06); }
.me-ss-tlabel { font-size: 13px; font-weight: 600; color: var(--c-primary); flex-shrink: 0; }
.me-ss-total .me-ss-grid { flex: 1; }

@media (max-width: 640px) {
	.me-stat-grid { grid-template-columns: repeat(2, 1fr); }
	.me-ss-grid, .me-ss-fields { grid-template-columns: repeat(2, 1fr); }
	.me-modal { padding: 16px; }
}

@media (max-width: 1100px) {
	/* /me 与 /console/ 已共用 `.console` 外壳（窄屏折叠见「统一创作中心 /console/」段）。
	   表格侧：小于 1100 时数字列不再值得占位 —— 隐藏全部数字列后行内只剩「文章 + 操作」两格，
	   列数必须同步收成 2 列，否则操作列会被挤进残留的固定列里（原实现是「行 2 格 / 表头 3 格」错位）。
	   实测：1024px 下若保留数字列，标题列只剩 165px；收起后回升到 385px。 */
	.me-row { grid-template-columns: minmax(0, 1fr) max-content; }
	.me-num, .me-thead span:nth-child(2),
	.me-thead span:nth-child(3), .me-thead span:nth-child(4), .me-thead span:nth-child(5) { display: none; }
	.me-ops { justify-content: flex-start; }
}
@media (max-width: 560px) {
	.me-row { grid-template-columns: minmax(0, 1fr); gap: 8px; padding: 12px; }
	.me-thead { display: none; }
	.me-cover { width: 84px; height: 52px; }
	.me-ops { justify-content: flex-start; }
	.me-search { flex-basis: 100%; }
}

/* ---------- 右上角用户菜单（博客园式） ---------- */
.user-menu { position: relative; }
.user-btn {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	height: 34px;
	padding: 0 8px 0 4px;
	background: transparent;
	border: 1px solid var(--c-border);
	border-radius: var(--radius-btn);
	color: var(--c-text-2);
	font-size: 13px;
	cursor: pointer;
	transition: .15s;
}
.user-btn:hover { border-color: var(--c-primary); color: var(--c-primary); }
.user-btn img { border-radius: 50%; display: block; }
.user-name { max-width: 96px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.user-caret { font-size: 10px; opacity: .75; }
.user-dropdown {
	position: absolute;
	right: 0;
	top: calc(100% + 8px);
	min-width: 180px;
	background: var(--c-surface);
	border: 1px solid var(--c-border-2);
	border-radius: 10px;
	box-shadow: 0 12px 32px rgba(20, 30, 45, .16);
	padding: 6px;
	z-index: 80;
}
.ud-head {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 10px 10px 8px;
	border-bottom: 1px solid var(--c-border);
	margin-bottom: 6px;
}
.ud-head img { border-radius: 50%; display: block; }
.ud-txt { display: flex; flex-direction: column; min-width: 0; }
.ud-name { font-size: 14px; color: var(--c-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ud-login { font-style: normal; font-size: 12px; color: var(--c-text-2); }
.user-dropdown a {
	display: block;
	padding: 9px 12px;
	font-size: 14px;
	color: var(--c-text);
	border-radius: 8px;
}
.user-dropdown a:hover { background: var(--c-surface); color: var(--c-primary); }
.user-dropdown .ud-logout { color: #d64541; border-top: 1px solid var(--c-border); margin-top: 4px; border-radius: 0 0 8px 8px; }
.user-dropdown .ud-logout:hover { color: #d64541; }

/* ---------- 用户主页 /user/{用户名}/ ---------- */
.user-page { max-width: 900px; margin: 0 auto; }
.user-hero {
	display: flex;
	align-items: center;
	gap: 20px;
	padding: 24px;
	flex-wrap: wrap;
}
.user-ava {
	width: 96px; height: 96px;
	border-radius: 50%;
	object-fit: cover;
	border: 3px solid var(--c-primary);
	flex-shrink: 0;
}
.user-info { flex: 1; min-width: 220px; }
.user-info h1 { font-size: 22px; margin: 0 0 4px; }
.user-login { font-size: 13px; color: var(--c-text-2); margin: 0 0 8px; }
.user-bio { font-size: 14px; color: var(--c-text); margin: 0 0 6px; }
.user-meta { font-size: 12px; color: var(--c-text-2); margin: 0; }
.user-stats {
	display: flex;
	gap: 18px;
	text-align: center;
}
.user-stats div { display: flex; flex-direction: column; }
.user-stats b { font-size: 18px; color: var(--c-primary); }
.user-stats span { font-size: 12px; color: var(--c-text-2); }
.user-stats a.user-stat-link { color: inherit; text-decoration: none; display: flex; flex-direction: column; }
.user-stats a.user-stat-link:hover b { color: var(--c-primary); text-decoration: underline; }
.user-cta { display: flex; align-items: center; gap: 10px; width: 100%; }
.user-cta .follow-count { font-size: 13px; color: var(--c-text-2); }
.btn-outline {
	border-color: var(--c-primary);
	color: var(--c-primary);
	background: transparent;
}
.btn-outline:hover { background: var(--c-primary); color: var(--c-on-primary); }

.user-settings { margin-top: 20px; padding: 20px 24px; }
.user-settings .sec-title { margin-top: 0; }
/* 头像上传区 */
.us-avatar { display: flex; align-items: center; flex-wrap: wrap; gap: 16px; margin-bottom: 22px; padding-bottom: 22px; border-bottom: 1px solid var(--c-border-2); }
.us-avatar > img { width: 88px; height: 88px; border-radius: 50%; object-fit: cover; border: 3px solid var(--c-primary); flex-shrink: 0; }
.us-avatar-actions { display: flex; align-items: center; gap: 10px; }
.us-avatar .btn-outline { cursor: pointer; }
.us-avatar-hint { width: 100%; font-size: 12px; color: var(--c-text-3); margin: 0; }
.us-field {
	display: flex;
	flex-direction: column;
	gap: 6px;
	font-size: 14px;
	margin-bottom: 14px;
	color: var(--c-text);
}
.us-field i { font-style: normal; font-size: 12px; color: var(--c-text-2); }
.us-field input, .us-field textarea {
	border: 1px solid var(--c-border-2);
	border-radius: var(--radius-btn);
	padding: 9px 12px;
	font-size: 14px;
	font-family: inherit;
}
.us-field input:focus, .us-field textarea:focus {
	outline: none;
	border-color: var(--c-primary);
}
.us-actions { display: flex; align-items: center; gap: 12px; }
.us-msg { font-size: 13px; }
.us-msg.ok { color: var(--c-primary); }
.us-msg.bad { color: #d64541; }

.user-posts { margin-top: 20px; }
.user-posts .sec-title { margin-bottom: 12px; }

/* 主页两栏：文章 + 右侧挂件 */
.user-body { display: grid; grid-template-columns: 1fr 280px; gap: var(--gap); align-items: start; }
.user-side { display: flex; flex-direction: column; gap: var(--gap); }
.user-side .card h3 { margin: 0 0 10px; font-size: 14px; color: var(--c-text); }
/* 标签云 */
.tag-cloud { display: flex; flex-wrap: wrap; gap: 8px; }
.tag-cloud a { font-size: 13px; color: var(--c-text-2); background: var(--c-bg); border: 1px solid var(--c-border-2); padding: 4px 10px; border-radius: 999px; text-decoration: none; }
.tag-cloud a:hover { color: var(--c-primary); border-color: var(--c-primary); }
/* 文章档案 */
.arch-list { list-style: none; margin: 0; padding: 0; }
.arch-list li { display: flex; justify-content: space-between; font-size: 13px; padding: 5px 0; border-bottom: 1px dashed var(--c-border-2); }
.arch-list li:last-child { border-bottom: 0; }
.arch-list a { color: var(--c-text); text-decoration: none; }
.arch-list a:hover { color: var(--c-primary); }
.arch-list .cnt { color: var(--c-text-3); }
/* 热门文章排行（阅读/评论/推荐 Top5） */
.hot-sub { font-size: 13px; color: var(--c-text-2); margin: 10px 0 4px; font-weight: 600; }
.hot-sub:first-child { margin-top: 0; }
.rank-list { list-style: none; margin: 0 0 12px; padding: 0; counter-reset: r; }
.rank-list:last-child { margin-bottom: 0; }
.rank-list li { display: flex; gap: 8px; font-size: 13px; line-height: 1.5; padding: 5px 0; }
.rank-list li.empty { color: var(--c-text-3); }
.rank-list li::before { counter-increment: r; content: counter(r); flex-shrink: 0; width: 18px; height: 18px; border-radius: 4px; background: var(--c-bg); color: var(--c-text-3); font-size: 11px; text-align: center; line-height: 18px; }
/* 序号徽标：金银铜底上的**白字对比度不足**（#f59b22 白字 ≈2.4:1 / #e0a800 ≈2.0:1），
   改深棕字（≈5:1），两种模式都达标。伪元素文字不在几何审计范围内，故此处按 WCAG 手算。 */
.rank-list li:nth-child(1)::before { background: var(--c-primary); color: var(--c-on-primary); }
.rank-list li:nth-child(2)::before { background: #f59b22; color: #4A2E00; }
.rank-list li:nth-child(3)::before { background: #e0a800; color: #4A3700; }
.rank-list a { color: var(--c-text); text-decoration: none; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden; }
.rank-list a:hover { color: var(--c-primary); }
/* 粉丝/关注 列表卡片 */
.uf-list { margin-top: 0; }
.uf-card { display: flex; align-items: center; gap: 14px; }
.uf-card .uf-ava { width: 56px; height: 56px; border-radius: 50%; object-fit: cover; flex-shrink: 0; }
.uf-card .uf-main { flex: 1; min-width: 0; }
.uf-card .uf-name { font-size: 15px; margin: 0 0 2px; }
.uf-card .uf-name a { color: var(--c-text); text-decoration: none; }
.uf-card .uf-name a:hover { color: var(--c-primary); }
.uf-card .uf-login { font-size: 12px; color: var(--c-text-2); margin: 0 0 4px; }
.uf-card .uf-bio { font-size: 13px; color: var(--c-text-2); margin: 0; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden; }

@media (max-width: 640px) {
	.user-name { display: none; }
	.user-hero { gap: 14px; }
	.user-stats { gap: 12px; flex-wrap: wrap; }
	.user-ava { width: 72px; height: 72px; }
	.user-body { grid-template-columns: 1fr; }
	.bell-btn { width: 32px; height: 32px; font-size: 16px; }
}

/* ---------- 用户主页 Tab 导航（CSDN 式） ---------- */
.user-tabs { display: flex; flex-wrap: wrap; gap: 4px; margin: 16px 0 0; border-bottom: 1px solid var(--c-border-2); }
.user-tabs a { padding: 10px 16px; font-size: 14px; color: var(--c-text-2); text-decoration: none; border-bottom: 2px solid transparent; margin-bottom: -1px; }
.user-tabs a:hover { color: var(--c-text); }
.user-tabs a.active { color: var(--c-primary); border-bottom-color: var(--c-primary); font-weight: 600; }

/* 最新·最热 排序切换 */
.sort-toggle { display: flex; gap: 8px; margin-bottom: 14px; }
.sort-toggle a { font-size: 13px; color: var(--c-text-2); text-decoration: none; padding: 4px 12px; border: 1px solid var(--c-border-2); border-radius: 999px; }
.sort-toggle a.active { color: var(--c-on-primary); background: var(--c-primary); border-color: var(--c-primary); }

/* 专栏 / 分类 卡片网格 */
.tax-grid { display: grid; grid-template-columns: 1fr; gap: 12px; }
.tax-card { display: flex; gap: 12px; padding: 12px; background: var(--c-bg); border: 1px solid var(--c-border-2); border-radius: 12px; text-decoration: none; color: inherit; transition: border-color .15s, transform .15s; }
.tax-card:hover { border-color: var(--c-primary); transform: translateY(-2px); }
.tax-cover { flex: 0 0 56px; width: 56px; height: 56px; border-radius: 10px; background: linear-gradient(135deg, var(--c-primary), var(--c-accent)); color: var(--c-on-primary); font-size: 26px; font-weight: 700; display: flex; align-items: center; justify-content: center; }
.tax-body { min-width: 0; }
.tax-body h4 { margin: 0 0 4px; font-size: 15px; }
.tax-body p { margin: 0 0 6px; font-size: 12px; color: var(--c-text-2); overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.tax-count { font-size: 12px; color: var(--c-primary); }
.tax-cover img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* 专栏 / 分类 专页（CSDN 式封面横幅 + 文章列表） */
.tax-archive { max-width: 960px; margin: 0 auto; padding: 8px 0 32px; }
.tax-banner { position: relative; border-radius: 16px; overflow: hidden; min-height: 168px; display: flex; align-items: flex-end; background: linear-gradient(135deg, var(--c-primary), var(--c-accent)); margin-bottom: 22px; }
.tax-banner::after { content: ''; position: absolute; inset: 0; background: linear-gradient(180deg, rgba(0,0,0,0) 25%, rgba(0,0,0,.6) 100%); }
.tax-banner-inner { position: relative; z-index: 1; padding: 22px 24px; color: #fff; }
.tax-banner-inner h1 { margin: 0 0 6px; font-size: 24px; }
.tax-banner-inner .tax-desc { margin: 0 0 8px; font-size: 13px; opacity: .92; max-width: 660px; line-height: 1.5; }
.tax-banner-inner .tax-meta { font-size: 12px; opacity: .85; }
.tag-box { padding: 14px; }
.tax-count-inline { margin-left: 4px; font-size: 11px; color: var(--c-text-3); }

/* 侧栏链接列表（专栏等） */
.link-list { list-style: none; margin: 0; padding: 0; }
.link-list li { display: flex; justify-content: space-between; align-items: center; padding: 6px 0; border-bottom: 1px dashed var(--c-border-2); font-size: 13px; }
.link-list li:last-child { border-bottom: 0; }
.link-list a { color: var(--c-text); text-decoration: none; }
.link-list a:hover { color: var(--c-primary); }
.link-list .cnt { color: var(--c-text-3); font-size: 12px; }

/* 最新评论 */
.cmt-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.cmt-list li { font-size: 13px; }
.cmt-meta { margin: 0 0 2px; color: var(--c-text-2); }
.cmt-meta a { color: var(--c-primary); text-decoration: none; }
.cmt-excerpt { margin: 0; color: var(--c-text-2); line-height: 1.5; }

/* 头部消息铃铛 + 未读红点 */
.bell-btn { position: relative; display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; border-radius: 50%; color: var(--c-text-2); text-decoration: none; font-size: 18px; flex-shrink: 0; }
/* 铃铛图标已由 emoji 改为内联 SVG：用 flex 容器量取，避免 inline SVG 的基线留白 */
.bell-ico { display: inline-flex; align-items: center; justify-content: center; }
.bell-btn:hover { background: var(--c-bg); color: var(--c-primary); }
.bell-badge { position: absolute; top: 1px; right: 1px; min-width: 16px; height: 16px; padding: 0 4px; border-radius: 999px; background: #B3312C; color: #fff; font-size: 11px; line-height: 16px; text-align: center; box-sizing: border-box; }
/* 消息中心列表 */
.nt-list { margin-top: 16px; display: flex; flex-direction: column; gap: 8px; }
.nt-item { display: flex; align-items: center; gap: 10px; padding: 12px 14px; background: var(--c-surface); border: 1px solid var(--c-border-2); border-radius: var(--radius-card); text-decoration: none; color: var(--c-text); }
.nt-item:hover { border-color: var(--c-primary); }
.nt-item.unread { background: #fffaf0; }
.nt-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--c-primary); flex-shrink: 0; }
.nt-item.read .nt-dot { background: var(--c-border); }
.nt-text { flex: 1; min-width: 0; font-size: 14px; }
.nt-time { font-size: 12px; color: var(--c-text-3); flex-shrink: 0; }
.nt-actions { display: flex; align-items: center; gap: 12px; margin-bottom: 4px; }

/* ============================================================
   阅读页增强（A）：文末相关推荐 · TOC 滚动高亮 · 代码高亮/复制
   ============================================================ */
.rel-rec { margin-top: 28px; padding-top: 18px; border-top: 1px solid var(--c-border-2); }
.rel-rec h3 { margin: 0 0 14px; font-size: 16px; }
.rel-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; }
.rel-card {
	display: flex; gap: 10px; padding: 10px;
	background: var(--c-bg); border: 1px solid var(--c-border-2);
	border-radius: var(--radius-card); text-decoration: none;
	transition: border-color .15s, transform .15s;
}
.rel-card:hover { border-color: var(--c-primary); transform: translateY(-2px); }
.rel-thumb { flex: none; width: 88px; height: 60px; border-radius: 8px; overflow: hidden; background: var(--c-border-2); }
.rel-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.rel-body { min-width: 0; display: flex; flex-direction: column; }
.rel-title { font-size: 14px; color: var(--c-text); line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.rel-card:hover .rel-title { color: var(--c-primary); }
.rel-meta { margin-top: auto; font-size: 12px; color: var(--c-text-3); }

/* TOC 滚动高亮 */
.toc a.active { color: var(--c-primary); font-weight: 600; }

/* 代码块复制按钮 + hljs 间距 */
.article-body pre { position: relative; }
.code-copy {
	position: absolute; top: 8px; right: 8px;
	border: 1px solid var(--c-border); background: var(--c-surface);
	color: var(--c-text-2); font-size: 12px; padding: 2px 8px;
	border-radius: 6px; cursor: pointer; opacity: 0; transition: opacity .15s;
}
.article-body pre:hover .code-copy { opacity: 1; }
.article-body pre code.hljs { padding: 14px; border-radius: var(--radius-btn); }

/* ============================================================
   作者主页增强（C）：封面横幅 + 数据感
   ============================================================ */
.user-cover {
	height: 220px; border-radius: 16px;
	background: linear-gradient(120deg, #dbeafe, #e7f4ec 52%, #fdf0dd);
	border: 1px solid var(--c-border-2);
	margin-bottom: -64px; position: relative; overflow: hidden;
	box-shadow: var(--shadow);
}
.user-cover::after {
	content: ''; position: absolute; inset: 0;
	background: radial-gradient(circle at 18% 20%, rgba(255, 255, 255, .28), transparent 60%);
}
.user-hero { position: relative; z-index: 1; box-shadow: var(--shadow); padding: 30px 34px; }
.user-hero .user-ava { width: 116px; height: 116px; border: 5px solid #fff; box-shadow: var(--shadow); }
.user-info h1 { font-size: 27px; margin: 0 0 6px; }
.user-login { font-size: 14px; }
.user-meta { font-size: 13px; }
.user-stats { gap: 34px; }
.user-stats div b, .user-stats a b { font-size: 25px; color: var(--c-text); }
.user-stats span { font-size: 13px; }
.user-cta { position: absolute; top: 22px; right: 24px; width: auto; }
.user-cta .btn { padding: 8px 18px; font-size: 14px; }

/* 主页改为 CSDN 式左栏（成就/专栏）+ 主列文章流 */
.user-page { max-width: 1100px; }
.user-body { grid-template-columns: 280px 1fr; }
.user-side { order: -1; }

/* 个人成就卡 */
.ach-list { list-style: none; margin: 0; padding: 0; }
.ach-list li { display: flex; align-items: center; gap: 10px; padding: 7px 0; font-size: 14px; color: var(--c-text-2); }
.ach-list b { color: var(--c-text); margin: 0 2px; }
.ach-ic { width: 26px; height: 26px; border-radius: 50%; font-size: 12px; display: inline-flex; align-items: center; justify-content: center; font-style: normal; font-weight: 600; flex-shrink: 0; }

/* 侧栏专栏（缩略图行） */
.col-side { list-style: none; margin: 0; padding: 0; }
.col-side li { display: flex; align-items: center; gap: 10px; padding: 8px 0; border-bottom: 1px solid var(--c-border-2); }
.col-side li:last-child { border-bottom: 0; }
.col-side img, .col-fallback { width: 44px; height: 32px; border-radius: 6px; object-fit: cover; flex-shrink: 0; }
.col-fallback { display: inline-flex; align-items: center; justify-content: center; background: var(--c-primary-soft); color: var(--c-primary); font-weight: 600; font-size: 14px; }
.col-side a { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; text-decoration: none; color: var(--c-text); font-size: 14px; }
.col-side a:hover .col-name { color: var(--c-primary); }
.col-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.col-side .cnt { font-size: 12px; color: var(--c-text-3); flex-shrink: 0; }

/* ---------- 聚合个人中心 /center/ ----------
 * 2026-10-08：侧栏（原 `.center-body` 两栏 + `.center-nav` 一套独立样式）已收编到
 * `template-parts/user-nav.php`，与 `/me/`、`/console/` 共用 `.console-side` / `.console-nav`。
 * 这里只保留内容列，避免同一批入口在不同页面呈现两种外观。
 */
.center-page { max-width: 1100px; margin: 0 auto; }
.center-main { min-width: 0; }

/* 统一外壳内的个人中心页：限宽与内边距交给外壳，避免"壳中壳"二次收窄与双重留白 */
.console-main > .user-page,
.console-main > .center-page,
.console-main > .member-page,
.console-main > .kb-main { max-width: none; margin: 0; padding: 0; }
/* 2026-10-08：`.center-cards` / `.center-card` / `.info-list` 已随 /center/ 去重一并删除
   （那是「数据概览」六张重复卡片与「基本资料」重复字段的样式，PHP 里已无引用）。 */
.center-info { padding: 20px; }
.center-info h3 { margin: 0 0 14px; font-size: 16px; }

/* 空状态里的「下一步」提示：小字 + 弱色 + 链接主色（各页空状态统一用它，避免各写一套） */
.empty-hint { margin: 6px 0 0; font-size: 13px; line-height: 1.7; color: var(--c-text-3); }
.empty-hint a { color: var(--c-primary); }

/* 全局浮层反馈（S58120Toast，见 assets/main.js）：用于"没有内联位置"的失败/成功提示。
   底部居中，3 秒后自动淡出 —— 代替此前各页不统一的 window.alert 与"什么都不提示"。 */
.s58120-toast {
	position: fixed; left: 50%; bottom: calc(24px + env(safe-area-inset-bottom));
	transform: translateX(-50%) translateY(8px);
	z-index: 9999; max-width: min(92vw, 420px);
	padding: 10px 18px; border-radius: 8px;
	background: #14241C; color: #fff; font-size: 14px; line-height: 1.5;
	box-shadow: 0 8px 24px rgba(0, 0, 0, .22);
	opacity: 0; pointer-events: none; transition: opacity .2s, transform .2s;
}
.s58120-toast.on { opacity: 1; transform: translateX(-50%) translateY(0); }
.s58120-toast.bad { background: #b32d2e; }

/* 消息中心「加载更多」（第 21 条起原来直接看不到） */
.nt-more { margin: 14px 0 0; text-align: center; }

@media (max-width: 640px) {
	.rel-grid { grid-template-columns: 1fr; }
	.user-cover { height: 100px; margin-bottom: -36px; }
	.user-cta { position: static; margin-top: 10px; }
	.user-cover { height: 150px; margin-bottom: -48px; }
	.user-hero { padding: 18px 16px; }
	.user-hero .user-ava { width: 84px; height: 84px; }
	.user-stats { gap: 16px; }
	.user-stats div b, .user-stats a b { font-size: 20px; }
	.user-body { grid-template-columns: 1fr; }
	.user-side { order: 2; }
	.center-cards { grid-template-columns: repeat(2, 1fr); }
}

/* ============================================================
   知识库首页 / 分类总览（P2）
   ============================================================ */
.kb-hero { padding: 26px 22px; text-align: center; background: linear-gradient(135deg, var(--c-primary-soft), var(--c-surface)); }
.kb-hero-title { margin: 0 0 6px; font-size: 26px; color: var(--c-text); }
.kb-hero-sub { margin: 0 0 6px; font-size: 15px; color: var(--c-text-2); }
/* 品牌注脚（「58120.cn｜58120 智能网络・弱电智能化技术学习平台」）：由 slogan 下方下移到 Hero 末行（2026-10-05 IA-07）——
   原位置夹在 h1 与搜索框之间打断视线流，且与顶栏字标、h1 三处重复；下移后作细字注脚，
   域名与实体全名的品牌/GEO 信号仍保留。 */
.kb-hero-brand { margin: 16px 0 0; font-size: 11.5px; letter-spacing: .2px; color: var(--c-text-2); }
.kb-search { display: flex; gap: 8px; max-width: 620px; margin: 0 auto; }
.kb-search input[type="search"] { flex: 1; min-width: 0; width: 100%; height: var(--ctl-hero); padding: 0 16px; font-size: 15px; border: 1px solid var(--c-border); border-radius: var(--radius-btn); background: var(--c-surface); }
.kb-search input[type="search"]:focus { border-color: var(--c-primary); outline: none; }
.kb-search .btn { height: var(--ctl-hero); padding: 0 22px; flex: none; }

/* .kb-duo（首页「热门条目 | 最近更新」两栏）已随 IA-08 两段式布局下线：
   文章列表改为通栏 .kb-feed，不再挤在 604px 宽的主区里被截断标题。 */

/* ============================================================
   首页右栏「高频故障」列表（.kb-rank）
   自持样式，**不复用**全站通用的 .rank-list：后者带全局 `li::before` 计数徽标
   （见文件后段「热门文章排行」），叠加会造成「一行两个序号」。
   ============================================================ */
.kb-rank { list-style: none; margin: 0; padding: 0; counter-reset: kbrank; }
.kb-rank li {
	display: flex; align-items: flex-start; gap: 8px;
	padding: 7px 0; border-bottom: 1px solid var(--c-border-2);
	font-size: 13px;
}
.kb-rank li:last-child { border-bottom: none; }
/* 序号徽标（P1）：右栏「高频故障」原来是纯文本列表，一屏看不出有几条、也难指认。
   用 CSS 计数器生成（不改模板），样式沿用归档页 .rank-list 的既有计数语言。 */
.kb-rank li::before {
	counter-increment: kbrank;
	content: counter(kbrank);
	flex: none; width: 18px; height: 18px; margin-top: 3px;
	border-radius: 5px; background: var(--c-bg); color: var(--c-text-3);
	font-size: 11px; font-weight: 600; line-height: 18px; text-align: center;
	font-variant-numeric: tabular-nums;
}
/* 允许两行（P1）：故障标题普遍 15~25 字，单行 + nowrap 会切掉关键现象词 */
.kb-rank .t {
	flex: 1; min-width: 0; color: var(--c-text-2);
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.kb-rank .t:hover { color: var(--c-primary); }

/* ============================================================
   首页两段式布局（IA-09，2026-10-07）
   第 1 段 `.kb-top`：三栏（分类导航 232 | 主区 1fr | 辅助栏 300）**等高**，
                    左栏底边与「Hero + 场景卡」底边强制对齐；
   第 2 段 `.kb-feed`：通栏最新条目。

   ⚠ 三栏**必须**包在 `.kb-top` 里，不能让 `.kb-feed` 与本段的三栏同处一个网格：
   `position: sticky` 的约束框是「最近的网格/块容器」。原先三栏与 feed 同格
   （feed 用 `grid-column: 1 / -1` 跨满三列）时，左右两栏会沿着**整个网格**一路下滑，
   覆盖 feed 的前几行卡片（1440px 实测：左栏文档位 126 → 634，正好压住 feed 第 1~3 行；
   叠加 z-index: 20 + 不透明背景 → 被压住的卡片完全看不见）。
   拆成两段后 sticky 的约束框只剩第 1 段，**结构上不可能**滑到 `.kb-feed` 上。
   ============================================================ */
.layout--home {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: var(--gap);
	padding-top: var(--gap);
}
.kb-top {
	display: grid;
	grid-template-columns: 232px minmax(0, 1fr) 300px;
	gap: var(--gap);
	align-items: stretch;
	min-width: 0;
}
/* 右栏不参与拉伸：拉伸后 sticky 元素填满自身网格区，会失去可滚动区间 */
.kb-top > .col-right { align-self: start; }

/* ⚠ 2026-10-11：原此处整块「左栏高度改由中栏决定并铺满」（`@media ≥1181`
   + 5 条 `.kb-cat-side*` 规则）**已删除** —— 纯死CSS（左侧分类竖栏随 IA-16 下线，
   模板零输出，见 2265 附近的删除说明）。零行为变化。 */

/* 第 2 段：通栏最新条目（`.layout--home` 的直接子元素，且在 `.kb-top` 之外） */
.kb-feed { min-width: 0; }
.kb-feed-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 10px; }
.kb-feed-head h2 { margin: 0; font-size: 15px; color: var(--c-text); }
.kb-feed-more { font-size: 12px; color: var(--c-text-2); }
.kb-feed-more:hover { color: var(--c-primary); }
.kb-feed-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(288px, 1fr)); gap: 12px; }
.kb-post {
	display: flex; flex-direction: column; gap: 10px;
	padding: 13px 14px;
	background: var(--c-surface);
	border: 1px solid var(--c-border);
	/* 类型色条（P1）：12~16 张卡并排时靠左缘色相做类型扫读，色系与 .kb-post-type.is-* 一致 */
	border-left: 3px solid var(--kb-accent, var(--c-border));
	border-radius: var(--radius-card);
	transition: border-color .15s, box-shadow .15s, transform .15s;
}
.kb-post.is-fault    { --kb-accent: #E0653C; }
.kb-post.is-guide    { --kb-accent: #3AA2E0; }
.kb-post.is-device   { --kb-accent: #17B3A3; }
.kb-post.is-standard { --kb-accent: #4A8AE0; }
.kb-post.is-case     { --kb-accent: #E0685F; }
.kb-post.is-term     { --kb-accent: #8B6CFF; }
.kb-post.is-faq      { --kb-accent: #5F9670; }
.kb-post.is-solution { --kb-accent: #2DAE67; }
.kb-post:hover { border-color: var(--c-primary); border-left-color: var(--kb-accent, var(--c-primary)); box-shadow: var(--shadow); transform: translateY(-2px); }
.kb-post-title {
	font-size: 14px; font-weight: 600; color: var(--c-text); line-height: 1.55;
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
	min-height: 43px; /* = 14px × 1.55 × 2 行，保证卡片等高 */
}
.kb-post:hover .kb-post-title { color: var(--c-primary); }
/* 摘要（P1）：卡片从「一行标题 + 日期」升级为可判断「要不要点」的条目 */
.kb-post-ex {
	font-size: 12.5px; line-height: 1.6; color: var(--c-text-2);
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
	min-height: 40px; /* = 12.5px × 1.6 × 2 行，保证同行卡片等高 */
}
.kb-post-ex:empty { display: none; }
.kb-post-meta { display: flex; align-items: center; gap: 8px; }
/* 主分类名：与类型标签同为「小字元信息」，不抢标题 */
.kb-post-cat {
	font-size: 11.5px; color: var(--c-text-3);
	overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0;
}
.kb-post-date { margin-left: auto; }
.kb-post-type {
	font-size: 11px; line-height: 1.6; padding: 1px 7px;
	border-radius: var(--radius-tag);
	background: var(--c-bg); color: var(--c-text-2);
	border: 1px solid var(--c-border-2);
}
.kb-post-date { font-size: 12px; color: var(--c-text-2); font-variant-numeric: tabular-nums; }
/* 条目类型色：12 张卡并排时靠色相做类型扫读（色系沿用 .post-thumb-ph.is-* 的既有体系）。
   文字色均已按 WCAG AA（≥4.5:1）挑过深色值，不直接用主色变量（绿 #2DAE67 在白底仅约 2.6:1）。 */
.kb-post-type.is-fault { background: rgba(224, 101, 60, .10); color: #A8442A; border-color: rgba(224, 101, 60, .22); }
.kb-post-type.is-guide { background: rgba(58, 162, 224, .10); color: #1F6FA8; border-color: rgba(58, 162, 224, .22); }
.kb-post-type.is-device { background: rgba(23, 179, 163, .10); color: #0E7A70; border-color: rgba(23, 179, 163, .22); }
.kb-post-type.is-standard { background: rgba(74, 138, 224, .10); color: #2F5FA8; border-color: rgba(74, 138, 224, .22); }
.kb-post-type.is-case { background: rgba(224, 104, 95, .10); color: #A83A32; border-color: rgba(224, 104, 95, .22); }
.kb-post-type.is-term { background: rgba(139, 108, 255, .10); color: #5B45C4; border-color: rgba(139, 108, 255, .22); }
.kb-post-type.is-faq { background: rgba(95, 150, 112, .10); color: #3D6B4A; border-color: rgba(95, 150, 112, .22); }
.kb-post-type.is-solution { background: var(--c-primary-soft); color: #1A7A46; border-color: rgba(45, 174, 103, .22); }

/* 列数由 `auto-fill + minmax(288px)` 自适应（2026-10-07 P1）：
   固定 3 列时同一张卡在 1440px 是 421px、2560px 是 715px（一行字占满 715px）。
   现按可用宽度自动分列：1440 → 4 列、1920 → 6 列、2560 → 7 列，卡片宽度稳定在 288~360px。
   窄屏（单列/双列）同样由 auto-fill 收拢，故不再需要 1180 / 768 的列数覆盖。 */
@media (max-width: 768px) {
	.kb-post-title { min-height: 0; -webkit-line-clamp: 3; }
}
/* 分类总览页 */
.kb-cat-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: var(--gap); }
/* 分类总览卡的标题由 h3 升为 h2（2026-10-07 标题层级修正）：
   不要再依赖 `.card h3` 的样式，故把字号/颜色/外边距显式写全。 */
.kb-cat-card h2 { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; margin: 0 0 10px; font-size: 14px; color: var(--c-text); }
.kb-cat-card h2 a { color: var(--c-text); text-decoration: none; font-size: 15px; }
.kb-cat-card h2 a:hover { color: var(--c-primary); }
.kb-cat-card .count { font-size: 12px; color: var(--c-text-3); font-weight: 400; }
.kb-cat-list { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 6px; }
.kb-cat-list a { font-size: 12px; padding: 3px 10px; border-radius: var(--radius-tag); background: var(--c-bg); color: var(--c-text-2); text-decoration: none; }
.kb-cat-list a:hover { background: var(--c-primary); color: var(--c-on-primary); }
.kb-cat-empty { margin: 0; font-size: 12px; color: var(--c-text-3); }
/* 关于页 */
.about-sub { margin: 0 0 10px; color: var(--c-text-2); }
.about-slogan { margin: 0 0 18px; padding: 10px 14px; border-left: 3px solid var(--c-primary); background: var(--c-primary-soft); color: var(--c-text); font-size: 15px; }

@media (max-width: 768px) {
	.kb-hero { padding: 18px 14px; }
	.kb-hero-title { font-size: 21px; }
	.kb-search { flex-direction: column; }
	.kb-search .btn { width: 100%; }
}

/* ============================================================
   知识条目类型化展示（P3）
   ============================================================ */
.kb-badges { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 0 0 10px; }
/* 类型徽标：统一「浅底 + 深字 + 细边」风格，仅以色相区分类型 */
.kb-badge {
	display: inline-block; padding: 2px 12px; border-radius: 999px;
	font-size: 12px; font-weight: 600;
	color: var(--c-primary);
	background: var(--c-primary-soft);
	border: 1px solid rgba(45, 174, 103, .22);
}
.kb-badge-term { color: #6b4ef0; background: rgba(124, 92, 255, .10); border-color: rgba(124, 92, 255, .22); }
.kb-badge-device { color: #0b8175; background: rgba(15, 157, 143, .10); border-color: rgba(15, 157, 143, .22); }
.kb-badge-standard { color: #2a62b8; background: rgba(47, 111, 208, .10); border-color: rgba(47, 111, 208, .22); }
.kb-badge-solution { color: #9A5A08; background: rgba(224, 138, 30, .10); border-color: rgba(224, 138, 30, .22); }
.kb-badge-case { color: #c0453f; background: rgba(217, 83, 79, .10); border-color: rgba(217, 83, 79, .22); }
.kb-badge-faq { color: #3d6b4a; background: rgba(74, 124, 89, .10); border-color: rgba(74, 124, 89, .22); }
.kb-badge-soft { font-size: 12px; color: var(--c-text-3); border: 1px solid var(--c-border-2); border-radius: 999px; padding: 2px 10px; }

.kb-panel { margin: 22px 0 0; padding: 16px 18px; background: var(--c-tile); border: 1px solid var(--c-border-2); border-radius: var(--radius-card); }
.kb-panel h3 { margin: 0 0 12px; font-size: 15px; }
.kb-panel h4 { margin: 0 0 6px; font-size: 13px; color: var(--c-text-2); }
.kb-row { display: flex; gap: 12px; margin: 0 0 8px; font-size: 14px; line-height: 1.6; }
.kb-row:last-child { margin-bottom: 0; }
.kb-k { flex: none; width: 84px; color: var(--c-text-3); }
.kb-v { color: var(--c-text); }
.kb-code { font-family: ui-monospace, Consolas, Menlo, monospace; }
.kb-status.is-ok { color: #1a8f4c; font-weight: 600; }
.kb-status.is-warn { color: #b06f00; font-weight: 600; }
.kb-status.is-bad { color: #c0392b; font-weight: 600; }
.kb-alert { margin: 10px 0 0; padding: 8px 12px; font-size: 13px; color: #c0392b; background: rgba(192, 57, 43, .08); border-radius: 8px; }
/* 正文内的边注（如标准时效性提示） */
.kb-note { margin: 14px 0 0; padding: 8px 12px; font-size: 13px; line-height: 1.6; color: var(--c-text-3); background: var(--c-bg); border-left: 3px solid var(--c-border-2); border-radius: 0 8px 8px 0; }

.kb-specs { width: 100%; border-collapse: collapse; margin-top: 10px; font-size: 13px; }
.kb-specs caption { text-align: left; font-size: 13px; color: var(--c-text-3); margin-bottom: 6px; }
.kb-specs th, .kb-specs td { border: 1px solid var(--c-border-2); padding: 7px 10px; text-align: left; }
.kb-specs th { width: 40%; background: var(--c-surface); color: var(--c-text-2); font-weight: 500; }

.kb-case-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; }
.kb-case-col { padding: 12px; background: var(--c-surface); border: 1px solid var(--c-border-2); border-radius: 10px; }
.kb-case-col p { margin: 0; font-size: 13px; line-height: 1.6; color: var(--c-text-2); }
.kb-case-col.is-fix { border-color: rgba(26, 143, 76, .35); background: rgba(26, 143, 76, .06); }

/* 五段式故障问答 / 教程块（现象-排查-解决-根因-延伸-避坑） */
.kb-qa-block { margin-top: 12px; padding: 12px 14px; background: var(--c-surface); border: 1px solid var(--c-border-2); border-radius: 10px; }
.kb-qa-block h4 { margin: 0 0 6px; font-size: 13px; font-weight: 600; color: var(--c-text-3); }
.kb-qa-block p { margin: 0; font-size: 13.5px; line-height: 1.7; color: var(--c-text-2); }
.kb-qa-block.is-fix { border-color: rgba(26, 143, 76, .35); background: rgba(26, 143, 76, .06); }
.kb-qa-block.is-warn { border-color: rgba(176, 111, 0, .35); background: rgba(176, 111, 0, .07); }
.kb-qa-steps { margin: 0; padding-left: 20px; font-size: 13.5px; line-height: 1.75; color: var(--c-text-2); }
.kb-qa-steps li { margin-bottom: 4px; }
.kb-qa-steps li:last-child { margin-bottom: 0; }

.kb-faq-list { display: flex; flex-direction: column; gap: 8px; }
.kb-faq-item { background: var(--c-surface); border: 1px solid var(--c-border-2); border-radius: 10px; padding: 10px 14px; }
.kb-faq-item summary { cursor: pointer; font-weight: 600; font-size: 14px; }
.kb-faq-a { margin-top: 8px; font-size: 14px; line-height: 1.7; color: var(--c-text-2); }

.kb-log { list-style: none; margin: 10px 0 0; padding: 0; font-size: 13px; }
.kb-log li { display: flex; gap: 10px; padding: 5px 0; border-top: 1px dashed var(--c-border-2); color: var(--c-text-2); }
.kb-log-date { flex: none; width: 88px; color: var(--c-text-3); }

@media (max-width: 768px) {
	.kb-case-grid { grid-template-columns: minmax(0, 1fr); }
	.kb-k { width: 68px; }
}

/* ============================================================
   分类 / 专栏归档页：知识库式三栏（侧栏导航 + 条目列表 + 辅助栏）
   ============================================================ */
.layout--docs {
	display: grid;
	grid-template-columns: 232px minmax(0, 1fr) 300px;
	gap: var(--gap);
	padding-top: var(--gap);
	align-items: start;
}
.docs-side { position: sticky; top: var(--sticky-top); min-width: 0; }
.docs-nav { padding: 12px 10px; }
.docs-nav h3 { margin: 0 0 8px; font-size: 12.5px; color: var(--c-text-3); font-weight: 600; letter-spacing: .3px; }
.docs-nav ul { list-style: none; margin: 0; padding: 0; }
.docs-nav li a {
	display: flex; align-items: center; justify-content: space-between; gap: 8px;
	min-height: var(--ctl-sm);
	padding: 4px 10px; border-radius: 8px;
	font-size: 13.5px; color: var(--c-text-2); text-decoration: none;
}
.docs-nav li a:hover { background: var(--c-bg); color: var(--c-primary); }
.docs-nav li.on a { background: var(--c-primary-soft); color: var(--c-primary); font-weight: 600; }
.docs-nav .cnt { font-size: 12px; color: var(--c-text-3); flex: none; }
/* 「当前分类优先」：归档页里命中当前一级分类时，就地展开其子类（免去再点一层） */
.docs-nav .docs-sub { margin: 2px 0 6px; padding-left: 8px; border-left: 2px solid var(--c-border-2); }
.docs-nav .docs-sub li a { min-height: var(--ctl-sm); padding: 4px 8px; font-size: 12.5px; }
.docs-nav .docs-sub li.on a { background: transparent; color: var(--c-primary); font-weight: 600; }
.docs-nav .docs-all {
	display: block; margin: 8px 0 0; padding: 9px 10px 2px;
	border-top: 1px dashed var(--c-border-2);
	font-size: 13px; color: var(--c-primary); text-decoration: none;
}
.docs-nav .docs-all:hover { text-decoration: underline; }

/* 紧凑页头（替代原大图 banner） */
.tax-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 18px; padding: 18px 20px; margin-bottom: var(--gap); }
.tax-head-main { min-width: 0; }
.tax-crumb { font-size: 12px; color: var(--c-text-3); }
.tax-crumb a { color: var(--c-text-3); text-decoration: none; }
.tax-crumb a:hover { color: var(--c-primary); }
.tax-crumb .sep { margin: 0 4px; }
.tax-head h1 { margin: 6px 0; font-size: 23px; line-height: 1.3; }
.tax-head .tax-desc { margin: 0 0 10px; font-size: 13px; color: var(--c-text-2); line-height: 1.65; max-width: 720px; }
.tax-stat { font-size: 13px; color: var(--c-text-3); }
.tax-stat b { color: var(--c-primary); font-size: 15px; font-family: var(--font-code); margin-right: 2px; }
.tax-head .sub-chips { margin-top: 12px; }
.tax-sort { display: flex; gap: 6px; flex: none; }
.tax-sort a { padding: 5px 14px; border-radius: 999px; font-size: 13px; color: var(--c-text-2); background: var(--c-bg); text-decoration: none; }
.tax-sort a:hover { color: var(--c-primary); }
.tax-sort a.on { background: var(--c-primary); color: var(--c-on-primary); }
.tax-sort a.on:hover { color: var(--c-on-primary); }

/* 归档页文章卡片略紧凑 */
.layout--docs .post-card { padding: 16px; }

@media (max-width: 1180px) {
	.layout--docs { grid-template-columns: minmax(0, 1fr) 300px; }
	.docs-side { display: none; }
}
@media (max-width: 768px) {
	.layout--docs { grid-template-columns: minmax(0, 1fr); }
	.tax-head { flex-direction: column; align-items: stretch; gap: 12px; padding: 16px; }
	.tax-head h1 { font-size: 20px; }
	.tax-sort { align-self: flex-start; }
}
/* 小屏：缩略图收窄，避免挤压标题 */
@media (max-width: 560px) {
	.post-thumb { width: 84px; height: 60px; }
	.post-row { gap: 10px; }
}

/* ---------- 聚合页：两栏变体（主栏 + 右栏，无左栏） ---------- */
.layout--wide {
	display: grid;
	grid-template-columns: minmax(0, 1fr) 300px;
	gap: var(--gap);
	padding-top: var(--gap);
	align-items: start;
}
@media (max-width: 768px) {
	.layout--wide { grid-template-columns: minmax(0, 1fr); }
}

/* ---------- 右栏「条目类型」链接列表 ---------- */
.link-list { list-style: none; margin: 0; padding: 0; }
.link-list li { display: flex; align-items: center; gap: 8px; }
.link-list li a {
	flex: 1; min-width: 0; padding: 7px 0;
	font-size: 13.5px; color: var(--c-text-2); text-decoration: none;
	overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.link-list li a:hover { color: var(--c-primary); }
.link-list li.on a { color: var(--c-primary); font-weight: 600; }
.link-list li.on { position: relative; }
.link-list .cnt { flex: none; font-size: 12px; color: var(--c-text-3); }
.link-list li.on .cnt { color: var(--c-primary); }

/* ---------- 无封面图时的类型占位块 ---------- */
.post-thumb-ph { display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, #38c07d, #1f8f52); }
.post-thumb-ph span { font-size: 26px; font-weight: 700; color: rgba(255, 255, 255, .94); line-height: 1; }
.post-thumb-ph.is-solution { background: linear-gradient(135deg, #f0a03c, #d9791a); }
.post-thumb-ph.is-device { background: linear-gradient(135deg, #17b3a3, #0b8175); }
.post-thumb-ph.is-standard { background: linear-gradient(135deg, #4a8ae0, #2a62b8); }
.post-thumb-ph.is-case { background: linear-gradient(135deg, #e0685f, #bd4139); }
.post-thumb-ph.is-term { background: linear-gradient(135deg, #8b6cff, #6b4ef0); }
.post-thumb-ph.is-faq { background: linear-gradient(135deg, #5f9670, #3d6b4a); }
.post-thumb-ph.is-fault { background: linear-gradient(135deg, #e0653c, #b03f22); }
.post-thumb-ph.is-guide { background: linear-gradient(135deg, #3aa2e0, #1f6fb0); }

/* ---------- 术语卡片网格（两栏内容区更紧凑） ---------- */
.kb-cat-grid--terms { grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); }

/* ============================================================
   知识库首页视觉优化（v2）
   ============================================================ */
/* Hero：渐隐网格底纹 + 概览统计 */
.kb-hero {
	position: relative;
	overflow: hidden;
	padding: 34px 22px 30px;
	background:
		radial-gradient(circle at 12% 0%, rgba(45, 174, 103, .10), transparent 46%),
		radial-gradient(circle at 88% 100%, rgba(255, 122, 69, .09), transparent 46%),
		linear-gradient(180deg, #FFFFFF, var(--c-surface));
}
.kb-hero::after {
	content: '';
	position: absolute;
	inset: 0;
	background-image: linear-gradient(rgba(45, 174, 103, .05) 1px, transparent 1px),
		linear-gradient(90deg, rgba(45, 174, 103, .05) 1px, transparent 1px);
	background-size: 28px 28px;
	mask-image: radial-gradient(circle at 50% 40%, #000, transparent 72%);
	-webkit-mask-image: radial-gradient(circle at 50% 40%, #000, transparent 72%);
	pointer-events: none;
}
.kb-hero > * { position: relative; z-index: 1; }
.kb-hero-title { font-size: 30px; letter-spacing: .5px; }
.kb-hero-stats {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	gap: 10px 26px;
	margin: 16px 0 0;
	font-size: 13px;
	/* 原为 --c-text-3（白底约 3.0:1，未达 WCAG AA）→ --c-text-2（约 6.9:1） */
	color: var(--c-text-2);
}
.kb-hero-stats b { font-size: 18px; color: var(--c-primary); margin-right: 3px; font-family: var(--font-code); }

/* ⚠ 2026-10-11（TK-20261011-UI-001）：原「首页左栏『按工程分类浏览』」整块
   （IA-09 ~ IA-15 的京东式左侧分类竖栏，约 66 行）**已删除** —— 纯死 CSS。

   依据：① `grep -rn 'kb-cat-side' --include=*.php` 在整个主题**零命中**，
   模板自 IA-16 起已改渲染通栏 `.kb-cat-bar`；② 本类不参与任何 JS 钩子。
   故删除是**零行为变化**的纯清理，同时消掉一块2019 年的覆写层。

   ⚠ 但**只删 `.kb-cat-side` 前缀的部分**，同块内仍在生效的规则一律保留。
     经逐条核对，被删块内的两条 `.kb-top` 栅格规则**确认为冗余**（不是死代码，
     是「重复定义」），删除后行为不变，证据如下：
       - 原 `@media ≤1180 { .kb-top { minmax(0,1fr) 300px } }`
         ⇒ 被更靠后的 `@media ≥993 { .kb-top { minmax(0,1fr) 300px } }`（现 3249 行）
         完全覆盖（≥993 与 ≤1180 在 993~1180 区间重叠，取值相同）
       - 原 `@media ≤768 { .kb-top { minmax(0,1fr) } }`
         ⇒ 被 `@media ≤992 { .kb-top { minmax(0,1fr) } }`（现 2582 行）完全覆盖
     两处的**有效定义都已由更靠后的规则接管**，故不必回补。
     —— 这正是本文件 3318-3321 记录的顺序陷阱：同优先级下后写者赢。
     ⚠ 若日后有人把 3249 / 2582 删掉，这两条冗余规则也不会自动"复活" ——
       它们不是兜底，是重复。

   同块内**已原样保留**（仍在生效，与左栏无关）：
     - `.cat-bar` 及其 `::after` 横滑渐变提示 —— 全站每页生效
   ============================================================ */

/* 分类 chips 横向滚动提示 */
.cat-bar { position: relative; }
.cat-bar::after {
	content: '';
	position: absolute; top: 0; right: 0; bottom: 0; width: 28px;
	background: linear-gradient(90deg, rgba(255, 255, 255, 0), var(--c-surface) 82%);
	pointer-events: none;
}
.cat-chips::-webkit-scrollbar { height: 0; }

/* 中屏（≤1180）：收敛顶部导航，避免与搜索框争空间 */
@media (max-width: 1180px) {
	.topnav { gap: 12px; font-size: 13px; }
}
/* 窄中屏（≤1024）：导航允许横向滚动，不挤压搜索框 */
@media (max-width: 1024px) {
	.topnav {
		gap: 10px; font-size: 13px;
		overflow-x: auto; white-space: nowrap;
		max-width: 46vw; scrollbar-width: none;
	}
	.topnav::-webkit-scrollbar { height: 0; }
}

/* ============================================================
   聚合页分面 · 术语卡（P4）
   ============================================================ */
.kb-facet-label { font-size: 13px; color: var(--c-text-3); align-self: center; }
.kb-term-card { display: flex; flex-direction: column; gap: 4px; text-decoration: none; }
.kb-term-card h2 { margin: 0; font-size: 15px; color: var(--c-text); }
.kb-term-card:hover h2 { color: var(--c-primary); }
.kb-term-en { margin: 0; font-size: 12px; color: var(--c-text-3); font-family: ui-monospace, Consolas, Menlo, monospace; }
.kb-term-alias, .kb-term-ex { margin: 0; font-size: 12px; color: var(--c-text-2); line-height: 1.6; }

/* ============================================================
   8 大场景栏目导航（问答知识库定位 · 纯前端映射层）
   ============================================================ */
.kb-scene-card-wrap { margin-top: var(--gap); }
.kb-scene-card-wrap > .kb-sec-h { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; }
.kb-scene-card-wrap > .kb-sec-h .more { font-size: 12px; font-weight: 400; }
/* 场景卡：自适应列数（左栏占 232px 后主区约 724px → 3 列约 233px/张，宽屏自动 4 列） */
.kb-scenes { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; }
.kb-scene {
	display: flex; flex-direction: column; gap: 6px;
	padding: 11px 13px;
	border: 1px solid var(--c-border);
	border-radius: var(--radius-card, 12px);
	background: var(--c-surface);
	transition: border-color .15s, box-shadow .15s, transform .15s;
}
.kb-scene:hover { border-color: var(--c-primary); box-shadow: var(--shadow); transform: translateY(-2px); }
.kb-scene-head { display: flex; align-items: flex-start; gap: 10px; text-decoration: none; }
.kb-scene-ico {
	flex: none; width: 30px; height: 30px; border-radius: 9px;
	display: inline-flex; align-items: center; justify-content: center;
	font-size: 14px; font-weight: 700;
	/* 图标位是装饰（无锚文本承载），用品牌亮绿 + 浅底，保持品牌感 */
	color: var(--c-primary-bright); background: var(--c-primary-soft);
	border: 1px solid rgba(45, 174, 103, .18);
}
/* 图标位优先内联 SVG（见 functions.php s58120_scene_icon_svg）：currentColor 描边，
   脱掉字重/字号影响，只吃 .kb-scene-ico 的颜色。 */
.kb-scene-svg { display: block; }
.kb-scene-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
/* 场景名是 h3（此前为 span）：补齐 h1 → h2（区块）→ h3（场景簇）层级，故需清掉标题默认外边距。 */
.kb-scene-name { margin: 0; font-size: 14px; font-weight: 600; color: var(--c-text); line-height: 1.35; }
.kb-scene-head:hover .kb-scene-name { color: var(--c-primary); }
/* 描述最长 2 行：场景卡等高，避免个别长描述把整行撑高。
   注意这是 <a> 的锚文本（长尾场景词），2 行是刻意保留的 SEO 与扫读信息量，
   不再进一步 clamp 到 1 行。 */
.kb-scene-desc {
	font-size: 12px; color: var(--c-text-2); line-height: 1.5;
	overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
}

@media (max-width: 768px) {
	.kb-scenes { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.kb-scene { padding: 10px 12px; }
}
/* 小手机：场景卡保持两列（单列 8 张会把内容样例挤出首屏两屏之外），同步收窄字号与内边距 */
@media (max-width: 480px) {
	.kb-scenes { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
	.kb-scene { padding: 10px 11px; gap: 5px; }
	.kb-scene-ico { width: 26px; height: 26px; border-radius: 8px; font-size: 13px; }
	.kb-scene-name { font-size: 13px; }
	.kb-scene-desc { font-size: 11.5px; }
}

/* 关于页品牌注脚 */
.about-note { margin-top: 12px; padding: 8px 12px; font-size: 13px; color: var(--c-text-3); background: var(--c-bg); border-left: 3px solid var(--c-border-2); border-radius: 0 8px 8px 0; }

/* ============================================================
   故障速查手册 /quickfix/
   ============================================================ */
.kb-qf-group { margin-top: var(--gap); }
/* 分组标题由 h3 升为 h2（2026-10-07 标题层级修正）：显式写全字号/颜色/外边距。 */
.kb-qf-group > h2 { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin: 0 0 4px; font-size: 15px; color: var(--c-text); }
.kb-qf-group > h2 .more { font-size: 12px; font-weight: 400; }
.kb-qf-desc { margin: 0 0 12px; font-size: 12px; color: var(--c-text-3); }
.kb-qf-list {
	list-style: none; margin: 0; padding: 0;
	display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px 20px;
}
.kb-qf-list li {
	display: flex; align-items: baseline; gap: 8px; min-width: 0;
	padding: 6px 0; border-bottom: 1px dashed var(--c-border);
}
.kb-qf-link { flex: 1; min-width: 0; font-size: 13.5px; color: var(--c-text-2); text-decoration: none; line-height: 1.5; }
.kb-qf-link:hover { color: var(--c-primary); }
.kb-qf-src { flex: none; font-size: 11px; color: var(--c-text-3); background: var(--c-bg); border-radius: var(--radius-tag); padding: 1px 7px; }
.kb-qf-empty { margin: 0; font-size: 13px; color: var(--c-text-3); }

@media (max-width: 768px) {
	.kb-qf-list { grid-template-columns: minmax(0, 1fr); }
}

/* ============================================================
   AI 问答辅助 /ai/
   ============================================================ */
.kb-hero-alt { margin: 12px 0 0; font-size: 13px; color: var(--c-text-2); }
.kb-hero-alt a { color: var(--c-primary); text-decoration: none; }
.kb-hero-alt a:hover { text-decoration: underline; }

/* 首页 Hero 末行：提示语与概览统计并排（宽屏一行、窄屏自动换行）。
   改前是两块独立段落（提示 12px 上边距 + 统计 16px 上边距）各占一行，
   叠加已被删除的品牌行，Hero 共 5 行文字把内容挤出首屏。 */
.kb-hero-meta {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: 6px 22px;
	margin-top: 14px;
}
.kb-hero-meta .kb-hero-alt { margin: 0; font-size: 12.5px; }
.kb-hero-meta .kb-hero-stats { margin: 0; gap: 6px 18px; font-size: 12.5px; }

.kb-hero--ai { text-align: left; }
.kb-hero--ai .kb-hero-title,
.kb-hero--ai .kb-hero-sub { text-align: left; }
.kb-hero--ai .kb-hero-sub { margin-bottom: 14px; }

.kb-ai-form { display: flex; flex-direction: column; gap: 10px; }
.kb-ai-form textarea {
	width: 100%; min-height: 84px; padding: 12px 14px;
	font-size: 15px; line-height: 1.6; font-family: inherit;
	color: var(--c-text); background: var(--c-surface);
	border: 1px solid var(--c-border); border-radius: var(--radius-btn);
	resize: vertical;
}
.kb-ai-form textarea:focus { border-color: var(--c-primary); outline: none; }
.kb-ai-actions { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }

.kb-ai-samples { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-top: 14px; }
.kb-ai-samples-label { font-size: 12px; color: var(--c-text-3); }
.kb-ai-chip {
	font-size: 12px; padding: 4px 11px;
	color: var(--c-text-2); background: var(--c-bg);
	border: 1px solid var(--c-border); border-radius: var(--radius-tag);
	cursor: pointer; font-family: inherit;
}
.kb-ai-chip:hover { color: var(--c-on-primary); background: var(--c-primary); border-color: var(--c-primary); }

.kb-ai-panel { margin-top: var(--gap); }
.kb-ai-status { font-size: 13px; color: var(--c-text-2); }
.kb-ai-status[hidden] { display: none; }
.kb-ai-status:not(:empty) { margin-bottom: 10px; padding: 8px 12px; background: var(--c-bg); border-radius: 8px; }
.kb-ai-answer { font-size: 14.5px; line-height: 1.78; color: var(--c-text); }
.kb-ai-answer h3 { margin: 16px 0 6px; font-size: 15px; }
.kb-ai-answer h4, .kb-ai-answer h5 { margin: 14px 0 6px; font-size: 14px; }
.kb-ai-answer p { margin: 0 0 10px; }
.kb-ai-answer ul, .kb-ai-answer ol { margin: 0 0 10px; padding-left: 22px; }
.kb-ai-answer li { margin-bottom: 4px; }
.kb-ai-answer code {
	font-family: ui-monospace, Consolas, Menlo, monospace; font-size: 13px;
	padding: 1px 5px; background: var(--c-bg); border-radius: 4px;
}
.kb-ai-sources { margin-top: 16px; padding-top: 14px; border-top: 1px dashed var(--c-border); }
.kb-ai-sources h3 { margin: 0 0 8px; font-size: 14px; }
.kb-ai-src-list { margin: 0; padding-left: 20px; font-size: 13.5px; }
.kb-ai-src-list li { margin-bottom: 10px; }
.kb-ai-src-list a { color: var(--c-primary); text-decoration: none; }
.kb-ai-src-list a:hover { text-decoration: underline; }
.kb-ai-src-list p { margin: 4px 0 0; font-size: 12.5px; line-height: 1.6; color: var(--c-text-3); }
.kb-ai-src-type {
	font-size: 11px; color: var(--c-text-3);
	background: var(--c-bg); border-radius: var(--radius-tag); padding: 1px 7px; margin-left: 6px;
}

.kb-ai-note { margin-top: var(--gap); }
.kb-ai-note h2 { margin: 0 0 8px; font-size: 14px; color: var(--c-text); }
.kb-ai-note ul { margin: 0; padding-left: 20px; font-size: 13px; line-height: 1.75; color: var(--c-text-2); }
.kb-ai-note a { color: var(--c-primary); }

/* ===== 合规条款页 + 页脚主体公示（2026-10-06 引入会员积分与支付） ===== */
.legal-page .legal-updated { font-size: 12.5px; color: var(--c-text-3); margin: -4px 0 18px; }
.legal-page h2 { margin: 26px 0 10px; font-size: 16.5px; }
.legal-page h3 { margin: 20px 0 8px; font-size: 15px; }
.legal-page ul, .legal-page ol { margin: 0 0 12px; padding-left: 22px; }
.legal-page li { margin-bottom: 6px; line-height: 1.8; }
.legal-page p { line-height: 1.85; }
.legal-subject { width: 100%; border-collapse: collapse; margin: 0 0 18px; font-size: 13.5px; }
.legal-subject th, .legal-subject td { border: 1px solid var(--c-border); padding: 8px 12px; text-align: left; vertical-align: top; }
.legal-subject th { width: 170px; background: var(--c-bg); font-weight: 500; color: var(--c-text-2); white-space: nowrap; }
.legal-nav { display: flex; gap: 16px; flex-wrap: wrap; margin-top: 22px; padding-top: 14px; border-top: 1px dashed var(--c-border); font-size: 13.5px; }
.legal-nav a { color: var(--c-primary); text-decoration: none; }
.legal-nav a:hover { text-decoration: underline; }
.site-footer .footer-subject { margin-top: 4px; font-size: 12px; color: var(--c-text-3); line-height: 1.8; }
.site-footer .footer-legal { margin-top: 8px; display: flex; gap: 14px; flex-wrap: wrap; justify-content: center; font-size: 12px; }
.site-footer .footer-legal a { color: var(--c-text-3); text-decoration: none; }
.site-footer .footer-legal a:hover { color: var(--c-primary); text-decoration: underline; }
.site-footer a { text-decoration: none; }
.s58120-reg-agree { font-size: 13px; margin-top: 6px; }
.s58120-reg-agree label { display: flex; gap: 6px; align-items: flex-start; line-height: 1.6; }
.s58120-reg-agree a { color: #2DAE67; }
@media (max-width: 600px) {
	.legal-subject th { width: 110px; white-space: normal; }
}

/* ===== M16 会员中心 /member/ ===== */
.member-page { max-width: 1000px; margin: 0 auto; padding: 20px 16px 40px; }
.member-hero { display: flex; justify-content: space-between; align-items: center; gap: 20px; flex-wrap: wrap; padding: 24px; }
.member-hero-main h1 { margin: 0 0 10px; font-size: 22px; }
.member-balance { margin: 0 0 6px; }
.member-balance b { font-size: 32px; color: var(--c-primary); margin-right: 6px; }
.member-balance span { font-size: 14px; color: var(--c-text-3); }
.member-level { margin: 0; font-size: 13.5px; color: var(--c-text-2); }
.member-hero-side { text-align: right; }
.member-block { margin-top: 18px; padding: 18px 20px; }
.member-block h2 { margin: 0 0 12px; font-size: 16.5px; }
.member-rules { margin: 0; padding-left: 20px; font-size: 14px; line-height: 1.85; color: var(--c-text-2); }
.member-products { display: grid; grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); gap: 12px; }
.member-product { border: 1px solid var(--c-border); border-radius: 8px; padding: 14px; text-align: center; }
.member-product-name { font-size: 14px; margin-bottom: 6px; }
.member-product-price { font-size: 18px; color: var(--c-primary); font-weight: 600; margin-bottom: 10px; }
.member-ledger { width: 100%; border-collapse: collapse; font-size: 13.5px; }
.member-ledger th, .member-ledger td { border-bottom: 1px solid var(--c-border); padding: 8px 10px; text-align: left; }
.member-ledger th { background: var(--c-bg); font-weight: 500; color: var(--c-text-2); }
.member-ledger .is-plus { color: #269A5B; font-weight: 600; }
.member-ledger .is-minus { color: #b32d2e; font-weight: 600; }
@media (max-width: 600px) {
	.member-hero { flex-direction: column; align-items: flex-start; }
	.member-hero-side { text-align: left; }
}

/* ============================================================
   首页视觉层 P2（2026-10-07）
   目标：把「面」的层级讲清楚 —— 页面底(灰) → 面板(白 + 细边) → 内容块(hover 才转白并抬升)，
   并把首页各面板标题统一成「主色竖条 + 15/16px 加粗」的同一套语言。
   全部选择器限定在首页作用域（.kb-top / .layout--home），**不动其它页面**的既有视觉。
   ============================================================ */

/* 1) 面板标题统一（改前 14px/常规字重，与卡片正文同级 —— 一屏 4 个面板读不出层级）。

   ⚠ 2026-10-11：以下三组选择器中的 `.kb-top .kb-cat-side-title` 已移除
   （左侧分类竖栏随IA-16 下线，该类不再有模板输出）。
   ⚠ 只摘掉这一条，**同组其余选择器全部保留** —— 它们仍在生效：
     `.kb-top .card h2.kb-sec-h` / `.kb-top .card h3`（右栏三块模块盒）
     与 `.layout--home .kb-feed-head h2`（内容流标题）。 */
.kb-top .card h2.kb-sec-h,
.kb-top .card h3,
.layout--home .kb-feed-head h2 {
	position: relative;
	padding-left: 10px;
	font-weight: 700;
	color: var(--c-text);
}
.kb-top .card h2.kb-sec-h,
.kb-top .card h3 { font-size: 15px; }
.layout--home .kb-feed-head h2 { font-size: 16px; }
.kb-top .card h2.kb-sec-h::before,
.kb-top .card h3::before,
.layout--home .kb-feed-head h2::before {
	content: '';
	position: absolute; left: 0; top: 50%; transform: translateY(-50%);
	width: 3px; height: 13px; border-radius: 2px;
	/* 装饰竖条用品牌亮绿（不承载文字） */
	background: var(--c-primary-bright);
}

/* 2) 场景卡：白面板里的白盒子是「卡片套卡片」，层次全靠两道边框撑。
   改常态浅灰底 + 透明边框，hover 转白并抬升 —— 白色面留给「可点内容」。 */
.kb-scene { background: var(--c-tile); border-color: transparent; }
.kb-scene:hover { background: var(--c-surface); border-color: var(--c-primary); }

/* 3) Hero：搜索框收窄 + 热门检索词 + 统计行分隔线。
   空搜索框对不知道该怎么描述的用户等于没有入口；给 4 个编辑精选检索词兜底。 */
.kb-search { max-width: 560px; }
.kb-hot {
	display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 8px;
	margin: 12px 0 0; font-size: 12.5px; color: var(--c-text-3);
}
.kb-hot a {
	padding: 2px 10px; border-radius: 999px; font-size: 12.5px;
	background: var(--c-bg); border: 1px solid var(--c-border-2); color: var(--c-text-2);
}
.kb-hot a:hover { background: var(--c-primary-soft); border-color: var(--c-primary); color: var(--c-primary); }
.kb-hero-stats span + span { position: relative; }
.kb-hero-stats span + span::before {
	content: '';
	position: absolute; left: -10px; top: 50%; transform: translateY(-50%);
	width: 1px; height: 12px; background: var(--c-border);
}

/* 4) 平板竖屏（≤992）：辅助栏不再挤在右侧 —— 768~1180 区间主区只剩约 460px，标题频繁折行。
   改为主区下方两列块（≤768 / ≤480 的既有规则继续收窄到 2 列 / 1 列）。 */
@media (max-width: 992px) {
	.kb-top { grid-template-columns: minmax(0, 1fr); }
	.layout--docs { grid-template-columns: minmax(0, 1fr); }
	.col-right {
		position: static;
		display: grid;
		grid-template-columns: repeat(2, minmax(0, 1fr));
		gap: var(--gap);
		align-items: start;
	}
	.col-right .card { margin-bottom: 0; }
}

/* ============================================================
   深浅配色 v1.2（2026-10-07 · M04-IA13 加入手动切换）

   **一份取值，两条生效路径**：
   - 颜色令牌在 `:root` 的 `@supports → light-dark()` 里定义一次（见文件上方），
     `color-scheme` 决定取哪一侧：默认「跟随系统」，用户手动选则被 `data-theme` 覆盖；
   - 少数无法令牌化的色相族（类型 chip / 徽标 / 代码高亮）在本块内**成对**给出浅 / 深值。
   于是「自动」与「手动」不可能不一致 —— 改配色只需改一处。

   本块刻意**不做**自动反色 / 滤镜方案：那会把字标、图片、语法高亮一起弄坏。

   验收：`node _e2e/a11y_audit.js`（浅 + 深双模式）
       + `--dark --pref=light` / `--light --pref=dark`（手动覆盖系统的两种组合）
       + `node _e2e/theme_toggle.js`（三态循环 · 持久化 · 防闪）
   ============================================================ */
@supports (color: light-dark(#fff, #000)) {
	/* 色相族：浅底深字 ↔ 深底亮字（同色相）。浅色一侧就是基规则里的现值，
	     在此重述是为了「一个选择器同时管两种配色」—— 浅色模式零视觉变化。
	     深色一侧的亮色值按「对深色底 ≥4.5:1」挑选，`a11y_audit.js --dark` 逐条把关。 */
	.kb-post-type.is-fault {
		background: light-dark(rgba(224, 101, 60, .10), rgba(224, 101, 60, .18));
		color: light-dark(#A8442A, #F2A78E);
		border-color: light-dark(rgba(224, 101, 60, .22), rgba(224, 101, 60, .36));
	}
	.kb-post-type.is-guide {
		background: light-dark(rgba(58, 162, 224, .10), rgba(58, 162, 224, .18));
		color: light-dark(#1F6FA8, #9CC6F2);
		border-color: light-dark(rgba(58, 162, 224, .22), rgba(58, 162, 224, .36));
	}
	.kb-post-type.is-device {
		background: light-dark(rgba(23, 179, 163, .10), rgba(23, 179, 163, .18));
		color: light-dark(#0E7A70, #86DBD2);
		border-color: light-dark(rgba(23, 179, 163, .22), rgba(23, 179, 163, .36));
	}
	.kb-post-type.is-standard {
		background: light-dark(rgba(74, 138, 224, .10), rgba(74, 138, 224, .18));
		color: light-dark(#2F5FA8, #9CBEF5);
		border-color: light-dark(rgba(74, 138, 224, .22), rgba(74, 138, 224, .36));
	}
	.kb-post-type.is-case {
		background: light-dark(rgba(224, 104, 95, .10), rgba(224, 104, 95, .18));
		color: light-dark(#A83A32, #F0A09A);
		border-color: light-dark(rgba(224, 104, 95, .22), rgba(224, 104, 95, .36));
	}
	.kb-post-type.is-term {
		background: light-dark(rgba(139, 108, 255, .10), rgba(139, 108, 255, .18));
		color: light-dark(#5B45C4, #C3B4F8);
		border-color: light-dark(rgba(139, 108, 255, .22), rgba(139, 108, 255, .36));
	}
	.kb-post-type.is-faq {
		background: light-dark(rgba(95, 150, 112, .10), rgba(95, 150, 112, .18));
		color: light-dark(#3D6B4A, #AECFB9);
		border-color: light-dark(rgba(95, 150, 112, .22), rgba(95, 150, 112, .36));
	}
	/* is-solution 的底色走 --c-primary-soft（令牌，自动跟随），只有文字与描边需要成对 */
	.kb-post-type.is-solution {
		color: light-dark(#1A7A46, #8FDCAF);
		border-color: light-dark(rgba(45, 174, 103, .22), rgba(45, 174, 103, .36));
	}
	.kb-badge-term {
		background: light-dark(rgba(124, 92, 255, .10), rgba(124, 92, 255, .18));
		color: light-dark(#6b4ef0, #C3B4F8);
		border-color: light-dark(rgba(124, 92, 255, .22), rgba(124, 92, 255, .36));
	}
	.kb-badge-device {
		background: light-dark(rgba(15, 157, 143, .10), rgba(15, 157, 143, .18));
		color: light-dark(#0b8175, #86DBD2);
		border-color: light-dark(rgba(15, 157, 143, .22), rgba(15, 157, 143, .36));
	}
	.kb-badge-standard {
		background: light-dark(rgba(47, 111, 208, .10), rgba(47, 111, 208, .18));
		color: light-dark(#2a62b8, #9CBEF5);
		border-color: light-dark(rgba(47, 111, 208, .22), rgba(47, 111, 208, .36));
	}
	.kb-badge-solution {
		background: light-dark(rgba(224, 138, 30, .10), rgba(224, 138, 30, .18));
		color: light-dark(#9A5A08, #F0B36B);
		border-color: light-dark(rgba(224, 138, 30, .22), rgba(224, 138, 30, .36));
	}
	.kb-badge-case {
		background: light-dark(rgba(217, 83, 79, .10), rgba(217, 83, 79, .18));
		color: light-dark(#c0453f, #F0A09A);
		border-color: light-dark(rgba(217, 83, 79, .22), rgba(217, 83, 79, .36));
	}
	.kb-badge-faq {
		background: light-dark(rgba(74, 124, 89, .10), rgba(74, 124, 89, .18));
		color: light-dark(#3d6b4a, #AECFB9);
		border-color: light-dark(rgba(74, 124, 89, .22), rgba(74, 124, 89, .36));
	}
	.badge-top {
		background: light-dark(#FFF3E8, rgba(224, 101, 60, .18));
		color: light-dark(#A8442A, #F2A78E);
	}
	.badge-fine {
		background: light-dark(#E8F3FF, rgba(58, 162, 224, .18));
		color: light-dark(#2F5FA8, #9CC6F2);
	}
	.badge-orig {
		background: light-dark(#E8F8EE, rgba(45, 174, 103, .18));
		color: light-dark(#1E7A36, #8FDCAF);
	}
	/* 排行榜前三名徽标：浅色与深色都用深底 + 白/深字（对比度已达标），无需成对 */

	/* 代码高亮：hljs 自带的 `github.min.css` 是**浅色主题**，深色下必须整块换成 GitHub Dark 配色。
	     浅色一侧写的就是 vendor 的现值（改这里等于改 vendor 主题，故两者必须同步）。
	     `.code-copy` 走令牌，自动跟随，无需在此覆盖。 */
	.hljs { background: light-dark(#fff, var(--c-code-bg)) !important; color: light-dark(#24292e, #C9D1D9) !important; }
	.hljs-doctag, .hljs-keyword, .hljs-meta .hljs-keyword, .hljs-template-tag,
	.hljs-template-variable, .hljs-type, .hljs-variable.language_ { color: light-dark(#d73a49, #FF7B72) !important; }
	.hljs-title, .hljs-title.class_, .hljs-title.class_.inherited__,
	.hljs-title.function_ { color: light-dark(#6f42c1, #D2A8FF) !important; }
	.hljs-attr, .hljs-attribute, .hljs-literal, .hljs-meta, .hljs-number, .hljs-operator,
	.hljs-selector-attr, .hljs-selector-class, .hljs-selector-id,
	.hljs-variable { color: light-dark(#005cc5, #79C0FF) !important; }
	.hljs-meta .hljs-string, .hljs-regexp, .hljs-string { color: light-dark(#032f62, #A5D6FF) !important; }
	.hljs-built_in, .hljs-symbol { color: light-dark(#e36209, #FFA657) !important; }
	.hljs-code, .hljs-comment, .hljs-formula { color: light-dark(#6a737d, #8B949E) !important; }
	.hljs-name, .hljs-quote, .hljs-selector-pseudo, .hljs-selector-tag { color: light-dark(#22863a, #7EE787) !important; }
	.hljs-subst { color: light-dark(#24292e, #C9D1D9) !important; }
	.hljs-section { color: light-dark(#005cc5, #79C0FF) !important; }
	.hljs-bullet { color: light-dark(#735c0f, #FFA657) !important; }
	.hljs-emphasis { color: light-dark(#24292e, #C9D1D9) !important; font-style: italic; }
	.hljs-strong { color: light-dark(#24292e, #C9D1D9) !important; font-weight: 700; }
	.hljs-addition {
		color: light-dark(#22863a, #7EE787) !important;
		background: light-dark(#f0fff4, rgba(46, 160, 67, .12)) !important;
	}
	.hljs-deletion {
		color: light-dark(#b31d28, #FFA198) !important;
		background: light-dark(#ffeef0, rgba(248, 81, 73, .12)) !important;
	}

	/* 顶部字标铭牌：PNG 实测为「深墨字（#0E3E6F）+ 白底、**完全不透明**」，
	     深色页头上会变成一块刺眼的白矩形。给它一层浅色铭牌（border 在 border-box 内，
	     不改变 48px 字标高，故不会造成顶栏跳动）；刻意**不反色** —— 反色会把品牌蓝变橙。 */
	.brand-logo {
		border-radius: 8px;
		/* 用 box-shadow 而非 border/padding 做铭牌：border 在 border-box 内会压缩字标内容
		   （浅色模式字标会凭空小 8%），box-shadow 不参与布局，两种模式尺寸完全一致。 */
		box-shadow: 0 0 0 3px light-dark(transparent, #F4F6F8);
	}

	/* Hero 底纹（M04-IA15 修）：基规则写死 `linear-gradient(180deg, #FFFFFF, var(--c-surface))`，
	   深色模式下**顶部仍是纯白** —— 像素实测 Hero 内 10/30/55px 处的亮度是 0.91/0.86/0.79，
	   即深色页中间嵌了一块白板。
	   ⚠ 这类缺陷几何审计**够不到**：元素的 `background-color` 是 transparent，
	   「向上合成背景」只看得到父级卡片底，`background-image` 此前被整类跳过。
	   本轮已给审计补上"渐变里的近白色"判定（`_e2e/a11y_audit.js` 第 6 项），
	   这里则把渐变的一头也成对给出。 */
	.kb-hero {
		background:
			radial-gradient(circle at 12% 0%, rgba(45, 174, 103, .10), transparent 46%),
			radial-gradient(circle at 88% 100%, rgba(255, 122, 69, .09), transparent 46%),
			linear-gradient(180deg, light-dark(#FFFFFF, #20252D), var(--c-surface));
	}

	/* 个人主页横幅：基规则是 `linear-gradient(120deg, #dbeafe, #e7f4ec 52%, #fdf0dd)`（三段浅彩），
	   同属"写死浅色渐变"这一类 —— 深色下是一块亮板，一并成对处理。 */
	.user-cover {
		background: linear-gradient(
			120deg,
			light-dark(#dbeafe, #1B2A38),
			light-dark(#e7f4ec, #1B2C25) 52%,
			light-dark(#fdf0dd, #32281A)
		);
	}
}

/* ============================================================
   配色模式开关（M04-IA13）
   三态循环：跟随系统（无 data-theme）→ 浅色 → 深色。
   图标切换纯 CSS（按 `:root[data-theme]` 选显示哪个），JS 只管状态、持久化与 aria 标签。
   ============================================================ */
.theme-toggle {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: var(--ctl-lg);
	height: var(--ctl-lg);
	padding: 0;
	border: 1px solid var(--c-border);
	background: var(--c-surface);
	color: var(--c-text-2);
	border-radius: var(--radius-btn);
	cursor: pointer;
}
.theme-toggle:hover { border-color: var(--c-primary); color: var(--c-primary); }
.theme-toggle:focus-visible { outline: 2px solid var(--c-primary); outline-offset: 2px; }
.tt-ico { display: none; }
.tt-auto { display: block; }
:root[data-theme="light"] .tt-auto,
:root[data-theme="dark"] .tt-auto { display: none; }
:root[data-theme="light"] .tt-light { display: block; }
:root[data-theme="dark"] .tt-dark { display: block; }
/* 手机端顶栏空间紧张：36px 档按钮在 ≤768 收成 32px 档 */
@media (max-width: 768px) {
	.theme-toggle { width: var(--ctl-sm); height: var(--ctl-sm); }
}

/* ============================================================
   首页版面：尺度（间距/圆角）与底部分类总览（M04-IA14 · 2026-10-07）

   ⚠ 字号一律**保持原值**（2026-10-07 第二轮修正）：
   第一版把字阶整体抬了一档（卡标题 14→16、区块标题 15→17、主标题 30→35…），
   实机看下来"字太大"，用户判定原来的字阶更合理 —— 故这里只动**间距与圆角**这类
   不改变文字大小的量：块间距 16→20、卡片内距 14→16/18、圆角 12→14、行内距放宽。
   文字层级改用**颜色与字重**表达（分类名由 text-3 提到 text-2、类型保持彩色胶囊），
   不靠放大字号 —— 放大字号会同时放大整屏，压掉首屏内容。

   另含两处内容量调整（与字号无关）：卡片摘要显示 3 行（截断 78→100 字）、
   「最新条目」标题旁加全站条目总量。
   ============================================================ */
:root {
	--gap: 20px;         /* 16 → 20：块与块的呼吸感（手机端在段末回落 16） */
	--radius-card: 14px; /* 12 → 14：圆角大一点，整屏更"软" */
}

.card { padding: 16px; }

/* Hero：只放宽内距与行距，字号保持原值（主标题 30px / 副题 15px / 搜索框 44px） */
.kb-hero { padding: 26px 24px 22px; }
.kb-hero-sub { margin-bottom: 10px; }
.kb-hot { margin-top: 14px; gap: 9px; }
.kb-hero-meta { margin-top: 14px; }
.kb-hero-stats { margin-top: 12px; gap: 10px 26px; }
.kb-hero-brand { margin-top: 14px; }

/* 区块标题：统一成「标题 + 计数 + 更多」，字号保持 15px */
.kb-feed-head { align-items: baseline; margin-bottom: 14px; }
.kb-feed-count { margin-left: 10px; font-size: 12.5px; font-weight: 400; color: var(--c-text-3); }
.kb-feed-more { font-size: 12.5px; }

/* 文章卡片：内距与行距放宽、摘要 3 行；字号保持原值（标题 14 / 摘要 12.5 / 类型 11） */
.kb-post { padding: 15px 17px; gap: 11px; border-left-width: 4px; }
.kb-post-ex { -webkit-line-clamp: 3; min-height: 60px; } /* = 12.5px × 1.6 × 3 行 */
.kb-post-meta { gap: 9px; }
/* 分类名不改字号、只提对比度（原为 --c-text-3 的 11.5px 灰，跟类型标签糊在一起） */
.kb-post-cat { color: var(--c-text-2); }
.kb-post-date { font-size: 12px; color: var(--c-text-3); }
.kb-feed-grid { gap: 18px; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); }

/* ⚠ 2026-10-11：原「左栏『按工程分类浏览』每行高度下限 38px」一行已删除
   —— 纯死 CSS（`.kb-cat-side-item` 无模板输出），零行为变化。 */

/* 场景卡：字号不变；桌面固定 3 列（auto-fill 会在窄一点的主区里掉成 2 列，把内容推出首屏） */
@media (min-width: 1181px) {
	.kb-scenes { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
.kb-rank li .t { line-height: 1.45; }

/* ⑧ 全站分类总览（页面底部）：把 15 大类 × 全部子类 + 8 场景 + 标签一次铺开，
   做成"分类索引"而不是"再放几张小卡" —— 分类信息站的价值就在于一眼看到有多少东西。 */
.kb-idx { margin-top: var(--gap); }
/* 底部索引的「轴行」：按场景 / 按行业 /（后续可再加）—— 同一套 chips 样式，避免各写一份 */
.kb-idx-row {
	display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px 10px;
	padding-bottom: 14px; margin-bottom: 14px;
	border-bottom: 1px solid var(--c-border-2);
}
.kb-idx-row-label { flex: none; font-size: 12.5px; font-weight: 600; color: var(--c-text-2); }
.kb-idx-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.kb-idx-chips a {
	display: inline-flex; align-items: baseline; gap: 6px;
	padding: 5px 12px; border-radius: 999px;
	background: var(--c-tile); border: 1px solid var(--c-border-2);
	font-size: 13px; color: var(--c-text); text-decoration: none;
}
.kb-idx-chips a:hover { border-color: var(--c-primary); color: var(--c-primary); }
.kb-idx-chips b { font-size: 12px; font-weight: 400; color: var(--c-text-3); font-variant-numeric: tabular-nums; }
.kb-idx-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(290px, 1fr)); gap: 16px 24px; }
.kb-idx-group { min-width: 0; }
.kb-idx-top {
	display: flex; align-items: baseline; gap: 8px;
	padding-bottom: 5px; margin-bottom: 8px;
	border-bottom: 1px solid var(--c-border-2);
	font-size: 13.5px; font-weight: 600; color: var(--c-text); text-decoration: none;
}
.kb-idx-top:hover { color: var(--c-primary); }
.kb-idx-top span { margin-left: auto; font-size: 11.5px; font-weight: 400; color: var(--c-text-3); font-variant-numeric: tabular-nums; }
.kb-idx-subs { display: flex; flex-wrap: wrap; gap: 5px 10px; }
.kb-idx-subs a { font-size: 12.5px; color: var(--c-text-2); text-decoration: none; }
.kb-idx-subs a:hover { color: var(--c-primary); }
.kb-idx-subs i { font-style: normal; margin-left: 3px; font-size: 11px; color: var(--c-text-3); font-variant-numeric: tabular-nums; }
.kb-idx-tags { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--c-border-2); }
.kb-idx-tags h3 { flex: none; margin: 0 4px 0 0; font-size: 13px; color: var(--c-text); }

/* ⑨ 窄屏回落：间距收紧（字号本就未放大，故无需再降字） */
@media (max-width: 768px) {
	:root { --gap: 16px; }
	.card { padding: 14px; }
	.kb-hero { padding: 24px 16px 20px; }
	.kb-post { padding: 14px 15px; }
	.kb-feed-count { display: block; margin: 2px 0 0; }
	.kb-idx-grid { grid-template-columns: minmax(0, 1fr); }
}

/* ============================================================
   行业轴（M04-IA16 · 2026-10-07）
   第三条轴 ——「给哪个行业干、按谁的标准交付」，与场景轴（顶栏 8 场景）和
   归档轴（15 大类 × 98 子类）并列不重叠。数据源：inc/industries.php。
   三处落位：
     ① 首页「按行业找标准」一行（kb-industry-nav.php）—— 只占一行、贴住最新条目；
     ② 底部索引的「按行业」轴行（kb-cat-index.php）；
     ③ /industries/ 总览 + /industry/{slug}/ 单行业（kb-industries-index.php / kb-industry.php）。
   字号一律沿用站内既有尺度（不复用 IA-14 那套放大字阶，那条已被判定过大而回退）。
   ============================================================ */

/* ① 首页首屏下的一行入口 */
.kb-ind-nav {
	display: flex; flex-wrap: wrap; align-items: center; gap: 9px;
	padding: 7px 13px;
	margin-top: 14px; /* 比 --gap(20px) 更紧：这一行是"入口"，不该和内容块抢节奏 */
	background: var(--c-surface);
	border: 1px solid var(--c-border-2);
	border-radius: var(--radius-card);
	box-shadow: var(--shadow-sm);
}
.kb-ind-label { flex: none; font-size: 13px; font-weight: 600; color: var(--c-text); }
.kb-ind-chips { display: flex; flex-wrap: wrap; gap: 7px; min-width: 0; }
.kb-ind-chips a {
	display: inline-flex; align-items: baseline; gap: 5px;
	padding: 4px 11px; border-radius: 999px;
	background: var(--c-tile); border: 1px solid transparent;
	font-size: 12.5px; color: var(--c-text-2); text-decoration: none;
}
.kb-ind-chips a:hover { border-color: var(--c-primary); color: var(--c-primary); }
.kb-ind-chips b { font-size: 11px; font-weight: 400; color: var(--c-text-3); font-variant-numeric: tabular-nums; }
.kb-ind-more { flex: none; margin-left: auto; font-size: 12.5px; color: var(--c-text-2); text-decoration: none; }
.kb-ind-more:hover { color: var(--c-primary); }
/* 注：`.kb-feed` 自身没有 margin-top（IA-09 拆两段时已交给外层网格 gap），
   故这里**不能**再给「入口行 + 最新条目」之间加间距 —— 加 12px 会把首屏卡片挤出折线（实测）。 */

/* ③-a 行业总览页（.article 版式，与 /about/ 同构） */
.ind-lead { margin: 0 0 10px; font-size: 14.5px; line-height: 1.85; color: var(--c-text); }
.ind-note { margin: 0 0 20px; font-size: 12.5px; line-height: 1.8; color: var(--c-text-3); }
.ind-h2note { margin-left: 10px; font-size: 12.5px; font-weight: 400; color: var(--c-text-3); }
.ind-grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
	gap: 14px;
	margin: 0 0 26px;
}
.ind-card {
	display: flex; flex-direction: column; gap: 7px;
	min-width: 0; padding: 14px 16px;
	background: var(--c-surface);
	border: 1px solid var(--c-border-2);
	border-radius: var(--radius-card);
	box-shadow: var(--shadow-sm);
	text-decoration: none;
	transition: border-color .14s, box-shadow .14s, transform .14s;
}
.ind-card:hover { border-color: var(--c-primary); box-shadow: var(--shadow); transform: translateY(-2px); }
.ind-card-head { display: flex; align-items: baseline; gap: 8px; }
.ind-card-head b { font-size: 14.5px; color: var(--c-text); }
.ind-card-head i { margin-left: auto; font-style: normal; font-size: 11.5px; color: var(--c-text-3); font-variant-numeric: tabular-nums; }
.ind-card-desc { font-size: 13px; line-height: 1.7; color: var(--c-text-2); }
.ind-card-line { font-size: 12px; line-height: 1.75; color: var(--c-text-3); }
.ind-card-line em { font-style: normal; margin-right: 6px; color: var(--c-text-2); }

/* ③-b 单行业页四块卡片 */
.ind-head { margin-bottom: var(--gap); }
.ind-head h1 { margin: 2px 0 8px; font-size: 22px; }
.ind-sec { margin-bottom: var(--gap); }
.ind-sec .kb-sec-h { margin-bottom: 12px; }
.ind-std { list-style: none; margin: 0; padding: 0; }
.ind-std li { padding: 10px 0; border-bottom: 1px dashed var(--c-border-2); }
.ind-std li:last-child { border-bottom: 0; padding-bottom: 0; }
.ind-std b { display: block; font-size: 13.5px; color: var(--c-text); }
.ind-std span { display: block; margin-top: 4px; font-size: 12.5px; line-height: 1.8; color: var(--c-text-2); }
.ind-sys { display: flex; flex-wrap: wrap; gap: 8px; list-style: none; margin: 0; padding: 0; }
.ind-sys li { padding: 5px 12px; border-radius: 999px; background: var(--c-tile); font-size: 12.5px; color: var(--c-text-2); }
.ind-brands { list-style: none; margin: 0; padding: 0; }
.ind-brands li { display: flex; align-items: baseline; gap: 10px; padding: 5px 0; }
.ind-brands b { flex: none; min-width: 92px; font-size: 13.5px; color: var(--c-text); }
.ind-brands span { font-size: 12.5px; color: var(--c-text-3); }
.ind-empty { margin: 0; font-size: 13.5px; line-height: 1.9; color: var(--c-text-2); }
.ind-rules { margin: 0 0 16px; padding-left: 20px; }
.ind-rules li { margin-bottom: 8px; font-size: 13.5px; line-height: 1.85; color: var(--c-text-2); }
.ind-rules b { color: var(--c-text); }
.ind-foot { margin: 6px 0 0; font-size: 12px; line-height: 1.85; color: var(--c-text-3); }
.kb-posts { display: flex; flex-direction: column; gap: 12px; }

@media (max-width: 768px) {
	.kb-ind-more { margin-left: 0; }
	.ind-head h1 { font-size: 19px; }
	.ind-lead { font-size: 14px; }
}

/* ============================================================
   顶栏「行业标准」三级悬浮菜单（M04-IA17）
   一级：18 个行业列表（带条数）  二级：右侧浮层（业态 / 品牌·甲方 / 标准依据 + 进入行业页）
   交互：`:hover` 管鼠标、`:focus-within` 管键盘，两者都**不需要 JS**；
        JS 只补三件必需的事：Esc 收起、aria-expanded 同步、窄屏点按展开（assets/main.js）。
   注：链接颜色必须用 `.topnav .xxx` 前缀 —— `.topnav a { color: var(--c-text-2) }` 的
   特异性是 (0,0,1,1)，普通类名 (0,0,1,0) 压不住它（踩过一次）。
   ============================================================ */
.nav-drop { position: relative; display: inline-flex; align-items: center; }
.nav-drop-trigger { display: inline-flex; align-items: center; gap: 4px; }
.nav-caret { font-size: 10px; opacity: .7; transition: transform .15s ease; }
.nav-drop:hover .nav-caret,
.nav-drop:focus-within .nav-caret { transform: rotate(180deg); }

.nav-drop-panel {
	display: none;
	position: absolute;
	top: calc(100% + 10px);
	left: -12px;
	z-index: 60;
	width: 264px;
	/* ⚠ 这里**不能**加 `max-height + overflow-y: auto`：面板一旦成为滚动容器，
	   右侧的二级浮层（absolute 子元素）会被裁掉 —— 实测踩到过，而且
	   Playwright 的 `isVisible()` 不检测滚动裁剪，探针会给出**假阳性**（只能靠看图发现）。 */
	overflow: visible;
	padding: 8px;
	background: var(--c-surface);
	border: 1px solid var(--c-border-2);
	border-radius: var(--radius-card);
	box-shadow: var(--shadow-lg);
}
/* 触发器与面板之间那 10px 空隙必须桥接：否则鼠标下移途中离开触发器，菜单立刻消失 */
.nav-drop-panel::before { content: ''; position: absolute; left: 0; right: 0; top: -12px; height: 12px; }
.nav-drop:hover .nav-drop-panel,
.nav-drop:focus-within .nav-drop-panel,
.nav-drop.is-open .nav-drop-panel { display: block; }
/* Esc 之后：鼠标可能还停在菜单上，`:hover` 会继续让它显示 —— 故需要一个"已按 Esc"的状态类
   （JS 在 mouseleave / 再次 mouseenter 时清掉），否则键盘用户按下 Esc 会看到菜单赖着不关。 */
.nav-drop.is-escaped .nav-drop-panel,
.nav-drop.is-escaped .drop-flyout { display: none !important; }

.drop-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; padding: 6px 8px 8px; margin-bottom: 6px; border-bottom: 1px solid var(--c-border-2); }
.drop-head-title { font-size: 13px; font-weight: 600; color: var(--c-text); }
.topnav .drop-head-more { font-size: 12px; }
.drop-list { list-style: none; margin: 0; padding: 0; }
.drop-item { position: relative; }
.topnav .drop-item-link { display: flex; align-items: center; gap: 8px; padding: 7px 8px; border-radius: 8px; color: var(--c-text); font-size: 13.5px; }
.topnav .drop-item-link:hover,
.drop-item:hover > .drop-item-link,
.drop-item:focus-within > .drop-item-link { background: var(--c-tile); color: var(--c-primary); }
.drop-item-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.drop-item-cnt { flex: none; font-size: 11.5px; color: var(--c-text-3); font-variant-numeric: tabular-nums; }
.drop-item-caret { flex: none; font-size: 12px; color: var(--c-text-3); }

/* 二级浮层 */
.drop-flyout {
	display: none;
	position: absolute;
	left: calc(100% + 6px);
	top: -8px;
	z-index: 61;
	width: 340px;
	padding: 12px 14px;
	background: var(--c-surface);
	border: 1px solid var(--c-border-2);
	border-radius: var(--radius-card);
	box-shadow: var(--shadow-lg);
}
.drop-item:hover > .drop-flyout,
.drop-item:focus-within > .drop-flyout { display: block; }
/* 靠下的行业（第 11 项起）改成底对齐，否则浮层会掉出视口下沿 */
.drop-item:nth-child(n+11) > .drop-flyout { top: auto; bottom: -8px; }
/* 与一级面板之间的 6px 空隙同样桥接 */
.drop-flyout::before { content: ''; position: absolute; left: -8px; top: 0; bottom: 0; width: 8px; }
.flyout-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; padding-bottom: 8px; margin-bottom: 8px; border-bottom: 1px solid var(--c-border-2); }
.flyout-head b { font-size: 14px; color: var(--c-text); }
.topnav .flyout-head a { font-size: 12px; }
.flyout-block { margin-bottom: 10px; }
.flyout-block:last-child { margin-bottom: 0; }
.flyout-label { display: block; margin-bottom: 4px; font-size: 11.5px; color: var(--c-text-3); }
.flyout-text { margin: 0; font-size: 12.5px; line-height: 1.7; color: var(--c-text-2); }
.flyout-brands { list-style: none; margin: 0; padding: 0; }
.flyout-brands li { display: flex; align-items: baseline; gap: 8px; padding: 3px 0; }
.flyout-brands b { flex: none; font-size: 12.5px; font-weight: 600; color: var(--c-text); }
.flyout-brands span { min-width: 0; font-size: 12px; color: var(--c-text-3); }

/* ============================================================
   「按行业」带（M04-IA18）
   位置：`</header>` 之后的独立条带 —— **不吸顶**，滚动即让位（吸顶区保持 110px 不变，
   不牺牲阅读空间）。只在桌面显示；≤768 收进汉堡菜单（那里已有「行业标准」入口）。
   ============================================================ */
.ind-bar {
	background: var(--c-bg);
	border-bottom: 1px solid var(--c-border-2);
}
.ind-bar-inner {
	display: flex; align-items: center; gap: 10px;
	padding-top: 6px; padding-bottom: 6px;
}
.ind-bar-label { flex: none; font-size: 12.5px; font-weight: 600; color: var(--c-text-2); }
.ind-bar-chips { display: flex; flex-wrap: nowrap; gap: 7px; min-width: 0; overflow-x: auto; }
.ind-bar-chips::-webkit-scrollbar { height: 0; }
.ind-bar-chips a {
	display: inline-flex; align-items: baseline; gap: 5px; flex: none;
	padding: 4px 11px; border-radius: 999px;
	background: var(--c-surface); border: 1px solid var(--c-border-2);
	font-size: 12.5px; color: var(--c-text-2); text-decoration: none;
}
.ind-bar-chips a:hover { border-color: var(--c-primary); color: var(--c-primary); }
.ind-bar-chips b { font-size: 11px; font-weight: 400; color: var(--c-text-3); font-variant-numeric: tabular-nums; }
.ind-bar-more { flex: none; margin-left: auto; font-size: 12.5px; color: var(--c-text-2); text-decoration: none; }
.ind-bar-more:hover { color: var(--c-primary); }

/* 网站地图页（/sitemap/）：分区跳转 + 标签云 */
.sm-jump { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 22px; }
.sm-jump a {
	padding: 5px 12px; border-radius: 999px;
	background: var(--c-tile); border: 1px solid var(--c-border-2);
	font-size: 12.5px; color: var(--c-text-2); text-decoration: none;
}
.sm-jump a:hover { border-color: var(--c-primary); color: var(--c-primary); }
.sm-tags { margin-bottom: 20px; }
.kb-sitemap h2 { scroll-margin-top: calc(var(--sticky-top) + 8px); }

@media (max-width: 768px) {
	/* 手机上这条带会把首屏吃掉一块，且那里本就有汉堡菜单入口 —— 直接不显示。 */
	.ind-bar { display: none; }
}

/* 矮屏（笔记本 1366×768 这类）把 18 行压实，保证面板整体落在视口内 ——
   用"压行距"而不是"面板滚动"，理由见上面关于浮层被裁剪的注释。 */
@media (max-height: 780px) {
	.topnav .drop-item-link { padding: 5px 8px; }
	.drop-head { padding: 4px 8px 6px; margin-bottom: 4px; }
	.flyout-block { margin-bottom: 8px; }
}

/* 窄屏（≤1180）：不做浮层，改"点按展开 18 个行业链接"。
   ⚠ 这一带（769~1180）顶栏**还没**收成汉堡菜单（汉堡在 ≤768 才出现），
   若沿用桌面那套"悬停即展开"，面板会以内联块把整行导航顶开 —— 实测很难看。
   故这一带只认"点按展开"（`.is-open`，由 JS 拦首击）；键盘 `:focus-within` 仍可展开。 */
@media (max-width: 1180px) {
	.nav-drop { display: block; width: 100%; }
	.nav-drop:hover:not(.is-open) .nav-drop-panel { display: none; }
	.nav-drop-panel { position: static; width: auto; max-height: none; overflow: visible; padding: 4px 0 6px; border: 0; box-shadow: none; }
	.nav-drop-panel::before,
	.drop-flyout { display: none !important; }
	.drop-head { padding: 4px 0 8px; }
	.topnav .drop-item-link { padding: 8px 0; }
	.topnav .drop-item-link:hover,
	.drop-item:hover > .drop-item-link { background: transparent; }
}

/* ============================================================
   首页信息架构重排（M04-IA15 · 2026-10-07）
   —— Hero 与场景带改**通栏**，「最新条目」搬进中栏与左栏并排。

   为什么要动结构（1440px 实测，改前）：
     header 110 + 场景条 45 + 行业带 45 → 第 1 段 `.kb-top` 从 175 开始、高 **737**。
     这 737 不是中栏（Hero 306 + 场景区 370 = 696）撑的，而是**左栏 15 大类列表的自然高**
     （列表 570 + 头 45 + 脚 62）—— 于是内容流被推到 932px，首屏 1000px 里只露出
     第一行卡片的上边缘；1000~1180px 更差：左栏变折叠面板（129px）后，
     「最新条目」落在 1080~1191px，**首屏零内容**。

   重排后：Hero（通栏报头）→ 场景带（通栏）→ 三栏（左栏目录 · 中栏内容流 · 右栏）。
   左栏与内容流并排 ⇒ 它不再决定内容起点；中栏 716px 排 2 列大卡（349px、摘要 3 行）。
   选择器全部带 `.kb-hero-band` / `.kb-scene-band` / `.kb-top` 前缀，只作用于首页新结构。
   ============================================================ */

/* ① 三段顺序显式化：**场景带排在内容流之后**。
   理由：首屏高度是零和的。场景带（8 卡 4 列 × 2 行 ≈ 324px）留在上面，
   内容流就只能从 907px 开始（首屏只露出第一行卡片的上边缘）；把它排到内容流之后，
   内容流起点降到 ~465px，首屏可见 2 行半卡片。
   而「按场景」这套入口并没有丢：顶栏 `.cat-bar` 场景条在**每一个页面**都有，
   内容流里 12 张卡片的类型色条与分类名也承担了同样的导航职责。

   ⚠ 2026-10-12 **已删除本块的 order 声明**（TK-20261011-UI-001 · 补做 B）。
   原因：CSS 同特异性下后写者赢，文件末尾 3815-3819 的五段 order 才是唯一生效点，
   本块与 3229 那块都是**死代码**。保留会造成「同一批类名出现 3 套 order」的
   假象，后人改错地方却看不到任何效果 —— 门禁 8i「order 无重复声明」正是查这个。
   现两处order 已合并到末尾唯一一处，本段仅保留上述设计理由。 */

/* ② Hero：通栏报头，高度压到 ~270px（改前 306，且中栏只有 716px 宽）。
   内容仍居中、搜索框 620 → 660；标题 38px/1.15 行高（38 → 实测 h1 高 71px 是继承的
   大行高造成的，这里显式收口）。 */
.kb-hero-band > .kb-hero { padding: 26px 28px 22px; }
.kb-hero-band .kb-hero-title { line-height: 1.15; margin: 0 0 8px; }
.kb-hero-band .kb-search { max-width: 660px; }
.kb-hero-band .kb-hot { margin-top: 12px; }
.kb-hero-band .kb-hero-meta { margin-top: 10px; }
.kb-hero-band .kb-hero-brand { margin: 0; }
@media (min-width: 1181px) {
	.kb-hero-band .kb-hero-title { font-size: 40px; }
	.kb-hero-band .kb-hero-sub { font-size: 17px; margin-bottom: 12px; }
}
/* 引导语与热门词同行（IA-15 合并）：小一号、更浅，读作"补充说明"，并去掉胶囊底（它不是检索词） */
.kb-hot-hint { margin-left: 4px; color: var(--c-text-3); }
.kb-hot-hint a { padding: 0; background: none; border: 0; color: var(--c-primary); }
.kb-hot-hint a:hover { text-decoration: underline; }

/* ③ 场景带：通栏 4 列 × 2 行 —— 每张从 219px 涨到 ~313px，描述不再被挤成两行碎读 */
@media (min-width: 900px) {
	.kb-scene-band .kb-scenes { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px; }
	.kb-scene-band .kb-sec-h { font-size: 17px; margin-bottom: 12px; }
	.kb-scene-band .kb-scene { padding: 14px 16px; }
	.kb-scene-band .kb-scene-name { font-size: 15px; }
	.kb-scene-band .kb-scene-desc { font-size: 13px; }
}

/* ⚠ 2026-10-11：原「④ 左栏：自然高 + sticky」（`@media ≥1181` +
   `.kb-top > .kb-cat-side { align-self: start }`）已删除 —— 纯死 CSS，
   零行为变化（`.col-right` 的 `align-self: start` 在 1934 行另有定义，仍在生效）。 */

/* ⑤ 内容流：中栏 2 列大卡（~349px）。通栏时代是 4 列小卡（309px），信息量更低且把内容推到折下。 */
.kb-top .kb-feed-grid { grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 14px; }
.kb-top .kb-post { padding: 16px 18px; }
.kb-top .kb-post-ex { -webkit-line-clamp: 3; min-height: 68px; } /* 13.5px × 1.68 × 3 行 */

/* ⚠ 2026-10-11：原「⑥ 中屏（≤1180）左栏折叠面板压成一行」整块（13 行，
   全部为 `.kb-cat-side*`）已删除 —— 纯死 CSS，零行为变化。 */

/* ⑦ 手机（≤768）：Hero 收紧
   ⚠ 原此块内的 `.kb-cat-side-foot { display: none }` 已删除（纯死 CSS）。
   ⚠ 本块的 Hero 两行现已被文件**最末**的 B4 回落段（≤768）覆盖 ——
   那是有意的：B4 写在最末尾才能压住前面所有轮次追加的无条件规则。 */
@media (max-width: 768px) {
	.kb-hero-band > .kb-hero { padding: 24px 16px 20px; }
	.kb-hero-band .kb-hero-title { font-size: 28px; }
}

/* ============================================================
   首页 IA 重排 v2（M04-IA16 · 2026-10-07）
   —— 去掉左侧分类竖栏，分类改**通栏横条**；主体收成**两栏**。

   为什么（同类站检索，2026-10-07）：
     千家网 / 安防知识网 / 弱电智能网（定位与本站几乎一致）/ 电子发烧友
     —— 4 家内容型同行**没有一家**在首页用左侧竖排分类目录；
     唯一用左栏的是弱电行业网，那是 B2B 贸易平台（左栏 = 类目树 + 商品列表）。
     它们把分类放进顶部下拉（Mega Menu）或横向条，浏览维度交给区块内 Tab。

   与 IA-15 的关系：IA-15 已把内容流提到首屏（932 → 483px），但左栏仍是竖排 15 类 ——
   自然高 737px 与中栏参差（底边 669 / 1244 / 737），页面还多出"第二个结尾"（场景带）。
   本层把结构收敛为：
     Hero（通栏）→ 分类条（通栏）→ 两栏（内容流 · 右栏）→ 场景带（通栏）
   纵向底边从 3 条降到 2 条，首屏信息块从 6 降到 4（其中导航 3 → 2）。
   ============================================================ */

/* ① 四段顺序（视觉顺序在这里声明；DOM 顺序 = Hero → 分类条 → 两栏 → 场景带）

   ⚠ 2026-10-12 **已删除本块的 order 声明**（TK-20261011-UI-001 · 补做 B）。
   同上：文件末尾 3815-3819 才是唯一生效点，此处为死代码（门禁 8i）。 */

/* ② 主体两栏：`.kb-top` 从三栏收成「内容流 + 右栏」。
   ⚠ 必须限定 ≥993px —— ≤992/≤768 的单栏规则写在文件前段，本层在文件末尾，
   不加媒体查询就会因"更靠后"反过来盖掉它们（这类顺序陷阱本项目踩过一次）。 */
@media (min-width: 993px) {
	.kb-top { grid-template-columns: minmax(0, 1fr) 300px; align-items: start; }
}

/* ③ 分类条（15 大类 chips + 悬浮二级面板） */
.kb-cat-bar {
	background: var(--c-surface);
	border: 1px solid var(--c-border);
	border-radius: var(--radius-card);
}
.kb-cat-bar-inner { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 10px; padding: 12px 16px; }
.kb-cat-bar-item { position: relative; }
.kb-cat-bar-chip {
	display: inline-flex; align-items: center; gap: 6px;
	padding: 5px 12px; font-size: 13.5px; color: var(--c-text-2);
	background: var(--c-bg); border: 1px solid var(--c-border-2); border-radius: 999px;
}
.kb-cat-bar-cnt { font-size: 11.5px; color: var(--c-text-3); font-variant-numeric: tabular-nums; }
.kb-cat-bar-caret { font-size: 9px; color: var(--c-text-3); }
.kb-cat-bar-item:hover > .kb-cat-bar-chip,
.kb-cat-bar-item:focus-within > .kb-cat-bar-chip { color: var(--c-primary); border-color: var(--c-primary); }
.kb-cat-bar-item:hover > .kb-cat-bar-chip .kb-cat-bar-caret,
.kb-cat-bar-item:focus-within > .kb-cat-bar-chip .kb-cat-bar-caret { color: var(--c-primary); }
/* 二级浮层：与顶栏「行业标准」三级菜单同构（`:hover` 管鼠标、`:focus-within` 管键盘） */
.kb-cat-bar-panel {
	display: none; position: absolute; left: 0; top: calc(100% + 6px); z-index: 30;
	width: min(460px, calc(100vw - 48px));
	padding: 12px 14px; gap: 8px 10px; flex-wrap: wrap;
	background: var(--c-surface); border: 1px solid var(--c-border);
	border-radius: var(--radius-card); box-shadow: var(--shadow-lg);
}
.kb-cat-bar-item:hover > .kb-cat-bar-panel,
.kb-cat-bar-item:focus-within > .kb-cat-bar-panel { display: flex; }
.kb-cat-bar-panel a {
	font-size: 13px; color: var(--c-text-2);
	padding: 3px 10px; border-radius: 14px; background: var(--c-bg); white-space: nowrap;
}
.kb-cat-bar-panel a:hover { background: var(--c-primary); color: var(--c-on-primary); }
.kb-cat-bar-panel .kb-cat-bar-all { background: var(--c-primary-soft); color: var(--c-primary); }
.kb-cat-bar-more { margin-left: auto; font-size: 13px; color: var(--c-primary); }
/* 触屏（≤1180px）：没有 hover，浮层不适用。chips 仍是链接，
   完整 15+98 树由条末的「全部类目 →」(/categories/) 承担 —— 子类不是死路，只多一跳。 */
@media (max-width: 1180px) {
	.kb-cat-bar-panel { display: none !important; }
	.kb-cat-bar-more { margin-left: 0; }
}
@media (max-width: 768px) {
	.kb-cat-bar-inner { gap: 6px 8px; padding: 10px 12px; }
	.kb-cat-bar-chip { padding: 4px 10px; font-size: 13px; }
}

/* ④ 顶栏「按行业 ▾」下拉（原 `.ind-bar` 独立一行，IA-16 起并入场景条同一排，省 45px） */
.cat-drop { position: relative; display: inline-flex; }
/* 触发词外观沿用 `.cat-chips a`（它就是该容器里的一个链接），
   左侧加一条分隔线，读作"另一个维度"而不是第 9 个场景 chip。 */
.cat-bar .cat-drop-trigger { border-left: 1px solid var(--c-border); padding-left: 14px; cursor: pointer; }
.cat-drop-caret { font-size: 9px; }
.cat-drop-panel {
	display: none; position: absolute; right: 0; top: calc(100% + 8px); z-index: 40;
	width: min(520px, calc(100vw - 32px));
	padding: 14px 16px; gap: 8px 10px; flex-wrap: wrap;
	background: var(--c-surface); border: 1px solid var(--c-border);
	border-radius: var(--radius-card); box-shadow: var(--shadow-lg);
}
.cat-drop:hover > .cat-drop-panel,
.cat-drop:focus-within > .cat-drop-panel,
.cat-drop.is-open > .cat-drop-panel { display: flex; }
/* 桌面端菜单靠 `:hover` 显示，Esc 关不掉（鼠标还停在上面）→ 用 is-escaped 强制隐藏，
   鼠标离开或再次移入时由 JS 清掉。 */
.cat-drop.is-escaped > .cat-drop-panel { display: none; }
.cat-drop-panel a {
	display: inline-flex; align-items: center; gap: 5px;
	font-size: 13px; color: var(--c-text-2);
	padding: 4px 11px; border-radius: 14px; background: var(--c-bg); white-space: nowrap;
}
.cat-drop-panel a b { font-size: 11.5px; font-weight: 400; color: var(--c-text-3); font-variant-numeric: tabular-nums; }
.cat-drop-panel a:hover { background: var(--c-primary); color: var(--c-on-primary); }
.cat-drop-panel a:hover b { color: var(--c-on-primary); }
.cat-drop-panel .cat-drop-more { background: var(--c-primary-soft); color: var(--c-primary); }
/* 窄屏：与顶栏「行业标准」下拉同一策略 —— 不做浮层，改为就地展开（由 JS 的 is-open 驱动） */
@media (max-width: 1180px) {
	.cat-drop { display: inline-flex; }
	.cat-drop:hover > .cat-drop-panel,
	.cat-drop:focus-within > .cat-drop-panel { display: none; }
	.cat-drop.is-open > .cat-drop-panel { display: flex; }
	.cat-drop-panel {
		position: absolute; left: 0; right: auto; top: calc(100% + 6px);
		width: min(420px, calc(100vw - 40px));
	}
}

/* ⑤ 内容流筛选按钮组（最新 / 方案 / 案例 / 标准） */
.kb-feed-tabs { display: flex; flex-wrap: wrap; gap: 8px; margin-left: auto; }
.kb-feed-tab {
	padding: 4px 14px; font-family: var(--font); font-size: 13.5px;
	color: var(--c-text-2); background: var(--c-surface);
	border: 1px solid var(--c-border); border-radius: 999px; cursor: pointer;
}
.kb-feed-tab:hover { color: var(--c-primary); border-color: var(--c-primary); }
.kb-feed-tab.is-on { font-weight: 600; color: var(--c-on-primary); background: var(--c-primary); border-color: var(--c-primary); }
/* ⚠ `.kb-feed-grid` 自带 `display: grid`，会盖掉浏览器对 `[hidden]` 的 `display: none` ——
   必须显式声明，否则"隐藏"的 Tab 面板会照旧铺在页面上（切换看起来像没生效）。 */
.kb-feed-grid[hidden] { display: none; }

/* ============================================================
   首页视觉刷新 v1（M04-IA17 · 2026-10-07）—— 方向 A「清爽现代」
   ============================================================

   用户反馈"首页还是很丑"，并点名四块：**分类条 / 文章卡片 / 右栏 / 整体**。
   此前三轮（IA-14/15/16）改的都是"结构"（东西放哪），这轮只改**视觉语言**：

     ① 报头：淡绿渐变 + 网格纹 + 居中 → **白底 + 左对齐大标题 + 搜索框移到右侧同一行**。
        （大面积极淡色是最没底气的填充；居中 4 行内容左右各空 200px 看着空。）
     ② 分类条：15 个灰胶囊（同权重/同灰度/带边框）→ **一行"索引式"文字链接**：
        无边框、无底、无圆角，细竖线分隔，计数降为 11.5px 小灰字。
        胶囊墙的问题不是信息多，是**15 个元素完全同权重**，读起来是标签云而非导航。
     ③ 卡片：左侧 3px 彩色条 + 彩色胶囊 + 分类文字（同一件事说三遍）→
        **去掉左侧色条与所有边框**，改"标题 16.5px 半粗 + 1 行摘要 + 1 行元信息"，
        类型只保留颜色（作为文字色，不再套胶囊底），卡片用极浅阴影浮起。
     ④ 右栏：三块独立细边框盒子 → **一段式**（细线分隔）；高频故障 6 → 4 条、单行省略。
     ⑤ 全局：`.card` 去 1px 边框（改浅阴影）、圆角 14 → 12、段间距 20 → 24，
        标题统一近黑 `--c-ink`（正文仍是 --c-text，保证对比度不降）。

   为什么这轮能见效：丑来自"装饰比信息多"（边框/胶囊/色条/渐变层层叠加）+ 层级扁平
   （通篇 12~13px 灰字）。本层做的是**减法**：删掉装饰，把层级交给字号与留白。
   ============================================================ */
:root {
	/* 标题用近黑：正文仍是 --c-text（对比度不变），标题与正文的层级靠色差 + 字重拉开 */
	--c-ink: light-dark(#0E1116, #F2F4F7);
	/* S5（2026-10-11）：12 → 8，并**取消**IA-18/IA-19 在首页对 `border-radius: 6px` 的
	   六处硬编码（见 3658 附近）—— 圆角重新由这一个令牌单一控制。
	   取 8px 而非 IA-18 抄的 51CTO 4px：本站卡片带 156×102 封面图，
	   4px 在有图卡片上显廉价；8px 是「利落」与「不硬」的平衡点。 */
	--radius-card: 8px;
	--gap: 24px;         /* 20 → 24：段与段之间给足留白 */
	--shadow-card: 0 1px 2px var(--c-shadow-sm), 0 6px 20px var(--c-shadow-sm);
	--shadow-card-hover: 0 2px 6px var(--c-shadow-sm), 0 14px 32px var(--c-shadow);
	/* ── S1（2026-10-11）字阶：1.25 大三度（major third），基准 15px ──────────
	   为什么需要：改版前全站451 处 font-size、30 个不同 px 值，其中
   12.5 / 13.5 / 14.5 / 15.5 四档只差 0.5~1px，**全部落在同一个视觉可辨阈值内**
   —— 层级只能靠字重与颜色区分，这就是「信息密」的字号学成因（不是字小，
   是字阶没有倍率关系）。现收敛为 8 档，**不允许出现令牌外的字号**。

   ⚠ 落地纪律：令牌是「新档位」，不是「全量替换」。本批只套用到首页
     （摘要/标题/元信息），`.article-body` 的 16px 保持不动 —— 正文阅读行长
     不受视觉改版影响，回归面最小。 */
	--fs-display: 48px;   /* Hero 站名（全站仅此一处） */
	--fs-h1: 30px;      /* 文章页 h1 / 焦点大卡标题 */
	--fs-h2: 22px;      /* 区块标题 */
	--fs-h3: 18px;      /* 卡片组标题 / 场景区标题 */
	--fs-body-lg: 17px; /* Hero slogan / 榜单标题 */
	--fs-body: 15px;    /* 正文、卡片摘要 */
	--fs-body-sm: 13.5px; /* 元信息、分类名、日期 */
	--fs-caption: 12px; /* 计数、注脚、英文小字 */
	--lh-tight: 1.15;   /* display / h1 */
	--lh-snug: 1.4;     /* h2 / h3 / 卡片标题 */
	/* ⚠ --lh-normal 不新增：body 现有 line-height: 1.7（约 620 行）沿用不动，
	   避免影响全站正文与所有既有组件的行高计算。 */
}

/* ② 全站卡片：去 1px 边框，改极浅阴影（页面底色是浅灰，白卡自然浮起）。
   边框色用 light-dark：浅色下透明、深色下保留（深色里阴影读不出来，靠细线定界）。
   不支持 light-dark() 的浏览器会整条丢掉该声明 → 退回上面那层 `1px solid var(--c-border-2)` ✓ */
.card {
	border: 1px solid light-dark(transparent, var(--c-border-2));
	box-shadow: var(--shadow-card);
}

/* ③ 报头：白底 + 左对齐 + 搜索框搬到右侧同一行

   ⚠ S3（2026-10-11）「压场感」改造：报头从 ~210px 加厚到目标 ~310px。
   压场感的来源是**厚度 + 字号**，不是新装饰 —— 本层**不加**渐变/插画/光晕，
   保持与 IA-17 起的「白底左对齐 + 克制」基调兼容（总控裁决采纳方案 A）。

   零和关系（重要）：Hero 增高与焦点大卡压低是**成对**的 —— 焦点大卡
   380 → 340（S4），首屏净增仅 +20px，不会把焦点大卡整体推出首屏。 */
.kb-hero {
	background: var(--c-surface);
	padding: 44px 48px 36px;
	text-align: left;
}
.kb-hero::after { display: none; } /* 去掉底部网格纹装饰层 */
.kb-hero-band .kb-hot,
.kb-hero-band .kb-hero-meta { justify-content: flex-start; }
.kb-hero-band .kb-hero-title { color: var(--c-ink); letter-spacing: -.01em; }
@media (min-width: 901px) {
	.kb-hero-band > .kb-hero {
		display: grid;
		/* 右列上限 560 → 520：给左列标题更多宽度，48px 站名不顶到搜索框 */
		grid-template-columns: minmax(0, 1fr) minmax(320px, 520px);
		column-gap: 48px;
		row-gap: 12px;
		align-items: center;
	}
	.kb-hero-band .kb-hero-title {
		grid-area: 1 / 1 / 2 / 2;
		font-size: var(--fs-display); line-height: var(--lh-tight); margin: 0;
	}
	.kb-hero-band .kb-hero-sub { grid-area: 2 / 1 / 3 / 2; font-size: var(--fs-body-lg); margin: 0; }
	.kb-hero-band .kb-search { grid-area: 1 / 2 / 3 / 3; max-width: none; margin: 0; }
	/* 热门词与统计行：与标题区之间拉开（12 → 16），否则四行元素贴在一条带上，
	   报头虽高却读不出「报头」的层次 */
	.kb-hero-band .kb-hot { grid-column: 1 / -1; margin-top: 16px; }
	.kb-hero-band .kb-hero-meta { grid-column: 1 / -1; margin-top: 4px; }
}

/* ④ 分类条：胶囊墙 → 索引式文字链接（细竖线分隔） */
.kb-cat-bar {
	background: none;
	border: 0;
	border-top: 1px solid var(--c-border);
	border-bottom: 1px solid var(--c-border);
	border-radius: 0;
}
.kb-cat-bar-inner { display: block; padding: 13px 0; line-height: 1.55; }
.kb-cat-bar-item { display: inline; position: relative; }
.kb-cat-bar-chip {
	display: inline; padding: 0; border: 0; border-radius: 0; background: none;
	font-size: 13.5px; color: var(--c-text-2);
}
.kb-cat-bar-chip:hover { color: var(--c-primary); text-decoration: underline; }
.kb-cat-bar-cnt { margin-left: 4px; font-size: 11.5px; color: var(--c-text-3); }
.kb-cat-bar-caret { margin-left: 3px; font-size: 9px; color: var(--c-text-3); }
/* 细竖线分隔：用伪元素而不是 `·`，因为竖线不参与文字基线、不会让行高起伏 */
.kb-cat-bar-item::after {
	content: ''; display: inline-block;
	width: 1px; height: 11px; margin: 0 11px;
	vertical-align: -1px; background: var(--c-border);
}
.kb-cat-bar-more { display: inline; margin-left: 4px; font-size: 13px; color: var(--c-primary); }
/* 浮层面板：白卡 + 阴影（无边框），内层也是文字链接而非胶囊 */
.kb-cat-bar-panel {
	border: 1px solid light-dark(transparent, var(--c-border));
	box-shadow: var(--shadow-lg);
	background: var(--c-surface);
	line-height: 1.9;
}
.kb-cat-bar-panel a { padding: 0; border-radius: 0; background: none; font-size: 13px; color: var(--c-text-2); }
.kb-cat-bar-panel a:hover { background: none; color: var(--c-primary); text-decoration: underline; }
.kb-cat-bar-panel .kb-cat-bar-all { background: none; color: var(--c-primary); }

/* ⑤ 内容流：卡片做减法 + Tab 改下划线（不再是一排胶囊） */
.kb-top .kb-feed-grid { gap: 16px; }
.kb-top .kb-post {
	gap: 7px;
	padding: 17px 19px;
	border: 0;
	border-left: 0;
	border-radius: 12px;
	box-shadow: var(--shadow-card);
}
.kb-top .kb-post:hover { box-shadow: var(--shadow-card-hover); transform: translateY(-1px); }
.kb-top .kb-post-title {
	font-size: 16.5px; font-weight: 600; line-height: 1.42;
	color: var(--c-ink); min-height: 47px;
}
.kb-top .kb-post-ex { font-size: 13.5px; line-height: 1.6; -webkit-line-clamp: 1; min-height: 22px; }
/* 类型只留颜色：去掉胶囊底与描边（同一件事此前说了三遍：左色条 + 胶囊 + 分类文字）

   ⚠ S1（2026-10-11）：元信息三件套 12.5px → 13.5px（--fs-body-sm）。
     它们与摘要同处一张卡，12.5 与摘要 15px 相差 2.5px 尚可，但三者内部
     彼此只差 0.5px（12.5/13.5/14.5）——收敛到同一档后才读得出「这是一组元信息」。 */
.kb-top .kb-post-type { padding: 0; border: 0; background: none; font-size: var(--fs-body-sm); font-weight: 600; }
.kb-top .kb-post-cat { font-size: var(--fs-body-sm); color: var(--c-text-3); }
.kb-top .kb-post-date { font-size: var(--fs-body-sm); color: var(--c-text-3); }
.kb-top .kb-feed-head h2 { font-size: var(--fs-h3); font-weight: 600; color: var(--c-ink); }
.kb-feed-tabs { gap: 18px; }
.kb-feed-tab {
	padding: 0 0 4px; border: 0; border-bottom: 2px solid transparent; border-radius: 0;
	background: none; font-size: 14px; color: var(--c-text-2);
}
.kb-feed-tab:hover { color: var(--c-primary); border-bottom-color: transparent; }
.kb-feed-tab.is-on {
	background: none; color: var(--c-ink); font-weight: 600;
	border-bottom-color: var(--c-primary);
}

/* ⑥ 右栏：三块细边框盒子 → 一段式（细线分隔） */
.kb-top > .col-right .card {
	background: none; border: 0; box-shadow: none; border-radius: 0;
	padding: 0; margin-bottom: 0;
}
.kb-top > .col-right .card + .card { margin-top: 20px; padding-top: 20px; border-top: 1px solid var(--c-border); }
.kb-top > .col-right .kb-sec-h {
	margin-bottom: 8px; font-size: 13px; font-weight: 600;
	color: var(--c-text-3); letter-spacing: .04em;
}
.kb-top > .col-right .notice { font-size: 13.5px; line-height: 1.7; }
.kb-top > .col-right .kb-rank li { padding: 5px 0; border-bottom: 0; font-size: 14px; }
.kb-top > .col-right .kb-rank li .t {
	display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.kb-top > .col-right .tag-cloud { gap: 6px 14px; }
.kb-top > .col-right .tag-cloud a { padding: 0; background: none; font-size: 13px; color: var(--c-text-2); }
.kb-top > .col-right .tag-cloud a:hover { background: none; color: var(--c-primary); text-decoration: underline; }

/* ⑦ 场景带：内层卡片去边框，改"图标 + 名称 + 一行说明"的轻网格 */
.kb-scene-band .kb-scene-card-wrap { border: 1px solid light-dark(transparent, var(--c-border-2)); box-shadow: var(--shadow-card); }
.kb-scene-band .kb-scene { border: 0; background: none; padding: 12px 6px; }
.kb-scene-band .kb-scene-name { font-size: 15px; font-weight: 600; color: var(--c-ink); }
.kb-scene-band .kb-scene-desc { font-size: 12.5px; line-height: 1.5; color: var(--c-text-3); -webkit-line-clamp: 1; }

/* ⑧ 窄屏回落：报头回到纵向堆叠（左对齐不变） */
@media (max-width: 900px) {
	.kb-hero { padding: 22px 18px 20px; }
	.kb-hero-band .kb-hero-title { font-size: 30px; }
	.kb-cat-bar-inner { padding: 11px 0; }
}
@media (max-width: 768px) {
	:root { --gap: 18px; }
	.kb-top .kb-post { padding: 15px 16px; }
	.kb-top .kb-post-title { font-size: 15.5px; min-height: 44px; }
	/* 分类条在手机上不再换行堆到 6 行（15 个长名在 390px 里必然如此）——
	   改成与顶栏场景条一致的**单行横向滚动**：一屏一行，滑动看其余，高度 ~45px。
	   注意这里要显式覆盖 `display: block`（IA-17 基规则）与 `flex-wrap`。 */
	.kb-cat-bar-inner {
		display: flex; flex-wrap: nowrap; overflow-x: auto;
		padding: 10px 0; font-size: 13px; line-height: 1.5;
		-webkit-overflow-scrolling: touch;
	}
	.kb-cat-bar-inner::-webkit-scrollbar { height: 0; }
	.kb-cat-bar-item { flex: none; }
	.kb-cat-bar-item::after { margin: 0 8px; }
	.kb-cat-bar-chip { white-space: nowrap; font-size: 13px; }
	.kb-cat-bar-more { flex: none; }
	/* 报头在手机上仍偏重（热门词 + 统计各占两三行），一并收一档。
	   ⚠ 选择器必须写成 `.kb-hero-band > .kb-hero` —— IA-15 也有一条同选择器（0-2-0）的
	   手机规则，只写 `.kb-hero`（0-1-0）会被它盖住（本轮踩到，量出来 padding 没变）。 */
	.kb-hero-band > .kb-hero { padding: 20px 16px 18px; }
	.kb-hero-band .kb-hero-title { font-size: 26px; }
	.kb-hero-band .kb-hot { gap: 7px; font-size: 12.5px; }
	.kb-hero-band .kb-hot a { padding: 3px 9px; font-size: 12.5px; }
	.kb-hero-band .kb-hero-stats { gap: 8px 18px; font-size: 12.5px; }
}

/* ============================================================
   首页范式迁移：学 51CTO 门户（M04-IA18 · 2026-10-07）
   ============================================================

   数据来源：用真浏览器渲染 51CTO 首页后**读计算样式**（不是凭印象），实测：
     容器宽 **1200px**（我们 1320）、卡片圆角 **4px**（我们 12）、
     卡片**无阴影**（靠 1px 细线 + 留白分块）、
     正文 #333 / 标题 #272727 20px / 次要 #999、#acacac、
     链接**绝大多数是深灰**（156 处 #272727）—— 彩色只留给榜单序号与当前频道；
     首屏 = 左侧"大焦点图 + 2 张图卡" + 右侧"24 小时热度排行榜"（序号 + 标题 + 摘要）。

   本轮据此改四件事（**结构只加不减**，视觉语言整体转向"扁平密集"）：
     ① 容器 1320 → **1200**，圆角 12 → **6**，卡片**全部去掉阴影**改 1px 细线；
     ② Hero 下方新增**焦点区**：1 大卡（彩色封面 + 压图白字标题 + 摘要）+ 2 中卡 + 右侧榜单；
     ③ 内容流卡片改 51CTO 的**"左图右文"**（设计化封面 148×96 + 标题/摘要/meta），双列密集；
     ④ 区块标题改"中文 + 英文小字 + 右侧更多"，并在标题行下加一条细线（门户式分块）。

   ⚠ 封面为什么是"设计化"的：站内条目正文里的图是第三方外链（CSDN 图床实测 403 防盗链），
   **不转载别人的图**，故封面 = 类型色渐变 + 类型字 + 斜纹。零外部请求、零版权问题，
   同时补上"首页一张图都没有"的观感缺陷。

   ⚠ 与 IA-17（方向 A：少边框 + 大留白）的关系：用户看过 A 之后要求改学 51CTO
   （扁平、密集、有块），故此处**覆盖** A 的阴影/大圆角，保留 A 建立的字号与层级纪律。

   ⚠ 2026-10-11 修复（TK-20261011-UI-001 · B1）：本层原有的
   `:root { --container: 1200px }`（3 行）**已删除**。
   它没有媒体查询、位于本文件更靠后 ⇒ 同特异性下覆盖了文件前段
   1065-1076 的四档响应式阶梯，使 `--container` 在**所有视口**恒为 1200px
   （大屏两侧各空 600~1300px，是「不够大气」的直接成因之一）。
   阶梯本体在1076 附近，已恢复生效；此处只保留 IA-18 的视觉规则。
   ============================================================ */

/* ① 扁平化：去阴影、1px 细线分块

   ⚠ S5（2026-10-11）：圆角**不再硬编码 6px**，回归 `--radius-card` 令牌。
   此前此处为 `.card` / `.kb-hero` / `.kb-post` / `.kb-rankbox` /
   `.kb-cat-bar` / `.kb-scene-card-wrap` 六处各写一遍 `6px`，绕过了令牌 ——
   后果是「首页 6px、其它页面 12px」两套圆角并存，且调令牌对首页无效。
   6px→8px 的方向保留（配封面图的卡片 4px 过硬、12px 过软，8px 是平衡点）。 */
.card {
	border: 1px solid var(--c-border);
	border-radius: var(--radius-card);
	box-shadow: none;
}
.kb-hero { border-radius: var(--radius-card); }
.kb-top .kb-post,
.kb-rankbox,
.kb-cat-bar,
.kb-scene-band .kb-scene-card-wrap { border-radius: var(--radius-card); }

/* ② 区块标题：中文 + 英文小字 + 右侧更多，标题行下压一条细线（门户式分块） */
.kb-sec-en {
	margin-left: 8px;
	font-size: 12px; font-weight: 400; letter-spacing: .06em;
	color: var(--c-text-3); text-transform: none;
}
.kb-sec-h,
.kb-feed-head h2,
.kb-scene-card-wrap .kb-sec-h {
	font-size: 20px; font-weight: 600; color: var(--c-ink);
}
.kb-top > .col-right .kb-sec-h { font-size: 15px; color: var(--c-ink); letter-spacing: 0; }
.kb-feed-head {
	align-items: center;
	padding-bottom: 10px; margin-bottom: 14px;
	border-bottom: 1px solid var(--c-border);
}

/* ③ 封面：类型色渐变 + 类型字 + 斜纹（不引外部图片）
   ⚠ 每条封面都必须同时给 `background-color`（= 渐变暗端），原因有两个：
     ① 只用 `background-image` 时元素的计算 `background-color` 是 transparent，
        对比度审计「向上合成背景」会一路找到浅色页面底 → 白字被判成 1.07:1 的**假违规**
        （本轮实测，5 处告警全是这么来的）；
     ② 浏览器不支持渐变时，文字仍有深色底可读 —— 渐进增强。
   渐变方向统一「亮端左上、暗端右下」，文字压在暗端（`align-items: flex-end`）。 */
.kb-cover {
	position: relative; overflow: hidden;
	display: flex; align-items: flex-end;
	padding: 8px 10px; border-radius: 4px;
	background-color: #1C2128;
	background-image: linear-gradient(135deg, #3A424E, #1C2128);
}
.kb-cover::after {
	content: ''; position: absolute; inset: 0;
	background-image: repeating-linear-gradient(45deg, rgba(255, 255, 255, .07) 0 6px, transparent 6px 12px);
}
.kb-cover-tag {
	position: relative; z-index: 1;
	font-size: 12px; font-weight: 600; color: #fff;
	letter-spacing: .02em;
}
/* 真实配图（2026-10-23）：有落库封面时 `.kb-cover` 容器不变（各断点的
   width/height 规则全部复用），内部垫一张 object-fit: cover 的图；
   设计化封面的斜纹（::after）与压暗层（::before）在 .has-img 下关闭 ——
   它们是为「纯色渐变 + 白字」设计的，压在照片上只会发灰。
   类型标签换成半透明深底 chip：照片亮度不可控，裸白字在亮图上不可读。 */
.kb-cover-img {
	position: absolute; inset: 0;
	width: 100%; height: 100%;
	object-fit: cover; display: block;
}
.kb-cover.has-img::before,
.kb-cover.has-img::after { content: none; }
.kb-cover.has-img .kb-cover-tag {
	background: rgba(0, 0, 0, .55);
	padding: 2px 8px;
	border-radius: 4px;
}
/* 同类型的深浅变体（tone-1/2/3，由条目 ID 取模决定）：
   站内 43% 是「方案」，不区分深浅时整屏封面是同一块绿；变体只压暗、不改色相，
   所以**类型仍然一眼可辨**，而相邻卡片有了节奏。压暗还能提高白字对比度。 */
.kb-cover.tone-2::before,
.kb-focus-lead.tone-2::before,
.kb-cover.tone-3::before,
.kb-focus-lead.tone-3::before {
	content: ''; position: absolute; inset: 0;
}
.kb-cover.tone-2::before,
.kb-focus-lead.tone-2::before { background: rgba(0, 0, 0, .20); }
.kb-cover.tone-3::before,
.kb-focus-lead.tone-3::before { background: rgba(0, 0, 0, .38); }
.cover-solution { background-color: #0A3524; background-image: linear-gradient(135deg, #157A55, #0A3524); }
.cover-case     { background-color: #47190F; background-image: linear-gradient(135deg, #97402F, #47190F); }
.cover-standard { background-color: #14243F; background-image: linear-gradient(135deg, #2D5696, #14243F); }
.cover-fault    { background-color: #4E2409; background-image: linear-gradient(135deg, #A95225, #4E2409); }
.cover-guide    { background-color: #0C3441; background-image: linear-gradient(135deg, #1F7694, #0C3441); }
.cover-device   { background-color: #0A322C; background-image: linear-gradient(135deg, #1E7268, #0A322C); }
.cover-term     { background-color: #221A42; background-image: linear-gradient(135deg, #514193, #221A42); }
.cover-faq      { background-color: #1F3122; background-image: linear-gradient(135deg, #4C704F, #1F3122); }

/* ④ 焦点区：**中栏顶部**的 1 大卡 + 2 中卡（榜单不在这里 —— 它在右栏，见 `.kb-rankbox`）。
   `align-items: start` 是必须的：默认 stretch 会让 2 张中卡（各 ~190px）把大卡拉到同高，
   首版就是这样把焦点区撑到 836px、把内容流推出首屏。

   ⚠ S4（2026-10-11）：右列 260 → 300px。260px 下中卡标题（14.5px）常折成两行
   把卡片撑高、且描述被截到只剩一行；300px 让标题基本单行、行数稳定。
   容器拓宽后（本批 B2），300px 占中栏比例反而更小，绝对宽度不受影响。 */
.kb-focus {
	display: grid;
	grid-template-columns: minmax(0, 1fr) 300px;
	gap: 14px;
	align-items: start;
	margin-bottom: 22px;
}
.kb-focus-lead {
	position: relative; overflow: hidden;
	display: flex; flex-direction: column; justify-content: flex-end;
	min-height: 320px; padding: 20px 22px;
	border-radius: var(--radius-card);
	/* 同封面：底色必须落在 `background-color` 上（审计可判、渐变失效时可读） */
	background-color: #0A3524;
	background-image: linear-gradient(135deg, #157A55, #0A3524);
}
/* 压图白字必须稳：底部再加一层暗色渐隐，保证任何封面色下正文都 ≥4.5:1 */
.kb-focus-lead::after {
	content: ''; position: absolute; inset: 0;
	background-image: linear-gradient(180deg, rgba(0, 0, 0, .05) 30%, rgba(0, 0, 0, .62));
}
.kb-focus-lead > * { position: relative; z-index: 1; }
/* 焦点大卡配图（2026-10-23）：模板用 inline `background-image: url(…)` 覆盖类上的
   类型色渐变，渐变不依赖 background-size/position（默认 auto 即铺满盒），照片依赖 ——
   故 .has-img 时在此补 cover + 居中。`::after` 的底部压暗渐保持不变，
   任意照片下白字对比度仍 ≥4.5:1；照片加载失败时 background-color 兜底。 */
.kb-focus-lead.has-img { background-size: cover; background-position: center; }
.kb-focus-lead-cat { font-size: 12.5px; color: rgba(255, 255, 255, .92); }
.kb-focus-lead-title {
	margin-top: 8px;
	font-size: 24px; font-weight: 700; line-height: 1.34; color: #fff;
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.kb-focus-lead-ex {
	margin-top: 10px;
	font-size: 13.5px; line-height: 1.6; color: rgba(255, 255, 255, .88);
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.kb-focus-sub { display: grid; grid-template-columns: minmax(0, 1fr); gap: 14px; }
.kb-focus-card { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.kb-focus-card .kb-cover { height: 118px; }
.kb-focus-card-title {
	font-size: 14.5px; font-weight: 600; line-height: 1.45; color: var(--c-ink);
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.kb-focus-card:hover .kb-focus-card-title { color: var(--c-primary); }

/* 榜单：序号 + 标题 + 一行摘要（序号用主色，其余保持深灰 —— 学 51CTO 的用色纪律） */
.kb-rankbox {
	border: 1px solid var(--c-border); border-radius: var(--radius-card);
	padding: 14px 16px; background: var(--c-surface);
}
.kb-rankbox .kb-sec-h { margin-bottom: 4px; }
.kb-ranklist { list-style: none; margin: 0; padding: 0; }
.kb-ranklist li {
	display: flex; gap: 10px;
	padding: 9px 0; border-top: 1px solid var(--c-border-2);
}
.kb-ranklist li:first-child { border-top: 0; }
.kb-ranklist-n {
	flex: none; width: 18px;
	font-size: 15px; font-weight: 700; font-style: italic; line-height: 1.5;
	color: var(--c-text-3);
}
.kb-ranklist li:nth-child(1) .kb-ranklist-n { color: var(--c-primary); }
.kb-ranklist-body { min-width: 0; }
.kb-ranklist-t {
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
	/* S1：14px → --fs-body 15px（榜单标题是右栏主信息，不该与正文同号） */
	font-size: var(--fs-body); font-weight: 600; line-height: var(--lh-snug); color: var(--c-ink);
}
.kb-ranklist-t:hover { color: var(--c-primary); }
.kb-ranklist-ex {
	display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden;
	/* S1：12.5px → --fs-body-sm 13.5px，与榜单标题（--fs-body-lg 17px）拉开层级 */
	margin-top: 3px; font-size: var(--fs-body-sm); line-height: 1.5; color: var(--c-text-3);
}

/* ⑤ 内容流：51CTO 式「左图右文」双列密集卡（封面 148×96）

   ⚠ S1（2026-10-11）：标题/摘要改用字阶令牌。**摘要 12.5 → 15px 是本次
   感知最强的一处抬升** —— 此前 12.5px 摘要配 148×96 封面，比例是「图比字大」，
   同屏12 张卡读起来像标签墙；抬到 15px 后图文比例才均衡。
   min-height 随之重算：15px × 1.65 × 2 行 ≈ 50px（保证同行卡片等高）。

   ⚠ R3（容器拓宽的连带效应）：`minmax(360px,1fr)` 是 auto-fill，
     列数随中栏宽度变化 —— 1200 容器 → 中栏 840 → 2 列；1320 → 960 → 2 列；
     1520 → 1160 → 3 列；1680 → 1320 → 3 列；1920 → 1560 → 4 列。
     卡片宽度稳定在 372~432px，封面 148px 固定 ⇒ 文字列248~284px，
     摘要 2 行仍够放（约 33~38 字/2 行）。**此为算式推算，未在浏览器实测。** */
.kb-top .kb-feed-grid { grid-template-columns: repeat(auto-fill, minmax(360px, 1fr)); gap: 12px; }
.kb-top .kb-post {
	flex-direction: row; align-items: flex-start; gap: 12px;
	padding: 12px; border: 1px solid var(--c-border); border-radius: var(--radius-card); box-shadow: none;
}
.kb-top .kb-post:hover { border-color: var(--c-primary); transform: none; box-shadow: none; }
.kb-top .kb-post .kb-cover { flex: none; width: 148px; height: 96px; }
.kb-top .kb-post-body { display: flex; flex-direction: column; gap: 6px; min-width: 0; flex: 1 1 auto; }
.kb-top .kb-post-title { font-size: var(--fs-body); line-height: var(--lh-snug); min-height: 42px; }
.kb-top .kb-post-ex { -webkit-line-clamp: 2; min-height: 50px; font-size: var(--fs-body); line-height: 1.65; }
.kb-top .kb-post-meta { margin-top: auto; }

/* ⑥ 右栏回到"模块盒"（51CTO 的右栏就是带框模块，不是无框段落） */
.kb-top > .col-right .card {
	background: var(--c-surface);
	border: 1px solid var(--c-border);
	border-radius: var(--radius-card);
	padding: 14px 16px;
	margin-bottom: 14px;
}
.kb-top > .col-right .card + .card { margin-top: 0; padding-top: 14px; border-top: 1px solid var(--c-border); }

/* ⑧ 五段顺序（视觉顺序在这里统一定，DOM 顺序即模板顺序）
   ⚠ 焦点区**不是**顶层段落 —— 它在 `.col-main` 之内（见上），故不参与这里的排序。
     第一版把它当顶层段落排了 order，才会出"焦点区行高被榜单撑高"那类问题。

   ⚠⚠ **本文件的 `order` 在此之前还有两处历史遗留声明：3160-3162 与 3230-3233。**
   CSS 同特异性下后写者赢，故**只有本处（3803 起）生效**，前两处是死代码。
   改视觉顺序只改这里；**不要**去动 3160/3230（改了不生效，只会让人以为改到了）。

   ⚠ 2026-10-12 修复（TK-20261011-UI-001 · 补做B）：`.kb-rail-band`（归档入口带，
   M04-IA20 新增）此前**从未声明 order**，默认值 0⇒ 被排到所有显式 order **之前**，
   实测插在顶栏与 Hero 之间压住报头（1440×900 实测 top=138 / h=24）。
   现按设计意图插在 Hero 之后、分类条之前，并把后三段各后移一位。

   ⚠ 类名是 `.kb-rail-band`（section，layout 的直接子元素），
     **不是** `.kb-rail`（nav，在 band 内部）—— 给 nav 加 order 对布局无效。

   ⚠⚠⚠ **五条每一条都必须带 `min-width: 0`，删改本块时勿丢**（2026-10-12 补记）：
     这五条是 `.layout--home`（grid）的全部直接子元素。`min-width: 0` 是 grid/flex 子项
     防「长不可断内容撑破轨道」的标准写法 —— `.kb-cat-band` 内含 15 大类共 113 个链接、
     `.kb-top` 内含整个内容流，一旦 min-width 退回 auto，这类回归会重新出现。
   ⚠ **「死代码」不等于「无职责」**：本次清理前，3160-3162 / 3230-3233 两段 order 死代码
     里还带着 `.kb-hero-band` / `.kb-cat-band` / `.kb-top` 的 `min-width: 0` ——
     `order` 被后写者覆盖了，但**同一规则块里的 `min-width` 不冲突、早写的那条仍然生效**。
     所以只删不补 ⇒ 这三段 min-width 悄悄退回 auto，几何当天看不出来，防护已经没了。
     「删了会回来」的东西不可只按「看起来是死代码」处理，须逐属性检查它还承担什么。
     （`verify.py` 的 order 门禁只查 order 声明、不查 min-width，属已知盲区，靠本注释守住。） */
.kb-hero-band { order: 1; min-width: 0; }
.kb-rail-band { order: 2; min-width: 0; }
.kb-cat-band { order: 3; min-width: 0; }
.kb-top { order: 4; min-width: 0; }
.kb-scene-band { order: 5; min-width: 0; }

/* ⑦ 窄屏回落：焦点区与内容流收成单列 */
@media (max-width: 992px) {
	.kb-focus { grid-template-columns: minmax(0, 1fr); }
	.kb-focus-sub { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.kb-focus-lead { min-height: 240px; }
	.kb-focus-lead-title { font-size: 20px; }
	.kb-top .kb-feed-grid { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 992px) {
	/* ≤992 时右栏由既有规则变成 2 列网格；榜单在窄列里会被挤成 174px 宽（实测）——
	   让它横跨整行，公告/故障/标签继续两列并排。 */
	.kb-top > .col-right .kb-rankbox { grid-column: 1 / -1; }
}
@media (max-width: 600px) {
	/* 手机首屏太挤：引导语与品牌注脚各占 1~2 行，而它们的入口在别处都有
	   （AI 问答/场景速查在顶栏与场景带；字标在顶栏、域名在页脚）。
	   display:none 只是不显示，HTML 里仍在，爬虫照样读得到。 */
	.kb-hot-hint { display: none; }
	.kb-hero-brand { display: none; }
}
@media (max-width: 768px) {
	.kb-focus-sub { grid-template-columns: minmax(0, 1fr); }
	.kb-focus-lead { min-height: 200px; padding: 16px; }
	.kb-focus-lead-title { font-size: 18px; }
	.kb-top .kb-post .kb-cover { width: 110px; height: 78px; }
	.kb-top .kb-post-title { font-size: 14.5px; min-height: 42px; }
}

/* ============================================================
   首页舒适度与"大气"档（M04-IA19 · 2026-10-07）
   ============================================================

   用户反馈：「整体结构不错，再大气一些。文字合适一些 —— 现在菜单中文字挤压的厉害、还换行了。」

   **实测**（1440px，容器 1200）：
     顶栏 = 字标 107 + 主导航 **636** + 搜索框 **70** + 操作区 307 = 1120（+间距）> 1200
     → 搜索框被压到 70px（只剩个放大镜的位置），这就是"挤压"的来源；
     分类索引 15 项在 1200 里**自由换行**成 2 行（换行位置随机，看着像被挤出来）。

   本层三条对策：
     ① **头部比正文宽**：顶栏与场景条用 1320 容器（正文仍 1200）——
        门户站的头部承担品牌 + 导航 + 搜索 + 操作区，比正文需要更宽的横向空间；
        并给搜索框 `min-width: 240px`，杜绝"被压成图标"。
     ② **分类索引改 8 列网格**：15 项排成整齐的两行（8 + 7 + 「全部类目」），
        不再是自由换行 —— 列对齐本身就有"大气"感，也彻底消除"挤出来的换行"。
     ③ **整体抬一档留白与字号**：段间距 24 → 28、区块标题 20 → 22、
        Hero 标题 44 → 46 + 内距加宽、焦点大卡 320 → 380、卡片内距 12 → 14。
   ============================================================ */

/* ① 顶栏禁止按字换行 + 搜索框改成"吃掉剩余空间"
   ——「菜单中文字挤压、还换行」的根因：导航项没有 `white-space: nowrap`，
      顶栏一行放不下时 flex 会把每项压窄 → 中文就**逐字折行**（「故障速查」变成两行，
      项高 24 → 48px）。修法两层：① 导航/操作区一律 nowrap（宁可让搜索框变窄，也不让菜单折行）；
      ② 搜索框从"固定最小宽"改为 `flex: 1 1 auto`，空间不足时**它先让位**。
      另：顶栏 `flex: none`，禁止收缩。

   ⚠ B3（2026-10-11）：**取消 `max-width: 1360px` 硬编码**，顶栏与场景条
      改为跟随 `--container`（即 `.container` 基规则的 max-width）。
      此前顶栏 1360 / 正文 1200，1440 视口下两者左边缘差 80px——
      用户会看到顶栏字标比下方 Hero 卡片更靠左，是典型的「拼装感」，
      破坏「同一个垂直网格」这个最基本的空间秩序（门户站掘金/CSDN 均左右对齐）。
      原注释称「头部比正文宽」是刻意设计，但代价大于收益。
      注：`.site-header .topbar` 这条其实冗余——`.topbar` 与 `.container`
      是同一元素（header.php:55 `class="container topbar"`），两条选择器同命中。 */

/* ⚠ `.search-box` 基规则带 `margin-left: auto` —— 在 flex 行里它会**吃掉全部剩余空间**，
   于是搜索框永远停在 `min-width`（实测 180px），加多少 grow 都没用。必须清掉。 */
.site-header .search-box { flex: 1 1 auto; min-width: 180px; max-width: 380px; margin-left: 0; }
.site-header .search-box input { min-width: 0; }
/* **只有 ≥1181 才禁止折行**（顶栏跟随容器后 ≥1280 有 1320px，实测搜索框能拿到 233px+）。
   为什么不全局 nowrap：≤1180 时"字标 + 10 项导航 + 搜索 + 操作区"根本放不下，
   强行 nowrap 会把顶栏撑破（`layout_audit` 实测 900 档 +65px、1024 档 +71px 横向溢出）。
   窄屏回到原来的"允许折行"行为：不好看，但不溢出 —— 这条由布局门禁逐档把关。 */
@media (min-width: 1181px) {
	.site-header .topnav { gap: 14px; flex: none; }
	.site-header .topnav a { font-size: 14.5px; }
	.site-header .topnav a,
	.site-header .topnav li,
	.site-header .top-actions a,
	.site-header .top-actions button { white-space: nowrap; }
}
/* 窄屏不再做"隐项/让位"特例：≤1180 就是放不下，强行 nowrap 会撑破顶栏
   （实测 900 档 +65px、1024 档 +71px）。此处保持既有行为不动，
   桌面（≥1181）由上面的媒体查询接管。 */

/* ② 分类索引：8 列网格（8 + 7 + 全部类目 = 两行各 8 格，列对齐） */
.kb-cat-bar-inner {
	display: grid;
	grid-template-columns: repeat(8, minmax(0, 1fr));
	gap: 10px 18px;
	padding: 14px 0;
	font-size: 14px;
}
/* 网格用间距分列，故去掉逐项的细竖线分隔符（与 8 列对齐重复） */
.kb-cat-bar-item::after { display: none; }
/* ⚠ 关键：类名里带空格的长名（「酒店电视与 IPTV」）会在 130px 的格子里**折成两行**，
   进而把整块网格挤成 3 行、看着像"挤压出来的换行"（实测 top=430 一项高 43px）。
   故：单行不折 + 超长省略 —— 顺便把计数从索引行里撤掉（它占 20px，是导致折行的直接原因），
   计数在悬浮面板里仍可见（「全部 121 条 →」）。 */
.kb-cat-bar-chip {
	font-size: 13.5px;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.kb-cat-bar-cnt { display: none; }
.kb-cat-bar-more { grid-column: -2 / -1; justify-self: end; font-size: 13.5px; }

/* ③ 大气一档：段间距、区块标题、Hero、焦点大卡、卡片内距

   ⚠ 2026-10-11（TK-20261011-UI-001 · S3/S4/S1）：本块原为「Hero 46px + 焦点大卡 380px」，
   两者是**此消彼长**的零和关系 —— Hero 抬高而大卡不降，首屏就被推爆
   （IA-18 曾修好「首屏 0 张卡」，IA-19 又把大卡从 320 抬回 380 而部分回退）。
   现改为：Hero 加厚（padding 34/36/30 → 44/48/36、站名 46 → 48），
   **同时**大卡 380 → 340，首屏净增仅 +20px。

   ⚠ 字号改用 S1 令牌，避免本块继续硬编码 px（这是全站 30 个字号的来源之一）。
     `--gap: 28px` 保留在此：1536 档阶梯已不再声明 --gap（见文件前段），
     大屏段间距统一由此值控制，不会再出现「大屏反而更挤」。 */
:root { --gap: 28px; }
.kb-hero-band > .kb-hero { padding: 44px 48px 36px; }
.kb-hero-band .kb-hero-title { font-size: var(--fs-display); }
.kb-hero-band .kb-hero-sub { font-size: var(--fs-body-lg); }
.kb-hero-band .kb-search input[type="search"] { height: 48px; }
.kb-hero-band .kb-search .btn { height: 48px; }
.kb-sec-h,
.kb-feed-head h2 { font-size: var(--fs-h2); }
/* S4：380 → 340，与 Hero 加厚零和配平 */
.kb-focus-lead { min-height: 340px; padding: 24px 26px; }
.kb-focus-lead-title { font-size: var(--fs-h1); }
.kb-focus-card .kb-cover { height: 132px; }
.kb-focus-card-title { font-size: var(--fs-body); }
.kb-top .kb-post { padding: 14px; gap: 14px; }
/* ⚠ 此处原为 `font-size: 15.5px`，位于本层（文件最靠后）会**盖掉** 3877 附近
   刚套用的 `--fs-body` 令牌 —— 令牌就白加了。故改为跟随令牌。 */
.kb-top .kb-post-title { font-size: var(--fs-body); }
.kb-top .kb-post .kb-cover { width: 156px; height: 102px; }
.kb-top > .col-right .card { padding: 16px 18px; margin-bottom: 16px; }
.kb-rankbox { padding: 16px 18px; }
.kb-ranklist li { padding: 10px 0; }
.kb-ranklist-t { font-size: var(--fs-body); }

/* ⚠ R3 连带修正（2026-10-11）：容器拓宽后 `.kb-feed-grid` 的
   `minmax(360px, 1fr)` 会排出 3 列，而封面被 IA-19 抬到 156px ——
   3 列时文字列只剩约 186px（12 字/行），摘要被截得只剩 24 字，读不下去。

   算式（未在浏览器实测，按盒模型推算；`--gap` 28、container-pad 16、右栏 300）：
     容器 1200 → 中栏 840 → 2 列，每列 414，文字列 222px
     容器 1320 → 中栏 960 → 2 列，每列 474，文字列 282px
     容器 1520 → 中栏 1160 → 2 列，每列 574，文字列 382px
     容器 1680 → 中栏 1320 → 3 列，每列 432，文字列 240px
     容器 1920 → 中栏 1560 → 3 列，每列 512，文字列 320px
   360→400 后各档文字列都在 222~382px（15px 字号 ≈ 14~25 字/行），
   摘要 2 行可容 28~50 字 —— 可读。 */
.kb-top .kb-feed-grid { grid-template-columns: repeat(auto-fill, minmax(400px, 1fr)); }

/* 窄屏回落（**顺序要紧**：992 → 768 → 600，后写的生效） */
@media (max-width: 992px) {
	.kb-cat-bar-inner { grid-template-columns: repeat(4, minmax(0, 1fr)); }
	.kb-focus-lead { min-height: 300px; }
	.kb-focus-lead-title { font-size: 22px; }
}
/* ≤768：回到 IA-17 建立的"单行横滑"（15 个长名在手机上无论怎么排都会挤，
   横滑是移动端约定）。必须写在 992 之后 —— 否则上面的网格列数会盖掉它。 */
@media (max-width: 768px) {
	.kb-cat-bar-inner {
		display: flex; flex-wrap: nowrap; overflow-x: auto;
		gap: 0; padding: 11px 0; font-size: 13.5px;
		-webkit-overflow-scrolling: touch;
	}
	.kb-cat-bar-inner::-webkit-scrollbar { height: 0; }
	.kb-cat-bar-item, .kb-cat-bar-more { flex: none; justify-self: auto; }
	.kb-cat-bar-item::after { display: inline-block; margin: 0 9px; }
	.kb-cat-bar-chip { white-space: nowrap; }
}
@media (max-width: 600px) {
	.kb-focus-card .kb-cover { height: 110px; }
	.kb-focus-lead { padding: 18px; }
}

/* ============================================================
   窄屏回落补正（TK-20261011-UI-001 · B4 · 2026-10-11）
   ============================================================

   为什么需要这一段：本文件从504 行到 4098 行叠了 5 轮视觉迭代（IA-14→IA-19），
   每一轮都在**文件末尾**追加覆盖规则。CSS 同特异性下「后写者赢」，
   于是**末尾的无条件规则会盖掉前段媒体查询里的移动端降级** —— 这是本项目
   已经踩过一次的顺序陷阱（见 3318-3321 的记录）。

   本次实测到的两处实例（改版前一直存在，从未被察觉）：
     ① `:root { --gap: 28px }`（本文件后段）压掉了 ≤768 的 `--gap: 18px`
        ⇒ 手机端段间距（28px）比桌面还大。
     ② Hero 的 `padding: 44px 48px 36px` + `font-size: var(--fs-display)`（48px）
        压掉了 ≤900 的 32px 与 ≤768 的 26px ⇒ 手机首屏被巨型标题占满。

   修法：**把降级重新声明在文件最末**，并按项目既有纪律**一律带 `@media` 限定**
   （不加限定就会反过来盖掉 ≤992/≤768 的单栏规则 —— 同类陷阱）。

   ⚠ 顺序：992 → 900 → 768 → 600，后写的生效。
   ============================================================ */
@media (max-width: 992px) {
	/* 焦点大卡 340（S4）→ 300：平板竖屏下焦点区仍需给内容流让位 */
	.kb-focus-lead { min-height: 300px; padding: 20px 22px; }
	.kb-focus-lead-title { font-size: 24px; }
}
@media (max-width: 900px) {
	/* Hero 放弃双列 grid（`@media ≥901` 那条已不生效），回落为纵向堆叠 */
	.kb-hero-band > .kb-hero { padding: 22px 18px 20px; }
	.kb-hero-band .kb-hero-title { font-size: 32px; }
	.kb-hero-band .kb-hero-sub { font-size: var(--fs-body); }
}
@media (max-width: 768px) {
	:root { --gap: 18px; }
	.kb-hero-band > .kb-hero { padding: 20px 16px 18px; }
	.kb-hero-band .kb-hero-title { font-size: 26px; }
	.kb-hero-band .kb-hot { margin-top: 12px; }
	.kb-hero-band .kb-hero-meta { margin-top: 10px; }
	/* 内容流卡片在手机上回到「上图下文」竖排（封面 156px 在 360px 宽里放不下） */
	.kb-top .kb-post { flex-direction: column; padding: 12px; }
	.kb-top .kb-post .kb-cover { width: 100%; height: auto; aspect-ratio: 3 / 2; }
	.kb-top .kb-post-title { min-height: 0; }
	.kb-top .kb-post-ex { min-height: 0; }

	/*
	 * ⚠ 2026-10-12 回归修复（本轮 S4 引入、部署后由布局门禁实测抓到）：
	 *
	 * S4 把 `.kb-top .kb-feed-grid` 的列宽下限从 `minmax(360px, 1fr)` 提到
	 * `minmax(400px, 1fr)`，理由是桌面 1680/1920 档排 3 列时文字列太窄（见上文算式）。
	 * 但 400px 是**无条件**规则，而 ≤992 的单列规则写在文件前段 3814 行 ——
	 * CSS 同特异性下「后写者赢」，于是手机端也被迫用 400px 最小列宽。
	 *
	 * 后果（layout_audit.js 实测）：**W=390 首页横向溢出 +22px**，
	 * 超宽元素全链为 `.kb-post` → `.kb-cover` / `.kb-post-body` / `-title` / `-ex` / `-meta`
	 * （卡片 412px > 视口 390px）。
	 *
	 * 这正是本段开头记录的「末尾无条件规则压掉前段降级」顺序陷阱的第三例 ——
	 * 前两例是 `--gap` 与 Hero，本次是内容流列宽。**同一种错误在同一个文件里犯了第三次。**
	 *
	 * 修法：`minmax(0, 1fr)` 显式回落。必须用 `minmax(0,…)` 而非 `minmax(1fr)`——
	 * 后者最小值是 min-content，会被内容撑宽导致整页横向溢出（3855 行已有同款注释）。
	 */
	.kb-top .kb-feed-grid { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 600px) {
	.kb-focus-card .kb-cover { height: 110px; }
	.kb-focus-lead { padding: 18px; }
	.kb-focus-lead-title { font-size: 22px; }
}

/* ============================================================
   归档入口带 + 首屏预算（TK-20261011-UI-001 · 补做 A/B/C · ui-brand-2 · 2026-10-12）
   ============================================================

   本段解决三件事。**全部数值均为真浏览器实测**（playwright-core 跑生产页+ 本地
   style.css 注入对比），不是推算。

   【A】`.kb-rail` 此前**完全没有 CSS**（`grep -c 'kb-rail' style.css` = 0）。
       模板 `template-parts/kb-rail-links.php` 已上线并正确渲染 6 格，但无样式
       ⇒ 实测高度只有 24px，视觉上等于一行没排版的裸链接。本段补齐。

   【B】`.kb-rail-band` 没有 order，被排到页面最前压住 Hero。
       修法在**3800-3818**（那里是 order 的唯一生效点），本段只管样式。

   【C】首屏零内容卡片 —— IA-15/IA-18 踩过两次的同一个坑，本轮第三次踩。
       实测改前（1440×900 生产）：内容流首行卡片 **Y=1221px**，视口 900
       ⇒ 首屏完全可见卡片 **0 张**。

   ── 首屏预算与验收（fold_gate.js 判据，实测）──────────────────────────
                改前firstTop  改后 firstTop   inFold/touched   占比
   1440×9001221      725             2 / 4        80.6%
   1920×1080      1166      737             6 / 9        68.2%
   1280×800       1221      644             2 / 2        80.5%
   768×1024       1380      876             0 / 1        85.5%
   390×844        1596      793             0 / 1        94.0%
   五视口横向溢出 = 0。

   ⚠ **判据要点（这里纠正过一个口径）**：桌面 `postsInFold ≥ 2` 的门槛是
     **首行Y ≤ 视口高 − 卡高**（157px），**不是** 视口高 − 2×卡高。
     原因：内容流是 2~3 列，**一行本身就是 2 张卡**，两列并排的顶边相同、
     底边也相同，所以「第一行整行入屏」就等于 2 张完全可见。
     曾按「2 行」误算成需要 586px（实为 743px），会把门槛虚高 157px。

   ⚠ **3 列对本项零帮助**（已实测）：列数不改变首行的垂直位置 firstTop，
     而 inFold 只由 `firstTop + 卡高 ≤ 视口高` 决定。实测把
     `minmax(400px,1fr)` 降到 320px 后：1440/1280 **仍是 2 列**
     （中栏 960/920px，3 列需 ≤312/299px），1920 反而从 3 列掉到 **4 列**、
     文字列压到 121px（≈8 字/行）。故**不采用 3 列方案**。

   ⚠ **焦点区的高度源是中卡，不是大卡**（第一版判断错了一次）：
     改前实测 `.kb-focus-lead` = 340px 而 `.kb-focus-sub` = **381px**
     （2 张中卡竖排 184×2 + gap）。`.kb-focus` 是 `align-items:start`，
     整区取较大者 ⇒ **只压大卡是零效果的**，必须让中卡由竖排变双列。

   ⚠ 为什么焦点区不能继续压到很低：大卡标题实测 80px（2 行 × 30px），
     已是 `--fs-h3` 下可读的下限。再压就要动字号层级或删摘要，
     属设计决策，不在本轮授权内。

   ⚠ 本段所有降级一律带@media 且落在**文件最末** —— 本文件第四类同源缺陷
     （末尾无条件规则压掉前段降级）的预防。`--gap`、Hero、内容流列宽
     已各犯过一次，此处不得再犯。 */

/* ══ 归档入口带 ══ */
.kb-rail {
	display: grid;
	grid-template-columns: repeat(6, minmax(0, 1fr));
	gap: 8px;
}
/* 每格高度用 min-height 常数 + flex 垂直居中 ⇒ **与条目数无关**
   （「横向轨道化」的核心设计意图）。
   minmax(0,1fr) 而非 1fr：后者最小值是 min-content，长名会撑破整格
   导致整页横向溢出（3855 行已有同款记录）。 */
.kb-rail-item {
	display: flex;
	flex-direction: column;
	justify-content: center;
	min-height: 64px;
	padding: 6px 12px;
	min-width: 0;
	background: var(--c-tile);
	border: 1px solid var(--c-border-2);
	border-radius: var(--radius-card);
	text-decoration: none;
}
/* ⚠ 刻意**不做胶囊墙**：浅灰面 + 1px 细线 + 8px 圆角（--radius-card 当前值）。
   若改成 border-radius:999px 会与 Hero 热门词行读作同类。 */
.kb-rail-name {
	font-size: var(--fs-body);            /* 15px */
	line-height: 1.35;
	color: var(--c-ink);
	white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.kb-rail-desc {
	font-size: var(--fs-body-sm);         /* 13.5px */
	line-height: 1.35;
	color: var(--c-text-3);
	white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.kb-rail-cnt { font-size: var(--fs-caption); line-height: 1.35; color: var(--c-text-3); }
.kb-rail-item:hover { background: var(--c-surface); border-color: var(--c-primary); }
.kb-rail-item:hover .kb-rail-name { color: var(--c-primary); }

/* ══ 段间距 ══ */
.layout--home { gap: 12px; padding-top: 10px; }

/* ══ Hero：报头压回单行标题 ══
   实测 1440/1280 下H1「弱电故障速查 · 从现象定位到根因」在 1320px 容器里
   被挤成 2 行（h=110px）；≤1535 降到 38px 后回到 1 行（h=44px），
   这一笔就是 66px —— 本轮最大的单笔收益。 */
.kb-hero-band > .kb-hero { padding: 12px 44px 10px; }
.kb-hero-band > .kb-hero { column-gap: 32px; row-gap: 8px; }
.kb-hero-band .kb-hot { margin-top: 6px; }
.kb-hero-band .kb-hero-meta { margin-top: 0; }

/* ══ 分类条：标题从「上方独立一行」并入左列 ══ */
.kb-cat-band {
	display: grid;
	grid-template-columns: max-content minmax(0, 1fr);
	gap: 16px;
	align-items: center;
}
.kb-cat-band-h {
	margin: 0;
	font-size: var(--fs-body-sm);
	line-height: 1.4;
	color: var(--c-text-3);
	white-space: nowrap;
}
.kb-cat-bar-inner { padding: 7px 0; }

/* ══ 焦点区：中卡双列（真正的降高手段）+ 大卡收薄 ══ */
.kb-focus { grid-template-columns: minmax(0, 1fr) 420px; margin-bottom: 8px; }
.kb-focus-lead { min-height: 168px; padding: 14px 18px; }
.kb-focus-lead-title { font-size: var(--fs-h3); -webkit-line-clamp: 2; }
.kb-focus-lead-ex { -webkit-line-clamp: 1; }
.kb-focus-sub { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.kb-focus-card .kb-cover { height: 72px; }
.kb-focus-card-title { -webkit-line-clamp: 2; }

/* ══ 内容流标题行 ══
   h2 只有一行却继承 body 的 line-height:1.7 ⇒ 31px 高；
   收紧字号 + 行高后整行 42 → 32px。这是最便宜的一笔。 */
.kb-feed-head { margin-bottom: 6px; }
.kb-feed-head h2 { font-size: var(--fs-body); line-height: 1.25; }

/* ============================================================
   降级区，一律带 @media。顺序要紧：1535 → 1180 → 992 → 900 → 768 → 600
   ============================================================ */

/* ≤1536：报头标题 48px 在 1320px 容器下折成 2 行（实测 h=110） */
@media (max-width: 1535px) {
	.kb-hero-band .kb-hero-title { font-size: 38px; }
}
/* ≤1180：6 格横排每格 <150px，长名被 ellipsis 吃掉，减为 3 列 */
@media (max-width: 1180px) {
	.kb-rail { grid-template-columns: repeat(3, minmax(0, 1fr)); }
	.kb-cat-band { grid-template-columns: minmax(0, 1fr); gap: 4px; }
}
/* ≤992：焦点区单列。**必须重申 .kb-focus-sub** —— 本段的无条件双列规则
   在它之后（更晚），不重申就会被覆盖（本文件反复出现的那类顺序陷阱）。 */
@media (max-width: 992px) {
	.kb-focus { grid-template-columns: minmax(0, 1fr); }
	.kb-focus-lead { min-height: 168px; padding: 14px 18px; }
	.kb-focus-sub { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.kb-focus-card .kb-cover { height: 92px; }
}
/* ≤900：Hero 放弃双列 grid */
@media (max-width: 900px) {
	.kb-hero-band > .kb-hero { padding: 16px 18px 14px; }
	.kb-hero-band .kb-hero-title { font-size: 30px; }
}

/* ★ 矮视口桌面（1280×800 / 1024×768 这类小笔电）：`max-height` 而非 `max-width`。
   首屏高度问题只跟视口**高**有关；1920×1080 虽然更宽但更高，不该被这一档波及。
   这一档把 1280 的 firstTop 从 772 压到 644（达 inFold=2 需要 ≤643）。 */
@media (max-height: 860px) and (min-width: 1181px) {
	.layout--home { gap: 10px; padding-top: 8px; }
	.kb-hero-band > .kb-hero { padding: 6px 40px 5px; row-gap: 6px; }
	.kb-hero-band .kb-hero-title { font-size: 34px; }
	.kb-hero-band .kb-hero-sub { font-size: var(--fs-body); }
	.kb-hero-band .kb-hot { margin-top: 2px; }
	.kb-focus-lead { min-height: 126px; padding: 12px 18px; }
	.kb-focus-card .kb-cover { height: 48px; }
	.kb-rail-item { min-height: 46px; padding: 5px 12px; }
	.kb-cat-bar-inner { padding: 3px 0; }
	.kb-cat-band-h { font-size: var(--fs-caption); }
	.kb-feed-head { margin-bottom: 4px; }
}

/* ≤768：归档带改单行横滑；标题行改两行网格（H2+更多 同行、tabs 独占一行横滑，
   实测 390 档 81px → 64px） */
@media (max-width: 768px) {
	.layout--home { gap: 12px; padding-top: 8px; }
	.kb-hero-band > .kb-hero { padding: 14px 16px 12px; }
	.kb-hero-band .kb-hero-title { font-size: 26px; }
	.kb-rail {
		display: flex; flex-wrap: nowrap; overflow-x: auto; gap: 8px;
		-webkit-overflow-scrolling: touch;
	}
	.kb-rail::-webkit-scrollbar { height: 0; }
	.kb-rail-item { flex: none; width: 148px; min-height: 60px; }
	.kb-focus-sub { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
	.kb-focus-lead { min-height: 140px; padding: 12px 14px; }
	.kb-focus-card .kb-cover { height: 66px; }
	.kb-focus-card-title { font-size: var(--fs-body-sm); -webkit-line-clamp: 3; }
	.kb-focus { margin-bottom: 6px; }
	/* 热门词单行横滑：竖排 3 行是手机报头里最不值当的一块 */
	.kb-hero-band .kb-hot { flex-wrap: nowrap; overflow-x: auto; gap: 7px; }
	.kb-hero-band .kb-hot::-webkit-scrollbar { height: 0; }
	.kb-hero-band .kb-hot a { flex: none; }
	.kb-hero-band .kb-hero-sub {
		display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
	}
	.kb-cat-bar-inner { padding: 10px 0; }
	/* ★ 封面 3/2 → 16/9。
	   ⚠⚠ 2026-10-12 **订正上一条注释里的错误数字**（原文写「244px → 137px」是**未实测的估算**，已作废）：
	     390 档实测：卡宽 366 − padding 12×2 ⇒ 封面宽 **340px**；
	     3/2 = 340×2/3 = 226.7px，16/9 = 340×9/16 = **191.2px**（实测封面 191px、卡高 358px）。
	     即本条**实际只省了 35px**，不是注释里暗示的 107px。

	   ⚠ **本条没有被任何规则压掉**（2026-10-12 用 CDP `CSS.getMatchedStylesForNode` 逐条核对）：
	     匹配到的 5 条规则按顺序为
	       ①3786 `width:148px;height:96px`
	       ②3858 `width:110px;height:78px`（≤992）
	       ③3970 `width:156px;height:102px`（无 @media！）
	       ④4053 `width:100%;height:auto;aspect-ratio:3/2`（≤768）
	       ⑤**4289 本条** `aspect-ratio:16/9;height:auto`（≤768，写在④之后 ⇒ 同特异性后写者赢）
	     计算值 `aspect-ratio` 实测就是 `16 / 9`，与算式 340×9/16=191.2 完全吻合。
	     **所以「4289 声明 16/9 却生效 3/2」这个判断不成立** ——
	     之所以看起来「16/9 没变化」，是因为**它本来就已生效**，再注入同一个值自然测不出差别。
	     要验证请注入 `2/1`（实测封面 170px、卡高 336px，差异立刻可见）。

	   ⚠ 为什么这条**不是**移动端 inFold 的出路：封面只占卡高 358px 中的 191px，
	     即使封面压到 0，卡高仍有 167px；而 inFold≥1 需要卡高 ≤ 844−801 = **43px**。
	     真要inFold≥1 必须改卡片**结构**（竖排→横排紧凑型），不是调封面比例。 */
	.kb-top .kb-post .kb-cover { aspect-ratio: 16 / 9; height: auto; }
	.kb-top .kb-post-ex { -webkit-line-clamp: 2; }
	/* 内容流标题行：grid 两行，避免 H2/tabs/更多 各自折行（81 → 64px） */
	.kb-feed-head {
		display: grid;
		grid-template-columns: minmax(0, 1fr) auto;
		align-items: center;
		column-gap: 8px;
		row-gap: 4px;
		margin-bottom: 6px;
	}
	.kb-feed-head h2 { grid-column: 1; font-size: var(--fs-body); line-height: 1.25; min-width: 0; }
	.kb-feed-more { grid-column: 2; grid-row: 1; }
	.kb-feed-tabs {
		grid-column: 1 / -1; grid-row: 2;
		display: flex; flex-wrap: nowrap; overflow-x: auto;
		-webkit-overflow-scrolling: touch; scrollbar-width: none;
	}
	.kb-feed-tabs::-webkit-scrollbar { height: 0; }
	.kb-feed-tabs a { flex: none; white-space: nowrap; }
}

/* ≤600：手机竖屏。目标是 firstTop ≤ 视口高×95%（844×0.95=801.8）且 touched≥1。
   实测 991 → 793。⚠ 手机顶栏实测 188px（占 844 的 22%），**不在本段可动范围**
   （顶栏是全站共用组件，改它影响所有页面），故只压首页自身的六段。 */
@media (max-width: 600px) {
	.layout--home { gap: 8px; }
	/* Hero 改两列网格：热词与统计**同一行**（热词列横滑、统计列固定在右）。
	   不删任何热词、不隐藏统计，只改排版。实测 258 → 约 190px。 */
	.kb-hero-band > .kb-hero {
		display: grid;
		grid-template-columns: minmax(0, 1fr) auto;
		column-gap: 10px;
		row-gap: 5px;
		align-items: center;
		padding: 8px 14px 6px;
	}
	.kb-hero-band .kb-hero-title { grid-column: 1 / -1; font-size: 22px; }
	.kb-hero-band .kb-hero-sub { grid-column: 1 / -1; font-size: 14px; -webkit-line-clamp: 1; margin-bottom: 0; }
	.kb-hero-band .kb-search { grid-column: 1 / -1; flex-direction: row; }
	.kb-hero-band .kb-search .btn { width: auto; padding: 0 16px; }
	.kb-hero-band .kb-search input[type="search"],
	.kb-hero-band .kb-search .btn { height: 42px; }
	.kb-hero-band .kb-hot {
		grid-column: 1; grid-row: 4;
		margin-top: 0; min-width: 0;
		overflow-x: auto; flex-wrap: nowrap; gap: 5px;
	}
	.kb-hero-band .kb-hot::-webkit-scrollbar { height: 0; }
	.kb-hero-band .kb-hot a { flex: none; }
	.kb-hero-band .kb-hero-meta {
		grid-column: 2; grid-row: 4;
		margin-top: 0; white-space: nowrap; font-size: var(--fs-caption);
	}
	/* 焦点区：摘要与标题重复信息，手机省掉；中卡封面压到 30px */
	.kb-focus-lead { min-height: 82px; padding: 8px 12px; }
	.kb-focus-lead-ex { display: none; }
	.kb-focus-card .kb-cover { height: 30px; }
	.kb-focus { margin-bottom: 4px; }
	.kb-rail-item { flex: none; width: 136px; min-height: 44px; padding: 3px 10px; }
	.kb-cat-band { gap: 0; }
	.kb-cat-bar-inner { padding: 5px 0; }
	.kb-feed-head { margin-bottom: 5px; }
}

/* ============================================================
   视觉第二批：① 分类条标题层级 ② 归档带可见性 ③ 焦点区收敛 ④ 封面斜纹降噪
   （TK-20261011-UI-002 · ui-brand-2 · 2026-10-12）
   ============================================================

   四项都来自总控对生产页截图的观察，**每项都先实测再改**（下附实测数据）。

   ── ② 是一处**我上一轮引入的真实缺陷**，不是观感问题 ──
   上一轮我按规格给归档带写了「浅底 `--c-tile` + 1px 细线」。实测：
     `.kb-rail-item` background = rgb(245,246,248)
     `body` background        = rgb(245,246,248)   ← **完全同色**
   而 `--c-tile: #F5F6F8` 与 `--c-bg: #F5F6F8` 在令牌表里就是同一个值（553/579行），
   `--c-border-2: #F2F3F5` 与底色只差 3/255 ⇒ 「浅底 + 细线」在灰底页面上**等于不存在**，
   6 格于是糊成一片。**结论：不能靠调数值救，必须换底色**。
   现改用 `--c-surface`（#FFFFFF，白卡浮在灰底上，与全站卡片同一套语言）+
   `--c-border`（#ECEEF0，比 --c-border-2 深一档才看得见）。

   ── 级联纪律 ──
   本段追加在文件**最末**。`.kb-rail-item` 的 `padding`/`min-height` 在本段之前
   已有两处带@media 的声明（矮视口档 46px/5px 12px、≤600 档 44px/3px 10px），
   本段的无条件 `padding` 写在它们**之后**，会把两处降级盖掉——
   这正是本文件反复出现的那类同源缺陷。故本段末尾**显式重申**了两档降级。 */

/* ── ② 归档入口带：6 格可见、可分、内外都有留白 ──
   容器左右留白：`.kb-rail` 加 2px 横向padding（配合 gap 8px，
   使第一格不顶到容器边缘，视觉上"有这一组"而不是"文字顶到边"）。 */
.kb-rail {
	gap: 8px;
	padding: 0 2px;
}
.kb-rail-item {
	background: var(--c-surface);
	border-color: var(--c-border);
	padding: 8px 14px;
}
/* 卡内左内边距比 gap 大 ⇒ 相邻两格的文字之间有 8+14+14=36px 间隔，
   配合白底与边框，「6 个独立入口」的读法足够。 */
.kb-rail-item + .kb-rail-item { border-left-color: var(--c-border-2); }

/* ── ① 分类条标题：把 h2 做出「块级感」（语义保留，视觉升级） ──
   实测改前 `.kb-cat-band-h` = 13.5px / color #666D78(--c-text-3)，
   与右侧 13.5px 的分类条目**同字号同色** ⇒ 完全没有层级，像浮在条上。
   改法：左侧加品牌亮绿竖条 —— 直接复用全站区块标题
   `.kb-sec-h::before` / `.layout--home .kb-feed-head h2::before`
   的同一套装饰语汇（3px 宽、13px 高、2px 圆角、亮绿），不新造样式。 */
.kb-cat-band-h {
	position: relative;
	padding-left: 10px;
	font-weight: 700;
	color: var(--c-text-2);          /* #666D78 → #4E5969，提一档 */
}
.kb-cat-band-h::before {
	content: '';
	position: absolute; left: 0; top: 50%; transform: translateY(-50%);
	width: 3px; height: 13px; border-radius: 2px;
	background: var(--c-primary-bright);
}

/* ── ③ 焦点区：三块收敛为一套视觉语言 ──
   实测：大卡 `.kb-focus-lead::after` 是**压图暗渐变**（为白字保证 ≥4.5:1），
   而两个中卡 `.kb-focus-card .kb-cover::after` 继承的是 `.kb-cover::after`
   的**斜纹** ⇒ 同屏出现「1 纯底 + 2 斜纹」两套语言，深浅与纹理都不同。
   改法：中卡封面**不画斜纹**（斜纹纯装饰、不承载任何技术语义，去掉不丢信息），
   三块统一为「纯类型色渐变底 + 靠字号与留白分层」。
   同时把中卡封面圆角对齐大卡（--radius-card），消除圆角不一致。 */
.kb-focus-card .kb-cover::after { content: none; }
.kb-focus-card .kb-cover { border-radius: var(--radius-card); }

/* ── ④ 封面斜纹降噪 ──
   实测改前：`rgba(255,255,255,.07)`，周期 **12px**（0 6px / 6px 12px）；
   内容流实测有 **36 个 `.kb-cover`** 密排，在 156×102px 的小图里
   6px 周期的高频条纹产生明显摩尔纹。
   改法（实测三档对比后选定）：对比 .07 → **.025**、周期 12 → **24px**。
   保留「类型色可辨」——那是 `linear-gradient` 类型色给的，不是斜纹给的；
   去掉「纹样」这个噪音。 */
.kb-cover::after {
	background-image: repeating-linear-gradient(45deg, rgba(255, 255, 255, .025) 0 12px, transparent 12px 24px);
}

/* ══ 本段新增属性的窄屏降级（必须，否则会压掉上面两处已有降级）══ */

/* 矮视口桌面：本段把归档带 padding 提到 8px 14px，需在此重申原档位 */
@media (max-height: 860px) and (min-width: 1181px) {
	.kb-rail { padding: 0 2px; }
	.kb-rail-item { min-height: 46px; padding: 5px 12px; }
	.kb-cat-band-h { padding-left: 10px; }
}
/* ≤768：归档带横滑时不需要额外容器留白（每格已是独立白卡） */
@media (max-width: 768px) {
	.kb-rail { padding: 0; }
	.kb-rail-item { padding: 6px 12px; }
}
/* ≤600：重申原档位（44px / 3px 10px），否则被本段无条件 padding 盖掉 */
@media (max-width: 600px) {
	.kb-rail-item { min-height: 44px; padding: 3px 10px; }
}

/* ══ M07 文末版权块 · 素材件提示（2026-10-14 终局裁决新增） ══
 * `_58120_review_required=1` 的采集件会渲染 cb-material：
 * 该类是 light 档「结构整理、主体照搬」内容的明示位，读者须一眼看出
 * 「本文未做实质性改写」，避免误以为是本站原创或已实质改写。 */
.copyright-block .cb-material {
	margin: 12px 0 0;
	padding: 10px 12px;
	border-left: 3px solid #996800;
	background: #fff8e6;
	color: #4a3b10;
	font-size: 14px;
	line-height: 1.7;
}
.copyright-block .cb-material a { color: #6b4e00; }

/* ============================================================
   ★ A2 高度档（TK-20261011-UI-001 收尾 · 2026-10-15）
   ------------------------------------------------------------
   决策：原宽度档 `@media (max-width: 1535px)` 包裹降级段会击垮首屏
   fold_gate（1920×1080 首行 Y 741→1038 / 96.1%>95% 红线、1536×864 三项 FAIL）。
   故改为**高度档**：密度态作为无条件默认（见上方 4182-4210，全视口紧凑布局），
   仅当视口同时满足 宽≥1920 且 高≥1200 时，恢复「大气」桌面大卡体量。

   为什么用 min-height:1200 而非 min-width（关键）：
     首屏门禁七视口最高为 1920×1080（高 1080 < 1200），本档**一个都不命中**，
     故门禁恒 PASS；而 1920×1200 / 2560×1440 这类「又宽又高」的桌面大屏
     才能吃到体量，兼顾「首屏不增高（窄/矮屏）」与「大屏够大气（宽高屏）」。

   本块须置于文件末（所有密度/降级规则之后），确保匹配视口时以「最后写入」赢级联。
   ============================================================ */
@media (min-width: 1920px) and (min-height: 1200px) {
	/* 大 Hero：恢复 44/48/36 内距与 48/12 栅格间距（被 4182-4185 密度覆盖） */
	.kb-hero-band > .kb-hero { padding: 44px 48px 36px; column-gap: 48px; row-gap: 12px; }
	.kb-hero-band .kb-hot { margin-top: 16px; }
	.kb-hero-band .kb-hero-meta { margin-top: 4px; }
	/* 焦点区：右列恢复 300px + 段距 22px（被 4204 密度覆盖） */
	.kb-focus { grid-template-columns: minmax(0, 1fr) 300px; margin-bottom: 22px; }
	/* 大卡：恢复 340px 高 + 24/26 内距（被 4205 密度覆盖） */
	.kb-focus-lead { min-height: 340px; padding: 24px 26px; }
	.kb-focus-lead-title { font-size: var(--fs-h1); }
	.kb-focus-lead-ex { -webkit-line-clamp: 2; }
	/* 中卡单列（被 4208 双列覆盖），收回横向排布、放大卡纵向体量 */
	.kb-focus-sub { grid-template-columns: minmax(0, 1fr); }
	.kb-focus-card .kb-cover { height: 132px; }
}

/* ============================================================
   首页内容流分组版块（2026-10-27 二轮改版）
   ------------------------------------------------------------
   「最新」混合流 + 类型 Tab 退役，改为按类型分组：每组 = 节头
   （复用 .kb-feed-head 既有样式与响应式规则）+ 4 张卡
   （2×2 铺满两列栅格）。此处只补组间距 —— `.kb-feed-group` 为
   新增独立类名，全文件无同名规则，置于文件末不参与
   「末尾规则压前段降级」的同源缺陷。
   ============================================================ */
.kb-feed .kb-feed-group + .kb-feed-group { margin-top: 26px; }
