Regression / regression (push) Canceled after 0s
本提交含两条并行工作线,因互相咬合(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 断言其互斥),未删。
467 lines
24 KiB
CSS
467 lines
24 KiB
CSS
/* 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; }
|