# DESIGN — dsh-opencode-palette v2(多主题引擎) > 目标:让 DSH Web 界面支持 **opencode TUI 的全部 34 个主题**(33 内置 + system), > 可即时切换、可持久化、可扩展。本文是架构师视角的设计说明:分层、数据流、映射表、扩展点。 ## 1. 一句话架构 **数据驱动三层管线:`主题数据(JSON) → 颜色解析(resolve) → DSH 适配(map+generate) → 注入(apply)`**。 主题是纯数据(vendored 自 opencode v1.18.12 官方 tag),代码不硬编码任何颜色; DSH 侧知识(CSS 变量名)被收敛到唯一一张映射表 `map-dsh.mjs`。 ## 2. 目录结构 ``` dsh-opencode-palette/ ├── package.json # dev 工作区(scripts: sync / build / test) ├── DESIGN.md # 本文 ├── README.md # 用户文档 ├── scripts/ │ ├── sync-themes.mjs # ① 数据层:从 opencode 官方 tag 同步主题 JSON(带校验+指纹) │ └── build-client.mjs # ④ 构建层:零依赖 mini-bundler → 产物 ├── src/ │ ├── themes/ # ① vendored 主题数据(33 个 JSON + NOTICES) │ └── engine/ # ② 纯逻辑引擎(ESM,可在 node 直接测试) │ ├── resolve.mjs # 颜色解析器:引用链 → RGBA/HEX │ ├── map-dsh.mjs # ★ 单一真相源:opencode 色位 → DSH CSS 变量 │ ├── generate.mjs # 主题 → { tokens, cssText } │ ├── registry.mjs # 注册表:33 JSON + system 生成 │ └── index.mjs # ThemeEngine 门面(无 DOM 依赖) ├── runtime/ │ └── client.mjs # ③ 浏览器胶水:注入/热切换/持久化/设置面板 ├── tests/ │ └── engine.test.mjs # 引擎单测(node:test,无需浏览器) ├── package/ # 产物:可分发 npm 包(build 生成) │ ├── package.json │ ├── README.md │ └── lib/{index.js, client.js} └── client.js # 动态版产物(build 生成,与包版同源) ``` ## 3. 分层职责与数据流 ``` [数据层] src/themes/*.json opencode 官方主题定义(defs 引用表 + theme 色位表) │ sync-themes.mjs 负责获取/校验/指纹(版本锁 v1.18.12) ▼ [引擎层] resolve.mjs 把 defs/theme 引用链、{dark,light} 变体、ANSI 数字、 │ transparent/none 全部解析为确定 HEX/RGBA(带循环检测) ▼ [引擎层] registry.mjs themes = 33 静态 + system 运行时生成;字母序;搜索 ▼ [适配层] map-dsh.mjs 语义色位 → DSH CSS 变量(--dsw-alias-* / --shiki-token-*) ▼ [生成层] generate.mjs 主题 → { tokens: overrideTokens 对象, css: