feat(Tab设置+UI主题): 迭代09 Tab设置统一管理 + 迭代10 UI适配DSH主题

迭代09 (R-011): Tab 设置统一管理所有会话 tab
- settings.tabs 布尔对象 → 统一有序数组 (kind: builtin|strategy)
- 旧配置 schema union 兼容 + 读取归一化无感迁移
- strategies 收窄为 {id,name},策略行 name join 自动跟随改名
- 策略增删联动 tabs 条目 (add 追加末尾 / remove 联动删除)
- 客户端统一注册读 tabs 数组,内置与策略可任意混排
- 设置页 Tab 设置子 tab:混排表格 + 拖动手柄 + 显隐开关 + 落点立即持久化
- 策略分组瘦身:仅 新增/重命名/删除 + 指引提示
- 回归测试: test-r011-tabs (23) + test-r011-api (12)

迭代10 (R-012): UI 适配 DSH 浅色/深色/跟随系统主题
- 10 个视图文件 141 处硬编码色 → var(--dsw-alias-*, fallback)
- 语义映射: bg-layer/label/border/state/button-contrast 等
- 淡底 color-mix 自适应;遮罩 bg-mask-1;阴影 shadow-lv3
This commit is contained in:
2026-09-02 14:00:56 +08:00
parent 35f2ad1a23
commit 4ac8a29805
15 changed files with 629 additions and 385 deletions
+6 -9
View File
@@ -2,15 +2,15 @@
* 服务端 API:策略 / 份额 / tabs 域(从 api.js 拆分,2026-08-31
*
* 端点:
* strategies / strategies/update / strategies/add / strategies/remove / strategies/move
* strategies / strategies/update / strategies/add / strategies/remove
* strategy-positions / unallocated / summary
* add-shares / move-all-shares / remove-shares
* tabs / tabs/update
*/
import {
getStrategies, updateStrategies, addStrategy, removeStrategy, moveStrategy,
getTabConfig, updateTabConfig,
getStrategies, updateStrategies, addStrategy, removeStrategy,
getTabs, updateTabs,
} from '../settings.js';
/** 策略/份额/tabs 端点方法表 */
@@ -19,7 +19,6 @@ export const STRATEGY_METHODS = new Set([
'strategies/update',
'strategies/add',
'strategies/remove',
'strategies/move',
'strategy-positions',
'unallocated',
'summary',
@@ -50,13 +49,11 @@ export async function handleStrategy(method, args, { manager, settings }) {
await removeStrategy(settings, args.strategyId);
await manager.clearStrategyShares(args.strategyId);
return getStrategies(settings);
case 'strategies/move':
return await moveStrategy(settings, args.strategyId, args.dir);
case 'tabs':
return getTabConfig(settings);
return getTabs(settings);
case 'tabs/update':
await updateTabConfig(settings, args.tabs);
return getTabConfig(settings);
await updateTabs(settings, args.tabs);
return getTabs(settings);
case 'strategy-positions':
return await manager.getStrategyPositions(args.strategyId);
case 'unallocated':