dsh-remote-plugin 0.5.7 → 0.5.9

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.
package/public/styles.css CHANGED
@@ -1,354 +1,8 @@
1
1
  /* DSH Remote · 移动优先 · 四皮肤(默认深空/深色落日/亮色易北爱乐厅/中性草原孤塔)
2
- * 统一 --dsr-* 变量; 主题由 <html data-theme="dark|light|neutral"> 驱动, theme.js 持久化。
3
- * 红绿色弱友好原则: 状态语义色之外, 品牌色使用蓝/青 + 橙/紫系, 避免红绿配对。 */
2
+ * 规则样式表; 变量定义已抽取到 theme-vars.css(桌面端共享), 保持单一来源。 */
4
3
 
5
- /* ============ 通用变量 ============ */
6
- :root {
7
- --dsr-radius: 14px;
8
- --dsr-safe-top: max(env(safe-area-inset-top, 0px), var(--native-top, 0px));
9
- --dsr-safe-b: max(env(safe-area-inset-bottom, 0px), var(--native-bottom, 0px));
10
- }
11
-
12
- /* ============ 深空「默认」: 经典深蓝紫(保留原配色) ============ */
13
- :root,
14
- html[data-theme="default"] {
15
- /* 中性灰阶 0(白) → 9(近黑) */
16
- --dsr-neutral-0: #FFFFFF;
17
- --dsr-neutral-1: #F4F6F9;
18
- --dsr-neutral-2: #E6EAF0;
19
- --dsr-neutral-3: #C9D1DC;
20
- --dsr-neutral-4: #A6B0BE;
21
- --dsr-neutral-5: #828D9E;
22
- --dsr-neutral-6: #616C7E;
23
- --dsr-neutral-7: #444E5E;
24
- --dsr-neutral-8: #2B3442;
25
- --dsr-neutral-9: #1A212C;
26
-
27
- --dsr-bg: #0B0E1A;
28
- --dsr-bg-2: #101528;
29
- --dsr-panel: #151B33;
30
- --dsr-panel-2: #1B2340;
31
- --dsr-line: #263056;
32
- --dsr-divider: rgba(232, 236, 255, .16);
33
- --dsr-text: #E8ECFF;
34
- --dsr-muted: #8B94BD;
35
- --dsr-text-disabled: rgba(232, 236, 255, .45);
36
-
37
- --dsr-accent: #5B8CFF;
38
- --dsr-on-accent: #FFFFFF;
39
- --dsr-accent-strong: #6FA0FF;
40
- --dsr-accent-soft: #5B8CFF1F;
41
- --dsr-accent-line: #5B8CFF66;
42
- --dsr-accent-2: #B48CFF;
43
- --dsr-accent-2-strong: #B48CFF;
44
- --dsr-accent-2-soft: #B48CFF21;
45
- --dsr-accent-2-line: #B48CFF66;
46
- --dsr-brand-a: #5B8CFF;
47
- --dsr-brand-b: #B48CFF;
48
-
49
- --dsr-success: #4BCF7E;
50
- --dsr-success-soft: #4BCF7E21;
51
- --dsr-success-line: #4BCF7E66;
52
- --dsr-warning: #FF9E64;
53
- --dsr-warning-soft: #FF9E6421;
54
- --dsr-warning-line: #FF9E6466;
55
- --dsr-on-warning: #1A120B;
56
- --dsr-error: #FF8F6B;
57
- --dsr-error-soft: #FF8F6B24;
58
- --dsr-error-line: #FF8F6B66;
59
- --dsr-info: #7DCFFF;
60
- --dsr-info-soft: #7DCFFF21;
61
- --dsr-info-line: #7DCFFF66;
62
-
63
- --dsr-head-bg: rgba(11, 14, 26, .94);
64
- --dsr-nav-bg: rgba(16, 21, 40, .94);
65
- --dsr-nav-muted: #8B94BD;
66
- --dsr-nav-active: #6FA0FF;
67
- --dsr-nav-badge-bg: #FF9E64;
68
- --dsr-nav-badge-text: #1A120B;
69
- --dsr-composer-bg: rgba(11, 14, 26, .92);
70
- --dsr-overlay: rgba(5, 7, 14, .66);
71
- --dsr-code-bg: rgba(0, 0, 0, .28);
72
- --dsr-shadow: rgba(0, 0, 0, .4);
73
- --dsr-glow: rgba(91, 140, 255, .8);
74
- --dsr-head-running-bg: linear-gradient(90deg, rgba(11, 14, 26, .94), rgba(35, 65, 150, .92), rgba(125, 207, 255, .6), rgba(35, 65, 150, .92), rgba(11, 14, 26, .94));
75
- --dsr-head-running-line: rgba(91, 140, 255, .55);
76
- --dsr-head-interrupted-bg: linear-gradient(90deg, rgba(11, 14, 26, .94), rgba(90, 26, 12, .92), rgba(255, 158, 100, .55), rgba(90, 26, 12, .92), rgba(11, 14, 26, .94));
77
- --dsr-head-interrupted-line: rgba(255, 158, 100, .55);
78
- }
79
-
80
- /* ============ 深色「落日」: 深钴蓝底 + 琥珀橙强调 ============ */
81
- html[data-theme="dark"] {
82
- /* 中性灰阶 0(白) → 9(近黑) */
83
- --dsr-neutral-0: #FFFFFF;
84
- --dsr-neutral-1: #F4F6F9;
85
- --dsr-neutral-2: #E6EAF0;
86
- --dsr-neutral-3: #C9D1DC;
87
- --dsr-neutral-4: #A6B0BE;
88
- --dsr-neutral-5: #828D9E;
89
- --dsr-neutral-6: #616C7E;
90
- --dsr-neutral-7: #444E5E;
91
- --dsr-neutral-8: #2B3442;
92
- --dsr-neutral-9: #1A212C;
93
-
94
- /* 表面与文字 */
95
- --dsr-bg: #05348B;
96
- --dsr-bg-2: #0B3E86;
97
- --dsr-panel: #0D438F;
98
- --dsr-panel-2: #164E9E;
99
- --dsr-line: #2E5A8C;
100
- --dsr-divider: rgba(255, 255, 255, .16);
101
- --dsr-text: #FFFFFF;
102
- --dsr-muted: rgba(255, 255, 255, .85);
103
- --dsr-text-disabled: rgba(255, 255, 255, .48);
4
+ @import 'theme-vars.css';
104
5
 
105
- /* 品牌强调(琥珀橙)与点缀(米色) */
106
- --dsr-accent: #F9A647;
107
- --dsr-on-accent: #1A120B;
108
- --dsr-accent-strong: #F9A647;
109
- --dsr-accent-soft: #F9A64721;
110
- --dsr-accent-line: #F9A64766;
111
- --dsr-accent-2: #EDCFAB;
112
- --dsr-accent-2-strong: #EDCFAB;
113
- --dsr-accent-2-soft: #EDCFAB21;
114
- --dsr-accent-2-line: #EDCFAB66;
115
- --dsr-brand-a: #F9A647;
116
- --dsr-brand-b: #EDCFAB;
117
-
118
- /* 状态色(WCAG 对比度按深钴蓝底校准) */
119
- --dsr-success: #7EE2A8;
120
- --dsr-success-soft: #7EE2A821;
121
- --dsr-success-line: #7EE2A866;
122
- --dsr-warning: #F9A647;
123
- --dsr-warning-soft: #F9A64721;
124
- --dsr-warning-line: #F9A64766;
125
- --dsr-on-warning: #1A120B;
126
- --dsr-error: #FFB4A6;
127
- --dsr-error-soft: #FFB4A624;
128
- --dsr-error-line: #FFB4A666;
129
- --dsr-info: #7DCFFF;
130
- --dsr-info-soft: #7DCFFF21;
131
- --dsr-info-line: #7DCFFF66;
132
-
133
- /* 悬浮/遮罩/特殊表面 */
134
- --dsr-head-bg: rgba(4, 32, 90, .94);
135
- --dsr-nav-bg: rgba(7, 38, 104, .94);
136
- --dsr-nav-muted: rgba(255, 255, 255, .85);
137
- --dsr-nav-active: #F9A647;
138
- --dsr-nav-badge-bg: #F9A647;
139
- --dsr-nav-badge-text: #1A120B;
140
- --dsr-composer-bg: rgba(5, 42, 110, .92);
141
- --dsr-overlay: rgba(2, 10, 32, .66);
142
- --dsr-code-bg: rgba(0, 0, 0, .28);
143
- --dsr-shadow: rgba(0, 0, 0, .4);
144
- --dsr-glow: rgba(249, 166, 71, .55);
145
- --dsr-head-running-bg: linear-gradient(90deg, rgba(4, 32, 90, .94), rgba(30, 77, 123, .92), rgba(125, 207, 255, .55), rgba(30, 77, 123, .92), rgba(4, 32, 90, .94));
146
- --dsr-head-running-line: rgba(249, 166, 71, .55);
147
- --dsr-head-interrupted-bg: linear-gradient(90deg, rgba(4, 32, 90, .94), rgba(90, 26, 12, .92), rgba(255, 180, 166, .55), rgba(90, 26, 12, .92), rgba(4, 32, 90, .94));
148
- --dsr-head-interrupted-line: rgba(255, 180, 166, .55);
149
- }
150
-
151
- /* ============ 亮色「易北爱乐厅」: 米白底 + 沙金强调 ============ */
152
- html[data-theme="light"] {
153
- --dsr-neutral-0: #FFFFFF;
154
- --dsr-neutral-1: #FAF9F7;
155
- --dsr-neutral-2: #F3F1ED;
156
- --dsr-neutral-3: #E8E5DF;
157
- --dsr-neutral-4: #D8D4CC;
158
- --dsr-neutral-5: #B8B3A9;
159
- --dsr-neutral-6: #8A857C;
160
- --dsr-neutral-7: #615D56;
161
- --dsr-neutral-8: #3F3C37;
162
- --dsr-neutral-9: #2B2B2B;
163
-
164
- --dsr-bg: #EFEEEC;
165
- --dsr-bg-2: #E5E1D9;
166
- --dsr-panel: #FAF8F5;
167
- --dsr-panel-2: #FFFFFF;
168
- --dsr-line: #D8D2C6;
169
- --dsr-divider: rgba(43, 43, 43, .12);
170
- --dsr-text: #2B2B2B;
171
- --dsr-muted: #6E6A63;
172
- --dsr-text-disabled: #A8A39A;
173
-
174
- /* 沙金(填充/按钮) + 深沙金(小字号文字) + 浅桃粉(点缀) */
175
- --dsr-accent: #E6BC7B;
176
- --dsr-on-accent: #2B2B2B;
177
- --dsr-accent-strong: #7A5A24;
178
- --dsr-accent-soft: #E6BC7B40;
179
- --dsr-accent-line: #C89A4E66;
180
- --dsr-accent-2: #6E5A8C;
181
- --dsr-accent-2-strong: #6E5A8C;
182
- --dsr-accent-2-soft: #6E5A8C1F;
183
- --dsr-accent-2-line: #6E5A8C59;
184
- --dsr-brand-a: #E6BC7B;
185
- --dsr-brand-b: #EDD4C2;
186
-
187
- --dsr-success: #237A46;
188
- --dsr-success-soft: #237A461A;
189
- --dsr-success-line: #237A4659;
190
- --dsr-warning: #965A0B;
191
- --dsr-warning-soft: #B96A0E1F;
192
- --dsr-warning-line: #B96A0E59;
193
- --dsr-on-warning: #FFFFFF;
194
- --dsr-error: #B7423F;
195
- --dsr-error-soft: #B7423F1F;
196
- --dsr-error-line: #B7423F59;
197
- --dsr-info: #2563C0;
198
- --dsr-info-soft: #2563C01A;
199
- --dsr-info-line: #2563C059;
200
-
201
- --dsr-head-bg: rgba(239, 238, 236, .94);
202
- --dsr-nav-bg: rgba(250, 248, 245, .94);
203
- --dsr-nav-muted: #6E6A63;
204
- --dsr-nav-active: #7A5A24;
205
- --dsr-nav-badge-bg: #965A0B;
206
- --dsr-nav-badge-text: #FFFFFF;
207
- --dsr-composer-bg: rgba(250, 248, 245, .92);
208
- --dsr-overlay: rgba(43, 43, 43, .4);
209
- --dsr-code-bg: rgba(0, 0, 0, .06);
210
- --dsr-shadow: rgba(43, 43, 43, .18);
211
- --dsr-glow: rgba(198, 154, 78, .45);
212
- --dsr-head-running-bg: linear-gradient(90deg, rgba(239, 238, 236, .94), rgba(230, 188, 123, .45), rgba(255, 255, 255, .65), rgba(230, 188, 123, .45), rgba(239, 238, 236, .94));
213
- --dsr-head-running-line: rgba(122, 90, 36, .55);
214
- --dsr-head-interrupted-bg: linear-gradient(90deg, rgba(239, 238, 236, .94), rgba(183, 66, 63, .18), rgba(255, 255, 255, .65), rgba(183, 66, 63, .18), rgba(239, 238, 236, .94));
215
- --dsr-head-interrupted-line: rgba(183, 66, 63, .55);
216
- }
217
-
218
- /* ============ 中性「草原孤塔」: 鼠尾草底 + 橄榄绿块 + 陶土红点缀(莫兰迪自然系) ============ */
219
- html[data-theme="neutral"] {
220
- --dsr-neutral-0: #FFFFFF;
221
- --dsr-neutral-1: #FAF7EE;
222
- --dsr-neutral-2: #F1EDDF;
223
- --dsr-neutral-3: #E6DFC8;
224
- --dsr-neutral-4: #D5CDB4;
225
- --dsr-neutral-5: #B8AF91;
226
- --dsr-neutral-6: #8E866D;
227
- --dsr-neutral-7: #6B6450;
228
- --dsr-neutral-8: #454133;
229
- --dsr-neutral-9: #2B2B2B;
230
-
231
- --dsr-bg: #DDD4B8;
232
- --dsr-bg-2: #D2C9AC;
233
- --dsr-panel: #E6DFC8;
234
- --dsr-panel-2: #F1EDDF;
235
- --dsr-line: #B8AF91;
236
- --dsr-divider: rgba(43, 43, 43, .14);
237
- --dsr-text: #2B2B2B;
238
- --dsr-muted: #5E5A45;
239
- --dsr-text-disabled: #9A937C;
240
-
241
- /* 橄榄军绿 = 主色(按钮/开关/底部导航块); 陶土砖红 = 强调(徽标/图标/链接) */
242
- --dsr-accent: #585818;
243
- --dsr-on-accent: #F5F1E3;
244
- --dsr-accent-strong: #585818;
245
- --dsr-accent-soft: #5858181F;
246
- --dsr-accent-line: #58581866;
247
- --dsr-accent-2: #832D15;
248
- --dsr-accent-2-strong: #832D15;
249
- --dsr-accent-2-soft: #832D151F;
250
- --dsr-accent-2-line: #832D1566;
251
- --dsr-brand-a: #585818;
252
- --dsr-brand-b: #832D15;
253
-
254
- --dsr-success: #1E5C33;
255
- --dsr-success-soft: #1E5C331F;
256
- --dsr-success-line: #1E5C3366;
257
- --dsr-warning: #8A4B0C;
258
- --dsr-warning-soft: #8A4B0C1F;
259
- --dsr-warning-line: #8A4B0C66;
260
- --dsr-on-warning: #FFFFFF;
261
- --dsr-error: #8A2A1F;
262
- --dsr-error-soft: #8A2A1F1F;
263
- --dsr-error-line: #8A2A1F66;
264
- --dsr-info: #1F4E7A;
265
- --dsr-info-soft: #1F4E7A1F;
266
- --dsr-info-line: #1F4E7A66;
267
-
268
- --dsr-head-bg: rgba(221, 212, 184, .94);
269
- --dsr-nav-bg: #585818;
270
- --dsr-nav-muted: rgba(245, 241, 227, .8);
271
- --dsr-nav-active: #F5F1E3;
272
- --dsr-nav-badge-bg: #832D15;
273
- --dsr-nav-badge-text: #F5F1E3;
274
- --dsr-composer-bg: rgba(230, 223, 200, .92);
275
- --dsr-overlay: rgba(43, 43, 43, .4);
276
- --dsr-code-bg: rgba(0, 0, 0, .07);
277
- --dsr-shadow: rgba(43, 43, 43, .2);
278
- --dsr-glow: rgba(88, 88, 24, .5);
279
- --dsr-head-running-bg: linear-gradient(90deg, rgba(221, 212, 184, .94), rgba(88, 88, 24, .30), rgba(245, 241, 227, .65), rgba(88, 88, 24, .30), rgba(221, 212, 184, .94));
280
- --dsr-head-running-line: rgba(88, 88, 24, .55);
281
- --dsr-head-interrupted-bg: linear-gradient(90deg, rgba(221, 212, 184, .94), rgba(131, 45, 21, .20), rgba(245, 241, 227, .65), rgba(131, 45, 21, .20), rgba(221, 212, 184, .94));
282
- --dsr-head-interrupted-line: rgba(131, 45, 21, .55);
283
- }
284
-
285
- /* 无 JS 或 JS 前: 跟随系统深浅偏好 */
286
- @media (prefers-color-scheme: light) {
287
- :root:not([data-theme]) {
288
- --dsr-neutral-0: #FFFFFF;
289
- --dsr-neutral-1: #FAF9F7;
290
- --dsr-neutral-2: #F3F1ED;
291
- --dsr-neutral-3: #E8E5DF;
292
- --dsr-neutral-4: #D8D4CC;
293
- --dsr-neutral-5: #B8B3A9;
294
- --dsr-neutral-6: #8A857C;
295
- --dsr-neutral-7: #615D56;
296
- --dsr-neutral-8: #3F3C37;
297
- --dsr-neutral-9: #2B2B2B;
298
-
299
- --dsr-bg: #EFEEEC;
300
- --dsr-bg-2: #E5E1D9;
301
- --dsr-panel: #FAF8F5;
302
- --dsr-panel-2: #FFFFFF;
303
- --dsr-line: #D8D2C6;
304
- --dsr-divider: rgba(43, 43, 43, .12);
305
- --dsr-text: #2B2B2B;
306
- --dsr-muted: #6E6A63;
307
- --dsr-text-disabled: #A8A39A;
308
-
309
- --dsr-accent: #E6BC7B;
310
- --dsr-on-accent: #2B2B2B;
311
- --dsr-accent-strong: #7A5A24;
312
- --dsr-accent-soft: #E6BC7B40;
313
- --dsr-accent-line: #C89A4E66;
314
- --dsr-accent-2: #6E5A8C;
315
- --dsr-accent-2-strong: #6E5A8C;
316
- --dsr-accent-2-soft: #6E5A8C1F;
317
- --dsr-accent-2-line: #6E5A8C59;
318
- --dsr-brand-a: #E6BC7B;
319
- --dsr-brand-b: #EDD4C2;
320
-
321
- --dsr-success: #237A46;
322
- --dsr-success-soft: #237A461A;
323
- --dsr-success-line: #237A4659;
324
- --dsr-warning: #965A0B;
325
- --dsr-warning-soft: #B96A0E1F;
326
- --dsr-warning-line: #B96A0E59;
327
- --dsr-on-warning: #FFFFFF;
328
- --dsr-error: #B7423F;
329
- --dsr-error-soft: #B7423F1F;
330
- --dsr-error-line: #B7423F59;
331
- --dsr-info: #2563C0;
332
- --dsr-info-soft: #2563C01A;
333
- --dsr-info-line: #2563C059;
334
-
335
- --dsr-head-bg: rgba(239, 238, 236, .94);
336
- --dsr-nav-bg: rgba(250, 248, 245, .94);
337
- --dsr-nav-muted: #6E6A63;
338
- --dsr-nav-active: #7A5A24;
339
- --dsr-nav-badge-bg: #965A0B;
340
- --dsr-nav-badge-text: #FFFFFF;
341
- --dsr-composer-bg: rgba(250, 248, 245, .92);
342
- --dsr-overlay: rgba(43, 43, 43, .4);
343
- --dsr-code-bg: rgba(0, 0, 0, .06);
344
- --dsr-shadow: rgba(43, 43, 43, .18);
345
- --dsr-glow: rgba(198, 154, 78, .45);
346
- --dsr-head-running-bg: linear-gradient(90deg, rgba(239, 238, 236, .94), rgba(230, 188, 123, .45), rgba(255, 255, 255, .65), rgba(230, 188, 123, .45), rgba(239, 238, 236, .94));
347
- --dsr-head-running-line: rgba(122, 90, 36, .55);
348
- --dsr-head-interrupted-bg: linear-gradient(90deg, rgba(239, 238, 236, .94), rgba(183, 66, 63, .18), rgba(255, 255, 255, .65), rgba(183, 66, 63, .18), rgba(239, 238, 236, .94));
349
- --dsr-head-interrupted-line: rgba(183, 66, 63, .55);
350
- }
351
- }
352
6
 
353
7
  /* ============ 基础 ============ */
354
8
  * { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }
@@ -405,6 +59,14 @@ button {
405
59
  font-size: 17px; display: grid; place-items: center;
406
60
  }
407
61
  .icon-btn:active { background: var(--dsr-panel-2); }
62
+ /* 顶栏按钮统一: 反馈/刷新/连接徽章同高同基线 */
63
+ .topbar-btn {
64
+ height: 44px; box-sizing: border-box;
65
+ display: inline-flex; align-items: center; justify-content: center; gap: 6px;
66
+ line-height: 1; vertical-align: middle; flex-shrink: 0;
67
+ }
68
+ .topbar-right .topbar-btn.icon-btn { width: 44px; padding: 0; font-size: 19px; border-radius: 12px; }
69
+ .topbar-right .topbar-btn.conn-badge { padding: 0 14px; border-radius: 999px; font-size: 12.5px; }
408
70
  .mini-btn {
409
71
  padding: 5px 11px; border-radius: 9px; font-size: 13px;
410
72
  background: var(--dsr-panel); border: 1px solid var(--dsr-line); color: var(--dsr-accent-strong);
@@ -412,6 +74,19 @@ button {
412
74
  flex-shrink: 0;
413
75
  }
414
76
  .mini-btn:active { background: var(--dsr-panel-2); }
77
+ a.mini-btn { text-decoration: none; display: inline-flex; align-items: center; }
78
+ .feedback-links { display: flex; gap: 8px; flex-wrap: wrap; padding: 0 14px 14px; }
79
+ .feedback-card { background: var(--dsr-accent-soft); border-color: var(--dsr-accent-line); }
80
+ .feedback-btn {
81
+ flex: 1 1 0; min-width: 92px; min-height: 44px;
82
+ display: inline-flex; align-items: center; justify-content: center; gap: 7px;
83
+ padding: 9px 12px; border-radius: 12px; font-size: 13.5px; font-weight: 600;
84
+ background: var(--dsr-panel); border: 1px solid var(--dsr-line); color: var(--dsr-accent-strong);
85
+ text-decoration: none; cursor: pointer; white-space: nowrap;
86
+ }
87
+ .feedback-btn svg { width: 17px; height: 17px; fill: currentColor; flex-shrink: 0; }
88
+ .feedback-btn.primary { background: var(--dsr-accent-strong); border-color: var(--dsr-accent-strong); color: var(--dsr-on-accent); }
89
+ .feedback-btn:active { filter: brightness(.94); }
415
90
  .btn {
416
91
  flex: 1; padding: 11px 14px; border-radius: 12px; font-size: 15px; font-weight: 600;
417
92
  border: 1px solid var(--dsr-line);
@@ -781,16 +456,38 @@ body.in-session .main { padding-bottom: 84px; }
781
456
  .setting-desc.expanded { white-space: normal; overflow: visible; text-overflow: clip; word-break: break-word; }
782
457
  .about { text-align: center; color: var(--dsr-muted); font-size: 12px; margin-top: 16px; line-height: 1.8; }
783
458
 
784
- /* 多服务器列表 */
459
+ /* 多服务器列表(分组) */
460
+ .group-bar { display: flex; align-items: center; gap: 8px; padding: 0 14px 10px; }
461
+ .group-bar-label { font-size: 12px; color: var(--dsr-muted); white-space: nowrap; }
462
+ .group-select { flex: 1; min-width: 0; position: relative; }
463
+ .group-select-btn { width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 6px; background: var(--dsr-bg-2); color: var(--dsr-text); border: 1px solid var(--dsr-line); border-radius: 10px; padding: 7px 9px; font: inherit; font-size: 13px; outline: none; cursor: pointer; }
464
+ .group-select-btn .caret { color: var(--dsr-muted); font-size: 10px; transition: transform .15s ease; }
465
+ .group-select-menu { position: absolute; left: 0; right: 0; top: calc(100% + 4px); z-index: 30; max-height: 220px; overflow-y: auto; background: var(--dsr-panel); border: 1px solid var(--dsr-line); border-radius: 12px; box-shadow: 0 8px 24px rgba(0,0,0,.28); padding: 4px; display: flex; flex-direction: column; gap: 2px; }
466
+ .group-option { width: 100%; text-align: left; background: none; border: none; color: var(--dsr-text); font: inherit; font-size: 13px; padding: 8px 10px; border-radius: 8px; }
467
+ .group-option.current { background: var(--dsr-accent-soft); color: var(--dsr-accent-strong); font-weight: 600; }
468
+ .group-option:active { background: var(--dsr-panel-2); }
785
469
  .server-list { padding: 0 14px 10px; display: flex; flex-direction: column; gap: 6px; }
786
470
  .server-empty { font-size: 12px; color: var(--dsr-muted); }
471
+ .srv-group { border: 1px solid var(--dsr-line); border-radius: 12px; background: var(--dsr-panel); overflow: hidden; }
472
+ .srv-group-head { display: flex; align-items: center; gap: 6px; padding: 7px 9px; }
473
+ .srv-group-name { flex: 1; min-width: 0; text-align: left; background: none; border: none; color: var(--dsr-text); font: inherit; font-size: 13px; font-weight: 600; padding: 2px 0; display: flex; align-items: center; gap: 6px; }
474
+ .srv-group-count { font-size: 10.5px; color: var(--dsr-muted); background: var(--dsr-bg-2); border-radius: 999px; padding: 0 7px; line-height: 16px; }
475
+ .srv-group-speed { flex-shrink: 0; padding: 3px 8px; font-size: 12px; }
476
+ .srv-group-del { flex-shrink: 0; width: 22px; height: 22px; border-radius: 7px; background: var(--dsr-panel); border: 1px solid var(--dsr-line); color: var(--dsr-muted); font-size: 11px; }
477
+ .srv-group-del:active { color: var(--dsr-error); }
478
+ .srv-group-body { display: flex; flex-direction: column; gap: 6px; padding: 0 9px 9px; }
479
+ .switch.small { width: 36px; height: 21px; }
480
+ .switch.small .slider::before { width: 15px; height: 15px; left: 2px; top: 2px; }
481
+ .switch.small input:checked + .slider::before { transform: translateX(15px); }
787
482
  .server-row {
788
483
  display: flex; align-items: center; gap: 8px;
789
484
  background: var(--dsr-bg-2); border: 1px solid var(--dsr-line); border-radius: 10px;
790
485
  padding: 8px 10px;
791
486
  }
792
487
  .server-row.active { border-color: var(--dsr-info-line); background: var(--dsr-info-soft); }
793
- .server-url { flex: 1; min-width: 0; font-size: 12.5px; word-break: break-all; }
488
+ .server-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
489
+ .server-note { font-size: 13px; word-break: break-all; }
490
+ .server-url { flex: 1; min-width: 0; font-size: 11.5px; color: var(--dsr-muted); word-break: break-all; }
794
491
  .server-badge {
795
492
  flex-shrink: 0; font-size: 11px; padding: 1px 7px; border-radius: 999px;
796
493
  background: var(--dsr-accent-soft); color: var(--dsr-accent-strong);
@@ -798,10 +495,11 @@ body.in-session .main { padding-bottom: 84px; }
798
495
  }
799
496
  .server-badge.good { background: var(--dsr-success-soft); color: var(--dsr-success); border-color: var(--dsr-success-line); }
800
497
  .server-badge.bad { background: var(--dsr-warning-soft); color: var(--dsr-warning); border-color: var(--dsr-warning-line); }
801
- .server-del {
498
+ .server-edit, .server-del {
802
499
  flex-shrink: 0; width: 24px; height: 24px; border-radius: 7px;
803
500
  background: var(--dsr-panel); border: 1px solid var(--dsr-line); color: var(--dsr-muted); font-size: 12px;
804
501
  }
502
+ .server-edit:active { color: var(--dsr-accent-strong); }
805
503
  .server-del:active { color: var(--dsr-error); }
806
504
  .server-add { display: flex; gap: 8px; padding: 0 14px 13px; }
807
505
  .server-add input {
@@ -844,6 +542,57 @@ body.in-session .main { padding-bottom: 84px; }
844
542
  font-size: 10px; font-weight: 800; padding: 0 6px; line-height: 16px;
845
543
  }
846
544
 
545
+ /* ---------- 反馈底部菜单 ---------- */
546
+ .sheet-backdrop {
547
+ position: fixed; inset: 0; z-index: 45;
548
+ background: var(--dsr-overlay);
549
+ animation: sheet-fade .18s ease;
550
+ }
551
+ .sheet {
552
+ position: fixed; left: 0; right: 0; bottom: 0; z-index: 46;
553
+ max-height: 72vh; overflow-y: auto; overscroll-behavior: contain;
554
+ background: var(--dsr-bg-2); border-top: 1px solid var(--dsr-line); border-radius: 20px 20px 0 0;
555
+ padding: 8px 12px calc(12px + env(safe-area-inset-bottom, 0px));
556
+ box-shadow: 0 -10px 34px var(--dsr-shadow);
557
+ animation: sheet-up .22s cubic-bezier(.2,.8,.3,1);
558
+ }
559
+ .sheet-handle { width: 38px; height: 4px; border-radius: 999px; background: var(--dsr-line); margin: 2px auto 10px; }
560
+ .sheet-title { font-size: 14px; font-weight: 700; padding: 0 6px 8px; }
561
+ .sheet-item {
562
+ width: 100%; min-height: 52px; display: flex; align-items: center; gap: 11px;
563
+ padding: 9px 10px; border-radius: 13px; border: none; background: transparent; color: var(--dsr-text);
564
+ font: inherit; text-align: left; cursor: pointer; text-decoration: none;
565
+ }
566
+ .sheet-item:hover, .sheet-item:focus-visible { background: var(--dsr-bg); outline: none; }
567
+ .sheet-item.primary { background: var(--dsr-accent-soft); border: 1px solid var(--dsr-accent-line); }
568
+ .sheet-item.primary:hover { background: var(--dsr-accent-soft); filter: brightness(1.03); }
569
+ .sheet-ico {
570
+ width: 38px; height: 38px; border-radius: 11px; flex-shrink: 0;
571
+ display: grid; place-items: center; background: var(--dsr-panel); border: 1px solid var(--dsr-line); color: var(--dsr-accent-strong);
572
+ }
573
+ .sheet-item.primary .sheet-ico { background: var(--dsr-accent-strong); border-color: var(--dsr-accent-strong); color: var(--dsr-on-accent); }
574
+ .sheet-ico svg { width: 18px; height: 18px; fill: currentColor; }
575
+ .sheet-item-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
576
+ .sheet-item-name { font-size: 14px; font-weight: 600; }
577
+ .sheet-item-desc { font-size: 12px; color: var(--dsr-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
578
+ @keyframes sheet-fade { from { opacity: 0 } to { opacity: 1 } }
579
+ @keyframes sheet-up { from { transform: translateY(24px); opacity: .6 } to { transform: translateY(0); opacity: 1 } }
580
+
581
+ /* 写反馈弹层 */
582
+ .fb-chips { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 10px; }
583
+ .fb-chip {
584
+ min-height: 36px; padding: 7px 14px; border-radius: 999px; font-size: 13px;
585
+ background: var(--dsr-panel); border: 1px solid var(--dsr-line); color: var(--dsr-text); cursor: pointer;
586
+ }
587
+ .fb-chip.current { background: var(--dsr-accent-soft); border-color: var(--dsr-accent-line); color: var(--dsr-accent-strong); font-weight: 600; }
588
+ .fb-textarea, .fb-input {
589
+ width: 100%; box-sizing: border-box; margin-bottom: 10px;
590
+ background: var(--dsr-panel); color: var(--dsr-text); border: 1px solid var(--dsr-line); border-radius: 12px;
591
+ padding: 10px 12px; font: inherit; font-size: 14px; outline: none; resize: vertical;
592
+ }
593
+ .fb-textarea:focus, .fb-input:focus { border-color: var(--dsr-accent-line); }
594
+ .fb-input { min-height: 42px; }
595
+
847
596
  /* ---------- 模态 ---------- */
848
597
  .modal {
849
598
  position: fixed; inset: 0; z-index: 40; display: grid; place-items: center;