Files
aurora-admin 5ee5d829a4
Regression / regression (push) Canceled after 0s
refactor(详情页+S8): 详情页减重(导航互斥/入口去重/i18n去重) + 品牌标识入库
本提交含两条并行工作线,因互相咬合(package.json scripts、regression.yml、
npm run build 链)无法按文件干净拆分,故合并为一次自洽提交。

## 详情页减重(本轮主任务:修复「AI 干太重」)

- 导航收敛:宽屏只用右侧目录、≤1200px 只用页内 sticky 导航,纯 CSS 媒体查询
  实现(不引入 JS 宽度监听)。此前两套导航同时可见,active 状态互相打架。
- 入口去重:标题区由「查看示例/在线测试/契约 JSON」三个减为「在线测试」一个;
  契约 JSON 归入实现资源;删除示例底部重复的「在线测试」。
- 示例工具栏:删除与目录锚点重复的示例下拉选择器;「全部展开代码」只在
  示例数 >1 时出现(103 个组件里 49 个仅 1 个示例,此前恒显示)。
- 重复文案:示例区两句同义导语合并为一句。
- 首页 CTA 由 5 个减为 2 个(浏览组件/快速开始),测试总览入口挂到已有的
  通过率统计卡上,不再另占 Hero 按钮。
- 统一详情取数:抽出 fetchDetail/loadDetail 作为 details/*.json 的唯一路径,
  FAQ 不再自行 fetch 一遍,与组件页共用缓存与失败兜底。

## i18n

- 删除 12 组重复键(含整段 FAQ 说明),字典 604 → 585 唯一键。
- 删除本次改动产生的 6 个死键。
- verify-i18n.mjs 新增 `unique dictionary keys` 断言:重复键在对象字面量里
  是静默的后值覆盖,此前无从发现;现由门禁拦住。

## 文档事实修正(实测为准)

- TESTING/CONTRIBUTING:79 → 103 组件;旧断言数改为回指 tests/report.json。
- PLATFORMS:移动端 108 文件/18 端 → 282 文件/47 端;契约 5 → 47;
  令牌 17 → 15;uni-app SFC 21 → 50。
- AGENTS:断言 1405/18 页 → 1464/103 页(PC)、807/47 页(移动端)。
- package.json:YOUR-ACCOUNT 占位 → gitea 实址与 kole-ui.mymoyu.top。

## 品牌标识(并行会话成果,一并入库)

- brand-mark.json 收归真源,build:brand 生成 favicon 与单色 SVG;
  PC 与移动端共用资产,verify:brand 24 条断言。
- regression.yml 增加 verify:brand 步骤。

## 门禁与验收

新增工具:verify-component-page.mjs(86 条真实浏览器断言,随详情页改造同步
更新为「只允许一套导航可见」)、verify-brand-mark.mjs、lib/i18n-dead-keys.mjs
(只读诊断)。

回归:PC 100%(1464/1464,103 页,N/A 50)· 移动端 100%(807/807,47 页)。
门禁:component-page 86 · i18n 17 · brand 24 · routes all · smoke all ·
theme OK · isolation 31 · nav all · examples 9 · api-docs 10 · mobile-docs 12。

已知未做:i18n 另有约 44 条历史死键(非本次产生),已记为 ROADMAP S8-P6;
顶栏与悬浮区的两个主题入口为刻意设计(verify-theme 断言其互斥),未删。
2026-09-22 23:56:05 +08:00

467 lines
24 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* Kole UI Mobile 文档站样式(site/m/ 专属)
自包含:不引用 site/style.css(那是 PC 文档站的样式),只依赖移动端令牌层。
令牌来源:.design_library/kole-ui-mobile/colors_and_type.css(@import PC 令牌 + --kole-m-*)。 */
* { box-sizing: border-box; }
body {
margin: 0;
font-family: var(--kole-font-family);
font-size: 14px;
line-height: 1.6;
color: var(--kole-color-text-body);
background: var(--kole-color-page-bg);
}
a { color: var(--kole-color-brand); text-decoration: none; }
a:hover { text-decoration: underline; }
/* ---- 顶栏(对齐 PC:60px 高 / 内容在容器内居中 / 激活项底部 2px 指示条)----
与 PC 的 .topbar 同一结构与顺序:logo(含副标题)+ 版本控件 + 主导航 + 主题模式。
区别只有容器宽度(PC 1440 / 本站 1180,与 .m-body 同宽,logo 与左栏左边缘对齐)
与高度的 60px 常量(PC 也用 60px)。 */
.m-top {
position: sticky;
top: 0;
z-index: 10;
height: 60px;
background: var(--kole-color-card-bg);
border-bottom: 1px solid var(--kole-color-border);
}
.m-top-inner {
max-width: 1180px;
margin: 0 auto;
height: 100%;
display: flex;
align-items: center;
gap: var(--kole-space-16);
padding: 0 var(--kole-space-24);
}
/* ---- 版本控件(PC .ver-picker 同款:可点下拉;清单拿不到时 data-single="1" 退回纯角标)---- */
.m-ver-picker { position: relative; flex-shrink: 0; }
.m-ver-trigger {
display: inline-flex; align-items: center; gap: 4px;
height: 22px; padding: 0 7px;
border: 1px solid transparent; border-radius: var(--kole-radius-small);
background: var(--kole-color-brand-bg);
color: var(--kole-color-brand);
font-family: var(--kole-font-family-num); font-size: 12px; font-weight: 500;
cursor: pointer; flex-shrink: 0;
transition: border-color .15s, background .15s, color .15s, box-shadow .15s;
}
.m-ver-trigger:hover { border-color: var(--kole-color-brand); }
.m-ver-trigger:focus-visible { outline: 2px solid var(--kole-color-focus-ring); outline-offset: 1px; }
.m-ver-trigger[aria-expanded="true"] {
border-color: var(--kole-color-brand);
box-shadow: 0 0 0 2px var(--kole-color-focus-ring);
}
.m-ver-caret { opacity: .75; transition: transform .18s ease; }
.m-ver-trigger[aria-expanded="true"] .m-ver-caret { transform: rotate(180deg); }
/* data-single="1" = 清单拿不到任何版本(未构建/未部署):退回纯角标观感,不留点不开的下拉 */
.m-ver-trigger[data-single="1"] { pointer-events: none; }
.m-ver-trigger[data-single="1"] .m-ver-caret { display: none; }
.m-ver-menu {
position: absolute; top: calc(100% + 8px); left: 0; z-index: 130;
width: min(216px, calc(100vw - 24px));
padding: 6px; display: flex; flex-direction: column; gap: 2px;
background: var(--kole-color-card-bg);
border: 1px solid var(--kole-color-border);
border-radius: var(--kole-radius-large);
box-shadow: var(--kole-shadow-high);
}
.m-ver-menu.hidden { display: none; }
.m-ver-menu-head {
padding: 3px 8px 7px; margin-bottom: 2px; border-bottom: 1px solid var(--kole-color-border);
color: var(--kole-color-text-secondary); font-size: 11px; line-height: 16px;
}
.m-ver-opt {
display: flex; align-items: center; gap: 8px;
width: 100%; min-height: 32px; padding: 0 8px;
border: 0; border-radius: var(--kole-radius-small);
background: transparent; color: var(--kole-color-text-body);
font: inherit; font-size: 13px; text-align: start; cursor: pointer;
}
.m-ver-opt:hover,
.m-ver-opt:focus-visible { background: var(--kole-color-brand-bg); color: var(--kole-color-brand); outline: none; }
.m-ver-opt[aria-selected="true"] { color: var(--kole-color-brand); font-weight: 600; }
.m-ver-opt-num { flex: 1; white-space: nowrap; font-family: var(--kole-font-family-num); }
.m-ver-opt-tag {
font-family: var(--kole-font-family-num); font-size: 10.5px; letter-spacing: .04em;
color: var(--kole-color-text-placeholder); white-space: nowrap;
}
.m-ver-opt[aria-selected="true"] .m-ver-opt-tag { color: var(--kole-color-brand); }
@media (prefers-reduced-motion: reduce) {
.m-ver-caret { transition: none; }
}
/* 顶栏导航:整栏高、激活项底部 2px 品牌指示条(PC .topnav a.active::after 同款) */
.m-nav {
margin-left: auto; display: flex; align-items: center; gap: var(--kole-space-8);
height: 100%; font-size: 14px;
}
.m-nav a {
position: relative;
display: inline-flex; align-items: center;
height: 100%; padding: 0 var(--kole-space-12);
color: var(--kole-color-text-body); text-decoration: none; white-space: nowrap;
}
.m-nav a:hover { color: var(--kole-color-brand); text-decoration: none; }
.m-nav a.active { color: var(--kole-color-brand); font-weight: 500; }
.m-nav a.active::after {
content: '';
position: absolute;
left: 12px; right: 12px; bottom: 0;
height: 2px;
background: var(--kole-color-brand);
border-radius: 1px 1px 0 0;
}
.m-shell { max-width: 1100px; margin: 0 auto; padding: var(--kole-space-24); }
.m-hero h1 { margin: 0 0 var(--kole-space-8); font-size: 26px; color: var(--kole-color-text-title); }
.m-hero p { margin: 0; color: var(--kole-color-text-secondary); }
.m-isolation {
margin: var(--kole-space-20) 0;
padding: var(--kole-space-16);
background: var(--kole-color-card-bg);
border: 1px solid var(--kole-color-border);
border-radius: var(--kole-radius-medium);
}
.m-isolation h2 { margin: 0 0 var(--kole-space-8); font-size: 15px; color: var(--kole-color-text-title); }
.m-isolation table { width: 100%; border-collapse: collapse; font-size: 13px; }
.m-isolation th, .m-isolation td { text-align: start; padding: 6px 10px; border-bottom: 1px solid var(--kole-color-border); }
.m-isolation th { color: var(--kole-color-text-secondary); font-weight: 500; }
.m-isolation code, .m-code { font-family: var(--kole-font-family-num); font-size: 12px; }
.m-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: var(--kole-space-16); margin-top: var(--kole-space-20); }
.m-card {
background: var(--kole-color-card-bg);
border: 1px solid var(--kole-color-border);
border-radius: var(--kole-radius-medium);
overflow: hidden;
display: flex;
flex-direction: column;
}
.m-card header { padding: var(--kole-space-12) var(--kole-space-16); border-bottom: 1px solid var(--kole-color-border); }
.m-card header .zh { font-size: 15px; color: var(--kole-color-text-title); }
.m-card header .en { font-family: var(--kole-font-family-num); font-size: 11px; color: var(--kole-color-text-secondary); }
/* 预览:以 320px 宽的设备帧展示真实演示页(iframe 即独立视口,fixed 元素落位正确) */
.m-card .preview { height: 260px; overflow: hidden; background: var(--kole-color-page-bg); }
.m-card .preview iframe { width: 320px; max-width: 100%; height: 560px; border: 0; display: block; transform: scale(.464); transform-origin: 0 0; }
.m-card footer { margin-top: auto; padding: var(--kole-space-8) var(--kole-space-16); border-top: 1px solid var(--kole-color-border); display: flex; gap: var(--kole-space-12); font-size: 12px; }
/* ---- 窄屏(≤720px)----
实测(2026-09-20,375px):本站在小屏上横向溢出 128px —— 元凶是表格里**不可断行的长路径**
(`.design_library/kole-ui-mobile/components/` 这类 token 把表格最小宽度顶到 462px),
以及组件页设备帧 iframe 固定 375px 宽。一个讲移动端的文档站自己在手机上横向滚动说不过去,
故:① 表格单元格允许长 token 断行;② iframe 取 min(设计宽, 容器宽);
③ 顶栏允许换行并把副导航收起来。 */
.m-table th, .m-table td, .m-isolation th, .m-isolation td { overflow-wrap: anywhere; word-break: break-word; }
.m-table code, .m-isolation code, .m-code { overflow-wrap: anywhere; }
@media (max-width: 720px) {
.m-top { height: auto; min-height: 60px; }
.m-top-inner { flex-wrap: wrap; padding: var(--kole-space-8) var(--kole-space-16); gap: var(--kole-space-8); row-gap: 6px; }
.m-nav { margin-left: 0; width: 100%; order: 3; gap: var(--kole-space-12); }
.m-shell { padding: var(--kole-space-16); }
.m-hero h1 { font-size: 22px; }
.m-grid { grid-template-columns: 1fr; }
}
.m-block { margin: var(--kole-space-20) 0; }
.m-block h2 { font-size: 16px; margin: 0 0 var(--kole-space-8); color: var(--kole-color-text-title); }
.m-block ul { margin: 0; padding-inline-start: 18px; }
.m-block li { margin: 2px 0; }
.m-table { width: 100%; border-collapse: collapse; font-size: 13px; background: var(--kole-color-card-bg); border: 1px solid var(--kole-color-border); border-radius: var(--kole-radius-medium); overflow: hidden; }
.m-table th, .m-table td { text-align: start; padding: 8px 12px; border-bottom: 1px solid var(--kole-color-border); vertical-align: top; }
.m-table th { background: var(--kole-color-table-header-bg); color: var(--kole-color-text-secondary); font-weight: 500; }
.m-table tr:last-child td { border-bottom: 0; }
.m-table code { font-family: var(--kole-font-family-num); font-size: 12px; color: var(--kole-color-text-title); }
.m-pill { display: inline-flex; align-items: center; height: 22px; padding: 0 10px; border-radius: var(--kole-radius-small); font-size: 12px; background: var(--kole-color-table-header-bg); color: var(--kole-color-text-secondary); font-family: var(--kole-font-family-num); }
.m-pill.brand { background: var(--kole-color-brand-bg); color: var(--kole-color-brand); }
.m-pill.warn { background: var(--kole-color-tag-green-bg); color: var(--kole-color-success); }
.m-stage { border: 1px solid var(--kole-color-border); border-radius: var(--kole-radius-medium); background: var(--kole-color-page-bg); padding: var(--kole-space-16) 0; }
/* 设备帧按设计宽 375px 展示;容器更窄时收缩(否则手机上看组件文档页会横向滚动,实测 375px 溢出 17px、320px 溢出 72px) */
.m-stage iframe { width: min(375px, 100%); height: 640px; margin: 0 auto; border: 0; display: block; background: var(--kole-color-card-bg); }
.m-ends { display: flex; flex-wrap: wrap; gap: var(--kole-space-8); }
.m-ends a {
display: inline-flex; align-items: center; gap: 6px; height: 30px; padding: 0 12px;
border: 1px solid var(--kole-color-border); border-radius: var(--kole-radius-base);
background: var(--kole-color-card-bg); color: var(--kole-color-text-body); font-size: 13px;
}
.m-ends a:hover { border-color: var(--kole-color-brand); color: var(--kole-color-brand); text-decoration: none; }
.m-foot { margin-top: var(--kole-space-32); padding-top: var(--kole-space-16); border-top: 1px solid var(--kole-color-border); color: var(--kole-color-text-secondary); font-size: 12px; }
/* ============================================================
左栏 + 主区两列布局(2026-09-20:补全左侧导航)
左栏用 <details open> 承载:桌面恒定展开(summary 隐藏、忽略收起语义),
≤1000px 变成可折叠面板 —— 静态页不需要 JS 同步状态。
主区必须 min-width:0:否则内部表格的 min-content 会把整个网格顶宽。
============================================================ */
.m-body {
max-width: 1180px;
margin: 0 auto;
padding: var(--kole-space-24) var(--kole-space-24) 0;
display: grid;
grid-template-columns: 236px minmax(0, 1fr);
gap: var(--kole-space-24);
align-items: start;
}
.m-main { min-width: 0; }
/* sticky 偏移 = 顶栏高(60px)+ 间距 16px,和 .m-body 的上边距同源;顶栏改高时这里必须跟着改 */
.m-side { position: sticky; top: 76px; max-height: calc(100vh - 100px); overflow-y: auto; overscroll-behavior: contain; }
.m-side > summary { display: none; }
.m-side:not([open]) > nav { display: block; } /* 桌面始终展开 */
.m-side nav { display: flex; flex-direction: column; gap: 2px; }
.m-side-section {
display: flex; align-items: center; gap: 6px;
margin: var(--kole-space-12) 0 4px;
padding: 0 10px;
font-size: 12px; color: var(--kole-color-text-secondary);
}
.m-side-section:first-child { margin-top: 0; }
.m-side-section .cnt {
margin-left: auto; font-family: var(--kole-font-family-num); font-size: 11px;
color: var(--kole-color-text-placeholder);
}
.m-side-group {
display: flex; align-items: center; gap: 6px;
margin: var(--kole-space-8) 0 2px; padding: 0 10px;
font-size: 11.5px; color: var(--kole-color-text-placeholder);
}
.m-side-group .cnt { margin-left: auto; font-family: var(--kole-font-family-num); font-size: 11px; }
.m-side-link {
display: flex; align-items: center; gap: 8px;
padding: 6px 10px; border-radius: var(--kole-radius-base);
color: var(--kole-color-text-body); font-size: 13px; text-decoration: none;
transition: background-color .15s, color .15s;
}
.m-side-link:hover { background: var(--kole-color-table-header-bg); color: var(--kole-color-brand); text-decoration: none; }
.m-side-link:focus-visible { outline: 2px solid var(--kole-color-focus-ring); outline-offset: -2px; }
.m-side-link.is-active { background: var(--kole-color-brand-bg); color: var(--kole-color-brand); font-weight: 500; }
.m-side-link em {
margin-left: auto; font-family: var(--kole-font-family-num); font-style: normal;
font-size: 11px; color: var(--kole-color-text-placeholder);
}
.m-side-link.is-active em { color: var(--kole-color-brand); opacity: .75; }
@media (max-width: 1000px) {
.m-body { grid-template-columns: minmax(0, 1fr); padding: var(--kole-space-16) var(--kole-space-16) 0; gap: var(--kole-space-16); }
.m-side {
position: static; max-height: none;
border: 1px solid var(--kole-color-border); border-radius: var(--kole-radius-medium);
background: var(--kole-color-card-bg); padding: 0 var(--kole-space-8) var(--kole-space-8);
}
.m-side > summary {
display: flex; align-items: center; gap: 8px;
padding: 10px 8px; cursor: pointer; font-size: 14px; color: var(--kole-color-text-title);
}
.m-side > summary .cur { margin-left: auto; font-size: 12px; color: var(--kole-color-text-secondary); }
.m-side:not([open]) > nav { display: none; }
.m-side-section:first-child { margin-top: var(--kole-space-8); }
}
/* ---- 代码块与复制按钮 ---- */
.m-code { margin: var(--kole-space-12) 0; border: 1px solid var(--kole-color-border); border-radius: var(--kole-radius-medium); overflow: hidden; background: var(--kole-color-card-bg); }
.m-code-head {
display: flex; align-items: center; gap: 8px;
padding: 6px 10px; background: var(--kole-color-table-header-bg);
border-bottom: 1px solid var(--kole-color-border);
font-size: 12px; color: var(--kole-color-text-secondary);
}
.m-code-head > span:first-child { flex: 1; font-family: var(--kole-font-family-num); }
.m-copy {
height: 24px; padding: 0 10px;
border: 1px solid var(--kole-color-border); border-radius: var(--kole-radius-small);
background: var(--kole-color-card-bg); color: var(--kole-color-text-body);
font-family: inherit; font-size: 12px; cursor: pointer;
transition: border-color .15s, color .15s, background-color .15s;
}
.m-copy:hover { border-color: var(--kole-color-brand); color: var(--kole-color-brand); }
.m-copy:focus-visible { outline: 2px solid var(--kole-color-focus-ring); outline-offset: 1px; }
.m-copy.is-done { background: var(--kole-color-brand); border-color: var(--kole-color-brand); color: var(--kole-color-text-inverse); }
.m-code pre { margin: 0; padding: var(--kole-space-12); overflow: auto; max-height: 460px; background: var(--kole-color-card-bg); }
.m-code pre code {
font-family: var(--kole-font-family-num); font-size: 12px; line-height: 1.7;
color: var(--kole-color-text-body); white-space: pre; tab-size: 2;
}
/* ---- 列表 / 提示 / 令牌胶囊 ---- */
.m-steps { margin: 0; padding-inline-start: 20px; display: flex; flex-direction: column; gap: 6px; font-size: 13px; }
.m-steps li::marker { color: var(--kole-color-brand); font-family: var(--kole-font-family-num); }
.m-note { margin: 6px 0 0; font-size: 12px; color: var(--kole-color-text-secondary); }
.m-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.m-chip {
font-family: var(--kole-font-family-num); font-size: 11.5px; line-height: 18px;
padding: 2px 8px; border-radius: 10px;
background: var(--kole-color-table-header-bg); color: var(--kole-color-text-body);
}
.m-chip.m { background: var(--kole-color-brand-bg); color: var(--kole-color-brand); }
.m-chip.inherit { background: var(--kole-color-tag-green-bg); color: var(--kole-color-success); }
/* ---- 组件页细节 ---- */
.m-sub { margin: 0 0 var(--kole-space-8); font-size: 13.5px; color: var(--kole-color-text-secondary); }
.m-cls {
font-family: var(--kole-font-family-num); font-size: 11.5px;
padding: 1px 6px; border-radius: var(--kole-radius-small);
background: var(--kole-color-brand-bg); color: var(--kole-color-brand);
}
.m-none { color: var(--kole-color-text-placeholder); }
.m-two { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: var(--kole-space-16); }
.m-details { border: 1px solid var(--kole-color-border); border-radius: var(--kole-radius-medium); background: var(--kole-color-card-bg); overflow: hidden; }
.m-details > summary { padding: 8px 12px; cursor: pointer; font-size: 13px; color: var(--kole-color-text-title); }
.m-details[open] > summary { border-bottom: 1px solid var(--kole-color-border); }
.m-details .m-code { margin: 0; border: 0; border-radius: 0; }
.m-status { display: inline-flex; align-items: center; gap: 6px; height: 22px; padding: 0 10px; border-radius: var(--kole-radius-small); font-size: 12px; font-family: var(--kole-font-family-num); background: var(--kole-color-table-header-bg); color: var(--kole-color-text-secondary); }
.m-status.pass { background: var(--kole-color-tag-green-bg); color: var(--kole-color-success); }
.m-status.fail { background: rgba(245,34,45,.12); color: var(--kole-color-error); }
/* ---- 演示块(TDesign 范式:每个演示 = 标题 + 说明 + 预览 + 代码)---- */
.m-demo-group {
margin: var(--kole-space-20) 0 var(--kole-space-8);
padding-left: 8px;
border-left: 3px solid var(--kole-color-brand);
font-size: 15px;
font-weight: 600;
color: var(--kole-color-text-title);
}
.m-demo { margin: 0 0 var(--kole-space-20); }
.m-demo-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.m-demo-title { font-size: 14px; font-weight: 500; color: var(--kole-color-text-title); }
.m-demo-desc { margin: 4px 0 var(--kole-space-8); font-size: 13px; color: var(--kole-color-text-secondary); }
.m-demo-stage {
border: 1px solid var(--kole-color-border);
border-radius: var(--kole-radius-medium);
background: var(--kole-color-page-bg);
padding: var(--kole-space-12) 0;
}
/* 单演示预览:375 宽设备帧、高度按单块内容给(比整页 640 矮),容器更窄时收缩 */
.m-demo-stage iframe {
width: min(375px, 100%);
height: 260px;
margin: 0 auto;
border: 0;
display: block;
background: var(--kole-color-card-bg);
}
.m-demo .m-details { margin-top: var(--kole-space-8); }
/* ============================================================
顶栏(2026-09-20:与 PC 顶栏同结构 —— logo + 版本下拉 + 主导航 + 主题模式)
左栏另有三段式「平台 / 开发指南 / 组件 N」,与 PC 侧栏同款。
PC 特有的三件未搬:搜索框(103 个组件才需要)、技术栈选择器(移动端 6 端同页展示)、
语言选择器(移动端无 i18n 字典)。
平台切换不在顶栏 —— 顶栏那份与左栏「平台」组重复(实测两条链接同指 ../index.html),
已删;两端现在都只有左栏一处入口。顶栏骨架样式见文件顶部 .m-top 一节。
============================================================ */
.m-logo { display: inline-flex; align-items: center; gap: 8px; text-decoration: none; color: var(--kole-color-text-title); flex-shrink: 0; }
.m-logo-mark {
width: 26px; height: 26px; border-radius: var(--kole-radius-large); flex-shrink: 0;
background: var(--kole-color-brand); color: var(--kole-color-text-inverse);
display: inline-flex; align-items: center; justify-content: center;
}
/* 移动端文档站复用 brand-mark.json 生成的单色 SVG mask;尺寸由盒子控制,
不再在生成器和静态样式里各维护一份几何路径。 */
.m-logo-mark[data-brand-mark="mono"]::before {
content: '';
width: 17px; height: 17px;
display: block;
background: currentColor;
-webkit-mask: url('../assets/kole-mark-mono.svg') center / contain no-repeat;
mask: url('../assets/kole-mark-mono.svg') center / contain no-repeat;
}
.m-logo-mark svg { display: none; }
.m-logo-text { font-size: 15px; font-weight: 600; white-space: nowrap; }
.m-logo-text em { font-style: normal; font-weight: 400; font-size: 12px; color: var(--kole-color-text-secondary); margin-left: 6px; }
.m-mode { position: relative; flex-shrink: 0; }
.m-mode-trigger {
height: 34px; padding: 0 10px; display: inline-flex; align-items: center; gap: 6px;
border: 1px solid var(--kole-color-border); border-radius: var(--kole-radius-base);
background: var(--kole-color-card-bg); color: var(--kole-color-text-body);
font-family: inherit; font-size: 13px; cursor: pointer;
transition: border-color .15s, color .15s, box-shadow .15s;
}
.m-mode-trigger:hover { border-color: var(--kole-color-brand); color: var(--kole-color-brand); }
.m-mode-trigger:focus-visible { outline: 2px solid var(--kole-color-focus-ring); outline-offset: 1px; }
.m-mode-trigger[aria-expanded="true"] {
border-color: var(--kole-color-brand); color: var(--kole-color-brand);
box-shadow: 0 0 0 2px var(--kole-color-focus-ring);
}
.m-mode-caret { opacity: .6; }
/* 三态图标(PC .theme-icon 同款):带浅色底衬,标识「这是主题入口」。
显隐由 JS 控制(applyMode)—— 显式选择时按时态给图标,自动模式下恒为显示器图标。 */
.m-mode-icon {
flex: 0 0 auto;
border-radius: var(--kole-radius-small);
background: var(--kole-color-table-header-bg);
transition: background .16s ease;
}
.m-mode-trigger:hover .m-mode-icon,
.m-mode-trigger[aria-expanded="true"] .m-mode-icon { background: var(--kole-color-brand-bg); }
.m-menu {
position: absolute; top: calc(100% + 8px); right: 0; z-index: 120;
width: 148px; padding: 6px; display: flex; flex-direction: column; gap: 2px;
background: var(--kole-color-card-bg); border: 1px solid var(--kole-color-border);
border-radius: var(--kole-radius-large); box-shadow: var(--kole-shadow-high);
}
.m-menu.hidden { display: none; }
.m-menu-head {
padding: 3px 8px 7px; margin-bottom: 2px; border-bottom: 1px solid var(--kole-color-border);
color: var(--kole-color-text-secondary); font-size: 11px;
}
.m-menu-opt {
display: flex; align-items: center; width: 100%; min-height: 32px; padding: 0 8px;
border: 0; border-radius: var(--kole-radius-small); background: transparent;
color: var(--kole-color-text-body); font-family: inherit; font-size: 13px; text-align: start; cursor: pointer;
}
.m-menu-opt:hover, .m-menu-opt:focus-visible { background: var(--kole-color-brand-bg); color: var(--kole-color-brand); outline: none; }
.m-menu-opt[aria-selected="true"] { color: var(--kole-color-brand); font-weight: 600; }
/* 侧栏「平台」组:两行 + 「当前」角标(PC 侧栏同款) */
.m-side-platform {
height: auto; min-height: 46px; flex-direction: column; align-items: flex-start;
justify-content: center; gap: 2px; padding: 6px 10px;
}
.m-side-platform .sp-top { display: flex; align-items: center; gap: 6px; }
.m-side-platform .sp-badge {
height: 16px; padding: 0 6px; border-radius: 8px;
background: var(--kole-color-brand); color: var(--kole-color-text-inverse);
font-size: 10px; line-height: 16px;
}
.m-side-platform .sp-sub {
font-size: 11px; line-height: 15px; color: var(--kole-color-text-placeholder);
white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%;
}
.m-side-platform:hover .sp-sub { color: var(--kole-color-text-secondary); }
/* 窄屏:副导航独占一行;logo 副标题让位。版本控件在最窄档整块收起 ——
只藏文字会留下一个空箭头按钮(视觉上是「点不开的下拉」,与 PC 的
data-single="1" 语义不同),不如整块收起。 */
@media (max-width: 820px) {
.m-logo-text em { display: none; }
}
@media (max-width: 720px) {
.m-nav { margin-left: 0; width: 100%; order: 4; gap: var(--kole-space-12); overflow-x: auto; }
}
@media (max-width: 480px) {
.m-ver-picker { display: none; }
}
/* 正文里的长 token 必须能断行:更新日志页从 CHANGELOG.md 提取的正文含 64 位哈希、
长路径这类不可断词的串,实测会让页面在 375px 溢出 88px / 414px 溢出 49px。
表格单元格此前已有同类规则(见 .m-table th/td),这里补齐正文与列表。 */
.m-sub, .m-note, .m-steps li, .m-block p, .m-demo-desc { overflow-wrap: anywhere; }
.m-sub code, .m-note code, .m-steps li code, .m-block p code, .m-demo-desc code { overflow-wrap: anywhere; }