Design System
组件契约
组件契约
版本 2.0 - 对齐 v3 原型,覆盖全部新增组件与交互模式。
1. 组件策略
MOSS 使用 shadcn/ui + Radix UI + Lucide,但视觉系统由本 design system 定义。
shadcn/ui:Button、Dialog、Sheet、Tabs、Tooltip、DropdownMenu、Select、Table 等基础实现。Radix UI:焦点管理、Esc 关闭、键盘导航、Popover/Modal 层级。Lucide:唯一图标集。Tailwind CSS:样式实现工具,映射 MOSS semantic token,不启用默认 palette。
组件代码在 components/ui/,业务组合组件在 feature 目录。不得在业务页面复制基础组件状态样式。
2. 核心组件清单
| 组件 | 基础 | 必须状态 |
|---|---|---|
Button |
shadcn Button | default、hover、focus、disabled、loading、destructive、primary。 |
IconButton |
Button + Lucide + Tooltip | default、hover、focus、disabled。 |
NavigationItem |
本地组合 | default、hover、active、disabled。 |
FilterBar |
ToggleGroup / Tabs | default、hover、active、keyboard focus。 |
FeedbackControl |
ToggleGroup | neutral、selected-positive、selected-negative、disabled。 |
Tag |
Badge | neutral、accent、info、warning、danger、domain-colored。 |
Chip |
本地组合 | default(带 dot-live 或纯文本)。 |
CountChip |
本地组合 | accent(默认)、plain(中性)。 |
ContentRow |
本地组合 | default、hover、selected、read、muted。 |
FocusItem |
本地组合 | default、hover、selected、warn、danger + domain-colored icon。 |
SignalCard |
本地组合 | default、hover、tinted、warm + 内嵌 viz。 |
CoverageMeter |
本地组合 | 5 段,逐段 on/off,域色填充。 |
DayPanel |
本地组合 | 含 stat-num countUp 动画。 |
ContextPanel / Inspector |
aside(宽屏)/ Sheet(窄屏) | open、closed、loading、empty + primary section。 |
DetailDrawer |
本地组合 | open、closed + focus trap。 |
Skeleton |
本地组合 | shimmer 动画。 |
EmptyState |
本地组合 | icon + title + description。 |
Toast |
本地组合 | visible(spring 弹入)→ auto-dismiss 3.4s。 |
CommandPalette |
本地组合 | open、results filtered。 |
CaptureDialog |
本地组合 | open、textarea focus、save → toast。 |
ConfirmDialog |
shadcn Dialog | open、busy。 |
DecisionPanel |
本地组合 | 3 options + result flash。 |
3. 新增组件详细契约
3.1 FocusItem
优先处理卡片。左侧 rail + icon + 文案 + meta 四列 grid。
data-dom属性驱动 icon 背景色:color-mix(in srgb, var(--color-dom-x) 14%, var(--color-bg-surface))。--rail自定义属性控制左侧指示条颜色:默认 accent,.warn用 warning,.danger用 danger。- 选中态:
border-color: accent+box-shadow: 0 0 0 3px accent-glow。 - 决策更新后触发
.flash动画(accent-soft → raised 600ms)。 - 支持
role="option"+aria-selected+ ArrowUp/Down 键盘导航。
3.2 SignalCard
跨域信号卡片。min-height 186px,含 label + metric/title + description + viz。
.tinted:accent-soft 渐变背景。.warm:warning-soft 渐变背景。- 内嵌 viz 类型:sparkline(SVG path + circle nodes)、progress ring(SVG circle)、bar chart(CSS bars)。
- 每个 viz 必须有
.viz-note注释行,说明坐标轴含义或图例。 - Hover:translateY(-2px) + elevation-2 + border-color accent。
3.3 CoverageMeter
六域覆盖度仪表。5 段 bar,每段 4px 高,gap 3px。
.seg.on在.reveal.in时从灰过渡到域色,逐段 delay 80ms。- 域色通过父元素
--dc自定义属性传入。
3.4 Inspector(ContextPanel)
右侧上下文面板。四个 section 用 border-bottom 分隔。
- 首个 section 使用
.primary类:浅 accent 背景 + accent-deep 标题色 + 负 margin 撑满面板宽度。 - 切换内容时 140ms cross-fade(opacity + translateY 6px),带 debounce 防快速点击闪烁。
- 视图切换时自动同步为域级概览上下文(
viewInspectorMap)。 - "打开详情"按钮映射到该域最相关的 detail key。
3.5 Skeleton
加载占位。.skeleton 基类 + .sk-line(文本行)/ .sk-block(卡片块)。
- shimmer 动画:
translateX(-100%) → translateX(100%),1.4s infinite。 - 用于 lazy view 首次切换时 280ms 占位。
3.6 EmptyState
空状态容器。dashed border + 居中 icon + title + description。
- 说明"没有什么"和"下一步可做什么"。
- 不写冗长产品教学文案。
3.7 HeroGlow
Hero 区域氛围光。两个绝对定位 div,filter: blur(80px),opacity 0.55。
- 不同尺寸(520×320 / 360×260)。
- 不同 drift 动画(22s / 18s alternate)。
- 背景色使用
--color-wash-1/--color-wash-2。 aria-hidden="true",纯装饰。
3.8 DecisionPanel
决策面板。3 个 option 按钮 + result 弹层。
.dangeroption 用 danger 色标题 + hover border。- Result 使用 spring 弹入动画。
- 取消操作必须经过 ConfirmDialog 二次确认。
- 决策完成后:更新 detail state + timeline + 卡片文案(带 flash)+ inspector + toast + audit event。
3.9 Toast
底部居中通知。accent 左边框 4px + elevation-3。
- Spring 弹入(translateY 14px → 0)。
- 3.4s 后自动消失。
role="status"+aria-live="polite"。
4. 交互规则
4.1 Buttons
primary每个局部区域最多一个。渐变背景 + inset highlight + glow shadow。secondary有边框 + elevation-1,hover 时 border 变 accent + glow shadow。- Active:
scale(.965)120ms。 - Loading 保留宽度,禁用重复提交。
4.2 NavigationItem
- Active:accent-soft 背景 + accent-deep 文字 + 700 weight + 左侧 3px 渐变指示线。
- Hover:accent-soft 背景 + ink 文字 + icon 变 accent 色。
- Count badge:active 时变 accent 色 + 600 weight。
4.3 视图切换
switchView()同步更新:中间内容区 + sidebar 高亮 + breadcrumb + inspector 上下文。- 非 Today 视图首次切换时:skeleton 280ms → template clone 注入 → reveal 动画。
- 已注入视图直接显示 + reveal class 添加。
4.4 列表与表格
- 推荐流使用连续行,不嵌套卡片。
- 行点击更新 inspector;行内按钮
stopPropagation。 - 空状态使用 EmptyState 组件。
4.5 Overlay
- Dialog 用于阻断流程和高风险确认。
- Sheet 用于可随时关闭的上下文。
- Escape + 点击遮罩 + 关闭按钮遵循 Radix 默认行为。
- Detail drawer 打开后 trap focus,关闭后焦点回到触发元素。
5. 页面组成约束
所有信息域复用同一工作台骨架:Sidebar + Workspace + Inspector。
| 信息域 | 中央工作区 | Inspector 默认上下文 |
|---|---|---|
| Today | Hero + Priority + Signals + Coverage | 最高优先级 focus-item。 |
| Inbox | 待处理输入 + 建议动作 + 入库规则 | 收件箱概览。 |
| Knowledge | 内容流 + 学习 + 研究 + 模板 + 输出 | 域概览 + 活跃研究问题。 |
| Action | 计划 + 维护 + 问题 + 应急 + 节奏 | 域概览 + 今日计划。 |
| Context | 机会 + 车辆 + 身份 + 声誉 + 文化 | 域概览 + 最新机会。 |
| Self | 事件 + 医疗 + 偏好 + 审美 | 域概览 + 数据边界。 |
| Asset | 理财 + 家庭 + 账号 + 订阅 + 风险 | 预算偏差信号。 |
| Governance | 策略列表 + 审计事件 | 逾期恢复演练。 |
新增页面必须先回答:它是否可以作为现有工作区的一种视图?若可以,不能另造 Dashboard 或新导航框架。