diff --git a/docs/zh-CN/superpowers/specs/2026-04-22-tweakcn-custom-theme-import-design.md b/docs/zh-CN/superpowers/specs/2026-04-22-tweakcn-custom-theme-import-design.md new file mode 100644 index 000000000..9663c6587 --- /dev/null +++ b/docs/zh-CN/superpowers/specs/2026-04-22-tweakcn-custom-theme-import-design.md @@ -0,0 +1,327 @@ +--- +x-i18n: + generated_at: "2026-04-25T01:40:01Z" + model: gpt-5.4 + provider: openai + source_hash: cccaaa1b3e472279b7548ad5af5d50162db9e99a731e06be796de64ee9f8c8d8 + source_path: superpowers/specs/2026-04-22-tweakcn-custom-theme-import-design.md + workflow: 15 +--- + +# Tweakcn 自定义主题导入设计 + +状态:已于 2026-04-22 在终端中批准 + +## 摘要 + +添加一个且仅一个浏览器本地的自定义 Control UI 主题槽位,可通过 tweakcn 分享链接导入。现有内置主题族仍为 `claw`、`knot` 和 `dash`。新的 `custom` 族表现得像一个普通的 OpenClaw 主题族,并且当导入的 tweakcn 负载同时包含 light 和 dark 两套 token 时,支持 `light`、`dark` 和 `system` 模式。 + +导入的主题仅存储在当前浏览器配置文件中,与其他 Control UI 设置一起保存。它不会写入 Gateway 网关配置,也不会在设备或浏览器之间同步。 + +## 问题 + +Control UI 主题系统目前仅支持三个硬编码主题族: + +- `ui/src/ui/theme.ts` +- `ui/src/ui/views/config.ts` +- `ui/src/styles/base.css` + +用户可以在内置主题族及其模式变体之间切换,但无法在不修改仓库 CSS 的情况下从 tweakcn 导入主题。此次需求的目标比通用主题系统更小:保留这三个内置主题,并添加一个由用户控制、可通过 tweakcn 链接替换的导入槽位。 + +## 目标 + +- 保持现有内置主题族不变。 +- 只添加一个导入的自定义槽位,而不是主题库。 +- 接受 tweakcn 分享链接或直接的 `https://tweakcn.com/r/themes/{id}` URL。 +- 仅将导入的主题持久化到浏览器本地存储中。 +- 让导入槽位与现有 `light`、`dark` 和 `system` 模式控制一起工作。 +- 保持安全的失败行为:错误导入绝不能破坏当前激活的 UI 主题。 + +## 非目标 + +- 不做多主题库,也不做浏览器本地导入列表。 +- 不做 Gateway 网关侧持久化或跨设备同步。 +- 不做任意 CSS 编辑器或原始主题 JSON 编辑器。 +- 不自动加载来自 tweakcn 的远程字体资源。 +- 不尝试支持只暴露单一模式的 tweakcn 负载。 +- 不做超出 Control UI 所需接缝范围的全仓库主题重构。 + +## 已确定的用户决策 + +- 保留三个内置主题。 +- 添加一个由 tweakcn 驱动的导入槽位。 +- 将导入的主题存储在浏览器中,而不是 Gateway 网关配置中。 +- 为导入的主题支持 `light`、`dark` 和 `system`。 +- 用下一次导入覆盖自定义槽位是预期行为。 + +## 推荐方案 + +向 Control UI 主题模型添加第四个主题族 id:`custom`。仅当存在有效的 tweakcn 导入内容时,`custom` 族才可被选择。导入的负载会被标准化为 OpenClaw 专用的自定义主题记录,并与其他 UI 设置一起存储在浏览器本地存储中。 + +在运行时,OpenClaw 渲染一个受控的 `