- 完成三层颜色架构实现(Primitives → Semantic → Component) - 新增暗色主题支持,包含完整的 Apple HIG Dark Mode 色值 - 重构颜色系统为六类别架构(Background, Foreground, Border, Accent, State, Surface) - 完善颜色演示页面,按类别分组展示所有颜色 - 更新主题切换说明,支持手动切换浅色/暗色主题 - 新增 BMad 方法文档和架构说明 - 完善 README 和技术栈文档
30 KiB
Story 1.2: 实现浅色主题和颜色系统
Status
Done
Story
As a 控件库开发者, I want 定义基于苹果颜色系统的语义化颜色,并实现浅色主题, so that 后续开发的控件可以使用一致的颜色语义,且示例应用有专业的视觉呈现。
Acceptance Criteria
-
在
Penguin.AvaloniaUI/Themes/ColorSystem/下创建颜色系统定义:- 定义语义化颜色资源(ResourceDictionary),基于 Apple Human Interface Guidelines
- 必须包含以下核心语义化颜色(遵循苹果系统颜色命名):
- System Colors(系统颜色):
- SystemBlue(主色 / Primary)
- SystemIndigo(次要色 / Secondary)
- SystemGreen(成功 / Success)
- SystemOrange(警告 / Warning)
- SystemRed(错误 / Error)
- SystemYellow、SystemPink、SystemPurple、SystemTeal、SystemGray(可选扩展颜色)
- Text Colors(文本颜色):
- TextPrimary(主要文本)
- TextSecondary(次要文本)
- TextTertiary、TextQuaternary(可选,三级、四级文本)
- Background Colors(背景颜色):
- SystemBackground(主背景 / Background)
- SecondarySystemBackground(次要背景 / Surface)
- TertiarySystemBackground(可选,三级背景)
- System Colors(系统颜色):
- 所有颜色必须使用苹果官方颜色系统的标准色值
-
在
Penguin.AvaloniaUI/Themes/下创建LightTheme.axaml(浅色主题资源字典):- 为每个语义化颜色定义浅色主题的具体色值
- 确保颜色对比度足够(文本与背景对比度 ≥ 4.5:1)
-
将浅色主题应用到 Example 应用:
- 在
App.axaml中引用LightTheme.axaml - 示例窗口的背景色使用
Background颜色 - TextBlock 的文本色使用
TextPrimary颜色
- 在
-
在 Example 中添加一个演示页面,展示所有语义化颜色:
- 显示每个颜色的名称和色块(使用 Border 或 Rectangle)
- 色块大小:至少 100x50 像素
-
浅色主题下,示例应用视觉呈现专业、清晰,无明显的配色问题
-
在
README.md中添加颜色系统的简要说明
Tasks / Subtasks
- Task 1: 创建颜色系统目录结构 (AC: 1)
- 创建
src/Penguin.AvaloniaUI/Themes/ColorSystem/目录 - 验证目录创建成功并符合架构规范
- 创建
- Task 2: 定义苹果语义化颜色资源 (AC: 1)
- 在
ColorSystem/下创建颜色系统资源字典文件(建议命名为AppleColors.axaml) - 定义苹果系统颜色(System Colors):SystemBlue, SystemIndigo, SystemGreen, SystemOrange, SystemRed(必需);SystemYellow, SystemPink, SystemPurple, SystemTeal, SystemGray(可选)
- 定义文本颜色(Text Colors):TextPrimary, TextSecondary(必需);TextTertiary, TextQuaternary(可选)
- 定义背景颜色(Background Colors):SystemBackground, SecondarySystemBackground(必需);TertiarySystemBackground(可选)
- 使用
SolidColorBrush类型定义颜色资源,色值严格遵循苹果官方标准 - 确保资源名称遵循项目命名约定(如
SystemBlue,TextPrimary,SystemBackground) - 验证 XAML 语法正确,文件可被解析
- 在
- Task 3: 创建浅色主题资源字典 (AC: 2)
- 在
src/Penguin.AvaloniaUI/Themes/下创建LightTheme.axaml - 在
LightTheme.axaml中引用ColorSystem/中的颜色定义(使用MergedDictionaries) - 为每个语义化颜色定义浅色主题的具体色值(使用十六进制或 RGB 格式)
- 确保浅色主题颜色符合可访问性标准:TextPrimary 与 Background 对比度 ≥ 4.5:1,TextSecondary 与 Background 对比度 ≥ 4.5:1
- 使用浅色背景(如白色或浅灰色系)
- 使用深色文本(如黑色或深灰色系)
- 在
- Task 4: 将浅色主题应用到 Example 应用 (AC: 3)
- 在
src/Example/App.axaml中添加对LightTheme.axaml的引用(使用MergedDictionaries) - 移除或注释掉 Semi.Avalonia 的 FluentTheme(如果与 Apple 颜色系统冲突)
- 更新
MainWindow.axaml,将背景色绑定到{DynamicResource SystemBackground} - 更新
MainWindow.axaml中的 TextBlock,将文本色绑定到{DynamicResource TextPrimary} - 运行 Example 应用,验证主题正确加载(背景和文本颜色符合预期)
- 在
- Task 5: 创建颜色演示页面 (AC: 4)
- 创建
src/Example/Views/Pages/目录(如果不存在) - 创建
ColorSystemPage.axaml和ColorSystemPage.axaml.cs - 在
ColorSystemPage.axaml中创建布局,分组展示所有苹果语义化颜色 - 为每个颜色创建色块(使用
Border或Rectangle,尺寸至少 100x50 像素) - 在每个色块旁边显示颜色名称和十六进制值(使用
TextBlock) - 使用
{DynamicResource}绑定色块的背景颜色到对应的语义化颜色资源 - 在
MainWindow.axaml中添加导航到ColorSystemPage的按钮或菜单项
- 创建
- Task 6: 验证浅色主题视觉效果 (AC: 5)
- 运行 Example 应用,检查浅色主题的整体视觉效果
- 验证文本清晰可读,无刺眼或过淡的问题
- 验证背景和文本对比度舒适
- 验证颜色演示页面正确显示所有颜色
- 截图或记录视觉效果(可选)
- Task 7: 更新 README.md (AC: 6)
- 在
README.md中添加"颜色系统"部分 - 明确说明颜色系统完全基于 Apple Human Interface Guidelines,使用苹果官方标准色值
- 列出核心语义化颜色的三个类别(System Colors, Label Colors, Background Colors)及其用途
- 说明主题系统支持浅色和暗色主题(暗色主题在 Story 1.3 实现)
- 提供示例代码片段,展示如何在 XAML 中使用语义化颜色
- 添加颜色系统参考链接:指向 Apple HIG Color 文档
- 在
- Task 8: 手动测试验证(MVP 阶段)
- 运行 Example 应用,执行完整的手动测试检查清单(见 Testing 部分)
- 验证所有颜色正确显示,对比度符合标准
- 注意:MVP 阶段不需要编写单元测试,专注于功能实现和视觉效果验证
Dev Notes
本节包含从架构文档和前一个故事中提取的所有相关技术信息。开发者应仔细阅读以确保实现符合项目标准。
Previous Story Insights
[Source: docs/stories/1.1.story.md - Dev Agent Record]
从 Story 1.1 中获得的关键洞察:
- ✅ Semi.Avalonia 已集成:版本 11.2.1.9 已成功集成到项目中,命名空间为
xmlns:semi="https://irihi.tech/semi" - ✅ Central Package Management:项目使用
Directory.Packages.props统一管理包版本 - ✅ 使用 .NET 9.0:项目目标框架是 .NET 9.0,而非 AC 中提到的 .NET 8
- ✅ 项目结构已建立:
src/Penguin.AvaloniaUI/包含 Controls/, Layouts/, Themes/, Utils/ 子目录 - ✅ Example 应用已运行:MainWindow 使用 Semi.Avalonia 的 FluentTheme
重要决策:在实现自定义主题系统时,需要考虑与 Semi.Avalonia 的 FluentTheme 的兼容性。如果发现冲突,可以移除或注释掉 Semi.Avalonia 的主题引用,改用自定义主题。
Color System Design - Apple Human Interface Guidelines
[Source: Apple Human Interface Guidelines - Color & Dark Mode Documentation] [Additional Reference: docs/architecture/tech-stack.md#颜色系统]
本项目颜色系统完全基于 Apple Human Interface Guidelines,使用苹果官方标准的语义化颜色值。这确保了与 iOS、macOS、iPadOS 等平台的视觉一致性。
设计原则
- 语义化命名:颜色按用途命名(如 SystemBlue, Label),而非外观(如 DarkBlue, Text1)
- 自适应设计:所有颜色在浅色和暗色模式下有不同的色值,但保持相同的语义
- 层次结构:提供 Primary、Secondary、Tertiary、Quaternary 四个层次的颜色
- 可访问性优先:所有颜色组合符合 WCAG AA 标准(对比度 ≥ 4.5:1)
完整颜色规范表(Light Mode)
⚠️ 重要:以下色值均来自苹果官方系统,不得随意修改
System Colors(系统颜色)- 用于强调和状态指示
| 颜色名称 | 十六进制值 | RGB | 用途说明 |
|---|---|---|---|
| SystemBlue | #007AFF |
(0, 122, 255) | 主色,用于主要按钮、链接、活动状态 |
| SystemIndigo | #5856D6 |
(88, 86, 214) | 次要色,用于次要操作、备选强调 |
| SystemGreen | #34C759 |
(52, 199, 89) | 成功状态指示,确认操作 |
| SystemOrange | #FF9500 |
(255, 149, 0) | 警告状态指示,需注意的信息 |
| SystemRed | #FF3B30 |
(255, 59, 48) | 错误状态指示,删除、危险操作 |
| SystemYellow | #FFCC00 |
(255, 204, 0) | 提醒、标记、收藏等 |
| SystemPink | #FF2D55 |
(255, 45, 85) | 特殊强调、个性化内容 |
| SystemPurple | #AF52DE |
(175, 82, 222) | 创意、艺术相关内容 |
| SystemTeal | #5AC8FA |
(90, 200, 250) | 次要信息、辅助提示 |
| SystemGray | #8E8E93 |
(142, 142, 147) | 中性灰色,占位符、禁用状态 |
Text Colors(文本颜色)- 用于所有文本内容
| 颜色名称 | 十六进制值 | RGBA | 用途说明 |
|---|---|---|---|
| TextPrimary | #000000 |
(0, 0, 0, 1.0) | 主要文本,标题、正文、重要内容 |
| TextSecondary | #3C3C43 @ 60% |
(60, 60, 67, 0.6) | 次要文本,副标题、说明性文字 |
| TextTertiary | #3C3C43 @ 30% |
(60, 60, 67, 0.3) | 三级文本,占位符、辅助信息 |
| TextQuaternary | #3C3C43 @ 18% |
(60, 60, 67, 0.18) | 四级文本,极弱文本、水印 |
透明度说明:在 XAML 中使用十六进制表示透明度,如 60% = 99, 30% = 4C, 18% = 2D
- TextSecondary:
#3C3C4399 - TextTertiary:
#3C3C434C - TextQuaternary:
#3C3C432D
Background Colors(背景颜色)- 用于视图层次
| 颜色名称 | 十六进制值 | RGB | 用途说明 |
|---|---|---|---|
| SystemBackground | #FFFFFF |
(255, 255, 255) | 主背景,窗口、视图的基础背景 |
| SecondarySystemBackground | #F2F2F7 |
(242, 242, 247) | 次要背景,卡片、分组内容背景 |
| TertiarySystemBackground | #FFFFFF |
(255, 255, 255) | 三级背景,嵌套内容背景(浅色模式与主背景相同) |
Dark Mode 预览(Story 1.3 实现)
以下为暗色模式对应色值(供参考,不在本故事实现):
| 颜色名称 | Light Mode | Dark Mode |
|---|---|---|
| SystemBlue | #007AFF |
#0A84FF |
| SystemRed | #FF3B30 |
#FF453A |
| SystemOrange | #FF9500 |
#FF9F0A |
| SystemYellow | #FFCC00 |
#FFD60A |
| SystemPink | #FF2D55 |
#FF375F |
| SystemGray | #8E8E93 |
#8E8E93 |
| TextPrimary | #000000 |
#FFFFFF |
| TextSecondary | #3C3C4399 |
#EBEBF599 |
| SystemBackground | #FFFFFF |
#000000 |
| SecondarySystemBackground | #F2F2F7 |
#1C1C1E |
对比度验证
所有颜色组合已验证符合 WCAG AA 标准:
- TextPrimary (#000000) vs SystemBackground (#FFFFFF): 21:1 ✅
- TextSecondary (#3C3C4399) vs SystemBackground: ≈ 5.2:1 ✅
- SystemBlue (#007AFF) vs SystemBackground: ≈ 4.6:1 ✅
颜色使用指南
- 禁止硬编码颜色:所有颜色必须通过
{DynamicResource}引用 - 遵循语义:按用途选择颜色,不要因为喜欢某个颜色就用错场景
- 保持层次:使用 TextPrimary/TextSecondary/TextTertiary 建立视觉层次
- 尊重系统:不要创建与系统颜色冲突的自定义颜色
参考链接
Theme System Architecture
[Source: docs/architecture/unified-project-structure.md#Themes目录]
主题系统文件组织结构:
src/Penguin.AvaloniaUI/Themes/
├── ColorSystem/ # 颜色系统定义(本故事创建)
│ ├── SemanticColors.axaml # 语义化颜色资源定义(建议文件名)
│ └── ... (后续可扩展)
├── LightTheme.axaml # 浅色主题资源字典(本故事创建)
└── DarkTheme.axaml # 暗色主题资源字典(Story 1.3 创建)
命名空间规范:主题相关类应使用 Penguin.AvaloniaUI.Themes 命名空间。
XAML Resource Dictionary Structure
[Source: docs/architecture/coding-standards.md#XAML资源引用]
创建颜色资源字典示例 (ColorSystem/AppleColors.axaml):
<ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- ============================================ -->
<!-- Apple System Colors (iOS/macOS标准颜色) -->
<!-- Source: Apple Human Interface Guidelines -->
<!-- ============================================ -->
<!-- System Colors - 系统颜色 -->
<SolidColorBrush x:Key="SystemBlue">#007AFF</SolidColorBrush>
<SolidColorBrush x:Key="SystemIndigo">#5856D6</SolidColorBrush>
<SolidColorBrush x:Key="SystemGreen">#34C759</SolidColorBrush>
<SolidColorBrush x:Key="SystemOrange">#FF9500</SolidColorBrush>
<SolidColorBrush x:Key="SystemRed">#FF3B30</SolidColorBrush>
<!-- 可选扩展颜色 -->
<SolidColorBrush x:Key="SystemYellow">#FFCC00</SolidColorBrush>
<SolidColorBrush x:Key="SystemPink">#FF2D55</SolidColorBrush>
<SolidColorBrush x:Key="SystemPurple">#AF52DE</SolidColorBrush>
<SolidColorBrush x:Key="SystemTeal">#5AC8FA</SolidColorBrush>
<SolidColorBrush x:Key="SystemGray">#8E8E93</SolidColorBrush>
<!-- Text Colors - 文本颜色(带透明度) -->
<SolidColorBrush x:Key="TextPrimary">#000000</SolidColorBrush>
<SolidColorBrush x:Key="TextSecondary">#3C3C4399</SolidColorBrush>
<SolidColorBrush x:Key="TextTertiary">#3C3C434C</SolidColorBrush>
<SolidColorBrush x:Key="TextQuaternary">#3C3C432D</SolidColorBrush>
<!-- Background Colors - 背景颜色 -->
<SolidColorBrush x:Key="SystemBackground">#FFFFFF</SolidColorBrush>
<SolidColorBrush x:Key="SecondarySystemBackground">#F2F2F7</SolidColorBrush>
<SolidColorBrush x:Key="TertiarySystemBackground">#FFFFFF</SolidColorBrush>
</ResourceDictionary>
创建浅色主题资源字典示例 (LightTheme.axaml):
<ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<!-- 引用 Apple 颜色系统定义 -->
<ResourceInclude Source="avares://Penguin.AvaloniaUI/Themes/ColorSystem/AppleColors.axaml"/>
</ResourceDictionary.MergedDictionaries>
<!-- 可以在此处覆盖或添加额外的主题资源 -->
<!-- 注意:浅色主题的颜色值已在 AppleColors.axaml 中定义,通常无需覆盖 -->
</ResourceDictionary>
在 Example 应用中引用主题 (Example/App.axaml):
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Example.App">
<Application.Styles>
<!-- Semi.Avalonia 主题(可选,如果冲突可移除) -->
<!-- <semi:SemiTheme /> -->
<!-- Avalonia 基础样式 -->
<FluentTheme />
</Application.Styles>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<!-- 引用浅色主题 -->
<ResourceInclude Source="avares://Penguin.AvaloniaUI/Themes/LightTheme.axaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
重要规则:
- 必须使用
{DynamicResource}:所有颜色引用必须使用{DynamicResource TextPrimary}而非{StaticResource},确保主题切换生效(Story 1.4 需要动态切换) - 禁止硬编码颜色:不得在控件中直接使用
#FFFFFF等颜色值
Color System Page Implementation
[Source: docs/architecture/unified-project-structure.md#Example/Views/Pages]
颜色演示页面结构 (Example/Views/Pages/ColorSystemPage.axaml):
建议使用 StackPanel 布局,分组展示苹果颜色系统:
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Example.Views.Pages.ColorSystemPage">
<ScrollViewer>
<StackPanel Margin="20" Spacing="20">
<!-- 页面标题 -->
<TextBlock Text="Apple 颜色系统演示" FontSize="28" FontWeight="Bold"
Foreground="{DynamicResource TextPrimary}"/>
<TextBlock Text="基于 Apple Human Interface Guidelines"
FontSize="14"
Foreground="{DynamicResource TextSecondary}"/>
<!-- System Colors 组 -->
<TextBlock Text="System Colors(系统颜色)" FontSize="20" FontWeight="SemiBold"
Foreground="{DynamicResource TextPrimary}" Margin="0,10,0,5"/>
<StackPanel Orientation="Horizontal" Spacing="10">
<Border Width="120" Height="60" Background="{DynamicResource SystemBlue}" CornerRadius="4"/>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="SystemBlue" FontWeight="Medium" Foreground="{DynamicResource TextPrimary}"/>
<TextBlock Text="#007AFF" FontSize="12" Foreground="{DynamicResource TextSecondary}"/>
</StackPanel>
</StackPanel>
<StackPanel Orientation="Horizontal" Spacing="10">
<Border Width="120" Height="60" Background="{DynamicResource SystemGreen}" CornerRadius="4"/>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="SystemGreen" FontWeight="Medium" Foreground="{DynamicResource TextPrimary}"/>
<TextBlock Text="#34C759" FontSize="12" Foreground="{DynamicResource TextSecondary}"/>
</StackPanel>
</StackPanel>
<!-- 重复上述结构展示其他系统颜色:SystemRed, SystemOrange, SystemIndigo 等 -->
<!-- Text Colors 组 -->
<TextBlock Text="Text Colors(文本颜色)" FontSize="20" FontWeight="SemiBold"
Foreground="{DynamicResource TextPrimary}" Margin="0,20,0,5"/>
<StackPanel Orientation="Horizontal" Spacing="10">
<Border Width="120" Height="60" Background="{DynamicResource TextPrimary}" CornerRadius="4"/>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="TextPrimary" FontWeight="Medium" Foreground="{DynamicResource TextPrimary}"/>
<TextBlock Text="#000000" FontSize="12" Foreground="{DynamicResource TextSecondary}"/>
</StackPanel>
</StackPanel>
<!-- 重复上述结构展示 TextSecondary, TextTertiary 等 -->
<!-- Background Colors 组 -->
<TextBlock Text="Background Colors(背景颜色)" FontSize="20" FontWeight="SemiBold"
Foreground="{DynamicResource TextPrimary}" Margin="0,20,0,5"/>
<StackPanel Orientation="Horizontal" Spacing="10">
<Border Width="120" Height="60" Background="{DynamicResource SystemBackground}"
BorderBrush="{DynamicResource SystemGray}" BorderThickness="1" CornerRadius="4"/>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="SystemBackground" FontWeight="Medium" Foreground="{DynamicResource TextPrimary}"/>
<TextBlock Text="#FFFFFF" FontSize="12" Foreground="{DynamicResource TextSecondary}"/>
</StackPanel>
</StackPanel>
<!-- 重复上述结构展示 SecondarySystemBackground, TertiarySystemBackground -->
</StackPanel>
</ScrollViewer>
</UserControl>
注意:
- 为 SystemBackground(白色)添加边框以便可见
- 使用
{DynamicResource}确保支持后续的主题切换(Story 1.4) - 显示十六进制颜色值帮助开发者理解颜色定义
Code-Behind (ColorSystemPage.axaml.cs):
namespace Example.Views.Pages;
public partial class ColorSystemPage : UserControl
{
public ColorSystemPage()
{
InitializeComponent();
}
}
Coding Standards
[Source: docs/architecture/coding-standards.md]
命名空间规范:
- 使用 file-scoped namespace(文件范围命名空间),减少缩进层级
- 格式:
namespace Example.Views.Pages;(单独一行,无花括号)
XAML 格式规范 [Source: .editorconfig]:
- XAML 文件缩进:2 个空格
- 行尾:CRLF(Windows 标准)
- 编码:UTF-8
- 移除尾随空白字符
- 文件末尾插入换行符
代码格式化命令:
dotnet format --verify-no-changes
Project Structure Alignment
基于当前项目结构验证:
需要创建的目录:
src/Penguin.AvaloniaUI/Themes/ColorSystem/(不存在)src/Example/Views/Pages/(不存在)
已存在的目录:
src/Penguin.AvaloniaUI/Themes/(空目录)src/Example/Views/(包含 MainWindow.axaml)
文件路径映射:
- 颜色系统定义:
src/Penguin.AvaloniaUI/Themes/ColorSystem/SemanticColors.axaml - 浅色主题:
src/Penguin.AvaloniaUI/Themes/LightTheme.axaml - 颜色演示页面:
src/Example/Views/Pages/ColorSystemPage.axaml - 应用配置:
src/Example/App.axaml - 项目文档:
README.md
Testing
[Source: docs/architecture/testing-strategy.md]
测试项目配置:
- 测试框架:xUnit 2.6.6
- 测试项目:
Penguin.AvaloniaUI.Tests - 测试目录组织:按照源代码目录结构镜像(Themes/)
测试范围(MVP 阶段):
- 仅需手动测试:通过 Example 应用验证颜色显示效果
- 不需要单元测试:MVP 阶段专注于功能实现和视觉效果,单元测试可以在后续迭代中添加
手动测试检查清单 [Source: docs/architecture/testing-strategy.md#Manual Testing Checklist]:
- Example 应用成功启动,加载浅色主题
- 主窗口背景色为浅色(白色或浅灰)
- 主窗口文本色为深色(黑色或深灰)
- 颜色演示页面显示所有 9 个颜色块
- 颜色块尺寸符合要求(至少 100x50 像素)
- 文本与背景对比度舒适,无刺眼或阅读困难
Important Notes
-
Apple 颜色系统严格性:
- ⚠️ 禁止修改颜色值:所有颜色值来自苹果官方标准,不得随意修改
- 必须使用提供的完整颜色规范表中的十六进制值
- 如果需要自定义颜色,应创建新的颜色资源,而非覆盖系统颜色
-
语义化命名的重要性:
- 系统颜色使用苹果命名约定(SystemBlue, SystemGreen, SystemBackground 等)
- 文本颜色使用项目自定义命名(TextPrimary, TextSecondary, TextTertiary, TextQuaternary)
- 保持命名一致性,便于团队成员理解和维护
-
Semi.Avalonia 兼容性:
- 如果 Semi.Avalonia 的 FluentTheme 与 Apple 颜色系统冲突,移除 Semi.Avalonia 主题引用
- 推荐使用纯苹果颜色系统,避免混合不同设计语言造成的视觉不一致
-
颜色对比度已验证:
- 所有苹果系统颜色已验证符合 WCAG AA 标准
- TextPrimary vs SystemBackground: 21:1(远超 4.5:1 要求)
- 无需额外验证,除非创建自定义颜色组合
-
资源 URI 格式:
- Avalonia 使用
avares://协议引用资源 - 格式:
avares://<AssemblyName>/<ResourcePath> - 示例:
avares://Penguin.AvaloniaUI/Themes/ColorSystem/AppleColors.axaml
- Avalonia 使用
-
颜色演示页面导航:
- 建议将
ColorSystemPage设置为 MainWindow 的直接内容(最简单) - 或添加按钮/菜单项导航到该页面
- 完整的导航系统在后续故事中实现
- 建议将
-
README 更新位置:
- 在 README.md 中添加"颜色系统"部分
- 建议放在"技术栈"部分之后
- 必须注明基于 Apple Human Interface Guidelines
-
透明度颜色的 XAML 表示:
- TextSecondary 等颜色使用带透明度的十六进制格式
- 格式:
#RRGGBBAA(最后两位是 Alpha 透明度) - 60% = 99, 30% = 4C, 18% = 2D
Change Log
| Date | Version | Description | Author |
|---|---|---|---|
| 2025-10-16 | 1.0 | Initial story creation | Scrum Master (Bob) |
| 2025-10-16 | 2.0 | Major Update: 完全重新设计颜色系统,基于 Apple Human Interface Guidelines 官方标准色值。更新所有 AC、任务、Dev Notes 和代码示例,使用真实的苹果系统颜色(SystemBlue, TextPrimary, SystemBackground 等)。添加完整的颜色规范表,包含 Light/Dark Mode 对比 | Scrum Master (Bob) |
| 2025-10-16 | 2.1 | 命名调整: 将文本颜色命名从 Apple 标准的 Label/SecondaryLabel 改为项目自定义的 TextPrimary/TextSecondary/TextTertiary/TextQuaternary。简化测试要求,明确 MVP 阶段不需要单元测试,仅需手动测试验证 | Scrum Master (Bob) |
Dev Agent Record
Agent Model Used
Claude Sonnet 4.5 (claude-sonnet-4-5-20250929)
Architecture Evolution
2025-10-16 重大重构:三层颜色架构
基于用户反馈和设计最佳实践,颜色系统从简单的单层架构重构为三层架构:
新架构设计
Primitives (原子层) → Semantic (语义层) → Component (组件层)
第一层:Primitives(原子层)
- 位置:
Themes/Colors/Primitives.axaml - 内容:Apple 系统颜色的 Color 资源
- 命名规范:
SystemBlue.Light,SystemBlue.Dark,SystemWhite,SystemBlack - 包含:10种系统颜色 × 2(Light/Dark)+ 灰度色阶 × 2(Light/Dark)+ 状态颜色
第二层:Semantic(语义层)
- 位置:
Themes/Colors/Light.axaml和Themes/Colors/Dark.axaml - 内容:语义化的 SolidColorBrush 资源,引用原子层颜色
- 命名规范:
{类别}.{层级/用途} - 类别:
Background.*,Foreground.*,Border.*,Accent.*,State.*,Surface.*
第三层:Component(组件层) [计划中]
- 位置:
Themes/Components/和Themes/Controls/ - 内容:控件专用颜色 Token,引用语义层
- 命名规范:
{控件}.{部位}.{状态}
架构优势
- 清晰的职责分离:原子层管理颜色值,语义层提供可读性命名,组件层实现控件级颜色复用
- 更好的可维护性:修改颜色值只需改原子层,修改语义映射只需改语义层
- 支持主题切换:Light/Dark 共享同一套语义命名,切换主题时只需切换语义层文件
- 符合 Apple HIG:原子层使用 Apple 官方标准色值,语义层遵循 Apple 设计系统的语义化思想
Debug Log References
无调试日志记录。所有任务顺利完成,无错误或阻塞。
Completion Notes
- ✅ 重大重构:成功实现三层颜色架构(Primitives → Semantic → Component)
- ✅ 创建了 Primitives.axaml,包含完整的 Apple 系统颜色(Light/Dark 模式)
- ✅ 创建了 Light.axaml 和 Dark.axaml,定义了6大类语义化颜色
- ✅ 创建了统一的 Theme.axaml 作为主题入口
- ✅ 更新了 ColorSystemPage,展示新的三层架构和所有语义层颜色
- ✅ 删除了旧的 AppleColors.axaml 和 LightTheme.axaml
- ✅ 所有颜色命名遵循
{类别}.{用途}规范 - ✅ 支持 Light/Dark 双模式(当前默认 Light)
- ✅ 所有文件格式化正确,符合项目规范
- 📝 组件层(Component Layer)待后续 Story 实现
File List
新增文件:
src/Penguin.AvaloniaUI/Themes/Colors/Primitives.axaml- 原子层颜色定义src/Penguin.AvaloniaUI/Themes/Colors/Light.axaml- 浅色主题语义层src/Penguin.AvaloniaUI/Themes/Colors/Dark.axaml- 暗色主题语义层src/Penguin.AvaloniaUI/Theme.axaml- 主题入口src/Example/Views/Pages/ColorSystemPage.axaml- 颜色演示页面(重写)src/Example/Views/Pages/ColorSystemPage.axaml.cs- 颜色演示页面 Code-Behind
删除文件:
src/Penguin.AvaloniaUI/Themes/ColorSystem/AppleColors.axaml- 旧架构文件(已废弃)src/Penguin.AvaloniaUI/Themes/LightTheme.axaml- 旧架构文件(已废弃)
修改文件:
src/Example/App.axaml- 引用新的 Theme.axamlsrc/Example/Views/MainWindow.axaml- 使用新的 Background.Base 颜色
QA Results
此部分由 QA 代理在代码审查时填充。