1
0
Files
DiAL/openspec/specs/card-dashboard/spec.md
lanyuanxiaoyao 48a9e96ec2 refactor: 目标卡片改为垂直三层布局
- 卡片宽度从 280px 调整为 270px,确保 StatusBar 30 个色块完整显示
- 布局从水平两行改为垂直三层:标题行、StatusBar、Sparkline 各占一行
- Sparkline 从固定 80x32px 改为占满宽度(约 238px x 40px)
- 三层之间使用 12px gap 间距
- 类名重构:card-row-1 -> card-header,拆分 card-row-2 为 card-status-bar 和 card-sparkline
2026-05-11 17:04:55 +08:00

91 lines
3.9 KiB
Markdown
Raw 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.
## Purpose
定义 Dashboard 的卡片式分组布局:按分组展示目标卡片、响应式网格、卡片内容结构和交互行为。
## Requirements
### Requirement: 分组卡片布局
Dashboard SHALL 按分组展示所有拨测目标,每个分组包含带统计的分组标题和固定宽度的卡片网格。
#### Scenario: 按分组展示目标
- **WHEN** 用户打开 Dashboard 页面
- **THEN** 页面 SHALL 按分组展示目标卡片,"默认分组" 排在最上面,其余分组按 YAML 配置顺序排列
#### Scenario: 分组标题带统计
- **WHEN** 页面渲染某个分组
- **THEN** 分组标题 SHALL 显示分组名称、该分组内目标总数、正常数和异常数,格式为 `分组名 (N个, X UP / Y DOWN)`
#### Scenario: "default" 分组显示名称
- **WHEN** 分组名称为 "default"
- **THEN** 分组标题 SHALL 显示 "默认分组"
### Requirement: 响应式卡片网格
Dashboard SHALL 使用固定宽度的卡片配合 Flexbox 流动布局,容器无最大宽度限制。
#### Scenario: Dashboard 容器占满宽度
- **WHEN** 用户打开 Dashboard 页面
- **THEN** Dashboard 容器 SHALL 占满浏览器宽度,不设置 max-width 限制
#### Scenario: 卡片固定宽度
- **WHEN** 页面渲染卡片(包括 Summary Cards 和 Target Cards
- **THEN** 每个卡片 SHALL 固定宽度 270px使用 `flex-shrink: 0` 防止收缩
#### Scenario: 流动式布局
- **WHEN** 视口宽度变化
- **THEN** 卡片网格 SHALL 使用 Flexbox wrap 自动换行,根据可用宽度调整单行卡片数量
#### Scenario: 卡片左对齐
- **WHEN** 页面渲染卡片网格
- **THEN** 卡片 SHALL 左对齐排列,右侧自然留白
#### Scenario: 统一间距
- **WHEN** 页面渲染 Summary Cards 和 Target Cards
- **THEN** 两种卡片网格 SHALL 使用相同的 gap 间距16px
### Requirement: 目标卡片内容
每个目标卡片 SHALL 展示目标名称、当前状态、类型标签、状态条和迷你耗时趋势线,采用垂直三层布局。
#### Scenario: 卡片第一层内容
- **WHEN** 卡片渲染
- **THEN** 卡片第一层 SHALL 展示状态指示圆点UP 绿色 / DOWN 红色、目标名称和类型标签HTTP / Command
#### Scenario: 卡片状态指示圆点
- **WHEN** 目标最近一次拨测 matched=true
- **THEN** 卡片状态圆点 SHALL 显示为绿色
- **WHEN** 目标最近一次拨测 matched=false
- **THEN** 卡片状态圆点 SHALL 显示为红色
#### Scenario: 卡片第二层状态条
- **WHEN** 卡片渲染且 recentSamples 数据可用
- **THEN** 卡片第二层 SHALL 独占一行展示状态条,包含 30 个色块每个采样点为一个色块UP 显示绿色(#1fbf75DOWN 显示红色(#e5484d),无数据显示灰色(#e2e8f0
#### Scenario: 卡片第三层迷你耗时趋势线
- **WHEN** 卡片渲染且 recentSamples 中有 durationMs 数据
- **THEN** 卡片第三层 SHALL 独占一行展示基于 recharts 的迷你折线图,宽度占满卡片内容区(约 238px高度 40px展示最近 30 次检查的耗时趋势
#### Scenario: 卡片垂直布局间距
- **WHEN** 卡片渲染
- **THEN** 卡片三层之间 SHALL 使用 12px 的间距gap
### Requirement: 卡片交互
卡片 SHALL 支持 hover 效果和点击打开模态框。
#### Scenario: 卡片 hover 效果
- **WHEN** 鼠标悬停在卡片上
- **THEN** 卡片 SHALL 显示上浮效果(阴影加深)
#### Scenario: 卡片点击打开详情
- **WHEN** 用户点击某个目标卡片
- **THEN** 系统 SHALL 打开该目标的详情模态框
### Requirement: 平滑过渡动画
卡片 SHALL 具有平滑的交互过渡动画效果。
#### Scenario: 卡片悬停动画
- **WHEN** 鼠标悬停在卡片上
- **THEN** 卡片 SHALL 平滑过渡显示上浮效果(阴影加深、轻微上移),过渡时长 0.3s
#### Scenario: 布局变化过渡
- **WHEN** 视口宽度变化导致卡片重新排列
- **THEN** 卡片位置变化 SHALL 有平滑的过渡动画