Files
Cyrene-For-Android/devdocs/03-design-system.md
T

209 lines
7.7 KiB
Markdown
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.
# 03 — 设计系统规范 (Material Design 3)
> **设计语言**Material Design 3 (Material You)
> **组件库**`androidx.compose.material3`
> **最低 API**26(不支持 Monet 的设备回退为手动主题色)
---
## 1. 色彩系统
### 1.1 动态配色 (Dynamic Color)
```
首选:androidx.compose.material3.dynamicColor
→ 系统壁纸提取 Primary / Secondary / Tertiary
→ 支持 Android 12+ (API 31+)
→ API 26-30 回退为预设主题色
备选:用户在设置中手动选择 Seed Color
→ 通过 MaterialTheme.colorScheme 的 lightColorScheme/darkColorScheme 生成
```
### 1.2 预设主题色
| 主题名 | Seed Color | 氛围 |
|--------|-----------|------|
| 默认(昔涟紫) | `#9C6BFF` (Lavender) | 温柔、亲切 |
| 樱花粉 | `#FFB4C8` (Sakura) | 甜美 |
| 海洋蓝 | `#6BA4FF` (Ocean) | 清爽 |
| 森林绿 | `#6BCF7C` (Forest) | 自然 |
| 日落橙 | `#FF9E6B` (Sunset) | 温暖 |
### 1.3 暗黑模式
| 属性 | Light | Dark |
|------|-------|------|
| Surface | `#FFFBFF` | `#1C1B1F` |
| Background | `#FFFBFF` | `#1C1B1F` |
| Primary | Dynamic | Dynamic (暗黑自适应) |
| OnSurface | `#1C1B1F` | `#E6E1E5` |
| SurfaceVariant | `#E7E0EC` | `#49454F` |
| 遮罩颜色 | `rgba(0,0,0,0.5)` | `rgba(0,0,0,0.7)` |
### 1.4 悬浮窗专用色
```
覆盖层背景遮罩:
Light: rgba(0, 0, 0, 0.5) // 50% 不透明度
Dark: rgba(0, 0, 0, 0.7) // 70% 不透明度
对话卡片背景:
Light: MaterialTheme.colorScheme.surface
Dark: MaterialTheme.colorScheme.surface
卡片圆角:28dp (顶部) / 0dp (底部)
卡片阴影 (Light)8dp elevation
卡片阴影 (Dark):无阴影,用 1dp outline 代替
```
## 2. 字体系统 (Typography)
| 角色 | 字号 | 字重 | 行高 | 用途 |
|------|------|------|------|------|
| displayLarge | 57sp | 400 | 64sp | 欢迎页标题 |
| headlineMedium | 28sp | 400 | 36sp | 设置页标题 |
| titleLarge | 22sp | 400 | 28sp | 对话框标题 |
| titleMedium | 16sp | 500 | 24sp | 列表标题 |
| bodyLarge | 16sp | 400 | 24sp | 对话气泡文字 |
| bodyMedium | 14sp | 400 | 20sp | 辅助文字、时间戳 |
| labelLarge | 14sp | 500 | 20sp | 按钮文字 |
| labelMedium | 12sp | 500 | 16sp | Tab 标签 |
| labelSmall | 11sp | 500 | 16sp | 状态标签 |
字体家族:`system-ui`(默认),不支持自定义字体以保证加载速度和系统一致性。
## 3. 形状系统 (Shapes)
| 角色 | 圆角 | 用途 |
|------|------|------|
| extraSmall | 4dp | 小标签、芯片 |
| small | 8dp | 输入框、按钮 |
| medium | 12dp | 卡片、对话框 |
| large | 16dp | 大卡片 |
| extraLarge | 28dp | 底部弹出卡片、Sheet |
## 4. 组件规范
### 4.1 对话气泡
```
昔涟消息 (左侧)
┌─────────────────────────────┐
│ 🤖 昔涟 10:32 │
│ ┌─────────────────────────┐ │
│ │ 开拓者,今天心情怎么样? │ │ ← 圆角: 12dp (top-start 4dp)
│ └─────────────────────────┘ │ 背景: PrimaryContainer
│ │ 文字: OnPrimaryContainer
└─────────────────────────────┘
用户消息 (右侧)
┌─────────────────────────────┐
│ 你 10:33 │
│ ┌─────────────────────┐ │
│ │ 还不错!你呢? │ │ ← 圆角: 12dp (top-end 4dp)
│ └─────────────────────┘ │ 背景: Primary
│ │ 文字: OnPrimary
└─────────────────────────────┘
```
### 4.2 消息类型样式
| 类型 | 样式 | 示例 |
|------|------|------|
| `chat` | 普通气泡 | 对话内容 |
| `action` | 居中斜体、灰色 | *昔涟正在查看客厅灯光状态* |
| `thinking` | 折叠面板、虚线边框 | 可展开/折叠 |
| `system_info` | Toast 样式 | 服务状态告知 |
| `tool_progress` | 进度条 + 图标 | IoT 操作进行中 |
### 4.3 语音输入按钮 (悬浮窗核心组件)
```
┌─────────────────────────────────┐
│ │
│ 🎤 波形动画 │ (LISTENING 状态)
│ "我在听..." │
│ │
│ ┌───────────────────────────┐ │
│ │ 输入文字或直接说话... │ │ (IDLE 状态,点击切换语音)
│ └───────────────────────────┘ │
│ │
│ ┌────┐ ┌──┐ │
│ │ 🎤 │ (按住说话) │⌨️│ │ (WAITING 状态)
│ └────┘ └──┘ │
└─────────────────────────────────┘
```
### 4.4 昔涟状态指示器
```
在线 (绿色点 + "昔涟")
● 昔涟
思考中 (黄色脉冲 + "思考中...")
◉ 思考中...
离线 (灰色 + "离线")
○ 昔涟 · 离线
说话中 (蓝色波纹 + "正在说话...")
〰 正在说话...
```
### 4.5 IoT 设备卡片
```
┌──────────────────────────┐
│ 💡 客厅灯 ● ON │
│ ┌──────────────────────┐ │
│ │ 亮度 ████████░░ 80% │ │
│ │ 色温 ████░░░░░░ 4000K│ │
│ └──────────────────────┘ │
│ [💡 开关] │
└──────────────────────────┘
```
## 5. 动效规范
| 动效 | 时长 | 曲线 | 说明 |
|------|------|------|------|
| 覆盖层出现 | 300ms | `FastOutSlowInEasing` | 底部滑入 |
| 覆盖层消失 | 250ms | `FastOutLinearInEasing` | 底部滑落 |
| 气泡出现 | 200ms | `LinearOutSlowInEasing` | 淡入 + 微上移 |
| 涟漪效果 | 400ms | `LinearEasing` | 标准 MD3 ripple |
| 页面切换 | 300ms | `FastOutSlowInEasing` | 淡入淡出 |
| 波形动画 | 循环 | — | 录制时音频可视化 |
| 状态指示脉冲 | 2s 循环 | — | 思考中 / 说话中的呼吸灯效果 |
## 6. 图标系统
| 来源 | 用途 |
|------|------|
| `Icons.Filled` | 导航栏、主要操作按钮 |
| `Icons.Outlined` | 列表项、辅助操作 |
| `Icons.Rounded` | 芯片、标签 |
| 自定义 Lottie | 昔涟头像动画、情感表达 |
| 自定义 Vector | 品牌 LOGO、IoT 设备图标 |
## 7. 悬浮窗 vs 全屏 布局差异
| 元素 | 全屏 Activity | 悬浮窗 Overlay |
|------|-------------|---------------|
| TopAppBar | 显示(标题 + 操作) | 不显示 |
| BottomNav | 显示(三 Tab | 不显示 |
| 对话区域 | 全屏滚动 | 自适应高度,最大 70% 屏幕 |
| 背景 | Surface 纯色 | 半透明遮罩 + 卡片 |
| 圆角 | 无 | 顶部 28dp |
| 导航返回 | 系统返回键 | 关闭覆盖层 |
| IoT 面板 | 完整功能 | 仅限查询,无控制 |
| 设置入口 | 完整 | 无(需打开 APP) |
## 8. 无障碍规范
- 所有可交互元素提供 `contentDescription`
- 语音按钮提供大点击区域(最小 48dp × 48dp)
- 支持 TalkBack 导航
- 字体缩放:支持系统字体大小设置(最大 200%)
- 色彩对比度:满足 WCAG AA 标准(正文 ≥ 4.5:1,大文字 ≥ 3:1)