Files
ui/docs/prd/epic-1-details-foundation-theme-infrastructure.md
2025-10-15 23:40:13 +08:00

6.0 KiB
Raw Blame History

Epic 1 Details: Foundation & Theme Infrastructure

Epic Goal

建立 Penguin.AvaloniaUI 控件库项目的完整基础设施,实现基于苹果颜色系统的主题框架。该 Epic 交付一个可运行的示例应用,演示浅色和暗色主题的流畅切换,为后续控件开发提供样式和颜色基础。通过该 Epic验证技术栈选择Avalonia、ReactiveUI、Semi.Avalonia的可行性。


Story 1.1: 项目基础设施搭建并初始化示例应用

As a 控件库开发者, I want 建立完整的项目结构和依赖配置,并创建一个可运行的示例应用, so that 我可以在稳定的基础设施上开始控件开发,并有一个测试载体来验证功能。

Acceptance Criteria

  1. 创建 Monorepo 目录结构,包含以下项目:

    • src/Penguin.AvaloniaUI/(核心控件库,.NET 8 类库)
    • src/Example/示例应用Avalonia 桌面应用)
    • src/Penguin.AvaloniaUI.Tests/单元测试项目xUnit
  2. 配置 Penguin.AvaloniaUI 项目的核心依赖:

    • Avalonia 11.x最新稳定版
    • Avalonia.ReactiveUI
    • Semi.Avalonia如果评估后可用
  3. 配置 Example 项目引用 Penguin.AvaloniaUI 项目

  4. Example 应用能够成功启动,显示一个基础窗口,包含:

    • 标题:"Penguin.AvaloniaUI Demo"
    • 一个 TextBlock 显示 "Hello World"
    • 窗口大小800x600
  5. 项目能够在 Windows 平台成功编译和运行

  6. 创建基础的 .gitignoreREADME.md

  7. 快速评估 Semi.Avalonia 的可用性:

    • 如果 Semi.Avalonia 可用,在 Example 中应用其基础样式
    • 如果不可用或过于复杂,记录决策并准备自定义样式系统

Story 1.2: 实现浅色主题和颜色系统

As a 控件库开发者, I want 定义基于苹果颜色系统的语义化颜色,并实现浅色主题, so that 后续开发的控件可以使用一致的颜色语义,且示例应用有专业的视觉呈现。

Acceptance Criteria

  1. Penguin.AvaloniaUI/Themes/ColorSystem/ 下创建颜色系统定义:

    • 定义语义化颜色资源ResourceDictionary包含至少以下颜色
      • Primary主色
      • Secondary次要色
      • Success成功
      • Warning警告
      • Error错误
      • Background背景
      • Surface表面
      • TextPrimary主要文本
      • TextSecondary次要文本
  2. Penguin.AvaloniaUI/Themes/ 下创建 LightTheme.axaml(浅色主题资源字典):

    • 为每个语义化颜色定义浅色主题的具体色值
    • 确保颜色对比度足够(文本与背景对比度 ≥ 4.5:1
  3. 将浅色主题应用到 Example 应用:

    • App.axaml 中引用 LightTheme.axaml
    • 示例窗口的背景色使用 Background 颜色
    • TextBlock 的文本色使用 TextPrimary 颜色
  4. 在 Example 中添加一个演示页面,展示所有语义化颜色:

    • 显示每个颜色的名称和色块(使用 Border 或 Rectangle
    • 色块大小:至少 100x50 像素
  5. 浅色主题下,示例应用视觉呈现专业、清晰,无明显的配色问题

  6. README.md 中添加颜色系统的简要说明


Story 1.3: 实现暗色主题

As a 控件库开发者, I want 基于颜色系统创建暗色主题, so that 控件库可以支持暗色模式,满足长时间使用场景的需求。

Acceptance Criteria

  1. Penguin.AvaloniaUI/Themes/ 下创建 DarkTheme.axaml(暗色主题资源字典):

    • 为每个语义化颜色定义暗色主题的具体色值
    • 确保颜色对比度足够(文本与背景对比度 ≥ 4.5:1
    • 暗色主题的背景色应较深(避免纯黑 #000000推荐深灰色系
  2. 暗色主题的颜色定义应与浅色主题在语义上对应:

    • Primary 在两种主题下都表示"强调色",但色值可以不同
    • Background 在浅色主题下是浅色,在暗色主题下是深色
  3. 修改 Example 应用,支持手动切换到暗色主题:

    • App.axaml 中暂时保留浅色主题为默认
    • 提供注释说明如何切换到暗色主题(修改 App.axaml 中的资源引用)
  4. 在暗色主题下,颜色演示页面能够正确显示所有暗色主题的颜色

  5. 暗色主题视觉呈现舒适,无过度刺眼或过暗的问题

  6. 两种主题下的颜色演示页面应使用相同的 XAML 代码(通过语义化颜色资源绑定)


Story 1.4: 实现运行时主题切换

As a 示例应用的用户, I want 通过 UI 按钮动态切换浅色和暗色主题, so that 我可以快速验证控件库在不同主题下的视觉效果,无需修改代码和重启应用。

Acceptance Criteria

  1. Penguin.AvaloniaUI/Themes/ 下创建 ThemeManager.cs 类:

    • 提供 ApplyTheme(ThemeType theme) 方法,支持动态加载主题资源
    • ThemeType 枚举包含 LightDark
    • 主题切换通过替换 Application.Current.Resources 中的资源字典实现
  2. 提供一个 ReactiveUI CommandSwitchThemeCommand

    • 接受 ThemeType 参数
    • 调用 ThemeManager.ApplyTheme() 切换主题
  3. 在 Example 应用的主窗口添加主题切换按钮:

    • 两个按钮:"浅色主题" 和 "暗色主题"(或一个 ToggleButton
    • 按钮绑定到 SwitchThemeCommand
    • 按钮样式使用当前主题的颜色系统
  4. 主题切换应流畅无闪烁:

    • 切换时间 < 100ms符合 NFR4
    • 所有使用语义化颜色的控件应自动更新外观
  5. 主题切换后,颜色演示页面应立即反映新主题的颜色

  6. 主题状态应持久化可选MVP 可以每次启动默认浅色主题)

  7. 在 Example 中添加一个简单的测试页面包含多种控件Button、TextBox、CheckBox验证主题切换对不同控件的影响