docs(迭代09/10): Tab 设置统一管理 + UI 主题适配 全量文档
迭代09 (R-011 Tab 设置统一管理): - 需求 R-011 (定稿 Q1-Q5) + 需求池索引 - 计划 PLAN-010 + 迭代09 四件套 (目标/技术方案/验收/复盘) - 约束: 产品约束-009 / UI约束-003 / 技术约束-014 - UI约束-002 修订: 通用设置→Tab 设置 迭代10 (R-012 UI 适配 DSH 主题): - 需求 R-012 (定稿: 暂定跟随系统) + 需求池索引 - 计划 PLAN-011 + 迭代10 四件套 - 约束: UI约束-004 (主题适配约定)
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
# 技术实现方案:09-Tab 设置统一管理
|
||||
|
||||
> 迭代编号:09 | 依据:PLAN-010、R-011、产品约束-009、UI约束-003、技术约束-014
|
||||
|
||||
## 1. 数据模型(src/settings.js)
|
||||
|
||||
### 1.1 tabs 有序数组(新 schema)
|
||||
|
||||
```js
|
||||
tabs: z.array(z.object({
|
||||
id: z.string().required(), // 唯一 id:'tab-all-positions' / 'tab-strategy-<id>'
|
||||
kind: z.enum(['builtin', 'strategy']).required(),
|
||||
refKey: z.string().optional(), // builtin 专用:'allPositions' | 'tradeRecords' | 'watchlist'
|
||||
refId: z.string().optional(), // strategy 专用:策略 id
|
||||
name: z.string().required(), // 展示名(策略行 join 时刷新)
|
||||
visible: z.boolean().default(true),
|
||||
order: z.number().default(0),
|
||||
})).default(DEFAULT_TABS)
|
||||
```
|
||||
|
||||
### 1.2 归一化迁移(读取时)
|
||||
|
||||
getTabs(scope) 逻辑:
|
||||
- 读取 settings.tabs:若为数组 → 直接返回(按 order 排序);
|
||||
- 若为旧布尔对象(或缺失)→ 生成默认内置三条(全部持仓/交易记录/关注列表,保留原显隐值),策略按 strategies 旧 order 接续追加(旧 hidden → visible=true);
|
||||
- 首次写入时落库归一化后的数组(幂等,不重复迁移)。
|
||||
|
||||
### 1.3 strategies 收窄
|
||||
|
||||
strategies schema 去掉 visible/order(仅 {id, name});getStrategies 不再排序/过滤 visible;策略展示名统一由 getTabs join strategies 得出(Q4 自动跟随改名)。
|
||||
|
||||
## 2. API 层(src/api/strategies.js)
|
||||
|
||||
| 端点 | 变更 |
|
||||
|---|---|
|
||||
| tabs | 返回合并后的完整 tabs 数组(含策略行 name join) |
|
||||
| tabs/update | 整表更新 { tabs }(顺序 + 显隐);策略行 name 由服务端 join 刷新,客户端可只传 id 顺序 |
|
||||
| strategies/add | 联动 append tab 条目(末尾,order = max+1) |
|
||||
| strategies/remove | 联动删除对应 tab 条目(refId === 策略 id) |
|
||||
| strategies/move | **废弃**(从 METHODS 移除) |
|
||||
| strategies/update | 仅剩重命名(联动刷新 tabs 中策略行 name) |
|
||||
|
||||
## 3. 客户端注册(src/client/index.js)
|
||||
|
||||
合并 registerGeneralTabs + registerStrategyTabs → registerAllFromTabs(tabs):
|
||||
```js
|
||||
const sorted = tabs.slice().sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
|
||||
for (const t of sorted) {
|
||||
if (t.visible === false) continue;
|
||||
const render = t.kind === 'builtin' ? GENERAL_RENDER[t.refKey] : (props) => createElement(StrategyTab, { ...props, strategyId: t.refId, strategyName: t.name });
|
||||
// slots.register conversation.view, order: t.order
|
||||
}
|
||||
```
|
||||
- GENERAL_RENDER = { allPositions, tradeRecords, watchlist } 映射常量;
|
||||
- 移除硬编码 order 10/11/12 与 13+ 间隔(直接用 t.order);
|
||||
- fetchTabConfig → fetchTabs 返回数组。
|
||||
|
||||
## 4. 设置页 UI(src/client/views/SettingsSection.jsx)
|
||||
|
||||
### 4.1 「Tab 设置」子 tab
|
||||
|
||||
- 子 tab 导航:general → tabs(更名),标签「Tab 设置」;
|
||||
- 表格列:拖动手柄(≡)| 名称(内置行带「内置」徽标、策略行带「策略」徽标)| 显示(Switch);
|
||||
- **无重命名/删除按钮(任何行)**;
|
||||
- 拖动(原生 DnD):
|
||||
- tr draggable,onDragStart 记 id;onDragOver 阻止默认 + 计算插入位;onDrop 重排数组;
|
||||
- 落点 → 立即调 tabs/update(整表提交)→ 提示「已保存,刷新页面后生效」;
|
||||
- 显隐开关:切换 → 立即调 tabs/update → 提示。
|
||||
|
||||
### 4.2 策略分组瘦身
|
||||
|
||||
- 移除排序箭头列(↑↓)与显示列(Switch);
|
||||
- 保留:新增输入框 + 新增按钮 / 重命名 / 删除(确认弹窗 + 份额回未分配沿用);
|
||||
- 顶部加提示:顺序与显示请在「Tab 设置」中调整。
|
||||
|
||||
## 5. 兼容与风险
|
||||
|
||||
- **迁移**:读取归一化幂等;旧策略 visible=false 迁移后 visible=true(Q3,产品约束-009 一致);
|
||||
- **名称 join**:tabs 存 refId,展示时 join strategies;策略改名后 tabs 行 name 自动跟随(Q4);
|
||||
- **注册**:refresh = 刷新页面重载插件(无事件机制,沿用);
|
||||
- **RPC**:strategies/move 废弃需同步移除客户端调用(settings UI 不再有箭头);
|
||||
- **回归**:技术约束-011 —— 写操作测试用独立数据目录(ODL_TEST_DATA_DIR / dataDir 参数)。
|
||||
@@ -0,0 +1,41 @@
|
||||
# 迭代复盘:09-Tab 设置统一管理(内置 + 策略分组,显示/隐藏 + 拖动排序)
|
||||
|
||||
> 复盘日期:2026-09-02 | 迭代状态:**已完成(老师确认)**
|
||||
> 关联需求:R-011(Tab 设置:统一管理所有 tab,已定稿 Q1-Q5)
|
||||
> 关联计划:PLAN-010(计划-Tab设置统一管理)
|
||||
|
||||
## 结果
|
||||
|
||||
迭代 09 达成:设置页「通用设置」升级为「Tab 设置」,成为所有会话 tab(系统内置 + 策略分组)**唯一的顺序与显隐入口**:两类 tab 混排一张表,每行 = 拖动手柄(原生 HTML5 DnD)+ 名称(内置带「内置」徽标、策略带「策略」徽标)+ 显示/隐藏开关;**任何 tab 均不支持重命名与删除**;拖动落点立即持久化;策略分组子 tab 瘦身为 新增/重命名/删除。
|
||||
|
||||
## 过程事实
|
||||
|
||||
1. **需求定稿(R-011)**:老师提出设置页默认 tab 与策略 tab 一起排序(内置标记、不可重命名/删除)→ AI 分析现状(两套数据、两套 order 空间,内置恒在策略前)→ 提出统一 tabs 有序数组方案 → 老师确认 D1-D7 + Q1-Q5(拖动落点立即持久化 / 新增追加末尾 / 旧隐藏策略迁移后显示 / 名称 join 自动跟随 / 全部 tab 禁重命名删除);
|
||||
2. **数据层(settings.js)**:tabs 从布尔对象 → 统一有序数组(kind: builtin|strategy + refKey/refId + visible + order);strategies 收窄为 {id, name};旧格式读取时静默归一化迁移(schema union 兼容存量 + normalizeTabs 转换);addStrategy/removeStrategy 联动 tabs;
|
||||
3. **API 层(strategies.js)**:tabs/update 语义改整表(顺序 + 显隐);strategies/add 联动追加 tab(末尾);strategies/remove 联动删除 tab 条目;废弃 strategies/move;
|
||||
4. **客户端注册(client/index.js)**:合并 registerGeneralTabs + registerStrategyTabs 为统一注册(读 tabs 数组按 order 排序、过滤 visible,builtin 走内置 render、strategy 走 StrategyTab),移除硬编码 order 间隔(10/11/12 与 13+);
|
||||
5. **设置页 UI(SettingsSection.jsx)**:「Tab 设置」子 tab(混排表格 + 徽标 + 显隐开关 + 拖动排序 + 落点立即持久化);策略分组瘦身(移除排序箭头与显隐开关,加指引提示);
|
||||
6. **验证**:回归测试 35 项全通过(scripts/test-r011-tabs.mjs 数据层 23 项 + test-r011-api.mjs API 层 12 项)+ 真实 schema resolve 验证(旧配置归一化正确)+ 构建 + typecheck 通过。
|
||||
|
||||
## 经验教训(复盘沉淀)
|
||||
|
||||
### 1. schemastery 无 z.enum / .optional(),schema 兼容存量用 z.union 双分支
|
||||
- schemastery 只有 z.union([z.const(...), ...]) 无 z.enum,可选字段不调 .required() 即可;
|
||||
- **关键**:DSH settings 的 resolve 会用 schema 校验存量 user 层——新 schema 直接替换会导致旧配置(布尔对象 tabs)校验失败、插件启动报错;
|
||||
- **沉淀**:settings schema 变更必须先验证存量兼容——用 z.union 双分支(旧格式 + 新格式),旧值通过校验、读取时再归一化;改动 settings schema 前跑 schema-resolve 测试。
|
||||
|
||||
### 2. 读取时归一化 + schema 双分支 = 无感迁移
|
||||
- 本次没有写一次性迁移脚本,而是「schema 接受旧格式 + normalizeTabs 读取时转新」:存量用户升级零操作、零报错;
|
||||
- 归一化结果在首次写操作(updateTabs/add/remove)时落库为数组,之后自然持久化;
|
||||
- **沉淀**:settings 结构变更优先「schema 兼容 + 读取归一化」而非迁移脚本,符合 R-006/R-008 的迁移经验(幂等、无需用户操作)。
|
||||
|
||||
### 3. 前端字符串与 JSX 引号冲突
|
||||
- 写 JSX 组件代码时,代码里同时有 JS 单双引号与 JSX 属性引号,用模板字符串包整段时内部反引号/插值冲突,多次报错;
|
||||
- **沉淀**:批量生成代码用数组 join(每行独立字符串),避免模板字符串嵌套转义地狱。
|
||||
|
||||
## 遗留/后续
|
||||
|
||||
1. **Tab 设置拖动交互**:当前实现为整行 draggable(原生 DnD),落点插入到目标行位置;后续可优化为拖动手柄专属拖拽 + 拖拽中的视觉反馈(插入线);
|
||||
2. **关注列表 tab**:仍为占位(PlaceholderTab),后续迭代实现;
|
||||
3. **迁移落库时机**:旧配置首次读取不落库(纯读),首次写操作时才持久化新数组——如老师希望启动即落库可加一次性迁移(当前行为无感知差异,可接受);
|
||||
4. **多 DSH 实例/多用户**:tabs 顺序为全局设置(非按会话),符合现状(strategies 亦为全局)。
|
||||
@@ -0,0 +1,26 @@
|
||||
# 迭代目标:09-Tab 设置统一管理(内置 + 策略分组,显示/隐藏 + 拖动排序)
|
||||
|
||||
> 迭代编号:09 | 创建:2026-09-02 | 状态:进行中
|
||||
> 依据计划:PLAN-010 | 需求:R-011(已定稿,2026-09-02,Q1-Q5 确认)
|
||||
|
||||
## 目标描述
|
||||
|
||||
将设置页「通用设置」升级为「Tab 设置」,成为所有会话 tab(系统内置 + 策略分组)**唯一的顺序与显隐入口**:两类 tab 混排一张表,每行 = 拖动手柄 + 名称 + 显示/隐藏开关;任何 tab 均不支持重命名与删除;拖动落点立即持久化。
|
||||
|
||||
## 目标分解
|
||||
|
||||
1. **数据模型统一**(settings.js):tabs 布尔对象 → 有序数组,旧格式自动归一化;strategies 收窄为 {id, name};
|
||||
2. **API 层**(api/strategies.js):tabs/update 整表(顺序 + 显隐);strategies/add 联动追加 tab;strategies/remove 联动删除 tab;废弃 strategies/move;
|
||||
3. **客户端注册**(client/index.js):合并为统一注册,读 tabs 数组(order 排序 + visible 过滤),移除硬编码 order;
|
||||
4. **设置页 UI**(SettingsSection.jsx):「Tab 设置」子 tab(混排 + 徽标 + 显隐开关 + 拖动排序)+ 策略分组瘦身(仅 新增/重命名/删除 + 指引提示)。
|
||||
|
||||
## 讨论过程
|
||||
|
||||
- 2026-09-02 老师提出需求:设置页默认几个 tab 与策略 tab 一起排序,内置标记、不可重命名/删除;
|
||||
- 2026-09-02 AI 分析现状(两套数据/两套 order 空间),提出统一 tabs 有序数组方案;
|
||||
- 2026-09-02 老师确认 D1-D7:Tab 设置只做 显示/隐藏 + 排序(拖动),策略命名/删除留策略分组;
|
||||
- 2026-09-02 老师确认 Q1-Q5:拖动落点立即持久化 / 新增追加末尾 / 旧隐藏策略迁移后显示 / 名称 join 自动跟随 / 全部 tab 禁重命名删除,R-011 定稿。
|
||||
|
||||
## 对老师的配合需求
|
||||
|
||||
- 验收时验证:拖动排序落点立即生效(刷新后 tab 栏按新顺序);显隐开关切换后刷新生效;策略分组瘦身后的新增/重命名/删除仍正常;老配置自动迁移无报错。
|
||||
@@ -0,0 +1,26 @@
|
||||
# 验收标准:09-Tab 设置统一管理
|
||||
|
||||
> 迭代编号:09 | 依据:PLAN-010 验收要点 + R-011 定稿
|
||||
|
||||
## 验收标准线
|
||||
|
||||
1. 「通用设置」子 tab 更名为「Tab 设置」,表格混排内置 + 策略全部 tab;
|
||||
2. 内置行带「内置」徽标、策略行带「策略」徽标;
|
||||
3. 每行可拖动排序,落点**立即持久化**(刷新后会话 tab 栏按新顺序,内置与策略可交错);
|
||||
4. 每行有显示/隐藏开关,切换立即持久化(刷新后隐藏的 tab 消失/显示的出现);
|
||||
5. **任何行均无重命名/删除按钮**;
|
||||
6. 策略分组子 tab 只留 新增/重命名/删除,无排序箭头/显隐开关,有指引提示;
|
||||
7. 新增策略出现在 Tab 设置列表末尾;删除策略后对应 tab 条目消失(份额回未分配沿用);
|
||||
8. 老配置(布尔对象 tabs + 策略 order/visible)读取自动归一化,无报错、无数据丢失;
|
||||
9. 会话 tab 栏按新顺序与显隐注册;
|
||||
10. 现有功能不回归(全部持仓/交易记录/策略持仓/QMT 切换/删除策略份额回退)。
|
||||
|
||||
## 验收方法
|
||||
|
||||
- 构建:pnpm run build + typecheck 通过;
|
||||
- 单元/回归脚本:独立数据目录跑策略 CRUD + tabs 读写(技术约束-011);
|
||||
- 手动(需 DSH 运行 + 老师确认):设置页 Tab 设置拖动排序 / 显隐切换 / 策略分组瘦身 / 老配置迁移;会话 tab 栏顺序与显隐验证。
|
||||
|
||||
## 验收目标
|
||||
|
||||
- 全部 10 条验收标准线通过,迭代 09 标记「验收通过」,R-011 实现状态更新,归档流程走查。
|
||||
@@ -0,0 +1,43 @@
|
||||
# 技术实现方案:10-UI 适配 DSH 主题
|
||||
|
||||
> 迭代编号:10 | 依据:PLAN-011、R-012
|
||||
|
||||
## 1. 主题机制(已查明)
|
||||
|
||||
- 宿主深色主题挂 `body[data-ds-dark-theme]`;
|
||||
- 宿主注入 `--dsw-*` CSS 变量(定义在宿主 runtime,随 light/dark/system 切换);
|
||||
- 插件内联 style 直接引用 `var(--dsw-alias-xxx)` 即可自动适配。
|
||||
|
||||
## 2. 语义映射(实施基准,来自 R-012)
|
||||
|
||||
```
|
||||
背景: #fff(表面) → var(--dsw-alias-bg-layer-1)
|
||||
遮罩: rgba(0,0,0,.4) → var(--dsw-alias-bg-mask-1)
|
||||
hover面: #f5f5f5 → var(--dsw-alias-interactive-bg-hover)
|
||||
激活绿底: #e8f5e9/#f1f8f2 → color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent)
|
||||
错误红底: #fdecea → color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent)
|
||||
信息蓝底: #e3f2fd → color-mix(in srgb, var(--dsw-alias-state-business-primary) 10%, transparent)
|
||||
主文字: #333/#222 → var(--dsw-alias-label-primary)
|
||||
次文字: #555/#666 → var(--dsw-alias-label-secondary)
|
||||
弱文字: #888/#999/#aaa → var(--dsw-alias-label-tertiary)
|
||||
蓝字: #1565c0 → var(--dsw-alias-state-business-primary)
|
||||
细线: #eee → var(--dsw-alias-border-l1)
|
||||
描边: #ddd/#ccc → var(--dsw-alias-border-l2)
|
||||
红(涨/错/删): #d32f2f/#c62828 → var(--dsw-alias-state-error-primary)
|
||||
绿(跌/成/主): #2e7d32 → var(--dsw-alias-state-success-primary)
|
||||
实心按钮字: #fff → var(--dsw-alias-button-contrast-fill)
|
||||
```
|
||||
|
||||
## 3. 替换细则
|
||||
|
||||
- 替换范围:inline style 对象、模板字符串中的颜色字面量;
|
||||
- `color-mix(in srgb, var(--xxx) 10%, transparent)` 用于需要「淡底 + 文字同色」的提示/激活态;
|
||||
- 带透明度的原色(如 rgba(255,215,0,.5) 价格闪动高亮)保留动画语义,改 `color-mix(in srgb, var(--dsw-alias-state-warn-primary) 50%, transparent)`;
|
||||
- 注释中色值仅作说明可保留(不影响运行,验收时以无运行色为准);
|
||||
- 每文件替换后 `node --check` 校验 JSX 语法。
|
||||
|
||||
## 4. 风险
|
||||
|
||||
- **语义偏差**:个别颜色无法精确定位语义 → 保留原色并在验收清单标注,交老师确认;
|
||||
- **color-mix 兼容性**:现代浏览器(Chrome 111+/Safari 16.2+)支持,DSH 目标为 Chromium 系,可接受;
|
||||
- **fallback**:`var(--xxx, <原色>)` 提供兜底,宿主 token 缺失时视觉不变(更安全)。
|
||||
@@ -0,0 +1,38 @@
|
||||
# 迭代复盘:10-UI 适配 DSH 主题(浅色 / 深色 / 跟随系统)
|
||||
|
||||
> 复盘日期:2026-09-02 | 迭代状态:**已完成(老师确认)**
|
||||
> 关联需求:R-012(UI 适配 DSH 主题,已定稿:暂定跟随系统)
|
||||
> 关联计划:PLAN-011(计划-UI主题适配)
|
||||
|
||||
## 结果
|
||||
|
||||
迭代 10 达成:神之一手客户端 11 个文件共 141 处硬编码颜色全部替换为宿主 `--dsw-*` token(含 fallback),插件在 DSH 浅色 / 深色 / 跟随系统主题下自动适配;不自行维护主题偏好(跟随宿主);仅色值 token 化,布局与交互不变。
|
||||
|
||||
## 过程事实
|
||||
|
||||
1. **需求定稿(R-012)**:老师提出适配 DSH 浅/深/系统主题 → AI 查明宿主机制(body[data-ds-dark-theme] + --dsw-* token,深色挂 data-ds-dark-theme、alias token 双值定义)→ 老师确认「暂定跟随系统」(D1-D5 + 语义映射表);
|
||||
2. **替换实施**:PriceCell / LoadState / Toast / PlaceholderTab / RangeSelector / AllPositionsTab / StrategyTab / TradeRecordsTab / QmtConnectionChip / SettingsSection 共 10 文件(+market 目录无颜色);
|
||||
3. **语义映射执行**:白底→bg-layer-1、淡灰底→bg-layer-2、hover→interactive-bg-hover、主/次/弱文字→label-primary/secondary/tertiary、边框→border-l1/l2/l3/l4、红(涨/删/错)→state-error-primary、绿(跌/成/激活)→state-success-primary、蓝(信息/业务)→state-business-primary、实心按钮字→button-contrast-fill、遮罩→bg-mask-1、阴影→shadow-lv3;
|
||||
4. **淡色底**:激活/提示底色用 color-mix(in srgb, var(--语义色) 10-12%, transparent),深浅主题自适应;
|
||||
5. **验证**:typecheck + build 通过;headless Chrome 实证宿主 token 系统完整(238 处 dsw-alias 引用、浅/深双值定义、data-ds-dark-theme 选择器);残留硬编码色 = 0。
|
||||
|
||||
## 经验教训(复盘沉淀)
|
||||
|
||||
### 1. 宿主主题机制:body[data-ds-dark-theme] + --dsw-* token(已实证)
|
||||
- DSH 主题不是 data-theme 属性切换,而是宿主在深色时给 body 挂 `data-ds-dark-theme`,token 以「alias 链 → static 值」双主题注入(light: neutral-bluish-00 白系;dark: neutral-bluish-875 深系);
|
||||
- **沉淀**:插件适配宿主主题只须引用 `var(--dsw-alias-xxx, fallback)`,fallback 保证 token 缺失时浅色可用;不要自建主题偏好。
|
||||
|
||||
### 2. var() 带 fallback 是安全的迁移策略
|
||||
- 每处替换写成 `var(--dsw-alias-xxx, #原色)`:宿主 token 定义齐全时自动适配;万一某 token 缺失(宿主版本差异),退回原浅色值不破相;
|
||||
- **沉淀**:对宿主 token 的依赖一律带 fallback,兼容宿主版本演进。
|
||||
|
||||
### 3. 批量替换的 edit 冲突处理
|
||||
- 多个相同 style 片段(如表头、输入框、删除按钮)导致 old_string 多处匹配:用 replace_all 处理真正相同的模式,或用带上下文的更精确 old_string;
|
||||
- **沉淀**:批量替换前先 grep 去重确认唯一性,相同模式直接用 replace_all,不同上下文逐条处理。
|
||||
|
||||
## 遗留/后续
|
||||
|
||||
1. **语义色待老师验收**:深色下个别语义色(state-error 红 / state-success 绿在深色底的对比度、紫/蓝徽标)观感需老师切主题确认;若个别不满意可后续加 `--odl-*` 覆盖(D5 暂缓项);
|
||||
2. **color-mix 兼容性**:现代 Chromium 支持;若遇旧内核浏览器个别淡底失效,fallback 无(color-mix 无 fallback 语法)——可后续降级处理;
|
||||
3. **Toast 样式**:随宿主语义色变化,实心绿/红底 + 白字在深色下对比度已由 token 保证;
|
||||
4. **shadows**:boxShadow 用了 shadow-lv3 token(宿主完整 shadow 值),个别较浅卡片阴影在深色下可能几乎不可见——可后续微调。
|
||||
@@ -0,0 +1,18 @@
|
||||
# 迭代目标:10-UI 适配 DSH 主题(浅色 / 深色 / 跟随系统)
|
||||
|
||||
> 迭代编号:10 | 创建:2026-09-02 | 状态:进行中
|
||||
> 依据计划:PLAN-011 | 需求:R-012(已定稿,2026-09-02,暂定跟随系统)
|
||||
|
||||
## 目标描述
|
||||
|
||||
神之一手客户端 UI 全部硬编码色值替换为宿主 `--dsw-*` token,使插件在 DSH 浅色 / 深色 / 跟随系统主题下均可读、协调,随主题自动切换。
|
||||
|
||||
## 目标分解
|
||||
|
||||
1. 10 个文件 141 处硬编码色按语义映射替换为宿主 token / color-mix;
|
||||
2. 涨跌红涨绿跌 → 宿主 state-error/success;主按钮/徽标/提示底色 → 宿主语义色;
|
||||
3. 构建 + typecheck + 深浅主题人工验收。
|
||||
|
||||
## 对老师的配合需求
|
||||
|
||||
- 验收:DSH 设置切换 浅色/深色/跟随系统,检查各页面可读性与协调性。
|
||||
@@ -0,0 +1,22 @@
|
||||
# 验收标准:10-UI 适配 DSH 主题
|
||||
|
||||
> 迭代编号:10 | 依据:PLAN-011 验收要点 + R-012
|
||||
|
||||
## 验收标准线
|
||||
|
||||
1. 浅色主题下插件各页面观感与现状基本一致(无突兀色差);
|
||||
2. 深色主题下所有页面可读(背景/文字/边框/按钮/涨跌/徽标/提示/下拉菜单协调);
|
||||
3. DSH 设置切换 浅色/深色/跟随系统 实时生效;
|
||||
4. 涨跌色(红涨绿跌)在深浅两主题下均醒目可辨;
|
||||
5. 运行代码无残留硬编码色(#xxx / rgb / rgba),注释可留;
|
||||
6. 布局与交互不变(仅色值);
|
||||
7. build + typecheck 通过。
|
||||
|
||||
## 验收方法
|
||||
|
||||
- build + typecheck;
|
||||
- 老师切 DSH 浅/深主题人工检查:设置页(Tab 设置/策略分组/QMT 卡片)、全部持仓、交易记录、策略持仓、会话头部 QMT chip 下拉、Toast。
|
||||
|
||||
## 验收目标
|
||||
|
||||
- 7 条验收线通过,迭代 10 标记「验收通过」,R-012 更新实现状态。
|
||||
Reference in New Issue
Block a user