Regression / regression (push) Canceled after 0s
## 品牌标识(本次会话) 起因:品牌此前没有任何图形标识 —— 唯一 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 未做部分)
226 lines
8.0 KiB
JSON
226 lines
8.0 KiB
JSON
{
|
||
"schemaVersion": 1,
|
||
"sourceKind": "authored-spec",
|
||
"provenance": "authored-in-repo",
|
||
"specFile": "spec/移动端规格.md",
|
||
"specSection": "42 · 消息通知 Message",
|
||
"confidence": "high",
|
||
"slug": "mobile-message",
|
||
"name": "消息通知 Message",
|
||
"semanticTypeCandidates": [
|
||
"message",
|
||
"notification",
|
||
"banner"
|
||
],
|
||
"variantDimensions": [
|
||
{
|
||
"name": "tone",
|
||
"values": [
|
||
"info",
|
||
"success",
|
||
"warning",
|
||
"error"
|
||
]
|
||
},
|
||
{
|
||
"name": "closable",
|
||
"values": [
|
||
"false",
|
||
"true"
|
||
]
|
||
}
|
||
],
|
||
"representativeVariants": [
|
||
{
|
||
"tone": "info",
|
||
"closable": "false",
|
||
"label": "信息(默认形态)"
|
||
},
|
||
{
|
||
"tone": "success",
|
||
"closable": "false",
|
||
"label": "成功"
|
||
},
|
||
{
|
||
"tone": "warning",
|
||
"closable": "true",
|
||
"label": "警告(需要用户读完,带关闭)"
|
||
},
|
||
{
|
||
"tone": "error",
|
||
"closable": "true",
|
||
"label": "错误(带关闭)"
|
||
}
|
||
],
|
||
"anatomy": {
|
||
"message": "消息层根元素,顶部固定的纵向列表容器;pointer-events: none 让下方页面照常可点",
|
||
"item": "单条消息,一行「图标 + 文字(+ 可选关闭)」,带 role=\"status\" 与 aria-live=\"polite\"",
|
||
"icon": "语气图标(装饰),aria-hidden=\"true\",语义由文字承担",
|
||
"text": "消息文字,超长换行,不截断",
|
||
"close": "可选的关闭按钮(原生 button,热区 44px)"
|
||
},
|
||
"structurePatterns": {
|
||
"tone": "info / success / warning / error —— 图标字形与侧边描边同族,文字保持正文色",
|
||
"closable": "false 读完自己消失 / true 右侧出现关闭按钮",
|
||
"状态类": "is-open 展开(滑下淡入 240ms)"
|
||
},
|
||
"usageHints": [
|
||
"在页面顶部给一条不打断操作的结果提示(提交成功、网络异常、库存告警、操作回执)",
|
||
"触屏上页面就是有限的可视区域,所以消息浮在内容之上(fixed)且不吃手势(pointer-events: none),页面不跳",
|
||
"与 Toast 的分工:Toast 占据视口中央用于「结果就是你此刻唯一关心的事」,Message 贴顶部一条用于「要告诉你但不该拦着你」",
|
||
"组件形态:受控 open + 内容 props;duration 到点回传 close,由宿主决定是否收起",
|
||
"命令式调用由宿主侧组装 —— 命令式 API 需要单例容器与跨端定时器治理,组件不提供全局方法"
|
||
],
|
||
"doNotInvent": [
|
||
"自动关闭的默认时长与「超时后是否保留」的策略",
|
||
"多条消息的排队、合并、去重与同屏上限",
|
||
"命令式全局方法(Message.success() 这类)与其单例容器",
|
||
"消息内的操作按钮与跳转链接(需要动作时请用通知栏或对话框)"
|
||
],
|
||
"unknowns": [
|
||
"tone=warning 与 error 是否需要不同的停留时长(当前统一由宿主传 duration)",
|
||
"顶部多条同时出现时是否该限制为最多两条(当前不限,由宿主控制)",
|
||
"是否需要在消息层上提供「点整条跳详情」的交互(当前只有可选的关闭按钮可点)"
|
||
],
|
||
"interaction": [
|
||
"消息层不吃手势(根 pointer-events: none),只有关闭按钮自己接收手势",
|
||
"自动消失时长由宿主决定:duration=0 表示不自动关闭",
|
||
"入场从上滑下并淡入 240ms(--kole-m-duration-slide),减少动态偏好下瞬时切换",
|
||
"多条并列时纵向排列,新的追加在下方;同屏条数上限由宿主决定"
|
||
],
|
||
"accessibility": [
|
||
"每条消息 role=\"status\" + aria-live=\"polite\":读屏朗读一次,不打断用户当前操作",
|
||
"语气图标 aria-hidden=\"true\",语义全部由文字承担(颜色不是唯一的信息通道)",
|
||
"关闭按钮是原生 button 并带 aria-label,可用 Tab 聚焦、Enter 触发",
|
||
"消息不抢焦点:出现时不移动焦点,用户正在输入的内容不受影响"
|
||
],
|
||
"api": {
|
||
"source": "implementation",
|
||
"note": "props / events / slots 为 6 端实现的公共接口(说明文字取自规格对应小节)。字段名与各端源码逐名核对:node tools/verify-mobile-docs.mjs",
|
||
"requiredNote": "「必传」按严格定义:实现里**没有默认值**时才为 Y(本门禁逐条核对 props 与各端源码的默认值,防止契约与实现脱节)。",
|
||
"props": [
|
||
{
|
||
"name": "tone",
|
||
"type": "'info' | 'success' | 'warning' | 'error'",
|
||
"default": "'info'",
|
||
"desc": "变体 tone:语气配色与图标形态(规格 §42.3)",
|
||
"required": false
|
||
},
|
||
{
|
||
"name": "open",
|
||
"type": "boolean",
|
||
"default": "false",
|
||
"desc": "状态 open:展开可见(规格 §42.4)",
|
||
"required": false
|
||
},
|
||
{
|
||
"name": "text",
|
||
"type": "string",
|
||
"default": "''",
|
||
"desc": "消息文字;与默认插槽二选一,text 优先(规格 §42.2 text)",
|
||
"required": false
|
||
},
|
||
{
|
||
"name": "duration",
|
||
"type": "number",
|
||
"default": "3000",
|
||
"desc": "自动关闭时长(毫秒);0 表示不自动关闭(规格 §42.5)",
|
||
"required": false
|
||
},
|
||
{
|
||
"name": "closable",
|
||
"type": "boolean",
|
||
"default": "false",
|
||
"desc": "变体 closable:是否显示右侧关闭按钮(规格 §42.3)",
|
||
"required": false
|
||
}
|
||
],
|
||
"events": [
|
||
{
|
||
"name": "close",
|
||
"params": "—",
|
||
"desc": "点关闭按钮或 duration 到点时触发;是否收起由宿主决定(规格 §42.5)"
|
||
}
|
||
],
|
||
"slots": [
|
||
{
|
||
"name": "default",
|
||
"desc": "消息内容(与 text 二选一;text 优先)"
|
||
}
|
||
]
|
||
},
|
||
"variantClasses": {
|
||
"tone": {
|
||
"info": [
|
||
".kole-m-message__item--info"
|
||
],
|
||
"success": [
|
||
".kole-m-message__item--success"
|
||
],
|
||
"warning": [
|
||
".kole-m-message__item--warning"
|
||
],
|
||
"error": [
|
||
".kole-m-message__item--error"
|
||
]
|
||
},
|
||
"closable": {
|
||
"false": [],
|
||
"true": [
|
||
".kole-m-message__close"
|
||
]
|
||
}
|
||
},
|
||
"demos": [
|
||
{
|
||
"id": "tones",
|
||
"group": "01 组件类型",
|
||
"title": "四种语气",
|
||
"desc": "信息 / 成功 / 警告 / 错误:图标与侧边描边同族变化,文字保持正文色以保证对比度不随语气波动。",
|
||
"variant": "tone=info|success|warning|error"
|
||
},
|
||
{
|
||
"id": "closable",
|
||
"group": "01 组件类型",
|
||
"title": "可关闭",
|
||
"desc": "closable=true:右侧 × 是原生 button、热区 44px;需要用户读完的长文案给一条显式关闭路径。",
|
||
"variant": "closable=true"
|
||
},
|
||
{
|
||
"id": "duration",
|
||
"group": "02 组件状态",
|
||
"title": "自动消失",
|
||
"desc": "duration 到点回传 close 由宿主收起;计时归宿主 —— 组件不持有默认时长以外的隐式行为。",
|
||
"variant": "duration=3000"
|
||
},
|
||
{
|
||
"id": "stack",
|
||
"group": "02 组件状态",
|
||
"title": "多条并列",
|
||
"desc": "消息层纵向排列,多条同时在场各自独立;同屏条数上限与合并策略由宿主决定。",
|
||
"variant": "多条同时 open"
|
||
},
|
||
{
|
||
"id": "plain",
|
||
"group": "02 组件状态",
|
||
"title": "默认形态",
|
||
"desc": "不带关闭按钮也不阻断操作:消息层自身 pointer-events: none,下方页面仍可正常点击与滚动。",
|
||
"variant": "closable=false"
|
||
}
|
||
],
|
||
"related": [
|
||
{
|
||
"slug": "mobile-toast",
|
||
"why": "需要占据视口中央、让用户只看结果时用轻提示;顶部一条且不打断操作用消息通知"
|
||
},
|
||
{
|
||
"slug": "mobile-noticebar",
|
||
"why": "常驻在页面里、随内容滚动的提醒用通知栏;消息通知浮在顶部且会消失"
|
||
},
|
||
{
|
||
"slug": "mobile-dialog",
|
||
"why": "需要用户先做决定再继续时用对话框,消息通知从不阻断操作"
|
||
}
|
||
]
|
||
}
|