Files
zhixing-system/.trellis/tasks/archive/2026-08/08-10-selection-status-drawer-compact-layout/design.md
T

72 lines
3.4 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.
# 选股执行状态抽屉与紧凑布局技术设计
## 1. Boundaries
本任务的产品边界在 `zhixing-web`:
- `SelectionResultsPage` 继续拥有执行状态、当前结果和局部抽屉开关状态。
- `features/selection/components` 新增执行状态抽屉与未完成评估表格,组件只消费 `SelectionFailure` 等 feature 类型。
- `PageLayout` 负责收紧跨页面的内容节奏;选股页面负责工作台内部的密度和滚动边界。
- `shared/ui/dialog.tsx` 作为底层弹层 primitive 复用,不新增后端或全局状态。
不改变 API adapter、query key、TanStack Query 状态和路由 search 参数。
## 2. Component Shape
建议的组件关系:
```text
SelectionResultsPage
├─ PageLayout
│ ├─ ExecutionToolbar
│ ├─ ResultMetrics(onOpenExecutionStatus)
│ └─ ResultState
│ └─ SelectionResultsWorkbench
└─ ExecutionStatusDrawer
├─ status summary
└─ IncompleteEvaluationTable
```
`FailureList` 从 `ResultState` 移除。`ResultMetrics` 的执行状态入口通过回调通知页面,不把 Dialog 状态放进 Zustand,也不把失败列表复制到本地 state。
抽屉使用 `Dialog` 的受控 `open/onOpenChange`,通过 feature 局部 class 将 popup 定位到右侧、设置 `width: min(600px, 100vw)`、`height: 100svh` 和紧凑边框圆角。这样保留 Base UI 的焦点陷阱、Escape 和遮罩语义,同时避免为一次性业务交互新增浅层 shared primitive。
## 3. Data Flow
```text
SelectionResults.failures
│
├─ ResultMetrics: failure count/status trigger
└─ ExecutionStatusDrawer: read-only props
└─ IncompleteEvaluationTable: rows
```
抽屉不请求数据、不轮询、不修改 URL。抽屉展示的每一行直接对应 `SelectionFailure`,状态和原因只做前端文案格式化;缺失原因显示 `—`。
## 4. Layout and Density
### Desktop
- `AppLayout → main → PageLayout → ResultState → workbench` 保持连续的 `flex: 1`、`min-height: 0` 高度链。
- 操作区、指标区、筛选栏、分页均使用 `shrink-0`。
- 主从工作台使用剩余空间;表格 `overflow-auto`,分页留在面板底部。
- 页面 gutter 由当前 24px 收紧为 16px 级别;内部 panel/filter/detail 使用 8–16px 级别的间距。
### Mobile
- 保留日期、策略、执行按钮的语义和触控尺寸,不为了压缩而降低到桌面 32px。
- 内容容器采用紧凑 gutter 和较小 section gap;页面恢复自然滚动。
- 抽屉宽度随视口收缩,不产生横向溢出;表格必要时只在抽屉内部横向处理长文本,优先让原因换行。
## 5. Compatibility and Rollback
- 旧结果结构仍可直接渲染;只有失败列表的呈现位置改变。
- 若 Drawer 样式影响 Base UI Dialog,可回退为同一受控 Dialog 的居中呈现,不影响数据流和页面其他交互。
- 若高度链修复造成无结果/错误状态被压缩,保留这些状态的最小可读高度,并只让成功结果工作台承担剩余高度。
## 6. Verification Strategy
- 页面测试:抽屉打开、表格内容、空表状态、关闭和焦点入口;确认主页面不再直接渲染失败卡片。
- 质量门禁:Prettier、ESLint、TypeScript、Vitest、Vite build。
- 浏览器:使用可控 mock 结果验证 1440×900、1280×800、390×844、375×812;检查抽屉宽度、分页底部位置、数据区滚动和无水平溢出。