Files
aurora-admin/.design_library/kole-ui-mobile/components/mobile-cascader.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

279 lines
9.7 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": "44 · 级联选择器 Cascader",
"confidence": "high",
"slug": "mobile-cascader",
"name": "级联选择器 Cascader",
"semanticTypeCandidates": [
"cascader",
"tree-select",
"region-picker"
],
"variantDimensions": [
{
"name": "mode",
"values": [
"panel",
"popup"
]
},
{
"name": "showPath",
"values": [
"true",
"false"
]
},
{
"name": "round",
"values": [
"false",
"true"
]
}
],
"representativeVariants": [
{
"mode": "panel",
"showPath": "true",
"round": "false",
"label": "内嵌面板(页面内逐级选择)"
},
{
"mode": "popup",
"showPath": "true",
"round": "true",
"label": "底部浮层(带遮罩与确定取消)"
},
{
"mode": "panel",
"showPath": "false",
"round": "false",
"label": "不显示路径条(层级少时省一行高度)"
}
],
"anatomy": {
"cascader": "根元素,mode=panel 时内嵌在页面里,mode=popup 时是底部浮层",
"mask": "遮罩(仅 mode=popup),点击关闭",
"cascader__header": "取消 / 标题 / 确定三格(仅 mode=popup)",
"cascader__path": "路径条,按已选深度渲染;除末位外都可点,点了回退到该级",
"cascader__panel": "选项区,role=listbox + aria-label 说明当前在选第几级",
"cascader__option": "单个选项,role=option + aria-selected;有下级显示箭头,叶子显示勾号"
},
"structurePatterns": {
"mode": "panel(内嵌在页面里)/ popup(底部浮层,自带遮罩与确定取消)",
"showPath": "true(显示路径条,可回退)/ false(不显示,层级少的场景省一行高度)",
"round": "false(直角)/ true(浮层靠内容一侧切圆角)"
},
"usageHints": [
"在有层级关系的选项里逐级选到末级(省 → 市 → 区、品类 → 子品类 → SKU)",
"移动端一次只展示当前一层,已选路径收进上方路径条,靠路径条回退而不是靠「上一级」按钮",
"点某一级后下一级选项随之变化:面板始终只渲染当前一层,选择即下钻",
"点路径条里的上级可回退:回退到该级并重新展示它的下一级;末位是「你在这里」的锚点,不可点",
"级数不写死:路径条按已选深度渲染,两级与四级用同一份实现",
"选项行高与路径条各项热区均不小于 44px"
],
"doNotInvent": [
"层级数据源(由宿主传入 options 树,本组件不发明省市区库)",
"搜索定位某级选项(那需要把整棵树拍平,是独立的检索组件)",
"异步逐级加载的占位与重试流程",
"多选(一次选多条路径)"
],
"unknowns": [
"路径很长时路径条是折行还是横向滚动(当前折行,四级以上会占两行)",
"叶子被选中后是否要自动收起浮层(当前不自动收,等宿主决定)",
"是否要保留「上一级」按钮作为路径条之外的第二种回退入口"
],
"interaction": [
"点某一级后下一级选项随之变化:面板始终只渲染当前一层,选择即下钻",
"点路径条里的上级可回退:回退到该级并重新展示它的下一级;末位是「你在这里」的锚点,不可点",
"级数不写死:路径条按已选深度渲染,两级与四级用同一份实现",
"点到叶子结点后再点同级另一项,会截断更深的层级(改选不会留下旧的深层残留)",
"选项行高与路径条各项热区均不小于 44px;选项区滚动容器 -webkit-overflow-scrolling: touch"
],
"accessibility": [
"mode=panel 根元素 role=\"group\" + aria-label;mode=popup 根元素 role=\"dialog\" + aria-modal=\"true\"",
"选项区 role=\"listbox\",aria-label 随层级变化(如「级联选项 · 城市」),读屏能播报当前在第几级",
"选项 role=\"option\" + aria-selected;禁用项写 aria-disabled=\"true\"",
"路径条末位写 aria-current=\"true\",读屏播报「当前项」",
"路径条每一项是原生 button(键盘可达),末位用 disabled 让键盘跳过"
],
"api": {
"source": "implementation",
"note": "props / events / slots 为 6 端实现的公共接口(说明文字取自规格对应小节)。字段名与各端源码逐名核对:node tools/verify-mobile-docs.mjs",
"requiredNote": "「必传」按严格定义:实现里**没有默认值**时才为 Y(本门禁逐条核对 props 与各端源码的默认值,防止契约与实现脱节)。",
"props": [
{
"name": "mode",
"type": "'panel' | 'popup'",
"default": "'panel'",
"desc": "变体 mode:panel 内嵌在页面里,popup 是底部浮层(规格 §44.3)",
"required": false
},
{
"name": "round",
"type": "boolean",
"default": "false",
"desc": "变体 round:浮层靠内容一侧是否切圆角(规格 §44.3)",
"required": false
},
{
"name": "showPath",
"type": "boolean",
"default": "true",
"desc": "变体 showPath:是否显示路径条(规格 §44.3)",
"required": false
},
{
"name": "open",
"type": "boolean",
"default": "false",
"desc": "状态 open:mode=popup 时浮层是否展开(规格 §44.4)",
"required": false
},
{
"name": "closeOnMask",
"type": "boolean",
"default": "true",
"desc": "遮罩点击是否关闭(规格 §44.5)",
"required": false
},
{
"name": "value",
"type": "Array<string>",
"default": "[]",
"desc": "当前选中路径,从根到当前级的 value 序列(规格 §44.6)",
"required": false
},
{
"name": "options",
"type": "Array<string | { label: string, value: string, disabled?: boolean, children?: Array }>",
"default": "[]",
"desc": "层级数据树(宿主提供,本组件不发明省市区库)(规格 §44.7)",
"required": false
},
{
"name": "disabled",
"type": "boolean",
"default": "false",
"desc": "状态 disabled:整块置灰且不响应(规格 §44.4)",
"required": false
},
{
"name": "title",
"type": "string",
"default": "''",
"desc": "浮层标题(空串时用默认「选择地区」)(规格 §44.2 cascader__header)",
"required": false
},
{
"name": "label",
"type": "string",
"default": "'级联选项'",
"desc": "选项区 aria-label 的前缀,读屏靠它知道这组在选什么(规格 §44.6)",
"required": false
}
],
"events": [
{
"name": "change",
"params": "value: Array<string>",
"desc": "路径变化时触发(下钻或回退),回传从根到当前级的 value 序列(规格 §44.5)"
},
{
"name": "confirm",
"params": "value: Array<string>",
"desc": "mode=popup 时点击确定触发(规格 §44.5)"
},
{
"name": "close",
"params": "—",
"desc": "mode=popup 时点击取消或遮罩(closeOnMask=true)触发(规格 §44.5)"
}
],
"slots": [
{
"name": "default",
"desc": "自定义内容(追加在面板之前,常见用法是放触发器)"
}
]
},
"variantClasses": {
"mode": {
"panel": [
".kole-m-cascader--panel"
],
"popup": [
".kole-m-cascader--popup"
]
},
"showPath": {
"true": [],
"false": [
".kole-m-cascader--no-path"
]
},
"round": {
"false": [],
"true": [
".kole-m-cascader--round"
]
}
},
"demos": [
{
"id": "levels",
"group": "01 组件类型",
"title": "逐级下钻",
"desc": "点省份后下一级换成城市:面板只渲染当前一层,避免 375px 下横向挤压。",
"variant": "mode=panel"
},
{
"id": "popup",
"group": "01 组件类型",
"title": "底部浮层",
"desc": "mode=popup:自带遮罩与确定取消,遮罩点击关闭。",
"variant": "mode=popup"
},
{
"id": "back",
"group": "02 组件状态",
"title": "回退上一级",
"desc": "点路径条里的上级即退回该级,重新展示它的下一级;末位是「你在这里」的锚点。",
"variant": "状态 selected(路径条回退)"
},
{
"id": "states",
"group": "02 组件状态",
"title": "禁用项与空态",
"desc": "禁用结点置灰并写 aria-disabled;当前级无子项时显示占位文案。",
"variant": "状态 disabled | empty"
}
],
"related": [
{
"slug": "mobile-picker",
"why": "选项之间没有层级关系(城市平铺)时用选择器,不要用级联去拼一棵假树"
},
{
"slug": "mobile-popup",
"why": "通用弹出层;mode=popup 本身就是底部浮层,不要在弹出层里再套一层"
},
{
"slug": "cell",
"why": "「已选地区」的展示入口用单元格,点开才拉起级联"
},
{
"slug": "mobile-list",
"why": "只需要展示一层可选项且不需要回退路径时,列表更轻"
},
{
"slug": "actionsheet",
"why": "动作面板面向「点一下即执行」,级联面向「逐级缩小范围再确认」"
}
]
}