Files

158 lines
7.0 KiB
Markdown
Raw Permalink 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.
# Skeleton Design Token
Skeleton 控件族使用 `SkeletonToken`(Token ID: `"Skeleton"`)作为组件级 Design Token,所有视觉属性均从全局 `SharedToken` 派生,不硬编码任何具体值。所有 Skeleton 系列控件共享同一套 Token。
---
## Token 资源访问方式
在 AXAML 中使用组件级 Token:
```xml
{atom:SkeletonTokenResource GradientFromColor}
{atom:SkeletonTokenResource TitleHeight}
{atom:SkeletonTokenResource BlockRadius}
{atom:SkeletonTokenResource ParagraphLineHeight}
{atom:SkeletonTokenResource ImageContainerSize}
```
在 AXAML 中使用全局共享 Token:
```xml
{atom:SharedTokenResource ControlHeight}
{atom:SharedTokenResource ControlHeightLG}
{atom:SharedTokenResource ControlHeightSM}
{atom:SharedTokenResource BorderRadius}
{atom:SharedTokenResource BorderRadiusSM}
{atom:SharedTokenResource BorderRadiusLG}
```
---
## 组件级 Token 一览
以下是 `SkeletonToken` 定义的全部组件级 Token,按功能分组说明。
### 颜色 Token
| Token 名 | 类型 | 来源 | 说明 |
|---|---|---|---|
| `GradientFromColor` | `Color` | `SharedToken.ColorFillContent` | 骨架块的基底颜色(静态状态和渐变起点色) |
| `GradientToColor` | `Color` | `SharedToken.ColorFill` | 渐变终点颜色(用于构建流光动画的渐变画刷) |
### 流光动画 Token
| Token 名 | 类型 | 来源 | 说明 |
|---|---|---|---|
| `LoadingBackgroundStart` | `IBrush` | 基于 `GradientFromColor` + `GradientToColor` 构建 | 流光动画起始帧画刷(`LinearGradientBrush`,起始位置为左) |
| `LoadingBackgroundMiddle` | `IBrush` | 基于 `GradientFromColor` + `GradientToColor` 构建 | 流光动画中间帧画刷(渐变已扫过一半) |
| `LoadingBackgroundEnd` | `IBrush` | 基于 `GradientFromColor` 构建 | 流光动画结束帧画刷(回到纯色状态) |
| `LoadingMotionDuration` | `TimeSpan` | 固定 `1.4s` | 流光动画一次循环的时长 |
### 尺寸 Token
| Token 名 | 类型 | 来源 | 说明 |
|---|---|---|---|
| `TitleHeight` | `double` | `SharedToken.ControlHeight / 2` | 标题骨架行高度 |
| `ParagraphLineHeight` | `double` | `SharedToken.ControlHeight / 2` | 段落骨架单行高度 |
| `BlockRadius` | `CornerRadius` | `SharedToken.BorderRadiusSM` | 骨架块默认圆角(`IsRound=False` 时使用) |
| `ParagraphLineRoundCornerRadius` | `CornerRadius` | `ParagraphLineHeight / 2` | 段落行胶囊形圆角(`IsRound=True` 时使用) |
### 间距 Token
| Token 名 | 类型 | 来源 | 说明 |
|---|---|---|---|
| `ParagraphMarginTop` | `Thickness` | `new Thickness(0, SharedToken.UniformlyMarginLG + SharedToken.UniformlyMarginXXS, 0, 0)` | 段落区域顶部间距(标题与段落之间的间隔) |
| `AvatarMarginRight` | `Thickness` | `new Thickness(0, 0, SharedToken.UniformlyMargin, 0)` | 头像区域右侧间距(头像与内容区域之间的间隔) |
### 图片骨架 Token
| Token 名 | 类型 | 来源 | 说明 |
|---|---|---|---|
| `ImageSize` | `double` | `SharedToken.ControlHeight × 1.5` | 图片骨架内嵌图标的尺寸 |
| `ImageContainerSize` | `double` | `SharedToken.ControlHeight × 1.5 × 2` | 图片骨架容器的默认宽高 |
| `ImageContainerMaxSize` | `double` | `SharedToken.ControlHeight × 1.5 × 4` | 图片骨架容器的最大宽高 |
---
## 主题中使用的全局 SharedToken
除组件级 Token 外,Skeleton 的各 ControlTheme 还直接引用了以下全局 `SharedToken`:
| Token 资源键 | 使用场景 | 说明 |
|---|---|---|
| `ControlHeight` | 中号高度 | `SkeletonElement`(Middle)、`SkeletonAvatar`(Middle)的高度 |
| `ControlHeightLG` | 大号高度 | `SkeletonElement`(Large)、`SkeletonAvatar`(Large)的高度 |
| `ControlHeightSM` | 小号高度 | `SkeletonElement`(Small)、`SkeletonAvatar`(Small)的高度 |
| `ControlHeightXS` | 段落行间距 | `SkeletonParagraph` 内部 StackPanel 的 `Spacing` |
| `BorderRadius` | 中号圆角 | `SkeletonAvatar`(Square + Middle)的圆角 |
| `BorderRadiusSM` | 小号圆角 | `SkeletonElement` 默认圆角、`SkeletonButton`(Square)圆角、`SkeletonImage` 圆角 |
| `BorderRadiusLG` | 大号圆角 | `SkeletonAvatar`(Square + Large)的圆角 |
---
## Token 对外观的具体影响
### 颜色与动画
| 状态 | 视觉效果 | 相关 Token |
|---|---|---|
| 静态(`IsActive=False`) | 纯色灰色块 | `GradientFromColor` → `Background` |
| 流光动画(`IsActive=True`) | 从左到右的渐变流光,三帧循环 | `LoadingBackgroundStart` → `LoadingBackgroundMiddle` → `LoadingBackgroundEnd`,时长 `LoadingMotionDuration` |
流光动画通过 Avalonia `Animation` + `KeyFrame` 实现,动画驱动 `AnimationLayerFill` 属性在三个 `LinearGradientBrush` 之间过渡:
```
帧 0(0%): LoadingBackgroundStart ── 渐变在最左侧
帧 1(80%): LoadingBackgroundMiddle ── 渐变扫过右侧
帧 2(100%): LoadingBackgroundEnd ── 回到纯色
```
### SizeType 与高度 Token 映射
| SizeType | SkeletonElement/SkeletonButton/SkeletonInput 高度 | SkeletonAvatar 宽高 |
|---|---|---|
| `Large` | `ControlHeightLG` | `ControlHeightLG` |
| `Middle` | `ControlHeight` | `ControlHeight` |
| `Small` | `ControlHeightSM` | `ControlHeightSM` |
### IsRound 与圆角 Token 映射
| IsRound | 段落行圆角 |
|---|---|
| `false`(默认) | `BlockRadius`(`BorderRadiusSM`) |
| `true` | `ParagraphLineRoundCornerRadius`(`ParagraphLineHeight / 2`,形成胶囊形) |
### 组合骨架屏内间距
| 区域 | 相关 Token | 效果 |
|---|---|---|
| 头像 → 内容 | `AvatarMarginRight` | 头像右侧留白 |
| 标题 → 段落 | `ParagraphMarginTop` | 段落区域顶部留白(仅 `IsShowTitle=True` 时生效) |
| 段落行间 | `ControlHeightXS`(共享 Token) | 段落内行与行之间的间距 |
---
## Token 值参考(默认主题)
以下是默认(Light)主题下各 Token 的典型计算值,实际值取决于全局 `SharedToken` 配置:
| Token | 默认值(约) | 计算逻辑 |
|---|---|---|
| `GradientFromColor` | `rgba(0,0,0,0.06)` | `SharedToken.ColorFillContent` |
| `GradientToColor` | `rgba(0,0,0,0.15)` | `SharedToken.ColorFill` |
| `TitleHeight` | `16` px | `ControlHeight / 2` |
| `ParagraphLineHeight` | `16` px | `ControlHeight / 2` |
| `BlockRadius` | `4` px | `SharedToken.BorderRadiusSM` |
| `ParagraphLineRoundCornerRadius` | `8` px | `ParagraphLineHeight / 2` |
| `ParagraphMarginTop` | `0,28,0,0` | `UniformlyMarginLG + UniformlyMarginXXS` |
| `AvatarMarginRight` | `0,0,16,0` | `UniformlyMargin` |
| `LoadingMotionDuration` | `1.4s` | 固定值 |
| `ImageSize` | `48` px | `ControlHeight × 1.5` |
| `ImageContainerSize` | `96` px | `ImageSize × 2` |
| `ImageContainerMaxSize` | `192` px | `ImageSize × 4` |
| `ControlHeight`(共享) | `32` px | 全局控件高度 |
| `ControlHeightLG`(共享) | `40` px | 全局大号控件高度 |
| `ControlHeightSM`(共享) | `24` px | 全局小号控件高度 |
| `ControlHeightXS`(共享) | `16` px | 全局超小号控件高度 |