dsh-vscode-mode 0.22.0 → 0.23.1

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.
@@ -0,0 +1,1049 @@
1
+ /* dsh-vscode-mode — 快捷菜单(悬浮按钮 + SAO 风格多列级联菜单 + 配置弹窗)
2
+ * 作者 ddj 2026年10月30号
3
+ *
4
+ * 浮层约定:根节点带 data-edrv-view(editor.css 的浮层样式同款作用域),
5
+ * 颜色全部走 DSH 设计令牌并带浅色兜底,避免深/浅主题下不可读。
6
+ *
7
+ * 设计取向:整个菜单只花一次「亮色」——当前行的 2px 强调条与悬浮按钮的强调色;
8
+ * 其余全部收成中性灰阶与发丝线,靠层级、间距和一处滑入动效表达结奏,
9
+ * 不做每行图标、不做渐变装饰、不做逐卡片阴影。
10
+ */
11
+
12
+ /* ── 令牌 ─────────────────────────────────────────────────── */
13
+ /* 定义在 [data-edrv-view] 上:菜单(portal 到 body 的独立根)与 ModalShell 弹窗
14
+ * 各自是不同根节点,令牌若只挂在菜单根上,弹窗里的按钮/芯片会取不到颜色。 */
15
+ [data-edrv-view] {
16
+ --qm-surface: var(--dsw-alias-bg-overlay, #ffffff);
17
+ --qm-sunken: var(--dsw-alias-bg-layer-1, #f4f7fa);
18
+ --qm-ink: var(--dsw-alias-label-primary, #1f2933);
19
+ --qm-ink-2: var(--dsw-alias-label-secondary, #55616e);
20
+ --qm-ink-3: var(--dsw-alias-label-tertiary, #8a95a1);
21
+ --qm-line: var(--dsw-alias-border-l2, #d8dfe6);
22
+ --qm-accent: var(--dsw-alias-brand-primary, #2f6fed);
23
+ --qm-accent-soft: var(--dsw-alias-interactive-bg-hover, rgba(47, 111, 237, .1));
24
+ --qm-hover: var(--dsw-alias-interactive-bg-hover, rgba(31, 41, 51, .06));
25
+ --qm-warn: var(--dsw-alias-state-warn-primary, #cf8b1f);
26
+ --qm-danger: var(--dsw-alias-state-error-primary, #d64545);
27
+ --qm-radius: 10px;
28
+ --qm-row: 34px;
29
+ --qm-elev:
30
+ 0 12px 30px -12px rgba(16, 24, 40, .3),
31
+ 0 2px 6px -2px rgba(16, 24, 40, .12);
32
+ }
33
+
34
+ /* 根层:铺满浮层、默认点击穿透;z-index 要压过同槽位的常驻浮层(如音乐条),否则菜单被盖住 */
35
+ [data-edrv-view].edrv-qm-root {
36
+ position: absolute;
37
+ inset: 0;
38
+ pointer-events: none;
39
+ z-index: 60;
40
+ font-size: 12px;
41
+ line-height: 1.4;
42
+ }
43
+
44
+ /* ── 悬浮按钮 ─────────────────────────────────────────────── */
45
+ [data-edrv-view] .edrv-qm-launcher {
46
+ position: absolute;
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ width: 32px;
51
+ height: 32px;
52
+ border-radius: 9px;
53
+ border: 1px solid var(--qm-line);
54
+ background: var(--qm-surface);
55
+ color: var(--qm-accent);
56
+ box-shadow: 0 1px 2px rgba(16, 24, 40, .12);
57
+ pointer-events: auto;
58
+ cursor: grab;
59
+ touch-action: none;
60
+ user-select: none;
61
+ transition: transform .14s cubic-bezier(.2, .8, .3, 1), box-shadow .14s ease, border-color .14s ease;
62
+ }
63
+
64
+ [data-edrv-view] .edrv-qm-launcher:hover {
65
+ transform: translateY(-1px);
66
+ border-color: var(--qm-accent);
67
+ box-shadow: 0 4px 14px -4px rgba(16, 24, 40, .3), 0 0 0 3px var(--qm-accent-soft);
68
+ }
69
+
70
+ [data-edrv-view] .edrv-qm-launcher:active {
71
+ transform: scale(.96);
72
+ }
73
+
74
+ [data-edrv-view] .edrv-qm-launcher--drag {
75
+ cursor: grabbing;
76
+ transform: scale(1.04);
77
+ box-shadow: 0 8px 20px -6px rgba(16, 24, 40, .38);
78
+ }
79
+
80
+ [data-edrv-view] .edrv-qm-launcher--open {
81
+ border-color: var(--qm-accent);
82
+ background: var(--qm-accent);
83
+ color: #fff;
84
+ box-shadow: 0 0 0 3px var(--qm-accent-soft);
85
+ }
86
+
87
+ /* 隐藏态:半透明小圆点(仍可拖动/点开,防止关掉后无处恢复) */
88
+ [data-edrv-view] .edrv-qm-launcher--mini {
89
+ width: 12px;
90
+ height: 12px;
91
+ border-radius: 50%;
92
+ border-color: transparent;
93
+ opacity: .4;
94
+ box-shadow: none;
95
+ transition: opacity .14s ease, transform .14s ease;
96
+ }
97
+
98
+ [data-edrv-view] .edrv-qm-launcher--mini:hover {
99
+ opacity: .9;
100
+ transform: scale(1.2);
101
+ box-shadow: none;
102
+ }
103
+
104
+ [data-edrv-view] .edrv-qm-launcher svg {
105
+ width: 19px;
106
+ height: auto;
107
+ display: block;
108
+ pointer-events: none;
109
+ }
110
+
111
+ /* ── 菜单容器与列 ─────────────────────────────────────────── */
112
+ [data-edrv-view] .edrv-qm-menu {
113
+ position: absolute;
114
+ pointer-events: auto;
115
+ }
116
+
117
+ /* 菜单本体(portal 到 body):铺满视口的穿透层,层级高于输入框卡片与其它浮层条目 */
118
+ [data-edrv-view].edrv-qm-menu {
119
+ position: fixed;
120
+ inset: 0;
121
+ pointer-events: none;
122
+ z-index: 150;
123
+ }
124
+
125
+ [data-edrv-view] .edrv-qm-col {
126
+ position: absolute;
127
+ display: flex;
128
+ flex-direction: column;
129
+ width: 220px;
130
+ box-sizing: border-box;
131
+ pointer-events: auto;
132
+ border-radius: var(--qm-radius);
133
+ border: 1px solid var(--qm-line);
134
+ background: var(--qm-surface);
135
+ box-shadow: var(--qm-elev);
136
+ overflow: hidden;
137
+ animation: edrv-qm-col-in .14s cubic-bezier(.2, .8, .3, 1);
138
+ }
139
+
140
+ @keyframes edrv-qm-col-in {
141
+ from { opacity: 0; transform: translateX(-6px); }
142
+ to { opacity: 1; transform: none; }
143
+ }
144
+
145
+ [data-edrv-view] .edrv-qm-scroll {
146
+ position: relative;
147
+ flex: 1;
148
+ min-height: 0;
149
+ overflow-y: auto;
150
+ overflow-x: hidden;
151
+ padding: 8px 7px;
152
+ scrollbar-width: none;
153
+ }
154
+
155
+ /* 上下渐隐只在内容确实超出列高时启用(短列被遮掉会看不清) */
156
+ [data-edrv-view] .edrv-qm-scroll--fade {
157
+ mask-image: linear-gradient(to bottom, transparent 0, #000 36px, #000 calc(100% - 36px), transparent 100%);
158
+ -webkit-mask-image: linear-gradient(to bottom, transparent 0, #000 36px, #000 calc(100% - 36px), transparent 100%);
159
+ }
160
+
161
+ [data-edrv-view] .edrv-qm-scroll::-webkit-scrollbar {
162
+ width: 0;
163
+ height: 0;
164
+ }
165
+
166
+ [data-edrv-view] .edrv-qm-list {
167
+ display: flex;
168
+ flex-direction: column;
169
+ gap: 1px;
170
+ }
171
+
172
+ /* ── 行 ──────────────────────────────────────────────────── */
173
+ [data-edrv-view] .edrv-qm-row {
174
+ position: relative;
175
+ display: flex;
176
+ align-items: center;
177
+ height: var(--qm-row);
178
+ min-height: var(--qm-row);
179
+ box-sizing: border-box;
180
+ padding: 0 7px 0 10px;
181
+ border-radius: 7px;
182
+ color: var(--qm-ink);
183
+ font-size: 12px;
184
+ font-weight: 500;
185
+ cursor: pointer;
186
+ user-select: none;
187
+ transform-origin: center center;
188
+ transition: background .1s ease, color .1s ease;
189
+ }
190
+
191
+ [data-edrv-view] .edrv-qm-row:hover,
192
+ [data-edrv-view] .edrv-qm-row--active {
193
+ background: var(--qm-hover);
194
+ }
195
+
196
+ /* 唯一的强调色落点:当前行左缘的短竖条 */
197
+ [data-edrv-view] .edrv-qm-row--active::before {
198
+ content: '';
199
+ position: absolute;
200
+ left: 3px;
201
+ top: 50%;
202
+ width: 2px;
203
+ height: 15px;
204
+ margin-top: -7.5px;
205
+ border-radius: 2px;
206
+ background: var(--qm-accent);
207
+ }
208
+
209
+ [data-edrv-view] .edrv-qm-row:focus-visible,
210
+ [data-edrv-view] .edrv-qm-launcher:focus-visible,
211
+ [data-edrv-view] .edrv-qm-foot:focus-visible,
212
+ [data-edrv-view] .edrv-qm-btn:focus-visible,
213
+ [data-edrv-view] .edrv-qm-input:focus-visible,
214
+ [data-edrv-view] .edrv-qm-textarea:focus-visible,
215
+ [data-edrv-view] .edrv-qm-select:focus-visible,
216
+ [data-edrv-view] .edrv-qm-chip:focus-visible {
217
+ outline: 2px solid var(--qm-accent);
218
+ outline-offset: 1px;
219
+ }
220
+
221
+ [data-edrv-view] .edrv-qm-row-label {
222
+ flex: 1;
223
+ min-width: 0;
224
+ overflow: hidden;
225
+ text-overflow: ellipsis;
226
+ white-space: nowrap;
227
+ }
228
+
229
+ /* 组行只留一枚折角箭头,文字「组」属于冗余信息 */
230
+ [data-edrv-view] .edrv-qm-row-chevron {
231
+ flex: 0 0 auto;
232
+ display: flex;
233
+ align-items: center;
234
+ color: var(--qm-ink-3);
235
+ transition: color .1s ease, transform .12s ease;
236
+ }
237
+
238
+ [data-edrv-view] .edrv-qm-row-chevron svg {
239
+ width: 12px;
240
+ height: 12px;
241
+ display: block;
242
+ }
243
+
244
+ [data-edrv-view] .edrv-qm-row--group:hover .edrv-qm-row-chevron,
245
+ [data-edrv-view] .edrv-qm-row--group.edrv-qm-row--active .edrv-qm-row-chevron {
246
+ color: var(--qm-accent);
247
+ transform: translateX(1px);
248
+ }
249
+
250
+ [data-edrv-view] .edrv-qm-row-kind {
251
+ flex: 0 0 auto;
252
+ color: var(--qm-ink-3);
253
+ font-size: 10px;
254
+ font-weight: 400;
255
+ }
256
+
257
+ [data-edrv-view] .edrv-qm-row-badge {
258
+ flex: 0 0 auto;
259
+ width: 5px;
260
+ height: 5px;
261
+ border-radius: 50%;
262
+ background: var(--qm-warn);
263
+ }
264
+
265
+ [data-edrv-view] .edrv-qm-row-badge--error {
266
+ background: var(--qm-danger);
267
+ }
268
+
269
+ /* 行尾「⋯」:占位常驻,避免悬停时行内容左右跳动 */
270
+ [data-edrv-view] .edrv-qm-row-more {
271
+ flex: 0 0 auto;
272
+ width: 18px;
273
+ height: 18px;
274
+ display: flex;
275
+ align-items: center;
276
+ justify-content: center;
277
+ border: 0;
278
+ border-radius: 5px;
279
+ background: transparent;
280
+ color: var(--qm-ink-3);
281
+ cursor: pointer;
282
+ font-size: 13px;
283
+ line-height: 1;
284
+ opacity: 0;
285
+ transition: opacity .1s ease, background .1s ease, color .1s ease;
286
+ }
287
+
288
+ [data-edrv-view] .edrv-qm-row:hover .edrv-qm-row-more,
289
+ [data-edrv-view] .edrv-qm-row--active .edrv-qm-row-more,
290
+ [data-edrv-view] .edrv-qm-row-more:focus-visible {
291
+ opacity: 1;
292
+ }
293
+
294
+ [data-edrv-view] .edrv-qm-row-more:hover {
295
+ background: var(--qm-surface);
296
+ color: var(--qm-accent);
297
+ }
298
+
299
+ [data-edrv-view] .edrv-qm-row--add {
300
+ margin-top: 5px;
301
+ border: 1px dashed var(--qm-line);
302
+ color: var(--qm-ink-2);
303
+ font-size: 11.5px;
304
+ font-weight: 400;
305
+ justify-content: center;
306
+ }
307
+
308
+ [data-edrv-view] .edrv-qm-row--add:hover {
309
+ border-color: var(--qm-accent);
310
+ color: var(--qm-accent);
311
+ background: var(--qm-accent-soft);
312
+ }
313
+
314
+ /* ── 底部固定栏(菜单设置) ──────────────────────────────── */
315
+ [data-edrv-view] .edrv-qm-foot {
316
+ display: flex;
317
+ align-items: center;
318
+ gap: 6px;
319
+ flex: 0 0 32px;
320
+ padding: 0 10px;
321
+ border-top: 1px solid var(--qm-line);
322
+ background: var(--qm-sunken);
323
+ color: var(--qm-ink-2);
324
+ font-size: 11.5px;
325
+ cursor: pointer;
326
+ user-select: none;
327
+ transition: color .1s ease, background .1s ease;
328
+ }
329
+
330
+ [data-edrv-view] .edrv-qm-foot:hover {
331
+ color: var(--qm-accent);
332
+ background: var(--qm-hover);
333
+ }
334
+
335
+ [data-edrv-view] .edrv-qm-foot-icon {
336
+ display: flex;
337
+ align-items: center;
338
+ }
339
+
340
+ [data-edrv-view] .edrv-qm-foot-icon svg {
341
+ width: 13px;
342
+ height: 13px;
343
+ display: block;
344
+ }
345
+
346
+ /* ── 空态:邀请而不是气氛 ────────────────────────────────── */
347
+ [data-edrv-view] .edrv-qm-empty {
348
+ display: flex;
349
+ flex-direction: column;
350
+ align-items: center;
351
+ gap: 3px;
352
+ padding: 14px 10px 12px;
353
+ text-align: center;
354
+ color: var(--qm-ink-3);
355
+ font-size: 11px;
356
+ font-weight: 400;
357
+ }
358
+
359
+ [data-edrv-view] .edrv-qm-empty-title {
360
+ color: var(--qm-ink-2);
361
+ font-size: 12px;
362
+ font-weight: 600;
363
+ }
364
+
365
+ [data-edrv-view] .edrv-qm-empty .edrv-qm-btn {
366
+ margin-top: 7px;
367
+ }
368
+
369
+ /* ── 弹窗表单 ────────────────────────────────────────────── */
370
+ [data-edrv-view] .edrv-qm-dialog {
371
+ width: min(620px, calc(100vw - 48px));
372
+ max-height: min(84vh, 720px);
373
+ box-sizing: border-box;
374
+ /* 复位 .vsm-mcp-dialog 的整卡内边距(本弹窗自带 头/体/脚 三段布局) */
375
+ padding: 0;
376
+ min-height: 0;
377
+ display: flex;
378
+ flex-direction: column;
379
+ overflow: hidden;
380
+ }
381
+
382
+ /* 固定头:长表单滚动时仍知道在编辑哪一项 */
383
+ [data-edrv-view] .edrv-qm-head {
384
+ flex: 0 0 auto;
385
+ padding: 14px 16px 12px;
386
+ border-bottom: 1px solid var(--qm-line);
387
+ }
388
+
389
+ [data-edrv-view] .edrv-qm-head-title {
390
+ color: var(--qm-ink);
391
+ font-size: 14px;
392
+ font-weight: 650;
393
+ line-height: 1.35;
394
+ }
395
+
396
+ [data-edrv-view] .edrv-qm-head-sub {
397
+ margin-top: 3px;
398
+ color: var(--qm-ink-3);
399
+ font-size: 11px;
400
+ font-weight: 400;
401
+ }
402
+
403
+ [data-edrv-view] .edrv-qm-sep {
404
+ height: 1px;
405
+ margin: 2px 0;
406
+ background: var(--qm-line);
407
+ opacity: .75;
408
+ }
409
+
410
+ [data-edrv-view] .edrv-qm-dialog-body {
411
+ flex: 1 1 auto;
412
+ min-height: 0;
413
+ padding: 14px 16px;
414
+ overflow: auto;
415
+ display: flex;
416
+ flex-direction: column;
417
+ gap: 12px;
418
+ }
419
+
420
+ [data-edrv-view] .edrv-qm-field {
421
+ display: flex;
422
+ flex-direction: column;
423
+ gap: 5px;
424
+ /* 抵消 .vsm-mcp-dialog label 的 12px 上下外边距(与 body 的 gap 重复) */
425
+ margin: 0;
426
+ }
427
+
428
+ [data-edrv-view] .edrv-qm-field-label {
429
+ color: var(--qm-ink-2);
430
+ font-size: 11px;
431
+ font-weight: 600;
432
+ display: flex;
433
+ align-items: center;
434
+ gap: 6px;
435
+ }
436
+
437
+ [data-edrv-view] .edrv-qm-field-hint {
438
+ color: var(--qm-ink-3);
439
+ font-size: 10px;
440
+ font-weight: 400;
441
+ }
442
+
443
+ /* 标签行:标签在左、紧凑控件(分段)在右,避免控件挤成两行 */
444
+ [data-edrv-view] .edrv-qm-field-head {
445
+ display: flex;
446
+ align-items: center;
447
+ justify-content: space-between;
448
+ gap: 8px;
449
+ min-height: 18px;
450
+ }
451
+
452
+ /* 分组区块:只用标题左侧的强调条分隔,不堆卡片、不加阴影 */
453
+ [data-edrv-view] .edrv-qm-section {
454
+ display: flex;
455
+ flex-direction: column;
456
+ gap: 9px;
457
+ }
458
+
459
+ [data-edrv-view] .edrv-qm-section-head {
460
+ position: relative;
461
+ display: flex;
462
+ align-items: baseline;
463
+ gap: 8px;
464
+ padding-left: 9px;
465
+ }
466
+
467
+ [data-edrv-view] .edrv-qm-section-head::before {
468
+ content: '';
469
+ position: absolute;
470
+ left: 0;
471
+ top: 3px;
472
+ bottom: 3px;
473
+ width: 3px;
474
+ border-radius: 2px;
475
+ background: var(--qm-accent);
476
+ }
477
+
478
+ [data-edrv-view] .edrv-qm-section-title {
479
+ color: var(--qm-ink);
480
+ font-size: 11.5px;
481
+ font-weight: 650;
482
+ }
483
+
484
+ [data-edrv-view] .edrv-qm-section-hint {
485
+ color: var(--qm-ink-3);
486
+ font-size: 10px;
487
+ font-weight: 400;
488
+ }
489
+
490
+ [data-edrv-view] .edrv-qm-section-body {
491
+ display: flex;
492
+ flex-direction: column;
493
+ gap: 10px;
494
+ }
495
+
496
+ /* 开关行:左侧标题与说明,右侧滑动开关 */
497
+ [data-edrv-view] .edrv-qm-switch-row {
498
+ display: flex;
499
+ align-items: center;
500
+ justify-content: space-between;
501
+ gap: 12px;
502
+ }
503
+
504
+ [data-edrv-view] .edrv-qm-switch-text {
505
+ display: flex;
506
+ flex-direction: column;
507
+ gap: 2px;
508
+ min-width: 0;
509
+ }
510
+
511
+ [data-edrv-view] .edrv-qm-switch {
512
+ position: relative;
513
+ flex: 0 0 auto;
514
+ box-sizing: border-box;
515
+ width: 34px;
516
+ height: 19px;
517
+ padding: 0;
518
+ border: 1px solid var(--qm-line);
519
+ border-radius: 999px;
520
+ background: var(--qm-sunken);
521
+ cursor: pointer;
522
+ transition: background .12s ease, border-color .12s ease;
523
+ }
524
+
525
+ [data-edrv-view] .edrv-qm-switch-knob {
526
+ position: absolute;
527
+ top: 2px;
528
+ left: 2px;
529
+ width: 13px;
530
+ height: 13px;
531
+ border-radius: 50%;
532
+ background: var(--dsw-alias-bg-base, #fff);
533
+ box-shadow: 0 1px 2px rgba(0, 0, 0, .18);
534
+ transition: transform .12s ease;
535
+ }
536
+
537
+ [data-edrv-view] .edrv-qm-switch--on {
538
+ border-color: var(--qm-accent);
539
+ background: var(--qm-accent);
540
+ }
541
+
542
+ [data-edrv-view] .edrv-qm-switch--on .edrv-qm-switch-knob {
543
+ transform: translateX(15px);
544
+ }
545
+
546
+ [data-edrv-view] .edrv-qm-switch:focus-visible {
547
+ outline: 2px solid var(--qm-accent);
548
+ outline-offset: 2px;
549
+ }
550
+
551
+ [data-edrv-view] .edrv-qm-switch:disabled {
552
+ opacity: .5;
553
+ cursor: not-allowed;
554
+ }
555
+
556
+ /* 字段里的按钮按内容宽度靠左,不拉满整行 */
557
+ [data-edrv-view] .edrv-qm-field > .edrv-qm-btn {
558
+ align-self: flex-start;
559
+ }
560
+
561
+ [data-edrv-view] .edrv-qm-input,
562
+ [data-edrv-view] .edrv-qm-textarea,
563
+ [data-edrv-view] .edrv-qm-select {
564
+ width: 100%;
565
+ box-sizing: border-box;
566
+ border: 1px solid var(--qm-line);
567
+ border-radius: 7px;
568
+ background: var(--dsw-alias-bg-base, #fff);
569
+ color: var(--qm-ink);
570
+ font: inherit;
571
+ padding: 6px 9px;
572
+ transition: border-color .1s ease, box-shadow .1s ease;
573
+ }
574
+
575
+ [data-edrv-view] .edrv-qm-input:focus,
576
+ [data-edrv-view] .edrv-qm-textarea:focus,
577
+ [data-edrv-view] .edrv-qm-select:focus {
578
+ outline: none;
579
+ border-color: var(--qm-accent);
580
+ box-shadow: 0 0 0 3px var(--qm-accent-soft);
581
+ }
582
+
583
+ [data-edrv-view] .edrv-qm-textarea {
584
+ min-height: 96px;
585
+ resize: vertical;
586
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
587
+ font-size: 11.5px;
588
+ line-height: 1.55;
589
+ }
590
+
591
+ [data-edrv-view] .edrv-qm-input:disabled,
592
+ [data-edrv-view] .edrv-qm-select:disabled {
593
+ background: var(--qm-sunken);
594
+ color: var(--qm-ink-3);
595
+ cursor: not-allowed;
596
+ }
597
+
598
+ [data-edrv-view] .edrv-qm-row2 {
599
+ display: flex;
600
+ gap: 10px;
601
+ }
602
+
603
+ [data-edrv-view] .edrv-qm-row2 > * {
604
+ flex: 1;
605
+ min-width: 0;
606
+ }
607
+
608
+ /* 分段控件:凹槽轨道 + 浮起选中块,比「整块填色」更克制 */
609
+ [data-edrv-view] .edrv-qm-seg {
610
+ display: flex;
611
+ gap: 2px;
612
+ width: 100%;
613
+ box-sizing: border-box;
614
+ padding: 2px;
615
+ border: 1px solid var(--qm-line);
616
+ border-radius: 7px;
617
+ background: var(--qm-sunken);
618
+ }
619
+
620
+ [data-edrv-view] .edrv-qm-seg-btn {
621
+ flex: 1 1 0;
622
+ min-width: 0;
623
+ border: 0;
624
+ border-radius: 5px;
625
+ background: transparent;
626
+ color: var(--qm-ink-2);
627
+ font: inherit;
628
+ font-size: 11.5px;
629
+ font-weight: 600;
630
+ padding: 4px 8px;
631
+ cursor: pointer;
632
+ transition: background .1s ease, color .1s ease;
633
+ }
634
+
635
+ [data-edrv-view] .edrv-qm-seg-btn:hover {
636
+ color: var(--qm-ink);
637
+ background: var(--qm-hover);
638
+ }
639
+
640
+ [data-edrv-view] .edrv-qm-seg-btn--on {
641
+ color: var(--qm-accent);
642
+ background: var(--qm-surface);
643
+ box-shadow: 0 1px 2px rgba(0, 0, 0, .08);
644
+ }
645
+
646
+ [data-edrv-view] .edrv-qm-seg-btn:focus-visible {
647
+ outline: 2px solid var(--qm-accent);
648
+ outline-offset: -2px;
649
+ }
650
+
651
+ [data-edrv-view] .edrv-qm-seg-btn:disabled {
652
+ opacity: .5;
653
+ cursor: not-allowed;
654
+ }
655
+
656
+ /* 放在标签行里的分段按内容宽度收起,不撑满整行 */
657
+ [data-edrv-view] .edrv-qm-field-head .edrv-qm-seg {
658
+ width: auto;
659
+ flex: 0 0 auto;
660
+ }
661
+
662
+ [data-edrv-view] .edrv-qm-field-head .edrv-qm-seg-btn {
663
+ flex: 0 0 auto;
664
+ padding: 3px 9px;
665
+ font-size: 11px;
666
+ }
667
+
668
+ /* ── 下拉选择(技能 / 规则 / 工作区) ────────────────────── */
669
+ [data-edrv-view] .edrv-qm-pick {
670
+ display: flex;
671
+ flex-direction: column;
672
+ gap: 4px;
673
+ }
674
+
675
+ [data-edrv-view] .edrv-qm-pick-trigger {
676
+ display: flex;
677
+ align-items: center;
678
+ gap: 6px;
679
+ width: 100%;
680
+ box-sizing: border-box;
681
+ min-height: 30px;
682
+ padding: 5px 9px;
683
+ border: 1px solid var(--qm-line);
684
+ border-radius: 7px;
685
+ background: var(--dsw-alias-bg-base, #fff);
686
+ color: var(--qm-ink);
687
+ font: inherit;
688
+ font-size: 11.5px;
689
+ text-align: left;
690
+ cursor: pointer;
691
+ transition: border-color .1s ease, box-shadow .1s ease;
692
+ }
693
+
694
+ [data-edrv-view] .edrv-qm-pick-trigger:hover {
695
+ border-color: var(--qm-accent);
696
+ }
697
+
698
+ [data-edrv-view] .edrv-qm-pick-trigger:focus-visible {
699
+ outline: none;
700
+ border-color: var(--qm-accent);
701
+ box-shadow: 0 0 0 3px var(--qm-accent-soft);
702
+ }
703
+
704
+ [data-edrv-view] .edrv-qm-pick-trigger--open {
705
+ border-color: var(--qm-accent);
706
+ box-shadow: 0 0 0 3px var(--qm-accent-soft);
707
+ }
708
+
709
+ [data-edrv-view] .edrv-qm-pick-trigger:disabled {
710
+ border-color: var(--qm-line);
711
+ background: var(--qm-sunken);
712
+ color: var(--qm-ink-3);
713
+ cursor: not-allowed;
714
+ }
715
+
716
+ [data-edrv-view] .edrv-qm-pick-summary {
717
+ flex: 1 1 auto;
718
+ min-width: 0;
719
+ overflow: hidden;
720
+ text-overflow: ellipsis;
721
+ white-space: nowrap;
722
+ }
723
+
724
+ [data-edrv-view] .edrv-qm-pick-badge {
725
+ flex: 0 0 auto;
726
+ display: inline-flex;
727
+ align-items: center;
728
+ justify-content: center;
729
+ min-width: 16px;
730
+ height: 16px;
731
+ padding: 0 4px;
732
+ border-radius: 999px;
733
+ background: var(--qm-warn);
734
+ color: #fff;
735
+ font-size: 10px;
736
+ font-weight: 700;
737
+ }
738
+
739
+ [data-edrv-view] .edrv-qm-pick-caret {
740
+ flex: 0 0 auto;
741
+ width: 0;
742
+ height: 0;
743
+ border-left: 4px solid transparent;
744
+ border-right: 4px solid transparent;
745
+ border-top: 5px solid var(--qm-ink-3);
746
+ transition: transform .12s ease;
747
+ }
748
+
749
+ [data-edrv-view] .edrv-qm-pick-trigger--open .edrv-qm-pick-caret {
750
+ transform: rotate(180deg);
751
+ }
752
+
753
+ /* 弹层是 position: fixed + 视口坐标,不受弹窗滚动区裁剪 */
754
+ [data-edrv-view] .edrv-qm-pick-panel {
755
+ position: fixed;
756
+ z-index: 260;
757
+ box-sizing: border-box;
758
+ display: flex;
759
+ flex-direction: column;
760
+ gap: 4px;
761
+ padding: 5px;
762
+ border: 1px solid var(--qm-line);
763
+ border-radius: var(--qm-radius);
764
+ background: var(--qm-surface);
765
+ box-shadow: var(--qm-elev);
766
+ overflow: hidden;
767
+ }
768
+
769
+ [data-edrv-view] .edrv-qm-pick-list {
770
+ display: flex;
771
+ flex-direction: column;
772
+ gap: 1px;
773
+ min-height: 0;
774
+ overflow: auto;
775
+ }
776
+
777
+ [data-edrv-view] .edrv-qm-pick-group {
778
+ display: flex;
779
+ flex-direction: column;
780
+ gap: 1px;
781
+ }
782
+
783
+ [data-edrv-view] .edrv-qm-pick-group-title {
784
+ padding: 6px 7px 3px;
785
+ color: var(--qm-ink-3);
786
+ font-size: 10px;
787
+ font-weight: 600;
788
+ }
789
+
790
+ [data-edrv-view] .edrv-qm-pick-option {
791
+ display: flex;
792
+ align-items: center;
793
+ gap: 7px;
794
+ width: 100%;
795
+ box-sizing: border-box;
796
+ padding: 5px 7px;
797
+ border: 0;
798
+ border-radius: 6px;
799
+ background: transparent;
800
+ color: var(--qm-ink);
801
+ font: inherit;
802
+ font-size: 11.5px;
803
+ text-align: left;
804
+ cursor: pointer;
805
+ transition: background .1s ease, color .1s ease;
806
+ }
807
+
808
+ [data-edrv-view] .edrv-qm-pick-option:hover {
809
+ background: var(--qm-hover);
810
+ }
811
+
812
+ [data-edrv-view] .edrv-qm-pick-option:focus-visible {
813
+ outline: 2px solid var(--qm-accent);
814
+ outline-offset: -2px;
815
+ }
816
+
817
+ [data-edrv-view] .edrv-qm-pick-option--on {
818
+ color: var(--qm-accent);
819
+ background: var(--qm-accent-soft);
820
+ }
821
+
822
+ [data-edrv-view] .edrv-qm-pick-check {
823
+ flex: 0 0 auto;
824
+ display: inline-flex;
825
+ align-items: center;
826
+ justify-content: center;
827
+ width: 13px;
828
+ height: 13px;
829
+ border: 1px solid var(--qm-line);
830
+ border-radius: 4px;
831
+ background: var(--dsw-alias-bg-base, #fff);
832
+ color: #fff;
833
+ font-size: 9px;
834
+ line-height: 1;
835
+ }
836
+
837
+ [data-edrv-view] .edrv-qm-pick-check--on {
838
+ border-color: var(--qm-accent);
839
+ background: var(--qm-accent);
840
+ }
841
+
842
+ [data-edrv-view] .edrv-qm-pick-name {
843
+ flex: 1 1 auto;
844
+ min-width: 0;
845
+ overflow: hidden;
846
+ text-overflow: ellipsis;
847
+ white-space: nowrap;
848
+ }
849
+
850
+ [data-edrv-view] .edrv-qm-pick-hint {
851
+ flex: 0 0 auto;
852
+ max-width: 45%;
853
+ overflow: hidden;
854
+ text-overflow: ellipsis;
855
+ white-space: nowrap;
856
+ color: var(--qm-ink-3);
857
+ font-size: 10px;
858
+ }
859
+
860
+ [data-edrv-view] .edrv-qm-pick-dot {
861
+ flex: 0 0 auto;
862
+ width: 5px;
863
+ height: 5px;
864
+ border-radius: 50%;
865
+ background: var(--qm-warn);
866
+ }
867
+
868
+ [data-edrv-view] .edrv-qm-pick-dot--error {
869
+ background: var(--qm-danger);
870
+ }
871
+
872
+ [data-edrv-view] .edrv-qm-pick-empty {
873
+ padding: 10px 8px;
874
+ color: var(--qm-ink-3);
875
+ font-size: 11px;
876
+ text-align: center;
877
+ }
878
+
879
+ [data-edrv-view] .edrv-qm-pick-more {
880
+ border: 1px dashed var(--qm-line);
881
+ border-radius: 6px;
882
+ background: transparent;
883
+ color: var(--qm-ink-2);
884
+ font: inherit;
885
+ font-size: 11px;
886
+ padding: 5px 7px;
887
+ cursor: pointer;
888
+ text-align: center;
889
+ }
890
+
891
+ [data-edrv-view] .edrv-qm-pick-more:hover {
892
+ border-color: var(--qm-accent);
893
+ color: var(--qm-accent);
894
+ background: var(--qm-accent-soft);
895
+ }
896
+
897
+ [data-edrv-view] .edrv-qm-warn-list {
898
+ margin: 0;
899
+ padding-left: 16px;
900
+ color: var(--qm-warn);
901
+ font-size: 11px;
902
+ }
903
+
904
+ [data-edrv-view] .edrv-qm-error-list {
905
+ margin: 0;
906
+ padding-left: 16px;
907
+ color: var(--qm-danger);
908
+ font-size: 11px;
909
+ }
910
+
911
+ [data-edrv-view] .edrv-qm-actions {
912
+ display: flex;
913
+ align-items: center;
914
+ gap: 8px;
915
+ padding: 11px 16px;
916
+ border-top: 1px solid var(--qm-line);
917
+ background: var(--qm-sunken);
918
+ }
919
+
920
+ [data-edrv-view] .edrv-qm-actions-grow {
921
+ flex: 1;
922
+ }
923
+
924
+ /* 按钮统一盒模型:固定高度 + 内容居中,同一行里的按钮才能等高对齐 */
925
+ [data-edrv-view] .edrv-qm-btn {
926
+ display: inline-flex;
927
+ align-items: center;
928
+ justify-content: center;
929
+ gap: 5px;
930
+ box-sizing: border-box;
931
+ height: 28px;
932
+ padding: 0 12px;
933
+ border: 1px solid var(--qm-line);
934
+ border-radius: 7px;
935
+ background: var(--dsw-alias-bg-base, #fff);
936
+ color: var(--qm-ink);
937
+ font: inherit;
938
+ font-size: 11.5px;
939
+ font-weight: 500;
940
+ line-height: 1;
941
+ white-space: nowrap;
942
+ user-select: none;
943
+ cursor: pointer;
944
+ transition: background .1s ease, border-color .1s ease, color .1s ease;
945
+ }
946
+
947
+ [data-edrv-view] .edrv-qm-btn--sm {
948
+ height: 24px;
949
+ padding: 0 9px;
950
+ font-size: 11px;
951
+ }
952
+
953
+ [data-edrv-view] .edrv-qm-btn:hover {
954
+ background: var(--qm-hover);
955
+ }
956
+
957
+ [data-edrv-view] .edrv-qm-btn--primary {
958
+ border-color: var(--qm-accent);
959
+ background: var(--qm-accent);
960
+ color: #fff;
961
+ }
962
+
963
+ [data-edrv-view] .edrv-qm-btn--primary:hover {
964
+ filter: brightness(1.06);
965
+ background: var(--qm-accent);
966
+ }
967
+
968
+ [data-edrv-view] .edrv-qm-btn--danger {
969
+ border-color: var(--qm-danger);
970
+ color: var(--qm-danger);
971
+ }
972
+
973
+ [data-edrv-view] .edrv-qm-btn:disabled {
974
+ opacity: .5;
975
+ cursor: not-allowed;
976
+ }
977
+
978
+ [data-edrv-view] .edrv-qm-btn:focus-visible {
979
+ outline: 2px solid var(--qm-accent);
980
+ outline-offset: 2px;
981
+ }
982
+
983
+ /* 按钮组:按内容宽度排布,不再等分拉满(导出/导入/重置宽度本就不同) */
984
+ [data-edrv-view] .edrv-qm-btn-row {
985
+ display: flex;
986
+ flex-wrap: wrap;
987
+ align-items: center;
988
+ gap: 8px;
989
+ }
990
+
991
+ /* 同一行里的输入框与按钮 */
992
+ [data-edrv-view] .edrv-qm-inline {
993
+ display: flex;
994
+ align-items: center;
995
+ gap: 6px;
996
+ }
997
+
998
+ [data-edrv-view] .edrv-qm-input--order {
999
+ width: 74px;
1000
+ flex: 0 0 74px;
1001
+ }
1002
+
1003
+ [data-edrv-view] .edrv-qm-row2 > .edrv-qm-field--narrow {
1004
+ flex: 0 0 136px;
1005
+ }
1006
+
1007
+ /* 悬浮按钮右键小菜单 */
1008
+ [data-edrv-view] .edrv-qm-context {
1009
+ position: absolute;
1010
+ min-width: 148px;
1011
+ padding: 4px;
1012
+ border-radius: 9px;
1013
+ border: 1px solid var(--qm-line);
1014
+ background: var(--qm-surface);
1015
+ box-shadow: var(--qm-elev);
1016
+ pointer-events: auto;
1017
+ }
1018
+
1019
+ [data-edrv-view] .edrv-qm-context-item {
1020
+ padding: 5px 9px;
1021
+ border-radius: 6px;
1022
+ cursor: pointer;
1023
+ color: var(--qm-ink);
1024
+ font-size: 12px;
1025
+ white-space: nowrap;
1026
+ transition: background .1s ease, color .1s ease;
1027
+ }
1028
+
1029
+ [data-edrv-view] .edrv-qm-context-item:hover {
1030
+ background: var(--qm-hover);
1031
+ }
1032
+
1033
+ [data-edrv-view] .edrv-qm-context-item--danger {
1034
+ color: var(--qm-danger);
1035
+ }
1036
+
1037
+ [data-edrv-view] .edrv-qm-context-sep {
1038
+ height: 1px;
1039
+ margin: 4px 2px;
1040
+ background: var(--qm-line);
1041
+ }
1042
+
1043
+ @media (prefers-reduced-motion: reduce) {
1044
+ [data-edrv-view] .edrv-qm-col { animation: none; }
1045
+ [data-edrv-view] .edrv-qm-launcher,
1046
+ [data-edrv-view] .edrv-qm-row,
1047
+ [data-edrv-view] .edrv-qm-row-chevron { transition: none; }
1048
+ [data-edrv-view] .edrv-qm-launcher:hover { transform: none; }
1049
+ }