Files
aurora-admin/.design_library/kole-ui-mobile/components/mobile-sticky.json
T
aurora-admin f1fbfc2ddb
Regression / regression (push) Canceled after 0s
feat(品牌标识): 几何 K 图标(favicon/顶栏标记/theme-color) + 并行会话成果入库
## 品牌标识(本次会话)

起因:品牌此前没有任何图形标识 —— 唯一 favicon 是内联 data-URI 里的字母「A」,
那是 v2.0.0「Aurora Admin → Kole UI」改名漏掉的一处(PC 顶栏也是「A」,
移动端站已是「K」;移动端文档站则完全没有 favicon)。

- 几何:24 网格三个互不接触的笔画(竖 + 两斜),圆头描边;
  描边 2.25 → 16px 标签页尺寸下正好 1.5px = 规范原文「描边1.5px」
- 取色分两套(刻意):favicon 硬编码品牌蓝/白(渲染在浏览器标签栏,不继承 kole-dark);
  顶栏标记走 currentColor(实测暗色下自动转 rgb(20,22,28))
- 新增 theme-color 双条(light #FFFFFF / dark #1C1F26,取 --kole-color-card-bg)
- 修 site/app.js hero 标语 KOLE ADMIN → KOLE UI(改名变形残留)
- 移动端 7 个模板补 favicon(此前计数 0)

验收:门禁 9 条全 OK(site-routing/site-routes/mobile-docs/mobile-site/isolation/
theme/nav/i18n/icons);PC 回归 1464/1464 · 移动端 807/807,各连跑 8 次一致;
两端 favicon 405 字节逐字节一致;PC 站控制台错误 1→0。

## 并行会话成果(本次一并入库)

- 图标系统:2576 图标(TDesign/Element Plus,MIT)+ 11 端注入 + 5 个构建门禁工具
  + IconPreview 预览页 + ICON-SPEC.md 冻结规格
- 移动端平台:47 组件 × 6 端 + 文档站 53 页 + 隔离门禁
- PC 组件:103 个大后台组件 / 组件11 批次
- uni-app:PC 端试点 + 移动端端实现 + 真实编译验证

## 工程

- .gitignore 补 .scratch/ 与 .zcode-preexisting-*.txt(会话中间产物,实测 9.1MB,不入库)
- CHANGELOG 补品牌标识条目
- ROADMAP 登 S8-P4(品牌标识任务包 + og:image/apple-touch-icon 未做部分)
2026-09-21 10:05:48 +08:00

243 lines
8.0 KiB
JSON
Raw 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.
{
"schemaVersion": 1,
"sourceKind": "authored-spec",
"provenance": "authored-in-repo",
"specFile": "spec/移动端规格.md",
"specSection": "39 · 吸顶容器 Sticky",
"confidence": "high",
"slug": "mobile-sticky",
"name": "吸顶容器 Sticky",
"semanticTypeCandidates": [
"sticky",
"affix",
"section-header"
],
"variantDimensions": [
{
"name": "position",
"values": [
"top",
"bottom"
]
},
{
"name": "safeArea",
"values": [
"false",
"true"
]
},
{
"name": "shadow",
"values": [
"false",
"true"
]
}
],
"representativeVariants": [
{
"position": "top",
"safeArea": "false",
"shadow": "false",
"label": "基础吸顶(列表标题条)"
},
{
"position": "top",
"safeArea": "false",
"shadow": "true",
"label": "吸顶后出阴影(与内容分层)"
},
{
"position": "top",
"safeArea": "true",
"shadow": "false",
"label": "安全区叠加(刘海屏)"
},
{
"position": "bottom",
"safeArea": "false",
"shadow": "true",
"label": "贴底吸顶(合计条)"
}
],
"anatomy": {
"sticky": "根元素,就是滚动内容流里的那一行(sticky 不脱离文档流,因此不需要占位元素)",
"title": "标题文字,单行省略,占满剩余宽度",
"extra": "右侧附加说明(数量、合计等),可选",
"action": "右侧动作按钮(原生 button,热区 44px),可选"
},
"structurePatterns": {
"position": "top 贴顶(最常用)/ bottom 贴底(合计条一类)",
"safeArea": "false 只用偏移量 / true 再叠加刘海或底部横条安全区",
"shadow": "false 恒定无投影 / true 仅吸顶后才有投影",
"状态类": "is-stuck 已贴合边缘(由宿主按滚动位置切换)"
},
"usageHints": [
"让一段内容在滚动时贴住滚动容器的边缘保持可见(列表标题、分组、购物车合计条)",
"用 CSS 原生 position: sticky —— 触屏惯性滚动下 JS 的 fixed 方案会抖动,且脱离文档流后要补占位元素",
"贴合位置由组件级变量 --kole-m-sticky-offset 决定,默认等于导航栏高度",
"组件本身不监听滚动:is-stuck 由宿主按滚动位置切换",
"吸顶不改变文档顺序:读屏与键盘的遍历顺序与未吸顶时完全一致"
],
"doNotInvent": [
"吸顶触发的位移/缩放动画(规格只定义了贴合,没有定义形态演变)",
"多个吸顶条的层叠顺序与相互推挤(层叠上下文规则由宿主决定)",
"进入/离开视口时的埋点事件与曝光统计",
"拖拽排序与吸附"
],
"unknowns": [
"吸顶判定是否应由组件内部提供一个可选的滚动监听辅助(当前完全交给宿主)",
"是否需要在吸顶时自动隐藏相邻内容(当前不做,靠宿主布局)",
"贴底形态在内容不足一屏时是否应始终贴底"
],
"interaction": [
"贴合位置由组件级变量 --kole-m-sticky-offset 决定,业务侧覆盖它即可适配自有导航",
"safeArea=true 时偏移叠加 --kole-m-safe-top / --kole-m-safe-bottom;env() 不可用时为 0px",
"组件本身不监听滚动:is-stuck 由宿主按滚动位置切换",
"触屏热区:整条高度 ≥ 44px;右侧动作按钮自身撑满 44px",
"position=bottom 时吸顶后的描边换到上边"
],
"accessibility": [
"根是普通容器,标题文字正常参与读屏朗读;is-stuck 是纯视觉增强,不添加任何 aria-*",
"右侧动作是原生 button,名称由可见文字承担;装饰性图形必须 aria-hidden=\"true\"",
"吸顶不改变文档顺序:读屏与键盘的遍历顺序与未吸顶时完全一致",
"prefers-reduced-motion 下不引入任何过渡"
],
"api": {
"source": "implementation",
"note": "props / events / slots 为 6 端实现的公共接口(说明文字取自规格对应小节)。字段名与各端源码逐名核对:node tools/verify-mobile-docs.mjs",
"requiredNote": "「必传」按严格定义:实现里**没有默认值**时才为 Y(本门禁逐条核对 props 与各端源码的默认值,防止契约与实现脱节)。",
"props": [
{
"name": "position",
"type": "'top' | 'bottom'",
"default": "'top'",
"desc": "变体 position:贴顶还是贴底(规格 §39.3)",
"required": false
},
{
"name": "safeArea",
"type": "boolean",
"default": "false",
"desc": "变体 safeArea:偏移叠加刘海 / 底部横条安全区(规格 §39.3)",
"required": false
},
{
"name": "shadow",
"type": "boolean",
"default": "false",
"desc": "变体 shadow:仅吸顶后才有投影(规格 §39.3)",
"required": false
},
{
"name": "stuck",
"type": "boolean",
"default": "false",
"desc": "状态 stuck:是否已贴合边缘,由宿主按滚动位置传入(规格 §39.4)",
"required": false
},
{
"name": "title",
"type": "string",
"default": "''",
"desc": "标题文字,单行省略(规格 §39.2 title)",
"required": false
},
{
"name": "actionText",
"type": "string",
"default": "''",
"desc": "右侧动作按钮文字;为空时不渲染按钮(规格 §39.2 action)",
"required": false
}
],
"events": [
{
"name": "action",
"params": "—",
"desc": "点击右侧动作按钮时触发(规格 §39.5)"
}
],
"slots": [
{
"name": "default",
"desc": "额外的栏内内容(放在标题与动作之间)"
}
]
},
"variantClasses": {
"position": {
"top": [
".kole-m-sticky--top"
],
"bottom": [
".kole-m-sticky--bottom"
]
},
"safeArea": {
"false": [],
"true": [
".kole-m-sticky--safe"
]
},
"shadow": {
"false": [],
"true": [
".kole-m-sticky--shadow"
]
}
},
"demos": [
{
"id": "basic",
"group": "01 组件类型",
"title": "基础吸顶",
"desc": "position: sticky 的默认形态:在框内向下滚动时标题条贴住框顶,不脱离文档流因此无需补占位元素。",
"variant": "position=top"
},
{
"id": "shadow",
"group": "01 组件类型",
"title": "吸顶后出阴影",
"desc": "shadow=true:未吸顶时与内容齐平,贴合后才出现投影,用形态而不是颜色表达「已经贴住了」。",
"variant": "shadow=true"
},
{
"id": "safe-area",
"group": "01 组件类型",
"title": "安全区叠加",
"desc": "safeArea=true:偏移量再叠加刘海高度;无刘海设备上安全区为 0px,表现与不带 safe 一致。",
"variant": "safeArea=true"
},
{
"id": "bottom",
"group": "02 组件状态",
"title": "贴底吸顶",
"desc": "position=bottom:内容不足一屏时贴住容器底,常用于订单合计条;吸顶后描边换到上边。",
"variant": "position=bottom"
},
{
"id": "action",
"group": "02 组件状态",
"title": "带动作",
"desc": "右侧动作是原生 button、热区 44px;点击回传 action,具体做什么由宿主决定。",
"variant": "actionText 非空"
}
],
"related": [
{
"slug": "navbar",
"why": "页面级固定导航用导航栏(fixed 且带安全区与返回),区块内的贴合才用吸顶容器"
},
{
"slug": "cell",
"why": "吸顶条下面承载的列表项用单元格,吸顶容器只负责那一行的贴合行为"
},
{
"slug": "mobile-list",
"why": "需要分组标题列表时用列表组件,而不是给每一行都套一个吸顶容器"
}
]
}