@lengduan/dsh-client-ui-skin-815 0.1.21 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,971 +1,971 @@
1
- /* 1945-08-15 终战皮肤:史料照片底 + 可读玻璃层。 */
2
-
3
- body[data-dsh-815] {
4
- color-scheme: dark;
5
- color: #f4ead6;
6
- background-color: #080a06;
7
- --dsw-alias-label-primary-inverted: #1a1c14;
8
- --vj-brass: #c4a35a;
9
- --vj-brass-soft: #e2c98a;
10
- --vj-olive: #3d4630;
11
- --vj-ink: #1c1a14;
12
- --vj-paper: #f3ead4;
13
- --vj-glass: rgba(18, 20, 14, 0.72);
14
- --vj-shadow: 0 18px 48px rgba(0, 0, 0, 0.42);
15
- /* 线性文件夹图标(Element UI Folder 风格的轮廓),供「在本地打开」分裂按钮
16
- 以 mask 描出,颜色跟随按钮文字色。 */
17
- --vj-folder-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 17.5V6.5a2 2 0 0 1 2-2h3.1a2 2 0 0 1 1.6.8l1.15 1.53a2 2 0 0 0 1.6.8H18.5a2 2 0 0 1 2 2v7.87a2 2 0 0 1-2 2h-13a2 2 0 0 1-2-2Z'/%3E%3C/svg%3E");
18
- /* 同一套描边语言的线性文件图标(右上折角的纸),供右栏 tab 的文件类型图标
19
- 以 mask 描出;目录类型仍走上面那枚文件夹。 */
20
- --vj-file-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M13.6 3.2H7.2a2 2 0 0 0-2 2v13.6a2 2 0 0 0 2 2h9.6a2 2 0 0 0 2-2V8.4Z'/%3E%3Cpath d='M13.6 3.2v5.2h5.2'/%3E%3C/svg%3E");
21
-
22
- --dsw-alias-bg-base: transparent;
23
- --dsw-alias-bg-layer-1: rgba(28, 30, 22, 0.78);
24
- --dsw-alias-bg-layer-2: rgba(36, 38, 28, 0.88);
25
- --dsw-alias-bg-layer-3: rgba(44, 46, 34, 0.92);
26
- --dsw-alias-bg-overlay: rgba(22, 24, 18, 0.94);
27
- --dsw-alias-border-l1: rgba(196, 163, 90, 0.28);
28
- --dsw-alias-border-l2-darkmode-thin: rgba(196, 163, 90, 0.36);
29
- --dsw-alias-border-l2: rgba(196, 163, 90, 0.42);
30
- --dsw-alias-border-l3: rgba(196, 163, 90, 0.7);
31
- /* l4 是宿主那档最细的描边(卡片 / 输入框 / 标签 / 分组线都在用),浅色主题下
32
- 是半透明黑 rgba(0,0,0,.16) —— 落在皮肤的暗底上只有 1.1~1.4:1,等于没有边框
33
- (设置里的预设卡、插件卡、外观方块,右栏引导卡、轨迹单元格等都中招)。
34
- 这里补成同族的铜金细线:对 #24261c 约 2.6:1,细线可见又不抢眼。 */
35
- --dsw-alias-border-l4: rgba(196, 163, 90, 0.5);
36
- --dsw-alias-brand-primary: #c4a35a;
37
- --dsw-alias-brand-text: #f4ead6;
38
- --dsw-alias-button-elevated-fill: rgba(52, 54, 40, 0.9);
39
- --dsw-alias-button-floating-fill: rgba(58, 60, 44, 0.94);
40
- --dsw-alias-button-floating-hover: #4a4e38;
41
- --dsw-alias-button-info-fill: #6a5a32;
42
- --dsw-alias-button-info-hover: #7c6a3c;
43
- --dsw-alias-interactive-bg-active: rgba(196, 163, 90, 0.28);
44
- --dsw-alias-interactive-bg-hover: rgba(196, 163, 90, 0.14);
45
- --dsw-alias-interactive-bg-hover-solid: #3a3e2c;
46
- --dsw-alias-label-primary: #f4ead6;
47
- --dsw-alias-label-primary-bluish: #e8dcb8;
48
- --dsw-alias-label-secondary: #c8c0a4;
49
- --dsw-alias-label-tertiary: #9e9780;
50
- --dsw-alias-label-caption: #7e7866;
51
- --dsw-alias-state-business-primary: #c4a35a;
52
- --dsw-alias-state-business-tertiary: #3a3828;
53
- --dsw-shadow-lv2: var(--vj-shadow);
54
- --dsw-specific-input-major: rgba(28, 30, 22, 0.82);
55
- --dsw-specific-selector: #323428;
56
- --dsw-specific-menu: #2c2e24;
57
- --dsw-specific-sidebar-fill: rgba(14, 16, 12, 0.88);
58
- --dsw-alias-markdown-code-block: #141610;
59
- --dsw-alias-markdown-code-block-banner: #1c1e16;
60
- --shiki-token-constant: #4dabf7;
61
- --shiki-token-string: #69db7c;
62
- --shiki-token-comment: #adb5bd;
63
- --shiki-token-keyword: #faa2c1;
64
- --shiki-token-parameter: #ffa94d;
65
- --shiki-token-function: #b197fc;
66
- --shiki-token-string-expression: #8ce99a;
67
- --shiki-token-punctuation: #ced4da;
68
- --shiki-token-link: #74c0fc;
69
- }
70
-
71
- body[data-dsh-815]::before {
72
- content: '';
73
- position: fixed;
74
- inset: 0;
75
- z-index: 0;
76
- pointer-events: none;
77
- background:
78
- linear-gradient(
79
- 180deg,
80
- rgba(10, 12, 8, 0.6) 0%,
81
- rgba(10, 12, 8, 0.38) 30%,
82
- rgba(12, 12, 10, 0.55) 52%,
83
- rgba(10, 12, 8, 0.78) 78%,
84
- rgba(8, 10, 6, 0.9) 100%
85
- ),
86
- radial-gradient(ellipse at 50% 30%, transparent 18%, rgba(8, 10, 6, 0.5) 100%);
87
- }
88
-
89
- body[data-dsh-815] [id='root'] {
90
- position: relative;
91
- z-index: 1;
92
- background: transparent;
93
- }
94
-
95
- body[data-dsh-815] :is([data-pane='sidebar'], [class*='sidebarCol']) {
96
- --dsw-alias-label-primary: #f4ead6;
97
- --dsw-alias-label-secondary: #d4ccb0;
98
- position: relative;
99
- z-index: auto;
100
- background: rgba(16, 18, 12, 0.92);
101
- border-right: 1px solid rgba(196, 163, 90, 0.42);
102
- box-shadow: 10px 0 28px rgba(0, 0, 0, 0.28);
103
- }
104
-
105
- body[data-dsh-815] :is([data-pane='sidebar'], [class*='sidebarCol']) > div {
106
- position: relative;
107
- overflow: visible;
108
- background:
109
- linear-gradient(180deg, rgba(28, 30, 20, 0.55), rgba(12, 14, 10, 0.72));
110
- }
111
-
112
- /* 青天白日海军旗:蓝底白日十二芒。仅挂在会话选中行左侧。 */
113
- body[data-dsh-815] [data-vj-session] {
114
- position: relative;
115
- padding-left: 26px;
116
- }
117
-
118
- body[data-dsh-815] [data-vj-session]:hover:not([aria-selected='true']) {
119
- border-radius: 8px;
120
- background: rgba(196, 163, 90, 0.1);
121
- }
122
-
123
- body[data-dsh-815] [data-vj-session][aria-selected='true'] {
124
- border-radius: 8px;
125
- background: linear-gradient(90deg, rgba(196, 163, 90, 0.22), rgba(28, 30, 22, 0.12));
126
- box-shadow: inset 0 0 0 1px rgba(196, 163, 90, 0.35);
127
- }
128
-
129
- body[data-dsh-815] [data-vj-session][aria-selected='true'] [class*='title'] {
130
- color: #fff8e8;
131
- }
132
-
133
- body[data-dsh-815] [data-vj-session][aria-selected='true']::before {
134
- content: '';
135
- position: absolute;
136
- left: 6px;
137
- top: 50%;
138
- z-index: 2;
139
- width: 16px;
140
- height: 11px;
141
- transform: translateY(-50%);
142
- pointer-events: none;
143
- background-color: #000095;
144
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 20'%3E%3Crect width='30' height='20' fill='%23000095'/%3E%3Cg fill='%23fff' transform='translate(15 10)'%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(30)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(60)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(90)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(120)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(150)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(180)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(210)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(240)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(270)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(300)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(330)'/%3E%3Ccircle r='2.7'/%3E%3Ccircle r='3.55' fill='none' stroke='%23000095' stroke-width='0.85'/%3E%3C/g%3E%3C/svg%3E");
145
- background-size: cover;
146
- background-repeat: no-repeat;
147
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);
148
- }
149
-
150
- body[data-dsh-815] :is([data-pane='conversation'], [class*='centerCol']) {
151
- color: #f4ead6;
152
- background: transparent;
153
- }
154
-
155
- /* 对话列宿主会写 background: var(--dsw-alias-bg-base);主题若在内层重绑该 token,会盖住油画并和输入座切出一条水平线。 */
156
- body[data-dsh-815] [data-phase='active'] {
157
- --dsw-alias-bg-base: transparent;
158
- background: transparent;
159
- }
160
-
161
- body[data-dsh-815] [data-phase='active'] [class*='scrollBody'],
162
- body[data-dsh-815] [data-phase='active'] [class*='viewArea'] {
163
- background: transparent;
164
- }
165
-
166
- body[data-dsh-815] :is([data-pane='details'], [class*='detailsCol']) {
167
- --dsw-alias-bg-base: #1c1e16;
168
- --dsw-alias-bg-overlay: #24261c;
169
- background: #1c1e16;
170
- border-left-color: rgba(196, 163, 90, 0.4);
171
- }
172
-
173
- body[data-dsh-815] button[class*='brand'] {
174
- color: #f3e3c0;
175
- --dsw-alias-label-primary-inverted: #1a1c14;
176
- }
177
-
178
- body[data-dsh-815] button[class*='brand'] > svg > rect {
179
- fill: #c4a35a;
180
- }
181
-
182
- body[data-dsh-815] [data-phase='hero'] [class*='headline'] {
183
- color: #fff8e8;
184
- font-family: Georgia, 'Times New Roman', serif;
185
- letter-spacing: 0.05em;
186
- text-shadow: 0 2px 10px rgba(0, 0, 0, 0.75);
187
- }
188
-
189
- body[data-dsh-815] [data-composer-card] {
190
- isolation: isolate;
191
- min-height: 0;
192
- color: #1c1a14;
193
- --dsw-alias-label-primary: #1c1a14;
194
- --dsw-alias-label-primary-bluish: #2a261c;
195
- --dsw-alias-label-secondary: #4a4638;
196
- --dsw-alias-label-tertiary: #6a6454;
197
- --dsw-alias-label-caption: #7e7866;
198
- --dsw-alias-brand-text: #1c1a14;
199
- /* 目标条「进行中的目标」走 brand/business 主色;浅纸底上浅铜看不清,压成暗铜。 */
200
- --dsw-alias-brand-primary: #6b4e16;
201
- --dsw-alias-state-business-primary: #6b4e16;
202
- --dsw-specific-input-major: #f3ead4;
203
- --dsw-alias-bg-layer-1: #f3ead4;
204
- --dsw-alias-bg-layer-2: #efe4c8;
205
- border: 1px solid rgba(196, 163, 90, 0.55);
206
- border-radius: 18px;
207
- background: linear-gradient(180deg, #f3ead4, #e4d6b4);
208
- box-shadow: var(--vj-shadow);
209
- transition: border-color 0.18s ease, box-shadow 0.18s ease;
210
- }
211
-
212
- /* 聚焦时宣纸框收一道亮铜边,像展柜签条被点亮。 */
213
- body[data-dsh-815] [data-composer-card]:focus-within {
214
- border-color: rgba(226, 201, 138, 0.9);
215
- box-shadow: 0 0 0 3px rgba(196, 163, 90, 0.16), var(--vj-shadow);
216
- }
217
-
218
- /* DSH 新版 Composer 把草稿文字渲染在 backdrop 层(data-input-backdrop),
219
- textarea 只保留原生 caret,其文字与背景都应是透明的:这里若把背景写成
220
- 宣纸浅色,会形成不透明层遮住 backdrop 里的草稿字。textarea 仅留深色 caret。 */
221
- body[data-dsh-815] [data-composer-card] :is(textarea, input, [contenteditable='true']) {
222
- color: #1c1a14;
223
- caret-color: #1c1a14;
224
- background: transparent;
225
- }
226
-
227
- /* 草稿正文字符真正由 backdrop 层(data-input-backdrop)绘制,颜色取自
228
- var(--dsw-alias-label-primary)。主题在暗色下把该 token 解析成浅色,
229
- 落在宣纸浅底上将看不清;这里在输入座内把 backdrop 压回墨色。 */
230
- body[data-dsh-815] [data-composer-card] [data-input-backdrop] {
231
- color: #1c1a14;
232
- }
233
-
234
- /* backdrop 内的 slash 命令 token / 引用 chip 原本用主题暗色下的浅色
235
- token(warn/business),落在宣纸浅底上也偏浅;压成暗金与深橄榄,
236
- 与 815 主题协调。用 data-decoration 属性定位,避开 CSS Modules 的 hash 类名。 */
237
- body[data-dsh-815] [data-composer-card] [data-input-backdrop] [data-decoration='token'] {
238
- color: #8a6a1c;
239
- }
240
-
241
- body[data-dsh-815] [data-composer-card] [data-input-backdrop] :is([data-decoration='chip'], [data-decoration='text-ref']) {
242
- color: #2f4a2f;
243
- }
244
-
245
- body[data-dsh-815] [data-composer-card] :is(textarea, input)::placeholder {
246
- color: #6a6454;
247
- }
248
-
249
- body[data-dsh-815] [data-phase='active'] [data-composer-seat] {
250
- --dsw-alias-bg-base: transparent;
251
- --dsw-alias-brand-primary: #6b4e16;
252
- --dsw-alias-state-business-primary: #6b4e16;
253
- background: transparent;
254
- }
255
-
256
- /* 提问卡(ui-user-questions 的 composer 接管层)是输入座的兄弟,不在输入卡内,
257
- 拿不到输入卡那层墨色 token。卡内自由作答框(.customBlock)的底取宿主
258
- --dsw-alias-bg-module-platform,皮肤没接管该 token,浅色主题下是近白
259
- #f5f6f7,而框内文字是皮肤全局的奶油 label-primary #f4ead6 —— 1.10:1,
260
- 输入值与占位符一起糊在白底上(输入框还是块白斑,与深橄榄卡面断裂)。
261
- 在提问卡子树内(宿主下发的 data-question-key,plan review 卡走
262
- data-plan-review-key,不受影响)把该 token 压成卡面同色 #24261c:输入值
263
- 12.85:1;占位符原值 label-caption 对深底只有 3.48:1,另提一档到
264
- label-tertiary #9e9780(5.25:1)。作用域限 :not([data-ds-dark-theme])
265
- (暗色主题下该 token 本身是深色,无需改动),卡外任何使用该 token 的表面
266
- 不受影响。 */
267
- body[data-dsh-815]:not([data-ds-dark-theme]) [data-question-key] {
268
- --dsw-alias-bg-module-platform: #24261c;
269
- }
270
-
271
- body[data-dsh-815]:not([data-ds-dark-theme]) [data-question-key] [class*='fieldInput']::placeholder {
272
- color: #9e9780;
273
- }
274
-
275
- /* 斜杠候选菜单 / popupSelect 浮层挂在输入座 overlay 锚点(零高条带),
276
- 是输入座的子节点,会继承宣纸浅底的墨字 token;但浮层自身是深色 Elevated
277
- 面(background: var(--dsw-specific-menu)),墨字落在深底上看不清。
278
- 在浮层根上换回主题浅色文字,并把菜单底压成不透明深橄榄——与对话框、
279
- 普通菜单(vj815.module.css 的 role='dialog' / role='menu' 规则)同一取值。 */
280
- body[data-dsh-815]
281
- :is(
282
- [data-composer-card] [role='listbox'],
283
- [data-composer-card] [class*='overlayAnchor'] > *
284
- ) {
285
- color: #f4ead6;
286
- --dsw-specific-menu: #2c2e24;
287
- --dsw-alias-label-primary: #f4ead6;
288
- --dsw-alias-label-primary-bluish: #e8dcb8;
289
- --dsw-alias-label-secondary: #d4ccb0;
290
- --dsw-alias-label-tertiary: #9e9780;
291
- --dsw-alias-label-dimmed: #9e9780;
292
- --dsw-alias-brand-primary: #c4a35a;
293
- --dsw-alias-state-business-primary: #c4a35a;
294
- --dsw-alias-interactive-bg-hover: rgba(196, 163, 90, 0.14);
295
- --dsw-alias-interactive-bg-active: rgba(196, 163, 90, 0.28);
296
- border-color: rgba(196, 163, 90, 0.5);
297
- }
298
-
299
- body[data-dsh-815] [data-chat-flow] {
300
- max-width: var(--dsh-composer-card-max-width);
301
- }
302
-
303
- body[data-dsh-815]
304
- [data-chat-flow-kind='assistant-step'] > * > * > * > div[class*='markdown'] {
305
- box-sizing: border-box;
306
- align-self: stretch;
307
- width: 100%;
308
- max-width: 100%;
309
- padding: 14px 18px;
310
- border: 1px solid rgba(196, 163, 90, 0.32);
311
- border-radius: 14px 14px 14px 6px;
312
- color: #f4ead6;
313
- background: linear-gradient(180deg, rgba(40, 42, 30, 0.82), rgba(16, 18, 12, 0.85));
314
- box-shadow:
315
- inset 0 1px 0 rgba(226, 201, 138, 0.12),
316
- 0 8px 22px rgba(0, 0, 0, 0.32);
317
- }
318
-
319
- body[data-dsh-815] [class*='markdown'] [class*='bannerWrap'] {
320
- background-color: var(--dsw-alias-markdown-code-block-banner);
321
- }
322
-
323
- /* 代码块保持橄榄深底,只收一道暗铜边,与气泡区分开。 */
324
- body[data-dsh-815] [class*='markdown'] pre {
325
- border: 1px solid rgba(196, 163, 90, 0.25);
326
- border-radius: 10px;
327
- }
328
-
329
- /* 宽表格(渲染器给 ≥4 列的 wrapper 打的 md-table-wide 钩子):宿主让 wrapper
330
- breakout 到整个对话列宽,且非 hover/focus 时 overflow-x: hidden —— 皮肤给
331
- 正文/用户消息加了气泡边框后,breakout 会直接穿透边框,右侧被对话列裁掉,
332
- 看上去就是「表格溢出且滚不动」。这里把 breakout 收回气泡内(spare/lead
333
- 归零),并让横向滚动常驻(宿主默认只在 hover/focus 时开)。 */
334
- body[data-dsh-815] :global(.md-table-wide) {
335
- --dsh-table-spare: 0px;
336
- --dsh-table-lead: 0px;
337
- overflow-x: auto;
338
- padding-bottom: 0;
339
- }
340
-
341
- /* 行内 code 走宣纸底墨字,白底场景下也必须压成墨色。 */
342
- body[data-dsh-815]
343
- :is(
344
- [data-chat-flow-kind='assistant-step'] > * > * > * > div[class*='markdown'],
345
- [class*='userRow'] [class*='bubble']
346
- )
347
- :not(pre) > code {
348
- padding: 0.04em 0.34em;
349
- border: 1px solid rgba(196, 163, 90, 0.45);
350
- border-radius: 5px;
351
- color: #1c1a14;
352
- background: var(--vj-paper);
353
- }
354
-
355
- /* 文件查看区域(右栏的文档预览)正文是 ui-primitives 的 markdown:行内 code
356
- 的底取 --dsw-alias-markdown-inline-code,浅色主题下是近白 #fafafa,而字色
357
- 继承皮肤全局的奶油 label-primary #f4ead6 —— 只有 1.14:1,胶囊里的字基本
358
- 读不出来。对话区的行内 code 早就走过宣纸底墨字,这一处是漏网的:这里只
359
- 把浅底上的字压回墨色,底仍交给宿主。暗色主题下 code 底本身是深色
360
- (static-neutral-800),奶油字正确,故排除。 */
361
- body[data-dsh-815]:not([data-ds-dark-theme])
362
- :is([class*='rightbarCol'], [data-sidebar-right-float-host]) [class*='markdown'] :not(pre) > code {
363
- color: #1c1a14;
364
- }
365
-
366
- /* 右栏的选中 tab(打开的文件名就在这颗胶囊上):dockkit 的 .tabActive 文字取
367
- label-primary,底取 --dsw-alias-markdown-tag,浅色主题下是近白 bluish-75
368
- (实测 #f1f3f5),奶油字落上去只有 1.07:1,文件名等于看不见。这里只压字色。
369
- 必须限定在右栏/浮窗容器内:会话页头那排视图 tab(对话 / 轨迹 / 用量统计)
370
- 用的是另一套类名,选中态底是透明的(叠在暗色油画上),全局压墨色会把它们
371
- 直接抹掉(墨字落在深底上,1.1:1)。暗色主题下胶囊底是深色 bluish-850,
372
- 保留奶油字。 */
373
- body[data-dsh-815]:not([data-ds-dark-theme])
374
- :is([class*='rightbarCol'], [data-sidebar-right-float-host]) [role='tab'][class*='tabActive'] {
375
- color: #1c1a14;
376
- }
377
-
378
- /* 选中 tab 一 hover,底就从浅灰胶囊换成半透明的交互底(皮肤值
379
- rgba(196,163,90,.14),叠在油画上就是暗底),上面那层刚压好的墨字于是又沉
380
- 进底色里。hover 态把字换回奶油色;未选中的 tab 本来就是奶油灰字,不在其列。 */
381
- body[data-dsh-815]:not([data-ds-dark-theme])
382
- :is([class*='rightbarCol'], [data-sidebar-right-float-host]) [role='tab'][class*='tabActive']:hover {
383
- color: #f4ead6;
384
- }
385
-
386
- /* tab 上的文件类型图标是宿主下发的彩色实心方块(markdown 是 DeepSeek 蓝
387
- #4176e6,文件夹是琥珀),在皮肤的线性描边视觉里像贴纸。按皮肤自绘的那套
388
- 描边图标用 mask 重画:文件走 --vj-file-icon,目录类型(class 里带 folder)
389
- 仍走 --vj-folder-icon。颜色走 currentColor,跟着 tab 文字色(选中墨色 /
390
- 未选中次要色)一起变;svg 内部的 path 藏掉,只留 mask 裁出的那层底色。 */
391
- body[data-dsh-815] [data-slot='sidebar.right.pane.tab.title'] svg[class*='titleIcon'] {
392
- color: inherit;
393
- background-color: currentColor;
394
- -webkit-mask: var(--vj-file-icon) center / contain no-repeat;
395
- mask: var(--vj-file-icon) center / contain no-repeat;
396
- }
397
-
398
- body[data-dsh-815] [data-slot='sidebar.right.pane.tab.title'] svg[class*='titleIcon'][class*='folder'] {
399
- -webkit-mask-image: var(--vj-folder-icon);
400
- mask-image: var(--vj-folder-icon);
401
- }
402
-
403
- body[data-dsh-815] [data-slot='sidebar.right.pane.tab.title'] svg[class*='titleIcon'] > * {
404
- display: none;
405
- }
406
-
407
- body[data-dsh-815]
408
- [data-chat-flow-kind='assistant-step'] > * > * > * > div[class*='markdown'] [class*='fileMention'] {
409
- color: #6b4e16;
410
- }
411
-
412
- /* 宣纸上的「+」压成深橄榄底白标,避免浅纸面上的白图标失踪。 */
413
- body[data-dsh-815] [data-composer-card] button[class*='add'] {
414
- color: #ffffff;
415
- border-radius: 10px;
416
- background: var(--vj-olive);
417
- }
418
-
419
- body[data-dsh-815] [data-composer-card] button[class*='add']:hover {
420
- background: #4a5238;
421
- }
422
-
423
- body[data-dsh-815] [class*='userRow'] [class*='bubble'] {
424
- color: #f4ead6;
425
- border: 1px solid rgba(196, 163, 90, 0.4);
426
- background: rgba(52, 48, 32, 0.92);
427
- }
428
-
429
- /* 宿主自带的浅色面不吃皮肤的暗色假设:非暗色主题下,下列容器的底色来自
430
- 主题(近白 / 浅灰),而皮肤把 label-primary 全局换成奶油色 #f4ead6,
431
- 浅底浅字几乎不可见。在这两类容器内把文字压回墨色。暗色主题下容器本身
432
- 是深底,皮肤浅字仍然正确,故用 :not() 排除,避免反向回归。 */
433
-
434
- /* ui-deliverables 的 present 文件卡:卡底 var(--dsw-static-neutral-50),
435
- 文件名与「打开」走 label-primary,文件图标走 link。 */
436
- body[data-dsh-815]:not([data-ds-dark-theme]) [data-presented-file] {
437
- --dsw-alias-label-primary: #1c1a14;
438
- --dsw-alias-link: #6b4e16;
439
- }
440
-
441
- /* 但卡里的「打开 / 展开」分裂按钮底不是卡片底:它取皮肤全局的
442
- button-floating-fill(深橄榄 rgba(58,60,44,.94),浅底卡片上量到 #45463a),
443
- 上面那条 label-primary 覆盖顺手把按钮文字也压成墨色,深底墨字只有 1.8:1,
444
- 看着就是「文字融进按钮」。按钮分两段,文字单独拿回奶油色;
445
- 箭头段的 disabled 态仍交给宿主(label-dimmed),免得禁用与可用没区别。 */
446
- body[data-dsh-815]:not([data-ds-dark-theme]) [data-presented-file]
447
- :is(button[class*='_open'], button[class*='_chevron']:not(:disabled)) {
448
- color: #f4ead6;
449
- }
450
-
451
- /* ui-conversation 的 todo 面板:面板底是主题的浅色 var(--dsw-specific-tip)
452
- (非暗色主题下量到 #f5f6f7),皮肤全局的 label-* 却是浅奶油。只压标题
453
- 不够——条目文字走 label-secondary(#c8c0a4,1.7:1)几乎看不见。这里把
454
- 面板内的文字层级整体压回墨色:标题 label-primary、条目 label-secondary、
455
- 计数 label-tertiary,pending 图标 label-caption 保持面板内最淡的一档。
456
- 层级依次 14.8:1 / 8.7:1 / 5.6:1 / 4.2:1。 */
457
- body[data-dsh-815]:not([data-ds-dark-theme]) [data-testid='todo-panel'] {
458
- --dsw-alias-label-primary: #1c1a14;
459
- --dsw-alias-label-secondary: #4a4638;
460
- --dsw-alias-label-tertiary: #5a5443;
461
- --dsw-alias-label-caption: #6a6454;
462
- }
463
-
464
- /* ui-conversation 的排队坞(QueueDock,`data-queue-dock`):它挂在 composer
465
- 栈里、输入卡之外,拿不到 [data-composer-card] 那层墨色 token,于是面板底
466
- 照样是主题浅色 var(--dsw-specific-tip)(实测 #f5f6f7),而「N 条排队消息」
467
- 走 label-primary 奶油 #f4ead6(1.05:1)、前面那枚队列图标与右侧箭头走
468
- label-tertiary #9e9780(2.6:1),整条几乎读不出来。与 todo 面板同法,
469
- 在坞内把文字层级压回墨色:标题 primary 约 15:1,前面那枚队列图标与右侧
470
- 箭头、状态字 tertiary 约 7:1(条目正文与文件名走 label-primary-dimmed,
471
- 浅色主题下本就是近黑,不用管)。暗色主题下面板本身深色,故排除。 */
472
- body[data-dsh-815]:not([data-ds-dark-theme]) [data-queue-dock] {
473
- --dsw-alias-label-primary: #1c1a14;
474
- --dsw-alias-label-secondary: #4a4638;
475
- --dsw-alias-label-tertiary: #5a5443;
476
- --dsw-alias-label-caption: #6a6454;
477
- }
478
-
479
- /* dsh-session-manager 的「会话管理」弹框(类名 sm-nativeDialog / sm-panelDialog,
480
- 不带 hash):弹框底是插件自己写死的白 / #f5f5f5,文字却取宿主的 label-* 三个
481
- token —— 皮肤把它们换成了奶油系,于是「全部 / 未归档 / 已归档」、会话标题、
482
- 行内「打开 / 归档 / 移动至工作区 / 迁移预设」以及行下方的元信息全落在白底上
483
- (1.1~2.7:1)。这里在弹框内把文字层级压回墨色;行内按钮 hover 时插件会把字
484
- 换成 label-primary(仍是皮肤的奶油),一并压掉,落在它的 --dsw-alias-fill-l2
485
- 浅底上就是墨字。插件的危险色(state-error-primary,4.8:1)与它自己写死的近黑
486
- 标题不动。注意必须写成属性选择器:本表是 CSS Module,类选择器会被 hash 成
487
- .xxxx_sm-nativeDialog,匹配不到插件的类。 */
488
- body[data-dsh-815]:not([data-ds-dark-theme])
489
- :is([class*='sm-nativeDialog'], [class*='sm-panelDialog']) {
490
- --dsw-alias-label-primary: #1c1a14;
491
- --dsw-alias-label-secondary: #4a4638;
492
- --dsw-alias-label-tertiary: #5a5443;
493
- --dsw-alias-label-caption: #6a6454;
494
- }
495
-
496
- /* ui-goal 的目标条:条底是主题的浅色 var(--dsw-specific-tip)(非暗色主题下量到
497
- #f5f6f7),而「进行中的目标」标签走 label-primary —— 皮肤在 body 上把它换成
498
- 奶油色 #f4ead6,对条底只有 1.1:1,标签整条融进条底看不见;目标正文走
499
- label-primary-dimmed(浅色主题下是近黑)所以照常可见,看上去就只有标签失踪。
500
- 这里与 todo 面板同法,在条内把文字层级压回墨色:标签 primary、hover 态
501
- secondary、图标 tertiary,对条底依次 16.1:1 / 8.7:1 / 7.0:1。暗色主题下条底
502
- 本身是深色,皮肤浅字仍然正确,故用 :not() 排除。 */
503
- body[data-dsh-815]:not([data-ds-dark-theme]) [data-goal-bar] {
504
- --dsw-alias-label-primary: #1c1a14;
505
- --dsw-alias-label-secondary: #4a4638;
506
- --dsw-alias-label-tertiary: #5a5443;
507
- }
508
-
509
- body[data-dsh-815] [data-terminal] {
510
- --dsw-alias-markdown-code-block: rgba(18, 20, 14, 0.96);
511
- --dsw-alias-label-primary: #f4ead6;
512
- color: #f4ead6;
513
- }
514
-
515
- /* dsh-better-sidebar 底部工作台的终端(xterm,头部工具条最右侧的「展开底部面板」)。
516
- 插件按「宿主配色方案」自选终端主题:surface 取 body 上的 --dsw-alias-bg-base,
517
- 透明或半透明时回退到 dark ? #111114 : #ffffff。815 皮肤为露油画把该 token 设成
518
- transparent,宿主又是浅色方案(html 内联 color-scheme: light、body 无
519
- data-ds-dark-theme),回退于是落到 #ffffff 白底;前景仍取皮肤的 label-primary
520
- 奶油色 #f4ead6 —— 白底奶油字约 1.1:1,终端内容等于看不见。
521
- xterm 的 surface 与 ANSI 16 色是插件在创建时一次性写成的内联样式与渲染 style
522
- (.xterm-viewport 的 background-color、.xterm-fg-N/.xterm-bg-N 的颜色),皮肤的
523
- CSS 变量改不到它们,所以这里在渲染面上按皮肤配色覆盖,不改插件源码:
524
- 底用 815 的深橄榄黑 #141610、前景留奶油色(约 15:1),ANSI 16 色换成与暗底匹配的
525
- one-dark 系(0/8 两色提亮到可读档),光标块与选区走铜金。
526
- 只在宿主浅色方案下出手:暗色方案下插件本就用深底 + ANSI_DARK,无需干预。 */
527
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-viewport) {
528
- background-color: #141610 !important;
529
- scrollbar-color: rgba(196, 163, 90, 0.55) #141610;
530
- }
531
-
532
- /* 上面的 fg 规则特异性高于插件的 .xterm-dim 半透明色,dim 语义改用透明度保留。 */
533
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-dim) {
534
- opacity: 0.7;
535
- }
536
-
537
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-selection) div {
538
- background-color: rgba(196, 163, 90, 0.32) !important;
539
- }
540
-
541
- /* 光标块由插件填成前景色、块内文字填成背景色(浅色方案下是 #ffffff),白字落在
542
- 奶油块上同样看不清;animation 内的声明优先于普通规则,故用 !important 压回墨色。 */
543
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-cursor.xterm-cursor-block) {
544
- color: #1c1a14 !important;
545
- }
546
-
547
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-0) { color: #5c6370; }
548
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-1) { color: #e06c75; }
549
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-2) { color: #98c379; }
550
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-3) { color: #e5c07b; }
551
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-4) { color: #61afef; }
552
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-5) { color: #c678dd; }
553
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-6) { color: #56b6c2; }
554
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-7) { color: #abb2bf; }
555
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-8) { color: #7f8694; }
556
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-9) { color: #e06c75; }
557
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-10) { color: #98c379; }
558
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-11) { color: #e5c07b; }
559
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-12) { color: #61afef; }
560
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-13) { color: #c678dd; }
561
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-14) { color: #56b6c2; }
562
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-15) { color: #ffffff; }
563
-
564
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-0) { background-color: #5c6370; }
565
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-1) { background-color: #e06c75; }
566
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-2) { background-color: #98c379; }
567
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-3) { background-color: #e5c07b; }
568
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-4) { background-color: #61afef; }
569
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-5) { background-color: #c678dd; }
570
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-6) { background-color: #56b6c2; }
571
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-7) { background-color: #abb2bf; }
572
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-8) { background-color: #7f8694; }
573
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-9) { background-color: #e06c75; }
574
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-10) { background-color: #98c379; }
575
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-11) { background-color: #e5c07b; }
576
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-12) { background-color: #61afef; }
577
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-13) { background-color: #c678dd; }
578
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-14) { background-color: #56b6c2; }
579
- body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-15) { background-color: #ffffff; }
580
-
581
- /* 对话列把 --dsw-alias-bg-base 设成透明好露油画;对话管理等弹层若写
582
- background: var(--dsw-alias-bg-base),会整层透出后面的字。弹层改实色。 */
583
- body[data-dsh-815] :is([role='dialog'], [role='menu'], [role='listbox'], [aria-modal='true'], [data-radix-popper-content-wrapper] > *) {
584
- color: #f4ead6;
585
- background-color: #24261c;
586
- --dsw-alias-bg-base: #24261c;
587
- --dsw-alias-label-primary: #f4ead6;
588
- --dsw-alias-label-secondary: #d4ccb0;
589
- --dsw-alias-label-tertiary: #9e9780;
590
- --dsw-alias-label-caption: #7e7866;
591
- --dsw-alias-bg-layer-1: #24261c;
592
- --dsw-alias-bg-layer-2: #1c1e16;
593
- --dsw-alias-bg-layer-3: #2c2e24;
594
- --dsw-alias-bg-module-platform: #24261c;
595
- --dsw-alias-bg-overlay: #323428;
596
- --dsw-specific-input-major: #24261c;
597
- --dsw-specific-selector: #323428;
598
- --dsw-specific-menu: #2c2e24;
599
- --dsw-specific-tip: #2a2c22;
600
- --dsw-alias-button-elevated-fill: #2e3026;
601
- --dsw-alias-button-floating-fill: #2a2c22;
602
- --dsw-alias-button-floating-hover: #3a3e2c;
603
- --dsw-alias-markdown-inline-code: #2a2c22;
604
- border-color: rgba(196, 163, 90, 0.5);
605
- box-shadow: var(--vj-shadow);
606
- }
607
-
608
- body[data-dsh-815] [data-slot='sidebar.settings'] [role='dialog'][aria-modal='true'] {
609
- --dsw-specific-sidebar-nav-item-active: rgba(196, 163, 90, 0.32);
610
- --dsw-specific-sidebar-nav-item-hover: rgba(196, 163, 90, 0.14);
611
- }
612
-
613
- /* 设置里原生 <select>:闭合条橄榄底奶油字;系统弹出层常是白底,option 用墨色宣纸。 */
614
- body[data-dsh-815] select {
615
- color: #f4ead6;
616
- background-color: #24261c;
617
- border-color: rgba(196, 163, 90, 0.5);
618
- }
619
-
620
- body[data-dsh-815] option {
621
- color: #1c1a14;
622
- background-color: #f3ead4;
623
- }
624
-
625
- /* 插件推荐面板写死 GitHub 冷色(#0d1117 / #58a6ff)。皮肤下换成暖橄榄底 + 铜金链。 */
626
- body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-panel) {
627
- color: #f4ead6;
628
- background: #24261c;
629
- border: 1px solid rgba(196, 163, 90, 0.5);
630
- box-shadow: var(--vj-shadow);
631
- scrollbar-color: #c4a35a #1c1e16;
632
- }
633
-
634
- body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-title) {
635
- color: #f4ead6;
636
- }
637
-
638
- body[data-dsh-815] :global(.dsh-rec-root) :is(:global(.dsh-rec-sub), :global(.dsh-rec-desc), :global(.dsh-rec-meta), :global(.dsh-rec-rank), :global(.dsh-rec-empty), :global(.dsh-rec-loading)) {
639
- color: #9e9780;
640
- }
641
-
642
- body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-close) {
643
- color: #9e9780;
644
- border-color: rgba(196, 163, 90, 0.5);
645
- }
646
-
647
- body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-close):hover {
648
- color: #f4ead6;
649
- }
650
-
651
- body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-scene),
652
- body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-repo) a {
653
- color: #d4bc7a;
654
- }
655
-
656
- body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-item):hover {
657
- background: rgba(196, 163, 90, 0.14);
658
- }
659
-
660
- body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-notify) {
661
- color: #f4ead6;
662
- background: #2c2e24;
663
- border-color: rgba(196, 163, 90, 0.5);
664
- border-left-color: var(--vj-brass);
665
- }
666
-
667
- body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-notify) b {
668
- color: #d4bc7a;
669
- }
670
-
671
- body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-nbtn) {
672
- color: #1c1a14;
673
- background: var(--vj-brass);
674
- border-color: rgba(196, 163, 90, 0.7);
675
- }
676
-
677
- body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-nbtn):hover {
678
- background: #d4bc7a;
679
- }
680
-
681
- /* dsh-update-checker 的「检查更新」页把描边写死在**内联 style** 里(元素没有类名
682
- 可挂):分组卡是 border: 1px solid rgba(128,128,128,.3),行内按钮是 .5 —— 灰线
683
- 落在暗底上只有 1.5~2:1,卡片等于没有边。内联样式优先级最高,只能用
684
- !important,并按 style 属性文本精确命中(只改 border-color,宽度/圆角/flex
685
- 等其余内联声明都不动)。插件若改写法,这两条会自然失效,届时按新值重写。 */
686
- body[data-dsh-815] [style*='rgba(128, 128, 128, 0.3)'] {
687
- border-color: rgba(196, 163, 90, 0.5) !important;
688
- }
689
-
690
- body[data-dsh-815] [style*='rgba(128, 128, 128, 0.5)'] {
691
- border-color: rgba(196, 163, 90, 0.7) !important;
692
- }
693
-
694
- /* Cordis 底栏面板写 background: var(--dsw-alias-bg-base);全局透明会透出油画。 */
695
- body[data-dsh-815] [data-slot='sidebar.footer.action'] {
696
- --dsw-alias-bg-base: #24261c;
697
- }
698
-
699
- /* dsh-timer-agent 的侧栏入口是插件自绘 DOM(board.module.css 的 .entry,一条透明
700
- 导航行),插在宿主「新会话」与 mneme portal 的「记忆」按钮之间;后两者都是宿主
701
- .newSession 观感(38px 高 / 12px 圆角 / 0.5px 铜边 / elevated 底 / 内容居中)。
702
- 插件自己不继承宿主类名,这里按它的标记属性覆盖成同款盒模型:注入式覆盖,
703
- 不改插件源码。收起态与宿主 .collapsed .newSession 同几何。 */
704
- body[data-dsh-815] [data-dsh-timeragent-entry] {
705
- align-self: stretch;
706
- width: auto;
707
- flex: none;
708
- justify-content: center;
709
- gap: 6px;
710
- height: 38px;
711
- margin: 0 2px 8px;
712
- padding: 8px 16px;
713
- box-sizing: border-box;
714
- border: 0.5px solid var(--dsw-alias-border-l3);
715
- border-radius: 12px;
716
- background: var(--dsw-alias-button-elevated-fill);
717
- color: var(--dsw-alias-label-primary);
718
- font-size: 14px;
719
- font-weight: 500;
720
- line-height: 22px;
721
- }
722
-
723
- body[data-dsh-815] [data-dsh-timeragent-entry]:hover {
724
- background: var(--dsw-alias-button-floating-hover);
725
- }
726
-
727
- body[data-dsh-815] [data-dsh-timeragent-entry][data-active] {
728
- background: var(--dsw-alias-interactive-bg-active);
729
- font-weight: 600;
730
- }
731
-
732
- /* 收起态:折叠成 rail 的 36x36 图标按钮,与「新会话」同位置同间距。 */
733
- body[data-dsh-815] [class*='collapsed'] [data-dsh-timeragent-entry] {
734
- align-self: flex-start;
735
- width: 36px;
736
- height: 36px;
737
- margin: 0 0 12px;
738
- padding: 0;
739
- gap: 0;
740
- border-color: transparent;
741
- background: transparent;
742
- }
743
-
744
- body[data-dsh-815] [class*='collapsed'] [data-dsh-timeragent-entry]:hover {
745
- background: var(--dsw-alias-interactive-bg-hover);
746
- }
747
-
748
- body[data-dsh-815] [class*='collapsed'] [data-dsh-timeragent-entry] [class*='entryLabel'] {
749
- display: none;
750
- }
751
-
752
- body[data-dsh-815] [class*='collapsed'] [data-dsh-timeragent-entry] svg {
753
- width: 18px;
754
- height: 18px;
755
- }
756
-
757
- /* mneme portal 的「记忆」按钮(`.mneme-topentry-native`,插在「新会话」与
758
- 「定时任务」之间)自带一条样式:底取 bg-layer-1(rgba(28,30,22,.78),比兄弟
759
- 按钮暗一档)、边取 l2(比兄弟按钮淡)。它与宿主 .newSession 同特异性 —— 谁的
760
- 样式表后加载谁赢,mneme 更新后它排到后面,于是「记忆」的底就比左右两个暗。
761
- 这里由皮肤把这三条钉死成兄弟按钮的值(特异性高于插件),收起态对齐宿主
762
- .collapsed .newSession;几何(38px / 12px / 图标位)仍由宿主的 .newSession 给。 */
763
- body[data-dsh-815] [class*='mneme-topentry-native'] {
764
- border: 0.5px solid var(--dsw-alias-border-l3);
765
- background: var(--dsw-alias-button-elevated-fill);
766
- color: var(--dsw-alias-label-primary);
767
- }
768
-
769
- body[data-dsh-815] [class*='mneme-topentry-native']:hover {
770
- background: var(--dsw-alias-button-floating-hover);
771
- }
772
-
773
- body[data-dsh-815] [class*='collapsed'] [class*='mneme-topentry-native'] {
774
- border-color: transparent;
775
- background: transparent;
776
- }
777
-
778
- body[data-dsh-815] [class*='collapsed'] [class*='mneme-topentry-native']:hover {
779
- background: var(--dsw-alias-interactive-bg-hover);
780
- }
781
-
782
- /* dsh-task-board 的侧栏入口([data-dsh-taskboard-entry],即插件 board.module.css 的
783
- .entry:36px 高 / 8px 圆角 / 左对齐 / 13px 次要色文字的透明导航行)与 dsh-timer-agent
784
- 同族,同样插在「新会话」与工作区浏览区之间,一样不继承宿主的 .newSession 类名。
785
- 按标记属性覆盖成上方「新会话 / 记忆」那两枚按钮的同款盒模型(38px 高 / 12px 圆角 /
786
- 0.5px 铜边 / elevated 底 / 内容居中),与 timer-agent 段逐条对齐;收起态对齐宿主
787
- .collapsed .newSession(36x36 图标按钮、透明底、12px 圆角,把插件自带的 50%
788
- 圆形收正)。仍是注入式覆盖,不改插件源码。 */
789
- body[data-dsh-815] [data-dsh-taskboard-entry] {
790
- align-self: stretch;
791
- width: auto;
792
- flex: none;
793
- justify-content: center;
794
- gap: 6px;
795
- height: 38px;
796
- margin: 0 2px 8px;
797
- padding: 8px 16px;
798
- box-sizing: border-box;
799
- border: 0.5px solid var(--dsw-alias-border-l3);
800
- border-radius: 12px;
801
- background: var(--dsw-alias-button-elevated-fill);
802
- color: var(--dsw-alias-label-primary);
803
- font-size: 14px;
804
- font-weight: 500;
805
- line-height: 22px;
806
- }
807
-
808
- body[data-dsh-815] [data-dsh-taskboard-entry]:hover {
809
- background: var(--dsw-alias-button-floating-hover);
810
- }
811
-
812
- /* 看板打开时插件在行上打 data-active;上面那层底会盖掉插件自己的 active 底色,
813
- 这里按同档高亮补回来,与 timer-agent 一致。 */
814
- body[data-dsh-815] [data-dsh-taskboard-entry][data-active] {
815
- background: var(--dsw-alias-interactive-bg-active);
816
- font-weight: 600;
817
- }
818
-
819
- body[data-dsh-815] [class*='collapsed'] [data-dsh-taskboard-entry] {
820
- align-self: flex-start;
821
- width: 36px;
822
- height: 36px;
823
- margin: 0 0 12px;
824
- padding: 0;
825
- gap: 0;
826
- border-color: transparent;
827
- border-radius: 12px;
828
- background: transparent;
829
- }
830
-
831
- body[data-dsh-815] [class*='collapsed'] [data-dsh-taskboard-entry]:hover {
832
- background: var(--dsw-alias-interactive-bg-hover);
833
- }
834
-
835
- body[data-dsh-815] [class*='collapsed'] [data-dsh-taskboard-entry] [class*='entryLabel'] {
836
- display: none;
837
- }
838
-
839
- body[data-dsh-815] [class*='titlebar'] > [class*='button']:first-of-type {
840
- display: none;
841
- }
842
-
843
- body[data-dsh-815] [data-skin-chrome='titlebar-brand'] {
844
- position: absolute;
845
- left: 50%;
846
- top: 50%;
847
- transform: translate(-50%, -50%);
848
- display: inline-flex;
849
- color: #f3e3c0;
850
- --dsw-alias-label-primary-inverted: #1a1c14;
851
- pointer-events: none;
852
- }
853
-
854
- body[data-dsh-815] [data-skin-chrome='titlebar-brand'] svg {
855
- display: block;
856
- height: 18px;
857
- width: auto;
858
- filter:
859
- drop-shadow(0 1px 2px rgba(0, 0, 0, 0.55))
860
- drop-shadow(0 0 3px rgba(196, 163, 90, 0.35));
861
- }
862
-
863
- /* 标题栏压一道主铜线 + 一道亮丝,像纪念碑檐口的鎏金收边。 */
864
- body[data-dsh-815] [class*='titlebar'] {
865
- position: relative;
866
- background: linear-gradient(to top, rgba(16, 18, 12, 0.96), rgba(36, 38, 26, 0.9));
867
- border-bottom: 1px solid rgba(196, 163, 90, 0.42);
868
- box-shadow:
869
- 0 1px 0 rgba(226, 201, 138, 0.1),
870
- 0 8px 20px rgba(0, 0, 0, 0.32);
871
- }
872
-
873
- body[data-dsh-815] [class*='titlebar'] [class*='button'] {
874
- color: #d4bc7a;
875
- }
876
-
877
- /* DSH 官方「在本地打开」分裂按钮(ui-open-in-app,挂在会话页头的
878
- conversation.session.header.utilities 插槽):宿主按已装应用下发真实 PNG 图标,
879
- 边框与分裂分隔线都取 --dsw-alias-border-l4,而皮肤没定义该 token(浅色主题下
880
- 是浅灰 hairline),于是边框和竖线在暗底上全都看不见。
881
- 这里把它按旁边的「对话管理 / 删除本对话」对齐:同款铜金边(l2)、同高 32px、
882
- 同 18px 圆角,并把两个分段的左右内边距各放宽 4px;宿主 PNG 换成统一的线性
883
- 文件夹图标(mask 跟随按钮文字色,hover/报错态一起变),分隔线取自 chevron
884
- 自身的 border-left,随边框一同显形。 */
885
- body[data-dsh-815] div:has(> button > img[src*='/open-in-app/icon']) {
886
- --dsw-alias-border-l4: var(--dsw-alias-border-l2);
887
- height: 32px;
888
- border-radius: 18px;
889
- }
890
-
891
- body[data-dsh-815] div:has(> button > img[src*='/open-in-app/icon']) > button > img {
892
- display: none;
893
- }
894
-
895
- /* 主段:官方 padding 5px 6px 5px 7px,左右各 +4。 */
896
- body[data-dsh-815] div:has(> button > img[src*='/open-in-app/icon']) > button:first-child {
897
- padding: 5px 10px 5px 11px;
898
- }
899
-
900
- /* 箭头段:官方 padding 5px 6px 5px 4px,左右各 +4。 */
901
- body[data-dsh-815] div:has(> button > img[src*='/open-in-app/icon']) > button:last-child {
902
- padding: 5px 10px 5px 8px;
903
- }
904
-
905
- body[data-dsh-815] div:has(> button > img[src*='/open-in-app/icon']) > button:first-child::before {
906
- content: '';
907
- flex: none;
908
- width: 15px;
909
- height: 15px;
910
- background-color: currentColor;
911
- -webkit-mask: var(--vj-folder-icon) center / contain no-repeat;
912
- mask: var(--vj-folder-icon) center / contain no-repeat;
913
- }
914
-
915
- /* 右下角展签:右缘铜金竖线,主行画名奶油字,副行时间地点铜金小字。
916
- 层级压到 #root(z-index: 1)之下、背景遮罩(body::before, z-index: 0)之上:
917
- fixed 元素与其同为 body 子层,DOM 顺序靠后故仍浮在遮罩上;应用外壳的不透明
918
- UI(如输入座宣纸卡)可盖住它,不再遮挡输入框。 */
919
- body[data-dsh-815] [data-skin-chrome='caption'] {
920
- position: fixed;
921
- right: 16px;
922
- bottom: 12px;
923
- z-index: 0;
924
- display: flex;
925
- flex-direction: column;
926
- gap: 2px;
927
- max-width: min(52vw, 460px);
928
- padding: 7px 12px;
929
- border-right: 2px solid var(--vj-brass);
930
- border-radius: 8px 0 0 8px;
931
- background: linear-gradient(270deg, rgba(8, 10, 6, 0.78), rgba(8, 10, 6, 0.32));
932
- font-family: Georgia, 'Times New Roman', serif;
933
- text-align: right;
934
- pointer-events: none;
935
- }
936
-
937
- body[data-dsh-815] [data-skin-chrome='caption-title'] {
938
- color: #f4ead6;
939
- font-size: 12.5px;
940
- letter-spacing: 0.06em;
941
- text-shadow: 0 1px 6px rgba(0, 0, 0, 0.8);
942
- }
943
-
944
- body[data-dsh-815] [data-skin-chrome='caption-sub'] {
945
- color: #d4bc7a;
946
- font-size: 10.5px;
947
- letter-spacing: 0.14em;
948
- text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
949
- }
950
-
951
- @media (hover: hover) {
952
- body[data-dsh-815] [data-time-hover-root] :is([class*='timeStart'], [class*='timeEnd']) {
953
- opacity: 1;
954
- }
955
- }
956
-
957
- /* 对话区右侧的轮次导航轨(ui-chat TurnNavigator):普通刻度取
958
- --dsw-alias-border-l4,皮肤没定义这个 token,浅色主题回落成半透明黑
959
- #00000029(实测刻度 rgba(0,0,0,.16) 再乘未加载态的 opacity .6),落在暗色
960
- 油画上等于没有,「时间线」只剩当前轮那一根。这里在刻度容器内把该 token 换成
961
- 皮肤的铜金:当前轮(label-primary 奶油)与预览态(label-tertiary)各有自己的
962
- 颜色,层级不变;未加载态仍由宿主的 opacity .6 压淡一档。 */
963
- body[data-dsh-815] [class*='markPosition'] {
964
- --dsw-alias-border-l4: var(--vj-brass);
965
- }
966
-
967
- @media (prefers-reduced-motion: reduce) {
968
- body[data-dsh-815] [data-composer-card] {
969
- transition: none;
970
- }
971
- }
1
+ /* 1945-08-15 终战皮肤:史料照片底 + 可读玻璃层。 */
2
+
3
+ body[data-dsh-815] {
4
+ color-scheme: dark;
5
+ color: #f4ead6;
6
+ background-color: #080a06;
7
+ --dsw-alias-label-primary-inverted: #1a1c14;
8
+ --vj-brass: #c4a35a;
9
+ --vj-brass-soft: #e2c98a;
10
+ --vj-olive: #3d4630;
11
+ --vj-ink: #1c1a14;
12
+ --vj-paper: #f3ead4;
13
+ --vj-glass: rgba(18, 20, 14, 0.72);
14
+ --vj-shadow: 0 18px 48px rgba(0, 0, 0, 0.42);
15
+ /* 线性文件夹图标(Element UI Folder 风格的轮廓),供「在本地打开」分裂按钮
16
+ 以 mask 描出,颜色跟随按钮文字色。 */
17
+ --vj-folder-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 17.5V6.5a2 2 0 0 1 2-2h3.1a2 2 0 0 1 1.6.8l1.15 1.53a2 2 0 0 0 1.6.8H18.5a2 2 0 0 1 2 2v7.87a2 2 0 0 1-2 2h-13a2 2 0 0 1-2-2Z'/%3E%3C/svg%3E");
18
+ /* 同一套描边语言的线性文件图标(右上折角的纸),供右栏 tab 的文件类型图标
19
+ 以 mask 描出;目录类型仍走上面那枚文件夹。 */
20
+ --vj-file-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M13.6 3.2H7.2a2 2 0 0 0-2 2v13.6a2 2 0 0 0 2 2h9.6a2 2 0 0 0 2-2V8.4Z'/%3E%3Cpath d='M13.6 3.2v5.2h5.2'/%3E%3C/svg%3E");
21
+
22
+ --dsw-alias-bg-base: transparent;
23
+ --dsw-alias-bg-layer-1: rgba(28, 30, 22, 0.78);
24
+ --dsw-alias-bg-layer-2: rgba(36, 38, 28, 0.88);
25
+ --dsw-alias-bg-layer-3: rgba(44, 46, 34, 0.92);
26
+ --dsw-alias-bg-overlay: rgba(22, 24, 18, 0.94);
27
+ --dsw-alias-border-l1: rgba(196, 163, 90, 0.28);
28
+ --dsw-alias-border-l2-darkmode-thin: rgba(196, 163, 90, 0.36);
29
+ --dsw-alias-border-l2: rgba(196, 163, 90, 0.42);
30
+ --dsw-alias-border-l3: rgba(196, 163, 90, 0.7);
31
+ /* l4 是宿主那档最细的描边(卡片 / 输入框 / 标签 / 分组线都在用),浅色主题下
32
+ 是半透明黑 rgba(0,0,0,.16) —— 落在皮肤的暗底上只有 1.1~1.4:1,等于没有边框
33
+ (设置里的预设卡、插件卡、外观方块,右栏引导卡、轨迹单元格等都中招)。
34
+ 这里补成同族的铜金细线:对 #24261c 约 2.6:1,细线可见又不抢眼。 */
35
+ --dsw-alias-border-l4: rgba(196, 163, 90, 0.5);
36
+ --dsw-alias-brand-primary: #c4a35a;
37
+ --dsw-alias-brand-text: #f4ead6;
38
+ --dsw-alias-button-elevated-fill: rgba(52, 54, 40, 0.9);
39
+ --dsw-alias-button-floating-fill: rgba(58, 60, 44, 0.94);
40
+ --dsw-alias-button-floating-hover: #4a4e38;
41
+ --dsw-alias-button-info-fill: #6a5a32;
42
+ --dsw-alias-button-info-hover: #7c6a3c;
43
+ --dsw-alias-interactive-bg-active: rgba(196, 163, 90, 0.28);
44
+ --dsw-alias-interactive-bg-hover: rgba(196, 163, 90, 0.14);
45
+ --dsw-alias-interactive-bg-hover-solid: #3a3e2c;
46
+ --dsw-alias-label-primary: #f4ead6;
47
+ --dsw-alias-label-primary-bluish: #e8dcb8;
48
+ --dsw-alias-label-secondary: #c8c0a4;
49
+ --dsw-alias-label-tertiary: #9e9780;
50
+ --dsw-alias-label-caption: #7e7866;
51
+ --dsw-alias-state-business-primary: #c4a35a;
52
+ --dsw-alias-state-business-tertiary: #3a3828;
53
+ --dsw-shadow-lv2: var(--vj-shadow);
54
+ --dsw-specific-input-major: rgba(28, 30, 22, 0.82);
55
+ --dsw-specific-selector: #323428;
56
+ --dsw-specific-menu: #2c2e24;
57
+ --dsw-specific-sidebar-fill: rgba(14, 16, 12, 0.88);
58
+ --dsw-alias-markdown-code-block: #141610;
59
+ --dsw-alias-markdown-code-block-banner: #1c1e16;
60
+ --shiki-token-constant: #4dabf7;
61
+ --shiki-token-string: #69db7c;
62
+ --shiki-token-comment: #adb5bd;
63
+ --shiki-token-keyword: #faa2c1;
64
+ --shiki-token-parameter: #ffa94d;
65
+ --shiki-token-function: #b197fc;
66
+ --shiki-token-string-expression: #8ce99a;
67
+ --shiki-token-punctuation: #ced4da;
68
+ --shiki-token-link: #74c0fc;
69
+ }
70
+
71
+ body[data-dsh-815]::before {
72
+ content: '';
73
+ position: fixed;
74
+ inset: 0;
75
+ z-index: 0;
76
+ pointer-events: none;
77
+ background:
78
+ linear-gradient(
79
+ 180deg,
80
+ rgba(10, 12, 8, 0.6) 0%,
81
+ rgba(10, 12, 8, 0.38) 30%,
82
+ rgba(12, 12, 10, 0.55) 52%,
83
+ rgba(10, 12, 8, 0.78) 78%,
84
+ rgba(8, 10, 6, 0.9) 100%
85
+ ),
86
+ radial-gradient(ellipse at 50% 30%, transparent 18%, rgba(8, 10, 6, 0.5) 100%);
87
+ }
88
+
89
+ body[data-dsh-815] [id='root'] {
90
+ position: relative;
91
+ z-index: 1;
92
+ background: transparent;
93
+ }
94
+
95
+ body[data-dsh-815] :is([data-pane='sidebar'], [class*='sidebarCol']) {
96
+ --dsw-alias-label-primary: #f4ead6;
97
+ --dsw-alias-label-secondary: #d4ccb0;
98
+ position: relative;
99
+ z-index: auto;
100
+ background: rgba(16, 18, 12, 0.92);
101
+ border-right: 1px solid rgba(196, 163, 90, 0.42);
102
+ box-shadow: 10px 0 28px rgba(0, 0, 0, 0.28);
103
+ }
104
+
105
+ body[data-dsh-815] :is([data-pane='sidebar'], [class*='sidebarCol']) > div {
106
+ position: relative;
107
+ overflow: visible;
108
+ background:
109
+ linear-gradient(180deg, rgba(28, 30, 20, 0.55), rgba(12, 14, 10, 0.72));
110
+ }
111
+
112
+ /* 青天白日海军旗:蓝底白日十二芒。仅挂在会话选中行左侧。 */
113
+ body[data-dsh-815] [data-vj-session] {
114
+ position: relative;
115
+ padding-left: 26px;
116
+ }
117
+
118
+ body[data-dsh-815] [data-vj-session]:hover:not([aria-selected='true']) {
119
+ border-radius: 8px;
120
+ background: rgba(196, 163, 90, 0.1);
121
+ }
122
+
123
+ body[data-dsh-815] [data-vj-session][aria-selected='true'] {
124
+ border-radius: 8px;
125
+ background: linear-gradient(90deg, rgba(196, 163, 90, 0.22), rgba(28, 30, 22, 0.12));
126
+ box-shadow: inset 0 0 0 1px rgba(196, 163, 90, 0.35);
127
+ }
128
+
129
+ body[data-dsh-815] [data-vj-session][aria-selected='true'] [class*='title'] {
130
+ color: #fff8e8;
131
+ }
132
+
133
+ body[data-dsh-815] [data-vj-session][aria-selected='true']::before {
134
+ content: '';
135
+ position: absolute;
136
+ left: 6px;
137
+ top: 50%;
138
+ z-index: 2;
139
+ width: 16px;
140
+ height: 11px;
141
+ transform: translateY(-50%);
142
+ pointer-events: none;
143
+ background-color: #000095;
144
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 20'%3E%3Crect width='30' height='20' fill='%23000095'/%3E%3Cg fill='%23fff' transform='translate(15 10)'%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(30)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(60)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(90)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(120)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(150)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(180)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(210)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(240)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(270)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(300)'/%3E%3Cpolygon points='0,-8.4 1.05,-3.5 -1.05,-3.5' transform='rotate(330)'/%3E%3Ccircle r='2.7'/%3E%3Ccircle r='3.55' fill='none' stroke='%23000095' stroke-width='0.85'/%3E%3C/g%3E%3C/svg%3E");
145
+ background-size: cover;
146
+ background-repeat: no-repeat;
147
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);
148
+ }
149
+
150
+ body[data-dsh-815] :is([data-pane='conversation'], [class*='centerCol']) {
151
+ color: #f4ead6;
152
+ background: transparent;
153
+ }
154
+
155
+ /* 对话列宿主会写 background: var(--dsw-alias-bg-base);主题若在内层重绑该 token,会盖住油画并和输入座切出一条水平线。 */
156
+ body[data-dsh-815] [data-phase='active'] {
157
+ --dsw-alias-bg-base: transparent;
158
+ background: transparent;
159
+ }
160
+
161
+ body[data-dsh-815] [data-phase='active'] [class*='scrollBody'],
162
+ body[data-dsh-815] [data-phase='active'] [class*='viewArea'] {
163
+ background: transparent;
164
+ }
165
+
166
+ body[data-dsh-815] :is([data-pane='details'], [class*='detailsCol']) {
167
+ --dsw-alias-bg-base: #1c1e16;
168
+ --dsw-alias-bg-overlay: #24261c;
169
+ background: #1c1e16;
170
+ border-left-color: rgba(196, 163, 90, 0.4);
171
+ }
172
+
173
+ body[data-dsh-815] button[class*='brand'] {
174
+ color: #f3e3c0;
175
+ --dsw-alias-label-primary-inverted: #1a1c14;
176
+ }
177
+
178
+ body[data-dsh-815] button[class*='brand'] > svg > rect {
179
+ fill: #c4a35a;
180
+ }
181
+
182
+ body[data-dsh-815] [data-phase='hero'] [class*='headline'] {
183
+ color: #fff8e8;
184
+ font-family: Georgia, 'Times New Roman', serif;
185
+ letter-spacing: 0.05em;
186
+ text-shadow: 0 2px 10px rgba(0, 0, 0, 0.75);
187
+ }
188
+
189
+ body[data-dsh-815] [data-composer-card] {
190
+ isolation: isolate;
191
+ min-height: 0;
192
+ color: #1c1a14;
193
+ --dsw-alias-label-primary: #1c1a14;
194
+ --dsw-alias-label-primary-bluish: #2a261c;
195
+ --dsw-alias-label-secondary: #4a4638;
196
+ --dsw-alias-label-tertiary: #6a6454;
197
+ --dsw-alias-label-caption: #7e7866;
198
+ --dsw-alias-brand-text: #1c1a14;
199
+ /* 目标条「进行中的目标」走 brand/business 主色;浅纸底上浅铜看不清,压成暗铜。 */
200
+ --dsw-alias-brand-primary: #6b4e16;
201
+ --dsw-alias-state-business-primary: #6b4e16;
202
+ --dsw-specific-input-major: #f3ead4;
203
+ --dsw-alias-bg-layer-1: #f3ead4;
204
+ --dsw-alias-bg-layer-2: #efe4c8;
205
+ border: 1px solid rgba(196, 163, 90, 0.55);
206
+ border-radius: 18px;
207
+ background: linear-gradient(180deg, #f3ead4, #e4d6b4);
208
+ box-shadow: var(--vj-shadow);
209
+ transition: border-color 0.18s ease, box-shadow 0.18s ease;
210
+ }
211
+
212
+ /* 聚焦时宣纸框收一道亮铜边,像展柜签条被点亮。 */
213
+ body[data-dsh-815] [data-composer-card]:focus-within {
214
+ border-color: rgba(226, 201, 138, 0.9);
215
+ box-shadow: 0 0 0 3px rgba(196, 163, 90, 0.16), var(--vj-shadow);
216
+ }
217
+
218
+ /* DSH 新版 Composer 把草稿文字渲染在 backdrop 层(data-input-backdrop),
219
+ textarea 只保留原生 caret,其文字与背景都应是透明的:这里若把背景写成
220
+ 宣纸浅色,会形成不透明层遮住 backdrop 里的草稿字。textarea 仅留深色 caret。 */
221
+ body[data-dsh-815] [data-composer-card] :is(textarea, input, [contenteditable='true']) {
222
+ color: #1c1a14;
223
+ caret-color: #1c1a14;
224
+ background: transparent;
225
+ }
226
+
227
+ /* 草稿正文字符真正由 backdrop 层(data-input-backdrop)绘制,颜色取自
228
+ var(--dsw-alias-label-primary)。主题在暗色下把该 token 解析成浅色,
229
+ 落在宣纸浅底上将看不清;这里在输入座内把 backdrop 压回墨色。 */
230
+ body[data-dsh-815] [data-composer-card] [data-input-backdrop] {
231
+ color: #1c1a14;
232
+ }
233
+
234
+ /* backdrop 内的 slash 命令 token / 引用 chip 原本用主题暗色下的浅色
235
+ token(warn/business),落在宣纸浅底上也偏浅;压成暗金与深橄榄,
236
+ 与 815 主题协调。用 data-decoration 属性定位,避开 CSS Modules 的 hash 类名。 */
237
+ body[data-dsh-815] [data-composer-card] [data-input-backdrop] [data-decoration='token'] {
238
+ color: #8a6a1c;
239
+ }
240
+
241
+ body[data-dsh-815] [data-composer-card] [data-input-backdrop] :is([data-decoration='chip'], [data-decoration='text-ref']) {
242
+ color: #2f4a2f;
243
+ }
244
+
245
+ body[data-dsh-815] [data-composer-card] :is(textarea, input)::placeholder {
246
+ color: #6a6454;
247
+ }
248
+
249
+ body[data-dsh-815] [data-phase='active'] [data-composer-seat] {
250
+ --dsw-alias-bg-base: transparent;
251
+ --dsw-alias-brand-primary: #6b4e16;
252
+ --dsw-alias-state-business-primary: #6b4e16;
253
+ background: transparent;
254
+ }
255
+
256
+ /* 提问卡(ui-user-questions 的 composer 接管层)是输入座的兄弟,不在输入卡内,
257
+ 拿不到输入卡那层墨色 token。卡内自由作答框(.customBlock)的底取宿主
258
+ --dsw-alias-bg-module-platform,皮肤没接管该 token,浅色主题下是近白
259
+ #f5f6f7,而框内文字是皮肤全局的奶油 label-primary #f4ead6 —— 1.10:1,
260
+ 输入值与占位符一起糊在白底上(输入框还是块白斑,与深橄榄卡面断裂)。
261
+ 在提问卡子树内(宿主下发的 data-question-key,plan review 卡走
262
+ data-plan-review-key,不受影响)把该 token 压成卡面同色 #24261c:输入值
263
+ 12.85:1;占位符原值 label-caption 对深底只有 3.48:1,另提一档到
264
+ label-tertiary #9e9780(5.25:1)。作用域限 :not([data-ds-dark-theme])
265
+ (暗色主题下该 token 本身是深色,无需改动),卡外任何使用该 token 的表面
266
+ 不受影响。 */
267
+ body[data-dsh-815]:not([data-ds-dark-theme]) [data-question-key] {
268
+ --dsw-alias-bg-module-platform: #24261c;
269
+ }
270
+
271
+ body[data-dsh-815]:not([data-ds-dark-theme]) [data-question-key] [class*='fieldInput']::placeholder {
272
+ color: #9e9780;
273
+ }
274
+
275
+ /* 斜杠候选菜单 / popupSelect 浮层挂在输入座 overlay 锚点(零高条带),
276
+ 是输入座的子节点,会继承宣纸浅底的墨字 token;但浮层自身是深色 Elevated
277
+ 面(background: var(--dsw-specific-menu)),墨字落在深底上看不清。
278
+ 在浮层根上换回主题浅色文字,并把菜单底压成不透明深橄榄——与对话框、
279
+ 普通菜单(vj815.module.css 的 role='dialog' / role='menu' 规则)同一取值。 */
280
+ body[data-dsh-815]
281
+ :is(
282
+ [data-composer-card] [role='listbox'],
283
+ [data-composer-card] [class*='overlayAnchor'] > *
284
+ ) {
285
+ color: #f4ead6;
286
+ --dsw-specific-menu: #2c2e24;
287
+ --dsw-alias-label-primary: #f4ead6;
288
+ --dsw-alias-label-primary-bluish: #e8dcb8;
289
+ --dsw-alias-label-secondary: #d4ccb0;
290
+ --dsw-alias-label-tertiary: #9e9780;
291
+ --dsw-alias-label-dimmed: #9e9780;
292
+ --dsw-alias-brand-primary: #c4a35a;
293
+ --dsw-alias-state-business-primary: #c4a35a;
294
+ --dsw-alias-interactive-bg-hover: rgba(196, 163, 90, 0.14);
295
+ --dsw-alias-interactive-bg-active: rgba(196, 163, 90, 0.28);
296
+ border-color: rgba(196, 163, 90, 0.5);
297
+ }
298
+
299
+ body[data-dsh-815] [data-chat-flow] {
300
+ max-width: var(--dsh-composer-card-max-width);
301
+ }
302
+
303
+ body[data-dsh-815]
304
+ [data-chat-flow-kind='assistant-step'] > * > * > * > div[class*='markdown'] {
305
+ box-sizing: border-box;
306
+ align-self: stretch;
307
+ width: 100%;
308
+ max-width: 100%;
309
+ padding: 14px 18px;
310
+ border: 1px solid rgba(196, 163, 90, 0.32);
311
+ border-radius: 14px 14px 14px 6px;
312
+ color: #f4ead6;
313
+ background: linear-gradient(180deg, rgba(40, 42, 30, 0.82), rgba(16, 18, 12, 0.85));
314
+ box-shadow:
315
+ inset 0 1px 0 rgba(226, 201, 138, 0.12),
316
+ 0 8px 22px rgba(0, 0, 0, 0.32);
317
+ }
318
+
319
+ body[data-dsh-815] [class*='markdown'] [class*='bannerWrap'] {
320
+ background-color: var(--dsw-alias-markdown-code-block-banner);
321
+ }
322
+
323
+ /* 代码块保持橄榄深底,只收一道暗铜边,与气泡区分开。 */
324
+ body[data-dsh-815] [class*='markdown'] pre {
325
+ border: 1px solid rgba(196, 163, 90, 0.25);
326
+ border-radius: 10px;
327
+ }
328
+
329
+ /* 宽表格(渲染器给 ≥4 列的 wrapper 打的 md-table-wide 钩子):宿主让 wrapper
330
+ breakout 到整个对话列宽,且非 hover/focus 时 overflow-x: hidden —— 皮肤给
331
+ 正文/用户消息加了气泡边框后,breakout 会直接穿透边框,右侧被对话列裁掉,
332
+ 看上去就是「表格溢出且滚不动」。这里把 breakout 收回气泡内(spare/lead
333
+ 归零),并让横向滚动常驻(宿主默认只在 hover/focus 时开)。 */
334
+ body[data-dsh-815] :global(.md-table-wide) {
335
+ --dsh-table-spare: 0px;
336
+ --dsh-table-lead: 0px;
337
+ overflow-x: auto;
338
+ padding-bottom: 0;
339
+ }
340
+
341
+ /* 行内 code 走宣纸底墨字,白底场景下也必须压成墨色。 */
342
+ body[data-dsh-815]
343
+ :is(
344
+ [data-chat-flow-kind='assistant-step'] > * > * > * > div[class*='markdown'],
345
+ [class*='userRow'] [class*='bubble']
346
+ )
347
+ :not(pre) > code {
348
+ padding: 0.04em 0.34em;
349
+ border: 1px solid rgba(196, 163, 90, 0.45);
350
+ border-radius: 5px;
351
+ color: #1c1a14;
352
+ background: var(--vj-paper);
353
+ }
354
+
355
+ /* 文件查看区域(右栏的文档预览)正文是 ui-primitives 的 markdown:行内 code
356
+ 的底取 --dsw-alias-markdown-inline-code,浅色主题下是近白 #fafafa,而字色
357
+ 继承皮肤全局的奶油 label-primary #f4ead6 —— 只有 1.14:1,胶囊里的字基本
358
+ 读不出来。对话区的行内 code 早就走过宣纸底墨字,这一处是漏网的:这里只
359
+ 把浅底上的字压回墨色,底仍交给宿主。暗色主题下 code 底本身是深色
360
+ (static-neutral-800),奶油字正确,故排除。 */
361
+ body[data-dsh-815]:not([data-ds-dark-theme])
362
+ :is([class*='rightbarCol'], [data-sidebar-right-float-host]) [class*='markdown'] :not(pre) > code {
363
+ color: #1c1a14;
364
+ }
365
+
366
+ /* 右栏的选中 tab(打开的文件名就在这颗胶囊上):dockkit 的 .tabActive 文字取
367
+ label-primary,底取 --dsw-alias-markdown-tag,浅色主题下是近白 bluish-75
368
+ (实测 #f1f3f5),奶油字落上去只有 1.07:1,文件名等于看不见。这里只压字色。
369
+ 必须限定在右栏/浮窗容器内:会话页头那排视图 tab(对话 / 轨迹 / 用量统计)
370
+ 用的是另一套类名,选中态底是透明的(叠在暗色油画上),全局压墨色会把它们
371
+ 直接抹掉(墨字落在深底上,1.1:1)。暗色主题下胶囊底是深色 bluish-850,
372
+ 保留奶油字。 */
373
+ body[data-dsh-815]:not([data-ds-dark-theme])
374
+ :is([class*='rightbarCol'], [data-sidebar-right-float-host]) [role='tab'][class*='tabActive'] {
375
+ color: #1c1a14;
376
+ }
377
+
378
+ /* 选中 tab 一 hover,底就从浅灰胶囊换成半透明的交互底(皮肤值
379
+ rgba(196,163,90,.14),叠在油画上就是暗底),上面那层刚压好的墨字于是又沉
380
+ 进底色里。hover 态把字换回奶油色;未选中的 tab 本来就是奶油灰字,不在其列。 */
381
+ body[data-dsh-815]:not([data-ds-dark-theme])
382
+ :is([class*='rightbarCol'], [data-sidebar-right-float-host]) [role='tab'][class*='tabActive']:hover {
383
+ color: #f4ead6;
384
+ }
385
+
386
+ /* tab 上的文件类型图标是宿主下发的彩色实心方块(markdown 是 DeepSeek 蓝
387
+ #4176e6,文件夹是琥珀),在皮肤的线性描边视觉里像贴纸。按皮肤自绘的那套
388
+ 描边图标用 mask 重画:文件走 --vj-file-icon,目录类型(class 里带 folder)
389
+ 仍走 --vj-folder-icon。颜色走 currentColor,跟着 tab 文字色(选中墨色 /
390
+ 未选中次要色)一起变;svg 内部的 path 藏掉,只留 mask 裁出的那层底色。 */
391
+ body[data-dsh-815] [data-slot='sidebar.right.pane.tab.title'] svg[class*='titleIcon'] {
392
+ color: inherit;
393
+ background-color: currentColor;
394
+ -webkit-mask: var(--vj-file-icon) center / contain no-repeat;
395
+ mask: var(--vj-file-icon) center / contain no-repeat;
396
+ }
397
+
398
+ body[data-dsh-815] [data-slot='sidebar.right.pane.tab.title'] svg[class*='titleIcon'][class*='folder'] {
399
+ -webkit-mask-image: var(--vj-folder-icon);
400
+ mask-image: var(--vj-folder-icon);
401
+ }
402
+
403
+ body[data-dsh-815] [data-slot='sidebar.right.pane.tab.title'] svg[class*='titleIcon'] > * {
404
+ display: none;
405
+ }
406
+
407
+ body[data-dsh-815]
408
+ [data-chat-flow-kind='assistant-step'] > * > * > * > div[class*='markdown'] [class*='fileMention'] {
409
+ color: #6b4e16;
410
+ }
411
+
412
+ /* 宣纸上的「+」压成深橄榄底白标,避免浅纸面上的白图标失踪。 */
413
+ body[data-dsh-815] [data-composer-card] button[class*='add'] {
414
+ color: #ffffff;
415
+ border-radius: 10px;
416
+ background: var(--vj-olive);
417
+ }
418
+
419
+ body[data-dsh-815] [data-composer-card] button[class*='add']:hover {
420
+ background: #4a5238;
421
+ }
422
+
423
+ body[data-dsh-815] [class*='userRow'] [class*='bubble'] {
424
+ color: #f4ead6;
425
+ border: 1px solid rgba(196, 163, 90, 0.4);
426
+ background: rgba(52, 48, 32, 0.92);
427
+ }
428
+
429
+ /* 宿主自带的浅色面不吃皮肤的暗色假设:非暗色主题下,下列容器的底色来自
430
+ 主题(近白 / 浅灰),而皮肤把 label-primary 全局换成奶油色 #f4ead6,
431
+ 浅底浅字几乎不可见。在这两类容器内把文字压回墨色。暗色主题下容器本身
432
+ 是深底,皮肤浅字仍然正确,故用 :not() 排除,避免反向回归。 */
433
+
434
+ /* ui-deliverables 的 present 文件卡:卡底 var(--dsw-static-neutral-50),
435
+ 文件名与「打开」走 label-primary,文件图标走 link。 */
436
+ body[data-dsh-815]:not([data-ds-dark-theme]) [data-presented-file] {
437
+ --dsw-alias-label-primary: #1c1a14;
438
+ --dsw-alias-link: #6b4e16;
439
+ }
440
+
441
+ /* 但卡里的「打开 / 展开」分裂按钮底不是卡片底:它取皮肤全局的
442
+ button-floating-fill(深橄榄 rgba(58,60,44,.94),浅底卡片上量到 #45463a),
443
+ 上面那条 label-primary 覆盖顺手把按钮文字也压成墨色,深底墨字只有 1.8:1,
444
+ 看着就是「文字融进按钮」。按钮分两段,文字单独拿回奶油色;
445
+ 箭头段的 disabled 态仍交给宿主(label-dimmed),免得禁用与可用没区别。 */
446
+ body[data-dsh-815]:not([data-ds-dark-theme]) [data-presented-file]
447
+ :is(button[class*='_open'], button[class*='_chevron']:not(:disabled)) {
448
+ color: #f4ead6;
449
+ }
450
+
451
+ /* ui-conversation 的 todo 面板:面板底是主题的浅色 var(--dsw-specific-tip)
452
+ (非暗色主题下量到 #f5f6f7),皮肤全局的 label-* 却是浅奶油。只压标题
453
+ 不够——条目文字走 label-secondary(#c8c0a4,1.7:1)几乎看不见。这里把
454
+ 面板内的文字层级整体压回墨色:标题 label-primary、条目 label-secondary、
455
+ 计数 label-tertiary,pending 图标 label-caption 保持面板内最淡的一档。
456
+ 层级依次 14.8:1 / 8.7:1 / 5.6:1 / 4.2:1。 */
457
+ body[data-dsh-815]:not([data-ds-dark-theme]) [data-testid='todo-panel'] {
458
+ --dsw-alias-label-primary: #1c1a14;
459
+ --dsw-alias-label-secondary: #4a4638;
460
+ --dsw-alias-label-tertiary: #5a5443;
461
+ --dsw-alias-label-caption: #6a6454;
462
+ }
463
+
464
+ /* ui-conversation 的排队坞(QueueDock,`data-queue-dock`):它挂在 composer
465
+ 栈里、输入卡之外,拿不到 [data-composer-card] 那层墨色 token,于是面板底
466
+ 照样是主题浅色 var(--dsw-specific-tip)(实测 #f5f6f7),而「N 条排队消息」
467
+ 走 label-primary 奶油 #f4ead6(1.05:1)、前面那枚队列图标与右侧箭头走
468
+ label-tertiary #9e9780(2.6:1),整条几乎读不出来。与 todo 面板同法,
469
+ 在坞内把文字层级压回墨色:标题 primary 约 15:1,前面那枚队列图标与右侧
470
+ 箭头、状态字 tertiary 约 7:1(条目正文与文件名走 label-primary-dimmed,
471
+ 浅色主题下本就是近黑,不用管)。暗色主题下面板本身深色,故排除。 */
472
+ body[data-dsh-815]:not([data-ds-dark-theme]) [data-queue-dock] {
473
+ --dsw-alias-label-primary: #1c1a14;
474
+ --dsw-alias-label-secondary: #4a4638;
475
+ --dsw-alias-label-tertiary: #5a5443;
476
+ --dsw-alias-label-caption: #6a6454;
477
+ }
478
+
479
+ /* dsh-session-manager 的「会话管理」弹框(类名 sm-nativeDialog / sm-panelDialog,
480
+ 不带 hash):弹框底是插件自己写死的白 / #f5f5f5,文字却取宿主的 label-* 三个
481
+ token —— 皮肤把它们换成了奶油系,于是「全部 / 未归档 / 已归档」、会话标题、
482
+ 行内「打开 / 归档 / 移动至工作区 / 迁移预设」以及行下方的元信息全落在白底上
483
+ (1.1~2.7:1)。这里在弹框内把文字层级压回墨色;行内按钮 hover 时插件会把字
484
+ 换成 label-primary(仍是皮肤的奶油),一并压掉,落在它的 --dsw-alias-fill-l2
485
+ 浅底上就是墨字。插件的危险色(state-error-primary,4.8:1)与它自己写死的近黑
486
+ 标题不动。注意必须写成属性选择器:本表是 CSS Module,类选择器会被 hash 成
487
+ .xxxx_sm-nativeDialog,匹配不到插件的类。 */
488
+ body[data-dsh-815]:not([data-ds-dark-theme])
489
+ :is([class*='sm-nativeDialog'], [class*='sm-panelDialog']) {
490
+ --dsw-alias-label-primary: #1c1a14;
491
+ --dsw-alias-label-secondary: #4a4638;
492
+ --dsw-alias-label-tertiary: #5a5443;
493
+ --dsw-alias-label-caption: #6a6454;
494
+ }
495
+
496
+ /* ui-goal 的目标条:条底是主题的浅色 var(--dsw-specific-tip)(非暗色主题下量到
497
+ #f5f6f7),而「进行中的目标」标签走 label-primary —— 皮肤在 body 上把它换成
498
+ 奶油色 #f4ead6,对条底只有 1.1:1,标签整条融进条底看不见;目标正文走
499
+ label-primary-dimmed(浅色主题下是近黑)所以照常可见,看上去就只有标签失踪。
500
+ 这里与 todo 面板同法,在条内把文字层级压回墨色:标签 primary、hover 态
501
+ secondary、图标 tertiary,对条底依次 16.1:1 / 8.7:1 / 7.0:1。暗色主题下条底
502
+ 本身是深色,皮肤浅字仍然正确,故用 :not() 排除。 */
503
+ body[data-dsh-815]:not([data-ds-dark-theme]) [data-goal-bar] {
504
+ --dsw-alias-label-primary: #1c1a14;
505
+ --dsw-alias-label-secondary: #4a4638;
506
+ --dsw-alias-label-tertiary: #5a5443;
507
+ }
508
+
509
+ body[data-dsh-815] [data-terminal] {
510
+ --dsw-alias-markdown-code-block: rgba(18, 20, 14, 0.96);
511
+ --dsw-alias-label-primary: #f4ead6;
512
+ color: #f4ead6;
513
+ }
514
+
515
+ /* dsh-better-sidebar 底部工作台的终端(xterm,头部工具条最右侧的「展开底部面板」)。
516
+ 插件按「宿主配色方案」自选终端主题:surface 取 body 上的 --dsw-alias-bg-base,
517
+ 透明或半透明时回退到 dark ? #111114 : #ffffff。815 皮肤为露油画把该 token 设成
518
+ transparent,宿主又是浅色方案(html 内联 color-scheme: light、body 无
519
+ data-ds-dark-theme),回退于是落到 #ffffff 白底;前景仍取皮肤的 label-primary
520
+ 奶油色 #f4ead6 —— 白底奶油字约 1.1:1,终端内容等于看不见。
521
+ xterm 的 surface 与 ANSI 16 色是插件在创建时一次性写成的内联样式与渲染 style
522
+ (.xterm-viewport 的 background-color、.xterm-fg-N/.xterm-bg-N 的颜色),皮肤的
523
+ CSS 变量改不到它们,所以这里在渲染面上按皮肤配色覆盖,不改插件源码:
524
+ 底用 815 的深橄榄黑 #141610、前景留奶油色(约 15:1),ANSI 16 色换成与暗底匹配的
525
+ one-dark 系(0/8 两色提亮到可读档),光标块与选区走铜金。
526
+ 只在宿主浅色方案下出手:暗色方案下插件本就用深底 + ANSI_DARK,无需干预。 */
527
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-viewport) {
528
+ background-color: #141610 !important;
529
+ scrollbar-color: rgba(196, 163, 90, 0.55) #141610;
530
+ }
531
+
532
+ /* 上面的 fg 规则特异性高于插件的 .xterm-dim 半透明色,dim 语义改用透明度保留。 */
533
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-dim) {
534
+ opacity: 0.7;
535
+ }
536
+
537
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-selection) div {
538
+ background-color: rgba(196, 163, 90, 0.32) !important;
539
+ }
540
+
541
+ /* 光标块由插件填成前景色、块内文字填成背景色(浅色方案下是 #ffffff),白字落在
542
+ 奶油块上同样看不清;animation 内的声明优先于普通规则,故用 !important 压回墨色。 */
543
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-cursor.xterm-cursor-block) {
544
+ color: #1c1a14 !important;
545
+ }
546
+
547
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-0) { color: #5c6370; }
548
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-1) { color: #e06c75; }
549
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-2) { color: #98c379; }
550
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-3) { color: #e5c07b; }
551
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-4) { color: #61afef; }
552
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-5) { color: #c678dd; }
553
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-6) { color: #56b6c2; }
554
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-7) { color: #abb2bf; }
555
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-8) { color: #7f8694; }
556
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-9) { color: #e06c75; }
557
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-10) { color: #98c379; }
558
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-11) { color: #e5c07b; }
559
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-12) { color: #61afef; }
560
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-13) { color: #c678dd; }
561
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-14) { color: #56b6c2; }
562
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-fg-15) { color: #ffffff; }
563
+
564
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-0) { background-color: #5c6370; }
565
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-1) { background-color: #e06c75; }
566
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-2) { background-color: #98c379; }
567
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-3) { background-color: #e5c07b; }
568
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-4) { background-color: #61afef; }
569
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-5) { background-color: #c678dd; }
570
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-6) { background-color: #56b6c2; }
571
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-7) { background-color: #abb2bf; }
572
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-8) { background-color: #7f8694; }
573
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-9) { background-color: #e06c75; }
574
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-10) { background-color: #98c379; }
575
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-11) { background-color: #e5c07b; }
576
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-12) { background-color: #61afef; }
577
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-13) { background-color: #c678dd; }
578
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-14) { background-color: #56b6c2; }
579
+ body[data-dsh-815]:not([data-ds-dark-theme]) :global(.xterm) :global(.xterm-rows) :global(.xterm-bg-15) { background-color: #ffffff; }
580
+
581
+ /* 对话列把 --dsw-alias-bg-base 设成透明好露油画;对话管理等弹层若写
582
+ background: var(--dsw-alias-bg-base),会整层透出后面的字。弹层改实色。 */
583
+ body[data-dsh-815] :is([role='dialog'], [role='menu'], [role='listbox'], [aria-modal='true'], [data-radix-popper-content-wrapper] > *) {
584
+ color: #f4ead6;
585
+ background-color: #24261c;
586
+ --dsw-alias-bg-base: #24261c;
587
+ --dsw-alias-label-primary: #f4ead6;
588
+ --dsw-alias-label-secondary: #d4ccb0;
589
+ --dsw-alias-label-tertiary: #9e9780;
590
+ --dsw-alias-label-caption: #7e7866;
591
+ --dsw-alias-bg-layer-1: #24261c;
592
+ --dsw-alias-bg-layer-2: #1c1e16;
593
+ --dsw-alias-bg-layer-3: #2c2e24;
594
+ --dsw-alias-bg-module-platform: #24261c;
595
+ --dsw-alias-bg-overlay: #323428;
596
+ --dsw-specific-input-major: #24261c;
597
+ --dsw-specific-selector: #323428;
598
+ --dsw-specific-menu: #2c2e24;
599
+ --dsw-specific-tip: #2a2c22;
600
+ --dsw-alias-button-elevated-fill: #2e3026;
601
+ --dsw-alias-button-floating-fill: #2a2c22;
602
+ --dsw-alias-button-floating-hover: #3a3e2c;
603
+ --dsw-alias-markdown-inline-code: #2a2c22;
604
+ border-color: rgba(196, 163, 90, 0.5);
605
+ box-shadow: var(--vj-shadow);
606
+ }
607
+
608
+ body[data-dsh-815] [data-slot='sidebar.settings'] [role='dialog'][aria-modal='true'] {
609
+ --dsw-specific-sidebar-nav-item-active: rgba(196, 163, 90, 0.32);
610
+ --dsw-specific-sidebar-nav-item-hover: rgba(196, 163, 90, 0.14);
611
+ }
612
+
613
+ /* 设置里原生 <select>:闭合条橄榄底奶油字;系统弹出层常是白底,option 用墨色宣纸。 */
614
+ body[data-dsh-815] select {
615
+ color: #f4ead6;
616
+ background-color: #24261c;
617
+ border-color: rgba(196, 163, 90, 0.5);
618
+ }
619
+
620
+ body[data-dsh-815] option {
621
+ color: #1c1a14;
622
+ background-color: #f3ead4;
623
+ }
624
+
625
+ /* 插件推荐面板写死 GitHub 冷色(#0d1117 / #58a6ff)。皮肤下换成暖橄榄底 + 铜金链。 */
626
+ body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-panel) {
627
+ color: #f4ead6;
628
+ background: #24261c;
629
+ border: 1px solid rgba(196, 163, 90, 0.5);
630
+ box-shadow: var(--vj-shadow);
631
+ scrollbar-color: #c4a35a #1c1e16;
632
+ }
633
+
634
+ body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-title) {
635
+ color: #f4ead6;
636
+ }
637
+
638
+ body[data-dsh-815] :global(.dsh-rec-root) :is(:global(.dsh-rec-sub), :global(.dsh-rec-desc), :global(.dsh-rec-meta), :global(.dsh-rec-rank), :global(.dsh-rec-empty), :global(.dsh-rec-loading)) {
639
+ color: #9e9780;
640
+ }
641
+
642
+ body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-close) {
643
+ color: #9e9780;
644
+ border-color: rgba(196, 163, 90, 0.5);
645
+ }
646
+
647
+ body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-close):hover {
648
+ color: #f4ead6;
649
+ }
650
+
651
+ body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-scene),
652
+ body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-repo) a {
653
+ color: #d4bc7a;
654
+ }
655
+
656
+ body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-item):hover {
657
+ background: rgba(196, 163, 90, 0.14);
658
+ }
659
+
660
+ body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-notify) {
661
+ color: #f4ead6;
662
+ background: #2c2e24;
663
+ border-color: rgba(196, 163, 90, 0.5);
664
+ border-left-color: var(--vj-brass);
665
+ }
666
+
667
+ body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-notify) b {
668
+ color: #d4bc7a;
669
+ }
670
+
671
+ body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-nbtn) {
672
+ color: #1c1a14;
673
+ background: var(--vj-brass);
674
+ border-color: rgba(196, 163, 90, 0.7);
675
+ }
676
+
677
+ body[data-dsh-815] :global(.dsh-rec-root) :global(.dsh-rec-nbtn):hover {
678
+ background: #d4bc7a;
679
+ }
680
+
681
+ /* dsh-update-checker 的「检查更新」页把描边写死在**内联 style** 里(元素没有类名
682
+ 可挂):分组卡是 border: 1px solid rgba(128,128,128,.3),行内按钮是 .5 —— 灰线
683
+ 落在暗底上只有 1.5~2:1,卡片等于没有边。内联样式优先级最高,只能用
684
+ !important,并按 style 属性文本精确命中(只改 border-color,宽度/圆角/flex
685
+ 等其余内联声明都不动)。插件若改写法,这两条会自然失效,届时按新值重写。 */
686
+ body[data-dsh-815] [style*='rgba(128, 128, 128, 0.3)'] {
687
+ border-color: rgba(196, 163, 90, 0.5) !important;
688
+ }
689
+
690
+ body[data-dsh-815] [style*='rgba(128, 128, 128, 0.5)'] {
691
+ border-color: rgba(196, 163, 90, 0.7) !important;
692
+ }
693
+
694
+ /* Cordis 底栏面板写 background: var(--dsw-alias-bg-base);全局透明会透出油画。 */
695
+ body[data-dsh-815] [data-slot='sidebar.footer.action'] {
696
+ --dsw-alias-bg-base: #24261c;
697
+ }
698
+
699
+ /* dsh-timer-agent 的侧栏入口是插件自绘 DOM(board.module.css 的 .entry,一条透明
700
+ 导航行),插在宿主「新会话」与 mneme portal 的「记忆」按钮之间;后两者都是宿主
701
+ .newSession 观感(38px 高 / 12px 圆角 / 0.5px 铜边 / elevated 底 / 内容居中)。
702
+ 插件自己不继承宿主类名,这里按它的标记属性覆盖成同款盒模型:注入式覆盖,
703
+ 不改插件源码。收起态与宿主 .collapsed .newSession 同几何。 */
704
+ body[data-dsh-815] [data-dsh-timeragent-entry] {
705
+ align-self: stretch;
706
+ width: auto;
707
+ flex: none;
708
+ justify-content: center;
709
+ gap: 6px;
710
+ height: 38px;
711
+ margin: 0 2px 8px;
712
+ padding: 8px 16px;
713
+ box-sizing: border-box;
714
+ border: 0.5px solid var(--dsw-alias-border-l3);
715
+ border-radius: 12px;
716
+ background: var(--dsw-alias-button-elevated-fill);
717
+ color: var(--dsw-alias-label-primary);
718
+ font-size: 14px;
719
+ font-weight: 500;
720
+ line-height: 22px;
721
+ }
722
+
723
+ body[data-dsh-815] [data-dsh-timeragent-entry]:hover {
724
+ background: var(--dsw-alias-button-floating-hover);
725
+ }
726
+
727
+ body[data-dsh-815] [data-dsh-timeragent-entry][data-active] {
728
+ background: var(--dsw-alias-interactive-bg-active);
729
+ font-weight: 600;
730
+ }
731
+
732
+ /* 收起态:折叠成 rail 的 36x36 图标按钮,与「新会话」同位置同间距。 */
733
+ body[data-dsh-815] [class*='collapsed'] [data-dsh-timeragent-entry] {
734
+ align-self: flex-start;
735
+ width: 36px;
736
+ height: 36px;
737
+ margin: 0 0 12px;
738
+ padding: 0;
739
+ gap: 0;
740
+ border-color: transparent;
741
+ background: transparent;
742
+ }
743
+
744
+ body[data-dsh-815] [class*='collapsed'] [data-dsh-timeragent-entry]:hover {
745
+ background: var(--dsw-alias-interactive-bg-hover);
746
+ }
747
+
748
+ body[data-dsh-815] [class*='collapsed'] [data-dsh-timeragent-entry] [class*='entryLabel'] {
749
+ display: none;
750
+ }
751
+
752
+ body[data-dsh-815] [class*='collapsed'] [data-dsh-timeragent-entry] svg {
753
+ width: 18px;
754
+ height: 18px;
755
+ }
756
+
757
+ /* mneme portal 的「记忆」按钮(`.mneme-topentry-native`,插在「新会话」与
758
+ 「定时任务」之间)自带一条样式:底取 bg-layer-1(rgba(28,30,22,.78),比兄弟
759
+ 按钮暗一档)、边取 l2(比兄弟按钮淡)。它与宿主 .newSession 同特异性 —— 谁的
760
+ 样式表后加载谁赢,mneme 更新后它排到后面,于是「记忆」的底就比左右两个暗。
761
+ 这里由皮肤把这三条钉死成兄弟按钮的值(特异性高于插件),收起态对齐宿主
762
+ .collapsed .newSession;几何(38px / 12px / 图标位)仍由宿主的 .newSession 给。 */
763
+ body[data-dsh-815] [class*='mneme-topentry-native'] {
764
+ border: 0.5px solid var(--dsw-alias-border-l3);
765
+ background: var(--dsw-alias-button-elevated-fill);
766
+ color: var(--dsw-alias-label-primary);
767
+ }
768
+
769
+ body[data-dsh-815] [class*='mneme-topentry-native']:hover {
770
+ background: var(--dsw-alias-button-floating-hover);
771
+ }
772
+
773
+ body[data-dsh-815] [class*='collapsed'] [class*='mneme-topentry-native'] {
774
+ border-color: transparent;
775
+ background: transparent;
776
+ }
777
+
778
+ body[data-dsh-815] [class*='collapsed'] [class*='mneme-topentry-native']:hover {
779
+ background: var(--dsw-alias-interactive-bg-hover);
780
+ }
781
+
782
+ /* dsh-task-board 的侧栏入口([data-dsh-taskboard-entry],即插件 board.module.css 的
783
+ .entry:36px 高 / 8px 圆角 / 左对齐 / 13px 次要色文字的透明导航行)与 dsh-timer-agent
784
+ 同族,同样插在「新会话」与工作区浏览区之间,一样不继承宿主的 .newSession 类名。
785
+ 按标记属性覆盖成上方「新会话 / 记忆」那两枚按钮的同款盒模型(38px 高 / 12px 圆角 /
786
+ 0.5px 铜边 / elevated 底 / 内容居中),与 timer-agent 段逐条对齐;收起态对齐宿主
787
+ .collapsed .newSession(36x36 图标按钮、透明底、12px 圆角,把插件自带的 50%
788
+ 圆形收正)。仍是注入式覆盖,不改插件源码。 */
789
+ body[data-dsh-815] [data-dsh-taskboard-entry] {
790
+ align-self: stretch;
791
+ width: auto;
792
+ flex: none;
793
+ justify-content: center;
794
+ gap: 6px;
795
+ height: 38px;
796
+ margin: 0 2px 8px;
797
+ padding: 8px 16px;
798
+ box-sizing: border-box;
799
+ border: 0.5px solid var(--dsw-alias-border-l3);
800
+ border-radius: 12px;
801
+ background: var(--dsw-alias-button-elevated-fill);
802
+ color: var(--dsw-alias-label-primary);
803
+ font-size: 14px;
804
+ font-weight: 500;
805
+ line-height: 22px;
806
+ }
807
+
808
+ body[data-dsh-815] [data-dsh-taskboard-entry]:hover {
809
+ background: var(--dsw-alias-button-floating-hover);
810
+ }
811
+
812
+ /* 看板打开时插件在行上打 data-active;上面那层底会盖掉插件自己的 active 底色,
813
+ 这里按同档高亮补回来,与 timer-agent 一致。 */
814
+ body[data-dsh-815] [data-dsh-taskboard-entry][data-active] {
815
+ background: var(--dsw-alias-interactive-bg-active);
816
+ font-weight: 600;
817
+ }
818
+
819
+ body[data-dsh-815] [class*='collapsed'] [data-dsh-taskboard-entry] {
820
+ align-self: flex-start;
821
+ width: 36px;
822
+ height: 36px;
823
+ margin: 0 0 12px;
824
+ padding: 0;
825
+ gap: 0;
826
+ border-color: transparent;
827
+ border-radius: 12px;
828
+ background: transparent;
829
+ }
830
+
831
+ body[data-dsh-815] [class*='collapsed'] [data-dsh-taskboard-entry]:hover {
832
+ background: var(--dsw-alias-interactive-bg-hover);
833
+ }
834
+
835
+ body[data-dsh-815] [class*='collapsed'] [data-dsh-taskboard-entry] [class*='entryLabel'] {
836
+ display: none;
837
+ }
838
+
839
+ body[data-dsh-815] [class*='titlebar'] > [class*='button']:first-of-type {
840
+ display: none;
841
+ }
842
+
843
+ body[data-dsh-815] [data-skin-chrome='titlebar-brand'] {
844
+ position: absolute;
845
+ left: 50%;
846
+ top: 50%;
847
+ transform: translate(-50%, -50%);
848
+ display: inline-flex;
849
+ color: #f3e3c0;
850
+ --dsw-alias-label-primary-inverted: #1a1c14;
851
+ pointer-events: none;
852
+ }
853
+
854
+ body[data-dsh-815] [data-skin-chrome='titlebar-brand'] svg {
855
+ display: block;
856
+ height: 18px;
857
+ width: auto;
858
+ filter:
859
+ drop-shadow(0 1px 2px rgba(0, 0, 0, 0.55))
860
+ drop-shadow(0 0 3px rgba(196, 163, 90, 0.35));
861
+ }
862
+
863
+ /* 标题栏压一道主铜线 + 一道亮丝,像纪念碑檐口的鎏金收边。 */
864
+ body[data-dsh-815] [class*='titlebar'] {
865
+ position: relative;
866
+ background: linear-gradient(to top, rgba(16, 18, 12, 0.96), rgba(36, 38, 26, 0.9));
867
+ border-bottom: 1px solid rgba(196, 163, 90, 0.42);
868
+ box-shadow:
869
+ 0 1px 0 rgba(226, 201, 138, 0.1),
870
+ 0 8px 20px rgba(0, 0, 0, 0.32);
871
+ }
872
+
873
+ body[data-dsh-815] [class*='titlebar'] [class*='button'] {
874
+ color: #d4bc7a;
875
+ }
876
+
877
+ /* DSH 官方「在本地打开」分裂按钮(ui-open-in-app,挂在会话页头的
878
+ conversation.session.header.utilities 插槽):宿主按已装应用下发真实 PNG 图标,
879
+ 边框与分裂分隔线都取 --dsw-alias-border-l4,而皮肤没定义该 token(浅色主题下
880
+ 是浅灰 hairline),于是边框和竖线在暗底上全都看不见。
881
+ 这里把它按旁边的「对话管理 / 删除本对话」对齐:同款铜金边(l2)、同高 32px、
882
+ 同 18px 圆角,并把两个分段的左右内边距各放宽 4px;宿主 PNG 换成统一的线性
883
+ 文件夹图标(mask 跟随按钮文字色,hover/报错态一起变),分隔线取自 chevron
884
+ 自身的 border-left,随边框一同显形。 */
885
+ body[data-dsh-815] div:has(> button > img[src*='/open-in-app/icon']) {
886
+ --dsw-alias-border-l4: var(--dsw-alias-border-l2);
887
+ height: 32px;
888
+ border-radius: 18px;
889
+ }
890
+
891
+ body[data-dsh-815] div:has(> button > img[src*='/open-in-app/icon']) > button > img {
892
+ display: none;
893
+ }
894
+
895
+ /* 主段:官方 padding 5px 6px 5px 7px,左右各 +4。 */
896
+ body[data-dsh-815] div:has(> button > img[src*='/open-in-app/icon']) > button:first-child {
897
+ padding: 5px 10px 5px 11px;
898
+ }
899
+
900
+ /* 箭头段:官方 padding 5px 6px 5px 4px,左右各 +4。 */
901
+ body[data-dsh-815] div:has(> button > img[src*='/open-in-app/icon']) > button:last-child {
902
+ padding: 5px 10px 5px 8px;
903
+ }
904
+
905
+ body[data-dsh-815] div:has(> button > img[src*='/open-in-app/icon']) > button:first-child::before {
906
+ content: '';
907
+ flex: none;
908
+ width: 15px;
909
+ height: 15px;
910
+ background-color: currentColor;
911
+ -webkit-mask: var(--vj-folder-icon) center / contain no-repeat;
912
+ mask: var(--vj-folder-icon) center / contain no-repeat;
913
+ }
914
+
915
+ /* 右下角展签:右缘铜金竖线,主行画名奶油字,副行时间地点铜金小字。
916
+ 层级压到 #root(z-index: 1)之下、背景遮罩(body::before, z-index: 0)之上:
917
+ fixed 元素与其同为 body 子层,DOM 顺序靠后故仍浮在遮罩上;应用外壳的不透明
918
+ UI(如输入座宣纸卡)可盖住它,不再遮挡输入框。 */
919
+ body[data-dsh-815] [data-skin-chrome='caption'] {
920
+ position: fixed;
921
+ right: 16px;
922
+ bottom: 12px;
923
+ z-index: 0;
924
+ display: flex;
925
+ flex-direction: column;
926
+ gap: 2px;
927
+ max-width: min(52vw, 460px);
928
+ padding: 7px 12px;
929
+ border-right: 2px solid var(--vj-brass);
930
+ border-radius: 8px 0 0 8px;
931
+ background: linear-gradient(270deg, rgba(8, 10, 6, 0.78), rgba(8, 10, 6, 0.32));
932
+ font-family: Georgia, 'Times New Roman', serif;
933
+ text-align: right;
934
+ pointer-events: none;
935
+ }
936
+
937
+ body[data-dsh-815] [data-skin-chrome='caption-title'] {
938
+ color: #f4ead6;
939
+ font-size: 12.5px;
940
+ letter-spacing: 0.06em;
941
+ text-shadow: 0 1px 6px rgba(0, 0, 0, 0.8);
942
+ }
943
+
944
+ body[data-dsh-815] [data-skin-chrome='caption-sub'] {
945
+ color: #d4bc7a;
946
+ font-size: 10.5px;
947
+ letter-spacing: 0.14em;
948
+ text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
949
+ }
950
+
951
+ @media (hover: hover) {
952
+ body[data-dsh-815] [data-time-hover-root] :is([class*='timeStart'], [class*='timeEnd']) {
953
+ opacity: 1;
954
+ }
955
+ }
956
+
957
+ /* 对话区右侧的轮次导航轨(ui-chat TurnNavigator):普通刻度取
958
+ --dsw-alias-border-l4,皮肤没定义这个 token,浅色主题回落成半透明黑
959
+ #00000029(实测刻度 rgba(0,0,0,.16) 再乘未加载态的 opacity .6),落在暗色
960
+ 油画上等于没有,「时间线」只剩当前轮那一根。这里在刻度容器内把该 token 换成
961
+ 皮肤的铜金:当前轮(label-primary 奶油)与预览态(label-tertiary)各有自己的
962
+ 颜色,层级不变;未加载态仍由宿主的 opacity .6 压淡一档。 */
963
+ body[data-dsh-815] [class*='markPosition'] {
964
+ --dsw-alias-border-l4: var(--vj-brass);
965
+ }
966
+
967
+ @media (prefers-reduced-motion: reduce) {
968
+ body[data-dsh-815] [data-composer-card] {
969
+ transition: none;
970
+ }
971
+ }