Files
aurora-admin/frameworks-mobile/Message.jsx
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

59 lines
2.3 KiB
React
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.
import React, { useEffect, useRef } from 'react';
import './Message.css';
/* 消息通知(移动端)— 规格 §42
顶部居中、不阻断操作(根是 pointer-events: none,只有关闭按钮自己接收手势)。
**两种用法**:
① 组件形态(本文件导出的即此形态):受控 open + 内容 props,计时到点回传 onClose;
② 命令式调用:宿主自己维护一个列表与定时器(见规格 §42.5),本组件不提供全局方法 ——
命令式 API 需要单例容器与跨端定时器,属于宿主或框架层的职责(规格 §42.7)。
本组件只暴露组件形态的 props / events。 */
export default function Message({
tone = 'info',
open = false,
text = '',
duration = 3000,
closable = false,
onClose,
children = null,
}) {
/* 自动消失:计时归宿主(duration 由调用方决定),组件只负责「到点回传 close」。
duration=0 表示不自动关闭。open / duration 变化时重新计时。
回调放 ref:把 onClose 写进依赖会让「宿主传内联箭头函数」的常见写法每次渲染都重置计时器,
计时永远到不了点(定时器形同虚设),而这不是调用方的错。 */
const closeRef = useRef(onClose);
closeRef.current = onClose;
useEffect(() => {
if (!open || !duration) return undefined;
const timer = setTimeout(() => {
if (closeRef.current) closeRef.current();
}, duration);
return () => clearTimeout(timer);
}, [open, duration]);
const cls = 'kole-m-message__item kole-m-message__item--' + tone + (open ? ' is-open' : '');
return (
<div className="kole-m-message">
<div className={cls} role="status" aria-live="polite" data-open={open ? 'true' : 'false'}>
<span className="kole-m-message__icon" aria-hidden="true">
{tone === 'success' ? '✓' : tone === 'warning' ? '⚠' : tone === 'error' ? '✕' : 'ℹ'}
</span>
<span className="kole-m-message__text">{text || children}</span>
{closable ? (
<button
className="kole-m-message__close"
type="button"
aria-label="关闭消息"
onClick={() => {
if (onClose) onClose();
}}
>
✕
</button>
) : null}
</div>
</div>
);
}