Files
EmailBill/openspec/changes/archive/2026-02-12-fix-stats-v2-node-style/design.md
SunCheng 803f09cc97
All checks were successful
Docker Build & Deploy / Build Docker Image (push) Successful in 27s
Docker Build & Deploy / Deploy to Production (push) Successful in 6s
Docker Build & Deploy / Cleanup Dangling Images (push) Successful in 2s
Docker Build & Deploy / WeChat Notification (push) Successful in 2s
feat(calendar): simplify holiday highlight styles and improve accessibility
- Introduced a new visual style for holiday highlights in the calendar component, replacing complex gradients with solid colors for better clarity.
- Removed the holiday badge to reduce visual noise and enhance user experience.
- Ensured that holiday information remains accessible through long-press interactions.
- Updated specifications to reflect the new design decisions and requirements for both light and dark themes.
- Added tasks for implementation, including style adjustments and accessibility enhancements.
2026-02-12 21:39:27 +08:00

4.5 KiB

Context

当前 TimePeriodTabs 组件使用了自定义的透明背景和半透明灰色样式,与 pencli 设计文件 (.pans/v2.pen, 节点 NDWwE) 中定义的视觉规范不一致。设计稿采用了更清晰的视觉层次:浅灰色背景容器包裹着三个标签,激活态使用白色背景突出显示。此外,当前实现缺乏暗色主题的适配。

技术栈:

  • Vue 3 Composition API (<script setup>)
  • SCSS 样式 (基于 CSS 变量的主题系统)
  • 主题系统: Web/src/assets/theme.css

设计规范来源:

  • .pans/v2.pen 节点 NDWwE (TabsWrapper)
    • 容器: padding [8, 24], 垂直布局
    • SegmentedControl (节点 4iQfn):
      • 背景 #F4F4F5, 圆角 8px, padding 4px, gap 4px, height 40px
    • 激活态标签 (节点 LN1iU):
      • 背景 #FFFFFF, 圆角 6px, 文字颜色 #1A1A1A, 字重 600
    • 非激活态标签 (节点 7LCL4, 7VSH1):
      • 背景透明, 圆角 6px, 文字颜色 #6B7280, 字重 500

Goals / Non-Goals

Goals:

  • 完全符合 pencli 设计规范的视觉样式
  • 支持亮色和暗色两种主题,保持良好的对比度和可读性
  • 保持组件 API 不变,不影响现有使用方式
  • 激活态具有明确的视觉反馈

Non-Goals:

  • 不修改组件的交互逻辑或事件处理
  • 不改变组件的 props 或 emits 接口
  • 不添加新功能(如动画效果或手势支持)

Decisions

决策 1: 直接使用 CSS 变量而非硬编码颜色

选择:theme.css 中定义新的语义化 CSS 变量 --segmented-bg--segmented-active-bg

理由:

  • 项目已有成熟的 CSS 变量主题系统 (Web/src/assets/theme.css)
  • 使用变量可以自动适配暗色主题,无需在组件中使用 v-if 判断
  • 便于后续统一调整分段控制器样式
  • 符合项目现有的样式管理模式

备选方案 (未采用):

  • 硬编码颜色值 - 无法适配暗色主题
  • 使用 computed 动态计算颜色 - 增加不必要的 JS 逻辑

决策 2: 暗色主题映射策略

选择: 暗色主题使用以下映射:

  • 容器背景: #27272a (对应浅色的 #F4F4F5)
  • 激活态背景: #3f3f46 (对应浅色的 #FFFFFF)
  • 激活态文字: #f4f4f5 (对应浅色的 #1A1A1A)
  • 非激活态文字: #a1a1aa (对应浅色的 #6B7280)

理由:

  • 保持与现有深色主题色板 (--bg-tertiary, --border-color) 的一致性
  • 确保 WCAG AA 级别的对比度标准(激活态文字对比度 > 4.5:1)
  • 视觉层次清晰,激活态明显突出

备选方案 (未采用):

  • 完全反转亮色主题颜色 - 对比度不足,可读性差
  • 使用蓝色或其他强调色 - 与设计稿的中性灰色调不符

决策 3: 保留现有的 hover 和过渡效果

选择: 保留 transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) 和 hover 状态

理由:

  • 提升交互体验,符合现代 UI 设计规范
  • 设计稿未明确禁止过渡效果
  • 与应用其他组件的交互风格保持一致

Risks / Trade-offs

风险 1: 新增 CSS 变量可能与未来设计稿冲突

风险: 如果后续设计稿为分段控制器定义了不同的颜色变量,可能需要重新调整

缓解措施:

  • 使用语义化命名 (--segmented-*),明确变量用途
  • theme.css 中添加注释标注变量来源 (/* From .pans/v2.pen NDWwE */)

风险 2: 暗色主题对比度可能不够理想

风险: 在某些设备或环境光下,暗色主题的激活态可能不够明显

缓解措施:

  • 使用 Chrome DevTools 的对比度检查工具验证
  • 添加微妙的阴影效果增强视觉分离 (box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3))

权衡: 放弃完全像素级还原设计稿字体

权衡: 设计稿使用 DM Sans 字体,但项目中可能未全局加载该字体

决策: 依赖 --font-primary 变量,由主题系统统一管理字体回退

影响: 在未加载 DM Sans 的环境下,会回退到系统字体,视觉效果略有差异,但可接受

Migration Plan

部署步骤:

  1. 更新 theme.css,添加新的 CSS 变量
  2. 更新 TimePeriodTabs.vue 组件样式
  3. 验证浏览器兼容性 (Chrome, Safari, Firefox)
  4. 在亮色和暗色主题下分别测试视觉效果

回滚策略:

  • 如发现严重视觉问题,可通过 Git 回滚单个文件
  • CSS 变量的添加不会破坏现有样式,可以安全回滚

影响范围:

  • 仅影响统计 v2 页面的时间段选择器组件
  • 无 API 变更,无需后端配合

Open Questions

无待解决问题。设计规范已明确,实现路径清晰。