Files

145 lines
5.4 KiB
Markdown
Raw Permalink Normal View History

2026-02-18 21:16:45 +08:00
## Context
当前项目中三个核心页面(日历、统计、预算)使用了不同的卡片样式规范:
**现状分析**
- 日历页面使用 CSS 变量系统(`var(--spacing-2xl)`, `var(--radius-lg)`
- 统计页面部分使用 CSS 变量(`var(--spacing-xl)`, `var(--radius-lg)`
- 预算页面使用硬编码数值(`16px`, `12px` 混用)
**约束条件**
- 必须保持响应式布局不被破坏
- 必须支持暗色模式的自动适配
- 不能影响现有的功能逻辑
- 需要最小化对现有代码的侵入性
**利益相关者**
- 前端团队:执行样式统一
- 设计团队:确保视觉一致性
- 用户:获得更统一的使用体验
## Goals / Non-Goals
**Goals:**
- 统一三个页面的卡片基础样式padding、margin、border-radius、box-shadow
- 建立基于 CSS 变量的样式系统,方便未来维护
- 确保所有卡片在暗色模式下表现一致
- 为未来的组件化(如通用 Card 组件)奠定基础
**Non-Goals:**
- 不创建新的通用 Card 组件(本次仅统一样式)
- 不修改卡片内部的业务逻辑或数据展示方式
- 不重构卡片的布局结构(如 flex 方向、grid 系统)
- 不涉及其他页面(只针对 calendarV2、statisticsV2、budgetV2
## Decisions
### 决策 1: 使用现有 CSS 变量系统,不引入新的样式规范
**理由**
- 项目已有完整的 CSS 变量系统(`Web/src/assets/theme.css`
- 日历和统计页面已部分使用该系统
- 避免引入新的样式标准增加维护成本
**替代方案**
- ❌ 创建全新的样式规范:增加学习成本,与现有系统冲突
- ❌ 使用 Tailwind CSS项目未使用 Tailwind引入成本过高
- ✅ 统一使用现有 CSS 变量:保持一致性,最小化改动
### 决策 2: 定义标准的卡片样式值
**标准值**(基于现有变量和最佳实践):
```scss
// 卡片容器样式
.common-card {
background: var(--bg-secondary);
border-radius: var(--radius-lg); // 12px
padding: var(--spacing-xl); // 16px
margin-bottom: var(--spacing-xl); // 16px
box-shadow: var(--shadow-sm);
}
// 卡片间距(页面级别)
.page-cards-container {
padding: var(--spacing-xl); // 16px (左右)
padding-top: var(--spacing-md); // 12px (顶部,紧跟 header)
padding-bottom: var(--spacing-3xl); // 24px (底部,预留安全区)
gap: var(--spacing-xl); // 16px (卡片之间)
}
```
**理由**
- `var(--spacing-xl)` (16px) 在移动端提供舒适的点击区域
- `var(--radius-lg)` (12px) 符合现代移动端设计趋势
- `var(--shadow-sm)` 提供微妙的层次感,不会过于突兀
**替代方案**
- ❌ padding: 12px - 太紧凑,触控体验差
- ❌ padding: 20px - 浪费屏幕空间
- ✅ padding: 16px - 平衡美观与空间利用
### 决策 3: 渐进式迁移策略
**步骤**
1. 在受影响的文件中查找硬编码的样式值(如 `padding: 16px`, `border-radius: 12px`
2. 替换为对应的 CSS 变量(如 `padding: var(--spacing-xl)`, `border-radius: var(--radius-lg)`
3. 确保 `.common-card` 类在所有卡片上统一应用
4. 验证暗色模式和不同屏幕尺寸下的显示效果
**理由**
- 最小化风险,逐文件验证
- 不引入破坏性变更
- 易于回滚
**替代方案**
- ❌ 一次性全局替换:风险高,难以定位问题
- ❌ 创建新组件并迁移:工作量大,超出本次范围
- ✅ 文件级逐步替换:可控、安全、可追溯
### 决策 4: 不创建全局共享样式文件(暂不引入)
**理由**
- 当前三个页面的样式文件已经独立且清晰
- 引入共享样式文件会增加依赖关系
- 留待后续如果需要更多页面统一时再考虑
**替代方案**
- ❌ 立即创建 `common-card.scss` 并全局导入:过度设计
- ✅ 保持现状,但确保使用相同的 CSS 变量值:简单高效
## Risks / Trade-offs
### [风险] 样式改动可能导致布局轻微变化
**缓解措施**
- 在多个设备和屏幕尺寸下进行视觉回归测试
- 重点检查内容溢出、文字截断、图表显示问题
- 必要时微调内部元素的间距
### [风险] CSS 变量未定义导致样式回退
**缓解措施**
- 确认 `theme.css` 中所有使用的变量已定义
- 在替换前验证变量的计算值是否符合预期
- 为关键样式提供 fallback 值(如 `padding: var(--spacing-xl, 16px)`
### [风险] 暗色模式下视觉效果不一致
**缓解措施**
- 测试所有卡片在暗色模式下的背景色、阴影、边框表现
- 确保 `var(--bg-secondary)``var(--shadow-sm)` 在暗色模式下有正确定义
### [权衡] 短期内仍需手动维护样式一致性
**说明**
- 本次不创建通用 Card 组件,未来新增卡片时仍需手动应用 `.common-card`
- 后续可考虑将其封装为 Vue 组件(如 `<CommonCard>`
## Open Questions
1. **是否需要在 `theme.css` 中新增卡片专用的变量组**
- 例如 `--card-padding`, `--card-radius`, `--card-shadow`
- 优势:语义更清晰,方便未来全局调整
- 劣势:增加变量数量,可能产生冗余
- **建议**:暂不新增,优先使用现有 `--spacing-*``--radius-*` 变量
2. **是否需要为特殊卡片(如 gauge 卡片)定义例外规则**
- BudgetChartAnalysis 中的 gauge 卡片当前使用 `padding: 12px`
- **建议**:保持 12px因为仪表盘需要更紧凑的布局以适应图表