# 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）
