返回 DeepSeek-Reasonix
THEME_PACK.zh-CN.md
根目录 / docs / THEME_PACK.zh-CN.md
1 # Reasonix 主题包 V2
2
3 Reasonix 桌面端原生主题包。主题是**受控皮肤**:语义颜色令牌、密度/圆角配方,以及首页与任务/工作区可独立配置的本地背景图。主题**不能**执行 CSS、JavaScript、加载字体、远程 URL 或 SVG 脚本。V1 主题继续兼容,并在两个场景共用首页图片。
4
5 > English: [THEME_PACK.md](./THEME_PACK.md)
6
7 ## 首版目标
8
9 - 内置风格、自建主题、背景图、实时预览、导入/导出、本地主题库
10 - 首页完整展示背景;进入任务后自动降低透明度并增加方向性遮罩
11 - 同时支持 Workbench / Creation,以及 `auto` / `light` / `dark`
12 - **不包含**在线主题市场、云同步或脚本插件
13
14 ## 主题体验(设置信息架构)
15
16 聊天代码块使用语言标题栏和常显复制按钮,与代码正文共用不透明背景。
17 关键字、字符串、函数、数字和注释分别着色,并根据最终代码及 Diff 背景
18 校正至至少 4.5:1 对比度,覆盖反转明暗和半透明自定义配色。壁纸透明度
19 不影响代码及标题栏按钮;切换主题通过 CSS 为已有语法节点重新着色。
20 正在生成的代码块使用同一查看器,未变化的高亮行保留 DOM;较长代码追加时,
21 在空闲高亮完成前保留已有前缀颜色。不支持的语言继续显示纯文本。
22
23 在 `desktop/frontend` 运行 `pnpm test:code-browser`,验证实际 Markdown
24 组件的主题、流式生成、复制和窄窗口行为。
25
26 外观拆成两个界面(不增加第三套入口):
27
28 1. **外观概览页** — 当前主题摘要、明暗模式、**唯一**基础配色控件、字体与缩放。主操作:**浏览主题**。
29 2. **主题画廊** — 官方 / 我的主题 / 基础配色三个分类;点击卡片仅选中;详情区隔离预览;
30 「临时预览」才覆盖全应用;只有「应用主题」会持久化。沉浸式预览是画廊详情的一部分。
31
32 状态模型(`desktop-theme-state.json` schema v2):
33
34 | 状态 | 含义 | 持久化 |
35 | --- | --- | --- |
36 | `themeMode` | 自动 / 浅色 / 深色 | 桌面配置 |
37 | `baseStyle` | Graphite…Amber | 桌面配置(`theme_style`) |
38 | `activeThemeId` | 仅官方、用户或插件主题 | `desktop-theme-state.json` |
39 | `selectedThemeId` / `previewThemeId` | 画廊选中 / 临时预览 | 仅前端内存 |
40
41 - `activeThemeId` **禁止**保存基础配色 id。选择基础配色会清空主题包。
42 - 应用主题包时保留 `baseStyle` 作为停用后的回退值。
43 - 明暗模式与主题包独立。
44
45 ## 主题类型
46
47 画廊分四组:
48
49 | 类型 | 来源 | 可编辑 | 可删除 | 可导出 |
50 | --- | --- | --- | --- | --- |
51 | **基础风格** | 六种视觉方向(Graphite、Aurora、Slate、Carbon、Nocturne、Amber),无令牌覆盖 | 否(需先复制) | 否 | 否 |
52 | **官方主题** | 安装包内嵌的八款只读主题(清单 + 原创背景 + 缩略图,MIT) | 否(需先复制) | 否 | 否 |
53 | **我的主题** | 编辑器新建、复制,或导入 `.reasonix-theme` | 是 | 是 | 是 |
54 | **插件主题** | 已启用插件贡献的 `.reasonix-theme`(Manifest v2 `contributes.themes`),直接从插件目录读取——从不拷入用户库 | 否 | 否(禁用或卸载插件) | 否 |
55
56 - 14 个内置 id(6 基础 + 8 官方)均为**保留名**:保存、导入、覆盖复制与删除都会拒绝冲突。
57 - 激活官方主题时,仅把其 id 写入 `desktop-theme-state.json`;资源在运行时从嵌入副本读取。
58 - 对基础/官方主题执行「复制」会生成可编辑的用户主题(官方背景会拷入用户库),之后可编辑或导出。
59 - v1 若把基础配色 id 存为 `activeThemeId`,加载时会迁移到 `desktop.theme_style` 并清空活动主题。
60 - 插件主题的外部 id 形如 `plugin:<plugin>:<theme>`;包内 `id` 仍遵循既有 id 规则。无效的 contributed 文件会被跳过并在主题视图中给出警告,绝不致命。当活动 id 对应的插件缺失、被禁用或被卸载时,界面回退到已配置的基础风格,但该 id **保留**在 `desktop-theme-state.json` 中——重新安装同一插件即可恢复主题。保存/删除/复制/导出都会以只读为由拒绝插件主题 id。
61
62 ### 八款官方主题
63
64 | ID | 名称 | 基础风格 | 画面 |
65 | --- | --- | --- | --- |
66 | `official-rose-dawn` | Rose Dawn / 玫瑰晨光 | graphite | 象牙白晨光、柔粉玫瑰、原创插画女性 |
67 | `official-fortune-forge` | Fortune Forge / 鸿运工坊 | amber | 朱红/金/玉绿工坊、原创吉祥程序员 |
68 | `official-crimson-horizon` | Crimson Horizon / 赤曜新城 | graphite | 珊瑚红未来城市天际线,无人物 |
69 | `official-sage-breeze` | Sage Breeze / 鼠尾草清风 | slate | 奶油纸张、鼠尾草、原创读者 |
70 | `official-spark-notebook` | Spark Notebook / 灵感手账 | aurora | 手账网格与文具、原创动漫成年人 |
71 | `official-violet-starlight` | Violet Starlight / 紫曜星夜 | nocturne | 蓝紫星空、蝴蝶、剪影女性 |
72 | `official-cyan-stage` | Cyan Stage / 青岚舞台 | carbon | 青蓝舞台与光环、原创数字表演者 |
73 | `official-noir-gold` | Noir Gold / 黑金序曲 | carbon | 黑丝绒、金色聚光灯、原创绅士 |
74
75 预览在应用内主题库(设置 → 外观)中展示,来自真实 Reasonix 构建。**请勿把应用截图当作主题背景导入。** 素材来源、哈希与许可记录见 [THEME_ASSETS.zh-CN.md](./THEME_ASSETS.zh-CN.md);生成脚本在 `scripts/official-theme-art/`(程序化、固定种子、可复现)。
76
77 ## 包格式
78
79 以 `.reasonix-theme` ZIP 分发。根目录**只能**包含:
80
81 | 文件 | 必需 | 说明 |
82 | --- | --- | --- |
83 | `theme.json` | 是 | 清单(≤ 1 MiB) |
84 | `background.png` / `.jpg` / `.jpeg` / `.webp` | 否 | 首页图片 ≤ 16 MiB,边长 ≤ 8192 |
85 | `background-task.png` / `.jpg` / `.jpeg` / `.webp` | 否 | 独立任务/工作区图片 ≤ 16 MiB,边长 ≤ 8192(V2) |
86
87 ZIP 限制:包体 ≤ 36 MiB;禁止子目录、符号链接、重复条目与路径穿越。
88
89 ### `theme.json` 示例
90
91 ```json
92 {
93 "schemaVersion": 2,
94 "id": "my-theme",
95 "name": "My Theme",
96 "author": "",
97 "description": "",
98 "license": "",
99 "baseStyle": "graphite",
100 "tokens": {
101 "light": {
102 "bg": "#f4f3ef",
103 "fg": "#111827",
104 "accent": "#2f5fa8"
105 },
106 "dark": {
107 "bg": "#0c0d10",
108 "fg": "#f1f1ef",
109 "accent": "#ff6a3d"
110 }
111 },
112 "recipes": {
113 "density": "comfortable",
114 "corners": "soft"
115 },
116 "background": {
117 "image": "background.webp",
118 "focusX": 0.72,
119 "focusY": 0.45,
120 "safeArea": "left",
121 "homeOpacity": 1,
122 "taskOpacity": 0.28,
123 "overlayStrength": 0.62
124 },
125 "taskBackground": {
126 "image": "background-task.webp",
127 "focusX": 0.5,
128 "focusY": 0.5,
129 "safeArea": "right",
130 "opacity": 0.28,
131 "overlayStrength": 0.62
132 }
133 }
134 ```
135
136 JSON Schema: [theme-pack.schema.json](./theme-pack.schema.json)
137
138 ### 字段规则
139
140 | 字段 | 规则 |
141 | --- | --- |
142 | `schemaVersion` | `1` 或 `2`;使用 `taskBackground` 时必须为 `2` |
143 | `id` | 小写 `[a-z][a-z0-9-]*`;保留:`graphite`/`aurora`/`slate`/`carbon`/`nocturne`/`amber` |
144 | `baseStyle` | 六套内置方向之一;未覆盖令牌继承该方向 |
145 | `tokens.light` / `tokens.dark` | 可选;键 → `#RRGGBB` 或 `#RRGGBBAA` |
146 | `recipes.density` | `compact` \| `comfortable` |
147 | `recipes.corners` | `square` \| `soft` \| `round` |
148 | `background.image` | 仅允许裸文件名(png/jpeg/webp) |
149 | `background.focusX/Y` | 0–1 焦点 |
150 | `background.safeArea` | `left` \| `right` \| `center`(任务页遮罩方向) |
151 | `background.homeOpacity` | 0–1 |
152 | `background.taskOpacity` | 0–1 |
153 | `background.overlayStrength` | 0–1 |
154 | `background.paneOpacity` | 0–1(首页场景面板不透明度) |
155 | `taskBackground.image` | 可选的独立任务/工作区图片,仅允许本地裸文件名 |
156 | `taskBackground.focusX/Y` | 0–1 焦点 |
157 | `taskBackground.safeArea` | `left` \| `right` \| `center` |
158 | `taskBackground.opacity` | 0–1 |
159 | `taskBackground.overlayStrength` | 0–1 |
160 | `taskBackground.paneOpacity` | 0–1(任务场景面板不透明度) |
161
162 ### 允许的令牌键
163
164 `bg`, `bgSoft`, `bgElev`, `panel`, `sidebar`, `chat`, `workspace`, `workspaceFiles`,
165 `border`, `borderSoft`, `fg`, `fgDim`, `fgFaint`, `accent`, `accentFg`, `ok`, `warn`, `err`
166
167 颜色**不得**包含 `url()`、渐变或任意 CSS。
168
169 ## 引擎行为
170
171 1. 先应用全局 `auto`/`light`/`dark` 与基础视觉风格。
172 2. 再应用主题包覆盖层(CSS 变量),挂在样式表之后,避免被后置 `:root` 与 Creation 局部变量压掉。
173 3. 根节点 `data-theme-pack="<id>"`;应用容器 `data-theme-scene="home|task"`。
174 4. 场景仅由当前会话是否有内容决定,不改变聊天状态或布局生命周期。
175 5. 背景为独立、不可交互层。任务页限制最高透明度并叠加方向性遮罩(**不**使用 `backdrop-filter`)。
176
177 ## 存储
178
179 | Reasonix 主目录路径 | 用途 |
180 | --- | --- |
181 | `desktop-theme-state.json` | 版本化的当前主题指针(**不**改 `config.toml`) |
182 | `themes/<id>/` | 用户主题库(`theme.json` + 最多两张可选场景图片) |
183
184 旧配置缺少主题状态时保持原行为;旧版本忽略新目录。CLI 主题、提示词、Provider 请求与缓存键均不变。
185
186 ## 桌面桥接
187
188 列出 / 启用 / 重置 / 保存 / 删除 / 复制 / 导入 / 导出 / 选择背景。
189 前端只接收临时资源 URL(`/__reasonix_theme_asset/...`)或 data URL,不暴露本机绝对路径。
190
191 同 ID 导入默认拒绝,确认后才允许原子替换。内置主题不可覆盖或删除。损坏/丢失回退 Graphite 路径。安全模式不加载外部主题。`/theme reset` 与命令面板可恢复默认。
192
193 ## 创作建议
194
195 1. 从内置方向起步,只覆盖需要的令牌。
196 2. 尽量满足 WCAG AA(正文约 4.5:1);编辑器会警告但允许继续保存。
197 3. 分享含背景图的主题前,确认照片/肖像/第三方素材的分发权利。
198 4. 首版不复制参考仓库的人物或第三方图片资产。
199
200 ## 模板
201
202 无版权素材的纯色模板(不含背景图)见英文版 [THEME_PACK.md](./THEME_PACK.md) 中的 `paper-dawn` 示例;将仅含 `theme.json` 的根目录打成 `paper-dawn.reasonix-theme` 即可导入。
203
203 lines MARKDOWN