# Message Design Token
Message 控件使用 `MessageToken`(Token ID: `"Message"`)作为组件级 Design Token。所有视觉属性均从全局 `SharedToken` 派生,不使用硬编码值。
> 📖 Token 源码位置:`src/AtomUI.Desktop.Controls/Message/MessageToken.cs`
---
## Token 资源访问方式
### AXAML 中访问
```xml
{atom:MessageTokenResource ContentBg}
{atom:MessageTokenResource ContentPadding}
{atom:MessageTokenResource MessageIconSize}
{atom:MessageTokenResource MessageIconMargin}
{atom:MessageTokenResource MessageTopMargin}
{atom:SharedTokenResource ColorPrimary}
{atom:SharedTokenResource ColorSuccess}
{atom:SharedTokenResource ColorWarning}
{atom:SharedTokenResource ColorError}
```
---
## Token 类定义
```csharp
[ControlDesignToken]
internal class MessageToken : AbstractControlDesignToken
{
public const string ID = "Message";
public static readonly ControlTokenResourceScopeProvider ScopeProvider = new(ID);
// ...
}
```
---
## 完整 Token 属性列表
### 背景与容器
| Token 属性 | 类型 | 派生自 SharedToken | 说明 |
|---|---|---|---|
| `ContentBg` | `Color` | `ColorBgElevated` | 消息卡片背景色 |
| `ContentPadding` | `Thickness` | `ControlHeightLG`、`FontSize`、`RelativeLineHeight`、`UniformlyPaddingXS` | 消息卡片内边距 |
> `ContentPadding` 的计算公式:垂直方向 = `(ControlHeightLG - FontSize × RelativeLineHeight) / 2`;水平方向 = `UniformlyPaddingXS`。
### 图标
| Token 属性 | 类型 | 派生自 SharedToken | 说明 |
|---|---|---|---|
| `MessageIconSize` | `double` | `FontSizeSM × RelativeLineHeightSM` | 消息图标尺寸 |
| `MessageIconMargin` | `Thickness` | `UniformlyMarginXS` | 消息图标右侧外边距(`0, 0, MarginXS, 0`) |
### 间距
| Token 属性 | 类型 | 派生自 SharedToken | 说明 |
|---|---|---|---|
| `MessageTopMargin` | `Thickness` | `UniformlyMargin` | 消息卡片外边距(上、左、右各 `UniformlyMargin`,下为 0) |
---
## 主题中使用的全局 SharedToken
除组件级 Token 外,MessageCard 的 ControlTheme 还直接引用了以下全局 `SharedToken`:
| Token 资源键 | 使用场景 |
|---|---|
| `EnableMotion` | 全局动画开关,控制消息入场/出场动画 |
| `MotionDurationMid` | 入场/出场动画时长 |
| `BoxShadows` | 消息卡片阴影效果 |
| `BorderRadiusLG` | 消息卡片大圆角 |
| `FontSize` | 消息文本字体大小 |
| `FontHeight` | 消息文本行高 |
| `ColorText` | 消息文本颜色 |
| `SelectionBackground` | 文本选中背景色 |
| `SelectionForeground` | 文本选中前景色 |
| `ColorPrimary` | Information / Loading 消息图标颜色(蓝色) |
| `ColorSuccess` | Success 消息图标颜色(绿色) |
| `ColorWarning` | Warning 消息图标颜色(黄色) |
| `ColorError` | Error 消息图标颜色(红色) |
---
## Token 在主题中的使用示例
### MessageCardTheme.axaml 中的 Token 引用
```xml
```
### WindowMessageManagerTheme.axaml 中的 Token 引用
```xml
```
---
## Token 对外观的具体影响
### 消息类型与颜色 Token 映射
| 消息类型 | 图标颜色 Token | 默认颜色 |
|---|---|---|
| `Information` | `SharedToken.ColorPrimary` | 蓝色(`#1677ff`) |
| `Success` | `SharedToken.ColorSuccess` | 绿色(`#52c41a`) |
| `Warning` | `SharedToken.ColorWarning` | 黄色(`#faad14`) |
| `Error` | `SharedToken.ColorError` | 红色(`#ff4d4f`) |
| `Loading` | `SharedToken.ColorPrimary` | 蓝色(`#1677ff`) |
### 视觉布局 Token 映射
| 视觉属性 | Token | 说明 |
|---|---|---|
| 卡片背景 | `ContentBg` ← `ColorBgElevated` | 浮层背景色,浅色模式下为白色 |
| 卡片阴影 | `SharedToken.BoxShadows` | 全局标准阴影 |
| 卡片圆角 | `SharedToken.BorderRadiusLG` | 大号圆角(8px) |
| 卡片内边距 | `ContentPadding` | 垂直方向根据控件高度和字号自适应 |
| 卡片外边距 | `MessageTopMargin` ← `UniformlyMargin` | 消息之间的堆叠间距 |
| 图标尺寸 | `MessageIconSize` ← `FontSizeSM × RelativeLineHeightSM` | 与小号字体行高对齐 |
| 图标间距 | `MessageIconMargin` ← `UniformlyMarginXS` | 图标与文本的间隔 |
| 文本字号 | `SharedToken.FontSize` | 全局默认字号(14px) |
| 文本行高 | `SharedToken.FontHeight` | 全局默认行高 |
| 文本颜色 | `SharedToken.ColorText` | 全局文本颜色 |
| 动画时长 | `SharedToken.MotionDurationMid` | 中等动画时长 |
---
## Token 派生链总结
```
SharedToken (DesignToken)
├── ColorBgElevated → ContentBg(卡片背景色)
├── ControlHeightLG → ContentPadding(垂直内边距计算)
├── FontSize → ContentPadding(垂直内边距计算)
├── RelativeLineHeight → ContentPadding(垂直内边距计算)
├── UniformlyPaddingXS → ContentPadding(水平内边距)
├── FontSizeSM → MessageIconSize(图标尺寸)
├── RelativeLineHeightSM → MessageIconSize(图标尺寸)
├── UniformlyMarginXS → MessageIconMargin(图标右侧间距)
├── UniformlyMargin → MessageTopMargin(卡片外边距)
├── BoxShadows → 卡片阴影(直接引用)
├── BorderRadiusLG → 卡片圆角(直接引用)
├── FontHeight → 文本行高(直接引用)
├── ColorText → 文本颜色(直接引用)
├── ColorPrimary → Information / Loading 图标颜色
├── ColorSuccess → Success 图标颜色
├── ColorWarning → Warning 图标颜色
├── ColorError → Error 图标颜色
├── MotionDurationMid → 入场/出场动画时长
└── EnableMotion → 动画开关
```