dsh-paoding 0.2.2 → 0.3.0
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/README.md +26 -22
- package/README_en.md +26 -22
- package/bin/dsh-paoding.mjs +73 -11
- package/docs/architecture.md +36 -31
- package/docs/architecture_en.md +54 -38
- package/docs/configuration.md +151 -57
- package/docs/configuration_en.md +155 -60
- package/docs/installation.md +96 -234
- package/docs/installation_en.md +111 -252
- package/docs/orchestration.md +24 -24
- package/docs/orchestration_en.md +24 -24
- package/package.json +8 -5
- package/plugins/paoding-config-ui/api-core.mjs +215 -18
- package/plugins/paoding-config-ui/index.mjs +413 -154
- package/plugins/paoding-config-ui/lib/base.css +1083 -42
- package/plugins/paoding-config-ui/lib/client.js +2266 -252
- package/plugins/paoding-config-ui/package.json +2 -2
- package/plugins/paoding-config-ui/runtime-inventory.mjs +27 -26
- package/presets/orchestrator/agent.cordis.yml +19 -9
- package/presets/orchestrator/preset.yml +3 -2
- package/presets/orchestrator/restrict.mjs +2 -1
- package/tools/install.mjs +9 -4
- package/tools/lib/alloc.mjs +60 -29
- package/tools/lib/cli.mjs +127 -279
- package/tools/lib/compose.mjs +261 -95
- package/tools/lib/config.mjs +266 -86
- package/tools/lib/host.mjs +55 -24
- package/tools/lib/skills.mjs +72 -45
- package/tools/lib/state.mjs +172 -40
- package/tools/lib/upgrade.mjs +170 -0
- package/tools/lib/util.mjs +7 -0
- package/tools/lib/version.mjs +233 -0
- package/tools/lib/workspaces.mjs +74 -0
- package/tools/lib/yaml.mjs +92 -15
- package/install.sh +0 -31
- package/tools/lib/wizard.mjs +0 -516
|
@@ -7,15 +7,6 @@
|
|
|
7
7
|
flex-direction: column;
|
|
8
8
|
gap: 16px;
|
|
9
9
|
width: 100%;
|
|
10
|
-
max-width: 760px;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
.omd-intro {
|
|
14
|
-
margin: 0;
|
|
15
|
-
padding: 0 2px;
|
|
16
|
-
font-size: 13px;
|
|
17
|
-
line-height: 20px;
|
|
18
|
-
color: var(--dsw-alias-label-tertiary);
|
|
19
10
|
}
|
|
20
11
|
|
|
21
12
|
/* Group container: the DSH PluginCard recipe — l2 hairline, r16, layer-3. */
|
|
@@ -98,6 +89,97 @@
|
|
|
98
89
|
color: var(--dsw-alias-state-error-primary);
|
|
99
90
|
}
|
|
100
91
|
|
|
92
|
+
/* 版本提示行:常态弱化(小字、三级文字色,同 omd-hint 观感);有新版时
|
|
93
|
+
挂 omd-versionNew 换成醒目警示卡(配色同 omd-statusWarn),链接继承行色。 */
|
|
94
|
+
.omd-versionRow {
|
|
95
|
+
display: flex;
|
|
96
|
+
align-items: center;
|
|
97
|
+
gap: 6px;
|
|
98
|
+
min-width: 0;
|
|
99
|
+
font-size: 11px;
|
|
100
|
+
line-height: 16px;
|
|
101
|
+
color: var(--dsw-alias-label-tertiary);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.omd-versionNew {
|
|
105
|
+
padding: 8px 12px;
|
|
106
|
+
box-sizing: border-box;
|
|
107
|
+
border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);
|
|
108
|
+
border-radius: 12px;
|
|
109
|
+
background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 10%, transparent);
|
|
110
|
+
color: var(--dsw-alias-state-warn-primary);
|
|
111
|
+
font-size: 12px;
|
|
112
|
+
line-height: 18px;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.omd-versionIcon { display: inline-flex; flex: none; }
|
|
116
|
+
.omd-versionText { min-width: 0; overflow-wrap: anywhere; }
|
|
117
|
+
|
|
118
|
+
.omd-versionLink {
|
|
119
|
+
color: inherit;
|
|
120
|
+
font-weight: 600;
|
|
121
|
+
text-decoration: underline;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.omd-versionLink:focus-visible { outline: 2px solid var(--dsw-alias-border-l4); outline-offset: 2px; }
|
|
125
|
+
|
|
126
|
+
/* 版本警示卡内的「升级」按钮:小号 pill(比操作坞按钮小一号,观感同
|
|
127
|
+
omd-restorePill),配色随警示卡 warn 主色,busy 时禁用。 */
|
|
128
|
+
.omd-upgradeBtn {
|
|
129
|
+
flex: none;
|
|
130
|
+
margin-left: auto;
|
|
131
|
+
padding: 2px 12px;
|
|
132
|
+
border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 55%, transparent);
|
|
133
|
+
border-radius: 999px;
|
|
134
|
+
background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);
|
|
135
|
+
color: inherit;
|
|
136
|
+
font: inherit;
|
|
137
|
+
font-size: 11px;
|
|
138
|
+
line-height: 16px;
|
|
139
|
+
font-weight: 600;
|
|
140
|
+
cursor: pointer;
|
|
141
|
+
transition: background 0.12s ease, border-color 0.12s ease;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.omd-upgradeBtn:hover:not(:disabled) {
|
|
145
|
+
background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 26%, transparent);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.omd-upgradeBtn:disabled { opacity: 0.6; cursor: default; }
|
|
149
|
+
|
|
150
|
+
.omd-upgradeBtn:focus-visible { outline: 2px solid var(--dsw-alias-border-l4); outline-offset: 1px; }
|
|
151
|
+
|
|
152
|
+
/* 升级进行中的补充说明(分钟级操作,管理预期)。 */
|
|
153
|
+
.omd-upgradeHint {
|
|
154
|
+
flex: none;
|
|
155
|
+
font-size: 11px;
|
|
156
|
+
line-height: 16px;
|
|
157
|
+
opacity: 0.85;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* 页头语境(pd-titleRow 内)的更新卡:比正文警示卡更紧凑,标题旁一行收纳;
|
|
161
|
+
窄屏放不下时卡内可换行。反馈行(成功 note / 失败 err)也收在卡内。 */
|
|
162
|
+
.pd-titleRow .omd-versionNew {
|
|
163
|
+
padding: 3px 8px 3px 10px;
|
|
164
|
+
border-radius: 8px;
|
|
165
|
+
max-width: min(560px, 100%);
|
|
166
|
+
flex-wrap: wrap;
|
|
167
|
+
row-gap: 2px;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.pd-titleRow .omd-upgradeBtn { margin-left: 2px; }
|
|
171
|
+
|
|
172
|
+
.omd-versionNote {
|
|
173
|
+
min-width: 0;
|
|
174
|
+
overflow-wrap: anywhere;
|
|
175
|
+
color: var(--dsw-alias-label-secondary);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.omd-versionNoteErr {
|
|
179
|
+
color: inherit;
|
|
180
|
+
font-weight: 600;
|
|
181
|
+
}
|
|
182
|
+
|
|
101
183
|
/* Sticky bottom action dock: keeps the primary buttons reachable at the
|
|
102
184
|
bottom of the scroll container while the user edits lower groups. */
|
|
103
185
|
.omd-actionBar {
|
|
@@ -129,15 +211,6 @@
|
|
|
129
211
|
align-items: center;
|
|
130
212
|
}
|
|
131
213
|
|
|
132
|
-
.omd-chipSecondary {
|
|
133
|
-
flex-basis: 100%;
|
|
134
|
-
opacity: 0.62;
|
|
135
|
-
font-size: 11px;
|
|
136
|
-
line-height: 1.5;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
.omd-chipErrText { color: var(--dsw-alias-state-error-primary); }
|
|
140
|
-
|
|
141
214
|
/* Role cards: stacked small cards (l2 hairline, r12, layer-1 fill). */
|
|
142
215
|
.omd-roleCard {
|
|
143
216
|
flex: none;
|
|
@@ -213,7 +286,8 @@
|
|
|
213
286
|
font-variant-numeric: tabular-nums;
|
|
214
287
|
}
|
|
215
288
|
|
|
216
|
-
.omd-roleDel
|
|
289
|
+
.omd-roleDel,
|
|
290
|
+
.omd-roleEdit {
|
|
217
291
|
display: inline-flex;
|
|
218
292
|
align-items: center;
|
|
219
293
|
justify-content: center;
|
|
@@ -227,12 +301,14 @@
|
|
|
227
301
|
transition: color 0.12s ease, background 0.12s ease;
|
|
228
302
|
}
|
|
229
303
|
|
|
230
|
-
.omd-roleDel:hover
|
|
304
|
+
.omd-roleDel:hover,
|
|
305
|
+
.omd-roleEdit:hover {
|
|
231
306
|
color: var(--dsw-alias-state-error-primary);
|
|
232
307
|
background: var(--dsw-alias-interactive-bg-hover);
|
|
233
308
|
}
|
|
234
309
|
|
|
235
|
-
.omd-roleDel:focus-visible
|
|
310
|
+
.omd-roleDel:focus-visible,
|
|
311
|
+
.omd-roleEdit:focus-visible { outline: 2px solid var(--dsw-alias-border-l4); outline-offset: -2px; }
|
|
236
312
|
|
|
237
313
|
.omd-roleBody {
|
|
238
314
|
display: flex;
|
|
@@ -298,7 +374,7 @@
|
|
|
298
374
|
line-height: 16px;
|
|
299
375
|
}
|
|
300
376
|
|
|
301
|
-
/* Source badge: "base" neutral, "
|
|
377
|
+
/* Source badge: "base" neutral, "mcp"/"plugin" warn-tinted (matches the old amber). */
|
|
302
378
|
.omd-toolTag {
|
|
303
379
|
flex: none;
|
|
304
380
|
margin-left: auto;
|
|
@@ -417,6 +493,15 @@
|
|
|
417
493
|
color: var(--dsw-alias-label-tertiary);
|
|
418
494
|
}
|
|
419
495
|
|
|
496
|
+
/* 运行时识别降级提示(仅 runtimeOk === false 时渲染):一行小字独立贴在
|
|
497
|
+
标签行上方,观感同 omd-hint 但不缩进组内、可整行换行。 */
|
|
498
|
+
.omd-runtimeNote {
|
|
499
|
+
font-size: 11px;
|
|
500
|
+
line-height: 16px;
|
|
501
|
+
color: var(--dsw-alias-label-tertiary);
|
|
502
|
+
overflow-wrap: anywhere;
|
|
503
|
+
}
|
|
504
|
+
|
|
420
505
|
/* Skill assignment rows: mono name + per-role checkboxes, hairline rows. */
|
|
421
506
|
.omd-skillRow {
|
|
422
507
|
display: flex;
|
|
@@ -429,12 +514,11 @@
|
|
|
429
514
|
.omd-skillRow:last-child { border-bottom: none; }
|
|
430
515
|
|
|
431
516
|
.omd-skillName {
|
|
432
|
-
|
|
433
|
-
|
|
517
|
+
/* 全量展示:不截断,长名自然换行(超长占位符名也能看全);角标与角色勾选列随行顶对齐 */
|
|
518
|
+
flex: 0 1 auto;
|
|
519
|
+
max-width: 360px;
|
|
434
520
|
min-width: 0;
|
|
435
|
-
overflow:
|
|
436
|
-
text-overflow: ellipsis;
|
|
437
|
-
white-space: nowrap;
|
|
521
|
+
overflow-wrap: anywhere;
|
|
438
522
|
font-family: var(--ds-font-family-code, ui-monospace, SFMono-Regular, Menlo, monospace);
|
|
439
523
|
font-size: 12px;
|
|
440
524
|
line-height: 20px;
|
|
@@ -458,6 +542,31 @@
|
|
|
458
542
|
cursor: pointer;
|
|
459
543
|
}
|
|
460
544
|
|
|
545
|
+
/* 项目级技能角标:仅工作区视角下、来自该工作区项目根(<ws>/.dsh|.agents
|
|
546
|
+
skills)的技能显示。观感同 omd-toolTag 的小角标配方,配色换 business 主色
|
|
547
|
+
软底以示「来自本项目」。 */
|
|
548
|
+
.omd-skillProj {
|
|
549
|
+
flex: none;
|
|
550
|
+
padding: 0 6px;
|
|
551
|
+
border: 1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 35%, transparent);
|
|
552
|
+
border-radius: 4px;
|
|
553
|
+
background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 10%, transparent);
|
|
554
|
+
color: var(--dsw-alias-state-business-primary);
|
|
555
|
+
font-size: 10px;
|
|
556
|
+
line-height: 16px;
|
|
557
|
+
font-weight: 500;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/* 技能网格作用域小字(分组标题旁):全局 = 仅用户级技能;工作区 = 用户级 +
|
|
561
|
+
该工作区项目级技能。挂在 groupHeading / glabel 里时重置其大写与字距样式。 */
|
|
562
|
+
.omd-skillScope {
|
|
563
|
+
min-width: 0;
|
|
564
|
+
font-weight: 400;
|
|
565
|
+
letter-spacing: normal;
|
|
566
|
+
text-transform: none;
|
|
567
|
+
color: var(--dsw-alias-label-tertiary);
|
|
568
|
+
}
|
|
569
|
+
|
|
461
570
|
/* Preview: success summary + scrollable mono yml block. */
|
|
462
571
|
.omd-previewSummary {
|
|
463
572
|
font-size: 12px;
|
|
@@ -614,19 +723,951 @@
|
|
|
614
723
|
outline-offset: 1px;
|
|
615
724
|
}
|
|
616
725
|
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
726
|
+
/* 配置对象标签页:「全局默认」/ 各工作区 tab +「更多」下拉(放不下的工作区
|
|
727
|
+
收进去)+ 末尾「+ 添加工作区」(弹窗)。下划线式激活态(::after 主色横条
|
|
728
|
+
压在容器 border-bottom 上);preset 已生成的工作区在文案前带一个小圆点
|
|
729
|
+
(成功色)标记,语义沿自旧 pill 行。 */
|
|
730
|
+
/* 吸顶:面板下滚时标签区钉在滚动视口顶(.pd-page 是滚动容器)。负外边距
|
|
731
|
+
对冲 .pd-page 的内边距(14px 28px 28px),吸顶时整幅盖住下方滚过的内容、
|
|
732
|
+
左右不露缝;自身补回同值内边距,静止观感与吸顶前一致。sticky 也是定位
|
|
733
|
+
元素,「更多」下拉的 absolute 锚点语义不变;z-index 20 压过分组卡与
|
|
734
|
+
建议下拉(7 / 6),低于页内弹窗遮罩(60)。 */
|
|
735
|
+
.omd-wsTabs {
|
|
736
|
+
position: sticky;
|
|
737
|
+
top: -14px; /* 吸顶位上移自身 padding-top:那 14px 补偿层恰好移出视口,
|
|
738
|
+
标签行贴顶无缝;静止时观感不变(负 top 只是让吸顶落点更低) */
|
|
739
|
+
z-index: 20;
|
|
740
|
+
background: var(--dsw-alias-bg-base);
|
|
741
|
+
margin: -14px -28px 0;
|
|
742
|
+
padding: 14px 28px 0;
|
|
743
|
+
display: flex;
|
|
744
|
+
flex-direction: column;
|
|
745
|
+
gap: 10px;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
.omd-tabs {
|
|
749
|
+
display: flex;
|
|
750
|
+
align-items: flex-end;
|
|
751
|
+
gap: 4px;
|
|
752
|
+
padding: 0 2px;
|
|
753
|
+
border-bottom: 1px solid var(--dsw-alias-border-l2);
|
|
754
|
+
overflow-x: auto;
|
|
755
|
+
/* 窄窗溢出时保留横向滚动兜底,但滚动条不露面——标签行只有一条下边框,
|
|
756
|
+
再横着压一条滚动条太突兀 */
|
|
757
|
+
scrollbar-width: none;
|
|
758
|
+
-ms-overflow-style: none;
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
.omd-tabs::-webkit-scrollbar { display: none; height: 0; }
|
|
762
|
+
|
|
763
|
+
.omd-tab {
|
|
764
|
+
position: relative;
|
|
765
|
+
display: inline-flex;
|
|
766
|
+
align-items: center;
|
|
767
|
+
gap: 6px;
|
|
768
|
+
flex: none;
|
|
769
|
+
max-width: 240px;
|
|
770
|
+
padding: 8px 14px;
|
|
771
|
+
border: none;
|
|
772
|
+
border-radius: 8px 8px 0 0;
|
|
773
|
+
background: transparent;
|
|
774
|
+
color: var(--dsw-alias-label-secondary);
|
|
775
|
+
font: inherit;
|
|
776
|
+
font-size: 13px;
|
|
777
|
+
line-height: 18px;
|
|
778
|
+
white-space: nowrap;
|
|
779
|
+
cursor: pointer;
|
|
780
|
+
transition: background 0.12s ease, color 0.12s ease;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
.omd-tab:hover {
|
|
784
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
785
|
+
color: var(--dsw-alias-label-primary);
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
.omd-tab:focus-visible {
|
|
789
|
+
outline: 2px solid var(--dsw-alias-border-l4);
|
|
790
|
+
outline-offset: -2px;
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
.omd-tabText {
|
|
794
|
+
min-width: 0;
|
|
795
|
+
overflow: hidden;
|
|
796
|
+
text-overflow: ellipsis;
|
|
797
|
+
white-space: nowrap;
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
.omd-tabActive,
|
|
801
|
+
.omd-tabActive:hover {
|
|
802
|
+
color: var(--dsw-alias-label-primary);
|
|
803
|
+
font-weight: 600;
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
.omd-tabActive::after {
|
|
807
|
+
content: "";
|
|
808
|
+
position: absolute;
|
|
809
|
+
left: 10px;
|
|
810
|
+
right: 10px;
|
|
811
|
+
bottom: -1px;
|
|
812
|
+
height: 2px;
|
|
813
|
+
border-radius: 2px;
|
|
814
|
+
background: var(--dsw-alias-label-primary);
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
/* 末尾「+ 添加工作区」:与 tab 同尺寸的 ghost 弱化按钮(点击打开输入弹窗)。 */
|
|
818
|
+
.omd-tabAdd {
|
|
819
|
+
color: var(--dsw-alias-label-tertiary);
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
.omd-tabAdd:hover {
|
|
823
|
+
color: var(--dsw-alias-label-primary);
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
.omd-tabAdd:disabled { cursor: default; opacity: 0.6; }
|
|
827
|
+
|
|
828
|
+
/* 「更多」:装填算法按标签行实宽放不下、收进下拉的那批工作区走这个入口,
|
|
829
|
+
着色沿用「添加工作区」的弱化款(tertiary,hover 转 primary)。激活工作区
|
|
830
|
+
藏在菜单里时 JS 会双挂 omd-tabMoreActive + omd-tabActive——主色、加粗、
|
|
831
|
+
底部激活条全部复用 .omd-tabActive 的既有视觉,这里不复制一份。 */
|
|
832
|
+
.omd-tabMore {
|
|
833
|
+
color: var(--dsw-alias-label-tertiary);
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
.omd-tabMore:hover {
|
|
837
|
+
color: var(--dsw-alias-label-primary);
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
/* 收纳计数徽标:小号弱化数字,垫一层浅底提示可点。运行时令牌没有注入
|
|
841
|
+
interactive-bg 的纯底色版,取本文件已验证的 hover 底。 */
|
|
842
|
+
.omd-tabMoreCount {
|
|
843
|
+
padding: 1px 6px;
|
|
844
|
+
border-radius: 999px;
|
|
845
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
846
|
+
color: var(--dsw-alias-label-tertiary);
|
|
847
|
+
font-size: 11px;
|
|
848
|
+
line-height: 14px;
|
|
849
|
+
font-variant-numeric: tabular-nums;
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
/* 「添加工作区」弹窗的输入框(旧 tab 条下方内联输入行已改为弹窗,输入框类名沿用)。 */
|
|
853
|
+
.omd-wsAddInput { flex: 1 1 260px; min-width: 0; }
|
|
854
|
+
|
|
855
|
+
/* 「添加工作区」弹窗里的组合框:建议下拉挂在 Wrap(相对定位)上,随输入框
|
|
856
|
+
聚焦展开。下拉要溢出卡片显示,所以 .pd-modalCard 不设 overflow 裁剪。
|
|
857
|
+
候选多于可视高度时下拉内部滚动,服务端 cap 50 也兜得住。 */
|
|
858
|
+
.omd-wsSuggestWrap {
|
|
859
|
+
position: relative;
|
|
860
|
+
flex: 1 1 260px;
|
|
861
|
+
min-width: 0;
|
|
862
|
+
display: flex;
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
/* 弹窗卡片是列向 flex,Wrap 的 260px 基线在列向会变成高度——弹窗内改回
|
|
866
|
+
自适应高度、宽度撑满卡片。 */
|
|
867
|
+
.pd-modalBody .omd-wsSuggestWrap {
|
|
868
|
+
flex: 0 0 auto;
|
|
869
|
+
width: 100%;
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
.omd-wsSuggestWrap .omd-wsAddInput { width: 100%; }
|
|
873
|
+
|
|
874
|
+
/* 「新建角色」弹窗里直接复用 .omd-nameInput:其 flex:1 是给行向 nameRow 的,
|
|
875
|
+
弹窗卡片是列向 flex,基线同样会变成高度——弹窗内改回自适应高度、宽度撑满。 */
|
|
876
|
+
.pd-modalBody .omd-nameInput {
|
|
877
|
+
flex: 0 0 auto;
|
|
878
|
+
width: 100%;
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
.omd-wsSuggest {
|
|
882
|
+
position: absolute;
|
|
883
|
+
top: calc(100% + 4px);
|
|
884
|
+
left: 0;
|
|
885
|
+
right: 0;
|
|
886
|
+
z-index: 7;
|
|
887
|
+
max-height: 240px;
|
|
888
|
+
overflow-y: auto;
|
|
889
|
+
display: flex;
|
|
890
|
+
flex-direction: column;
|
|
891
|
+
gap: 2px;
|
|
892
|
+
padding: 4px;
|
|
893
|
+
box-sizing: border-box;
|
|
894
|
+
border: 1px solid var(--dsw-alias-border-l2);
|
|
895
|
+
border-radius: 10px;
|
|
896
|
+
background: var(--dsw-alias-bg-layer-2);
|
|
897
|
+
box-shadow: 0 8px 24px -12px rgba(0, 0, 0, 0.35);
|
|
898
|
+
/* 候选多时内部滚动,滚动条同样不露面(与标签行同一套处理) */
|
|
899
|
+
scrollbar-width: none;
|
|
900
|
+
-ms-overflow-style: none;
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
.omd-wsSuggest::-webkit-scrollbar { display: none; height: 0; }
|
|
904
|
+
|
|
905
|
+
.omd-wsSuggestItem {
|
|
906
|
+
display: flex;
|
|
907
|
+
flex-direction: column;
|
|
908
|
+
gap: 1px;
|
|
909
|
+
padding: 5px 8px;
|
|
910
|
+
border: none;
|
|
911
|
+
border-radius: 7px;
|
|
912
|
+
background: transparent;
|
|
913
|
+
color: var(--dsw-alias-label-primary);
|
|
914
|
+
font: inherit;
|
|
915
|
+
text-align: left;
|
|
916
|
+
cursor: pointer;
|
|
917
|
+
transition: background 0.12s ease;
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
.omd-wsSuggestItem:hover {
|
|
921
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
.omd-wsSuggestItem:focus-visible {
|
|
925
|
+
outline: 2px solid var(--dsw-alias-state-business-primary);
|
|
926
|
+
outline-offset: -2px;
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
.omd-wsSuggestItem:disabled { cursor: default; opacity: 0.6; }
|
|
930
|
+
|
|
931
|
+
.omd-wsSuggestName {
|
|
932
|
+
font-size: 12px;
|
|
933
|
+
line-height: 17px;
|
|
934
|
+
font-weight: 600;
|
|
935
|
+
overflow: hidden;
|
|
936
|
+
text-overflow: ellipsis;
|
|
937
|
+
white-space: nowrap;
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
.omd-wsSuggestPath {
|
|
941
|
+
font-size: 11px;
|
|
942
|
+
line-height: 15px;
|
|
943
|
+
color: var(--dsw-alias-label-tertiary);
|
|
944
|
+
overflow: hidden;
|
|
945
|
+
text-overflow: ellipsis;
|
|
946
|
+
white-space: nowrap;
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
/* 「更多」下拉菜单:绝对定位挂在 .omd-wsTabs(relative)上,从整块标签区
|
|
950
|
+
下沿展开、盖过下方分组卡;z-index 高过建议下拉(7)与操作坞(6)。
|
|
951
|
+
候选多时内部滚动,滚动条同样藏起来。 */
|
|
952
|
+
.omd-tabsRow {
|
|
953
|
+
position: relative;
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
.omd-tabMenu {
|
|
957
|
+
position: absolute;
|
|
958
|
+
top: 100%;
|
|
959
|
+
left: 2px;
|
|
960
|
+
z-index: 30;
|
|
961
|
+
min-width: 280px;
|
|
962
|
+
max-width: 420px;
|
|
963
|
+
max-height: 320px;
|
|
964
|
+
overflow-y: auto;
|
|
965
|
+
display: flex;
|
|
966
|
+
flex-direction: column;
|
|
967
|
+
gap: 2px;
|
|
968
|
+
padding: 4px;
|
|
969
|
+
box-sizing: border-box;
|
|
970
|
+
border: 1px solid var(--dsw-alias-border-l2);
|
|
971
|
+
border-radius: 10px;
|
|
972
|
+
background: var(--dsw-alias-bg-layer-1);
|
|
973
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.16);
|
|
974
|
+
scrollbar-width: none;
|
|
975
|
+
-ms-overflow-style: none;
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
.omd-tabMenu::-webkit-scrollbar { display: none; height: 0; }
|
|
979
|
+
|
|
980
|
+
.omd-tabMenuItem {
|
|
981
|
+
display: flex;
|
|
982
|
+
align-items: center;
|
|
983
|
+
gap: 8px;
|
|
984
|
+
padding: 8px 10px;
|
|
985
|
+
border: none;
|
|
986
|
+
border-radius: 6px;
|
|
987
|
+
background: transparent;
|
|
988
|
+
color: var(--dsw-alias-label-secondary);
|
|
989
|
+
font: inherit;
|
|
990
|
+
font-size: 13px;
|
|
991
|
+
line-height: 18px;
|
|
992
|
+
text-align: left;
|
|
993
|
+
cursor: pointer;
|
|
994
|
+
transition: background 0.12s ease, color 0.12s ease;
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
.omd-tabMenuItem:hover {
|
|
998
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
999
|
+
color: var(--dsw-alias-label-primary);
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
.omd-tabMenuItem:focus-visible {
|
|
1003
|
+
outline: 2px solid var(--dsw-alias-border-l4);
|
|
1004
|
+
outline-offset: -2px;
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
.omd-tabMenuItemActive,
|
|
1008
|
+
.omd-tabMenuItemActive:hover {
|
|
1009
|
+
color: var(--dsw-alias-label-primary);
|
|
1010
|
+
font-weight: 600;
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
/* 名称占满中缝,会话数自然靠右;省略号截断复用 .omd-tabText 既有声明。 */
|
|
1014
|
+
.omd-tabMenuItem .omd-tabText { flex: 1 1 auto; }
|
|
1015
|
+
|
|
1016
|
+
/* 工作区配置状态三态小标签:项目(专属预设已生成)/ 待应用(存了条目、
|
|
1017
|
+
预设未生成)/ 全局(跟随全局配置)。挤在 tab 里所以字很小、用色区分,
|
|
1018
|
+
tooltip 有完整口径。 */
|
|
1019
|
+
.omd-tabTag {
|
|
1020
|
+
flex: none;
|
|
1021
|
+
padding: 1px 6px;
|
|
1022
|
+
border-radius: 999px;
|
|
1023
|
+
font-size: 11px;
|
|
1024
|
+
line-height: 14px;
|
|
1025
|
+
font-variant-numeric: tabular-nums;
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
.omd-tabTagProject {
|
|
1029
|
+
border: 1px solid color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent);
|
|
1030
|
+
background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);
|
|
1031
|
+
color: var(--dsw-alias-state-success-primary);
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
.omd-tabTagPending {
|
|
1035
|
+
border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);
|
|
1036
|
+
background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 10%, transparent);
|
|
1037
|
+
color: var(--dsw-alias-state-warn-primary);
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
.omd-tabTagGlobal {
|
|
1041
|
+
border: 1px solid var(--dsw-alias-border-l2);
|
|
1042
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
.omd-tabCount {
|
|
1046
|
+
flex: none;
|
|
1047
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1048
|
+
font-size: 12px;
|
|
1049
|
+
line-height: 16px;
|
|
1050
|
+
font-variant-numeric: tabular-nums;
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
/* 宽度测量层:常驻但不可见不可交互,只负责把每个 tab 的自然宽度喂给
|
|
1054
|
+
装填算法(offsetWidth 读取)。left 挪出视口 + visibility 双保险,
|
|
1055
|
+
flex 行不换行,子项宽度与真实 tab 一致(同款 .omd-tab 类)。 */
|
|
1056
|
+
.omd-tabsMeasure {
|
|
1057
|
+
position: absolute;
|
|
1058
|
+
left: -9999px;
|
|
1059
|
+
top: 0;
|
|
1060
|
+
display: flex;
|
|
1061
|
+
gap: 4px;
|
|
1062
|
+
visibility: hidden;
|
|
1063
|
+
pointer-events: none;
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1067
|
+
.omd-roleHead,
|
|
1068
|
+
.omd-roleDel,
|
|
1069
|
+
.omd-addRole,
|
|
1070
|
+
.omd-personaToggle,
|
|
1071
|
+
.omd-toolItem,
|
|
1072
|
+
.omd-chevron,
|
|
1073
|
+
.omd-textarea,
|
|
1074
|
+
.omd-extraRestore,
|
|
1075
|
+
.omd-upgradeBtn,
|
|
1076
|
+
.omd-nameInput,
|
|
1077
|
+
.omd-restorePill,
|
|
1078
|
+
.omd-tab,
|
|
1079
|
+
.omd-tabMenuItem,
|
|
1080
|
+
.omd-wsSuggestItem,
|
|
1081
|
+
.omd-spin,
|
|
1082
|
+
.pd-sbEntry,
|
|
1083
|
+
.pd-closeBtn,
|
|
1084
|
+
.pd-modalClose,
|
|
1085
|
+
.pd-toast {
|
|
1086
|
+
transition: none;
|
|
1087
|
+
animation: none;
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
/* ── 侧栏入口(data-dsh-paoding-entry)─────────────────────────────────────
|
|
1092
|
+
照 dsh-mnemon 侧栏入口观感:整行按钮、24×24 图标槽位,hover/active 跟随
|
|
1093
|
+
官方侧栏行;[data-sidebar-collapsed] 为官方折叠态的向前兼容写法(当前侧栏
|
|
1094
|
+
未必下发该属性,写上无害)。 */
|
|
1095
|
+
|
|
1096
|
+
.pd-sbEntry {
|
|
1097
|
+
box-sizing: border-box;
|
|
1098
|
+
display: flex;
|
|
1099
|
+
align-items: center;
|
|
1100
|
+
gap: 10px;
|
|
1101
|
+
width: 100%;
|
|
1102
|
+
min-height: 36px;
|
|
1103
|
+
padding: 0 10px;
|
|
1104
|
+
border: none;
|
|
1105
|
+
border-radius: 8px;
|
|
1106
|
+
background: transparent;
|
|
1107
|
+
color: var(--dsw-alias-label-secondary);
|
|
1108
|
+
font: inherit;
|
|
1109
|
+
font-size: 13px;
|
|
1110
|
+
line-height: 20px;
|
|
1111
|
+
white-space: nowrap;
|
|
1112
|
+
cursor: pointer;
|
|
1113
|
+
transition: background 0.12s ease, color 0.12s ease;
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
.pd-sbEntry:hover {
|
|
1117
|
+
color: var(--dsw-alias-label-primary);
|
|
1118
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
.pd-sbEntry:focus-visible {
|
|
1122
|
+
outline: 2px solid var(--dsw-alias-border-l4);
|
|
1123
|
+
outline-offset: -2px;
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
.pd-sbEntry[data-active] {
|
|
1127
|
+
color: var(--dsw-alias-label-primary);
|
|
1128
|
+
background: var(--dsw-alias-interactive-bg-active);
|
|
1129
|
+
font-weight: 600;
|
|
1130
|
+
}
|
|
1131
|
+
|
|
1132
|
+
.pd-sbEntryIcon {
|
|
1133
|
+
display: inline-flex;
|
|
1134
|
+
flex: none;
|
|
1135
|
+
align-items: center;
|
|
1136
|
+
justify-content: center;
|
|
1137
|
+
width: 24px;
|
|
1138
|
+
height: 24px;
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
.pd-sbEntryIcon svg {
|
|
1142
|
+
display: block;
|
|
1143
|
+
width: 18px;
|
|
1144
|
+
height: 18px;
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
.pd-sbEntryLabel {
|
|
1148
|
+
min-width: 0;
|
|
1149
|
+
overflow: hidden;
|
|
1150
|
+
text-overflow: ellipsis;
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
[data-sidebar-collapsed] .pd-sbEntry {
|
|
1154
|
+
width: 36px;
|
|
1155
|
+
min-height: 36px;
|
|
1156
|
+
justify-content: center;
|
|
1157
|
+
margin: 0 auto 12px;
|
|
1158
|
+
padding: 0;
|
|
1159
|
+
border-radius: 50%;
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
[data-sidebar-collapsed] .pd-sbEntryIcon svg { width: 20px; height: 20px; }
|
|
1163
|
+
|
|
1164
|
+
[data-sidebar-collapsed] .pd-sbEntryLabel { display: none; }
|
|
1165
|
+
|
|
1166
|
+
/* ── 全页 overlay(data-dsh-paoding-view / html[data-dsh-paoding-active])──
|
|
1167
|
+
机制照 dsh-mnemon:会话中栏转 relative 容器,overlay 绝对铺满;打开态靠
|
|
1168
|
+
<html> 的 active 属性切换显隐,并把中栏其余子元素一并藏掉。四个全页面板
|
|
1169
|
+
(mnemon / taskboard / ssh / paoding)互斥,active 属性相互排他(:not() 链),
|
|
1170
|
+
点亮谁谁显示。 */
|
|
1171
|
+
|
|
1172
|
+
[data-pane="conversation"],
|
|
1173
|
+
[class*="centerCol"],
|
|
1174
|
+
.dshDesktopConversationSurface {
|
|
1175
|
+
position: relative;
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
[data-dsh-paoding-view] {
|
|
1179
|
+
z-index: 60;
|
|
1180
|
+
background: var(--dsw-alias-bg-base);
|
|
1181
|
+
min-width: 0;
|
|
1182
|
+
min-height: 0;
|
|
1183
|
+
display: none;
|
|
1184
|
+
position: absolute;
|
|
1185
|
+
inset: 0;
|
|
1186
|
+
overflow: hidden;
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
.pd-panelView { isolation: isolate; }
|
|
1190
|
+
|
|
1191
|
+
html[data-dsh-paoding-active]:not([data-dsh-mnemon-active]):not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-dsh-paoding-view] { display: block; }
|
|
1192
|
+
|
|
1193
|
+
html[data-dsh-paoding-active]:not([data-dsh-mnemon-active]):not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [data-pane="conversation"] > :not([data-dsh-paoding-view]),
|
|
1194
|
+
html[data-dsh-paoding-active]:not([data-dsh-mnemon-active]):not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) [class*="centerCol"] > :not([data-dsh-paoding-view]),
|
|
1195
|
+
html[data-dsh-paoding-active]:not([data-dsh-mnemon-active]):not([data-dsh-taskboard-active]):not([data-dsh-ssh-active]) .dshDesktopConversationSurface > :not([data-dsh-paoding-view]) {
|
|
1196
|
+
display: none !important;
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
/* ── 全页配置页骨架(PageShell)──────────────────────────────────────────── */
|
|
1200
|
+
|
|
1201
|
+
.pd-shell {
|
|
1202
|
+
display: flex;
|
|
1203
|
+
flex-direction: column;
|
|
1204
|
+
height: 100%;
|
|
1205
|
+
min-width: 0;
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
.pd-pageHeader {
|
|
1209
|
+
flex: none;
|
|
1210
|
+
display: flex;
|
|
1211
|
+
align-items: center;
|
|
1212
|
+
gap: 12px;
|
|
1213
|
+
width: 100%;
|
|
1214
|
+
padding: 18px 28px 10px;
|
|
1215
|
+
box-sizing: border-box;
|
|
1216
|
+
}
|
|
1217
|
+
|
|
1218
|
+
.pd-pageTitles {
|
|
1219
|
+
flex: 1;
|
|
1220
|
+
min-width: 0;
|
|
1221
|
+
display: flex;
|
|
1222
|
+
flex-direction: column;
|
|
1223
|
+
gap: 2px;
|
|
1224
|
+
}
|
|
1225
|
+
|
|
1226
|
+
.pd-pageTitle {
|
|
1227
|
+
margin: 0;
|
|
1228
|
+
font-size: 16px;
|
|
1229
|
+
line-height: 22px;
|
|
1230
|
+
font-weight: 500;
|
|
1231
|
+
color: var(--dsw-alias-label-primary);
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1234
|
+
/* 页头标题旁的版本号(vX.Y.Z):小号弱化文本,与标题同基线。 */
|
|
1235
|
+
/* 标题行:标题(含版本号)与页头更新卡并排,窄屏换行收纳。 */
|
|
1236
|
+
.pd-titleRow {
|
|
1237
|
+
display: flex;
|
|
1238
|
+
align-items: center;
|
|
1239
|
+
gap: 10px;
|
|
1240
|
+
flex-wrap: wrap;
|
|
1241
|
+
row-gap: 6px;
|
|
1242
|
+
min-width: 0;
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
.pd-versionTag {
|
|
1246
|
+
margin-left: 8px;
|
|
1247
|
+
font-size: 12px;
|
|
1248
|
+
line-height: inherit;
|
|
1249
|
+
font-weight: 400;
|
|
1250
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1251
|
+
font-variant-numeric: tabular-nums;
|
|
1252
|
+
}
|
|
1253
|
+
|
|
1254
|
+
.pd-pageSubtitle {
|
|
1255
|
+
margin: 0;
|
|
1256
|
+
font-size: 13px;
|
|
1257
|
+
line-height: 18px;
|
|
1258
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1259
|
+
}
|
|
1260
|
+
|
|
1261
|
+
.pd-closeBtn {
|
|
1262
|
+
flex: none;
|
|
1263
|
+
display: inline-flex;
|
|
1264
|
+
align-items: center;
|
|
1265
|
+
justify-content: center;
|
|
1266
|
+
width: 32px;
|
|
1267
|
+
height: 32px;
|
|
1268
|
+
padding: 0;
|
|
1269
|
+
border: none;
|
|
1270
|
+
border-radius: 8px;
|
|
1271
|
+
background: transparent;
|
|
1272
|
+
color: var(--dsw-alias-label-secondary);
|
|
1273
|
+
cursor: pointer;
|
|
1274
|
+
transition: background 0.12s ease, color 0.12s ease;
|
|
1275
|
+
}
|
|
1276
|
+
|
|
1277
|
+
.pd-closeBtn:hover {
|
|
1278
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
1279
|
+
color: var(--dsw-alias-label-primary);
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
.pd-closeBtn:focus-visible {
|
|
1283
|
+
outline: 2px solid var(--dsw-alias-border-l4);
|
|
1284
|
+
outline-offset: -2px;
|
|
1285
|
+
}
|
|
1286
|
+
|
|
1287
|
+
.pd-closeGlyph {
|
|
1288
|
+
font-size: 18px;
|
|
1289
|
+
line-height: 1;
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
/* 页面内容容器:全宽(跟随中栏宽度),自身即滚动容器(omd-actionBar 的
|
|
1293
|
+
sticky bottom 在其中成立,官方分组卡观感不变)。height 100% 供非 flex
|
|
1294
|
+
宿主兜底,flex 宿主里由 flex: 1 1 0 接管。 */
|
|
1295
|
+
.pd-page {
|
|
1296
|
+
flex: 1 1 0;
|
|
1297
|
+
height: 100%;
|
|
1298
|
+
min-height: 0;
|
|
1299
|
+
min-width: 0;
|
|
1300
|
+
width: 100%;
|
|
1301
|
+
padding: 14px 28px 28px;
|
|
1302
|
+
box-sizing: border-box;
|
|
1303
|
+
display: flex;
|
|
1304
|
+
flex-direction: column;
|
|
1305
|
+
gap: 16px;
|
|
1306
|
+
overflow-y: auto;
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
/* ── 「添加工作区」弹窗 ─────────────────────────────────────────────────
|
|
1310
|
+
语义与视觉对齐宿主设置页的对话框:fixed 全屏遮罩盖住中栏滚动区 + 居中卡片。
|
|
1311
|
+
卡片明暗两主题都用 bg-layer-1(深色下是深底、浅色下近白,与设置页卡片
|
|
1312
|
+
一致);卡片不设 overflow 裁剪——输入框的建议下拉要溢出卡片显示。
|
|
1313
|
+
遮罩无过渡动效,不必进 reduced-motion 清单。 */
|
|
1314
|
+
.pd-modalMask {
|
|
1315
|
+
position: fixed;
|
|
1316
|
+
inset: 0;
|
|
1317
|
+
z-index: 60;
|
|
1318
|
+
display: flex;
|
|
1319
|
+
align-items: center;
|
|
1320
|
+
justify-content: center;
|
|
1321
|
+
padding: 24px;
|
|
1322
|
+
background: rgba(0, 0, 0, 0.45);
|
|
1323
|
+
backdrop-filter: blur(2px);
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
.pd-modalCard {
|
|
1327
|
+
width: min(560px, 100%);
|
|
1328
|
+
box-sizing: border-box;
|
|
1329
|
+
border: 1px solid var(--dsw-alias-border-l2);
|
|
1330
|
+
border-radius: 12px;
|
|
1331
|
+
background: var(--dsw-alias-bg-layer-1);
|
|
1332
|
+
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.28);
|
|
1333
|
+
}
|
|
1334
|
+
|
|
1335
|
+
/* 确认弹窗卡片:只有一段正文 + 两个按钮,比表单弹窗窄一档更合比例。 */
|
|
1336
|
+
.pd-modalCard.pd-confirmCard {
|
|
1337
|
+
width: min(460px, 100%);
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1340
|
+
.pd-modalHeader {
|
|
1341
|
+
display: flex;
|
|
1342
|
+
align-items: center;
|
|
1343
|
+
justify-content: space-between;
|
|
1344
|
+
padding: 16px 20px 0;
|
|
1345
|
+
}
|
|
1346
|
+
|
|
1347
|
+
.pd-modalTitle {
|
|
1348
|
+
margin: 0;
|
|
1349
|
+
font-size: 15px;
|
|
1350
|
+
line-height: 20px;
|
|
1351
|
+
font-weight: 600;
|
|
1352
|
+
color: var(--dsw-alias-label-primary);
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1355
|
+
/* 弹窗右上关闭钮:复用页头 pd-closeBtn 的视觉,缩成 28px 方块。 */
|
|
1356
|
+
.pd-modalClose {
|
|
1357
|
+
flex: none;
|
|
1358
|
+
display: inline-flex;
|
|
1359
|
+
align-items: center;
|
|
1360
|
+
justify-content: center;
|
|
1361
|
+
width: 28px;
|
|
1362
|
+
height: 28px;
|
|
1363
|
+
padding: 0;
|
|
1364
|
+
border: none;
|
|
1365
|
+
border-radius: 8px;
|
|
1366
|
+
background: transparent;
|
|
1367
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1368
|
+
cursor: pointer;
|
|
1369
|
+
transition: background 0.12s ease, color 0.12s ease;
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
.pd-modalClose:hover {
|
|
1373
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
1374
|
+
color: var(--dsw-alias-label-primary);
|
|
1375
|
+
}
|
|
1376
|
+
|
|
1377
|
+
.pd-modalClose:focus-visible {
|
|
1378
|
+
outline: 2px solid var(--dsw-alias-border-l4);
|
|
1379
|
+
outline-offset: -2px;
|
|
1380
|
+
}
|
|
1381
|
+
|
|
1382
|
+
.pd-modalBody {
|
|
1383
|
+
display: flex;
|
|
1384
|
+
flex-direction: column;
|
|
1385
|
+
gap: 8px;
|
|
1386
|
+
padding: 12px 20px 4px;
|
|
1387
|
+
}
|
|
1388
|
+
|
|
1389
|
+
.pd-modalLabel {
|
|
1390
|
+
font-size: 13px;
|
|
1391
|
+
line-height: 18px;
|
|
1392
|
+
color: var(--dsw-alias-label-secondary);
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
/* 确认弹窗正文(confirmModalOf):多行文案(内置角色删除的恢复引导、升级
|
|
1396
|
+
说明等)用 pre-line 保留源串里的换行;字色用主标签色,与次级 label 拉开
|
|
1397
|
+
层级——正文是用户要做决定的内容,得是最重的一档。 */
|
|
1398
|
+
.pd-modalText {
|
|
1399
|
+
font-size: 13px;
|
|
1400
|
+
line-height: 1.6;
|
|
1401
|
+
color: var(--dsw-alias-label-primary);
|
|
1402
|
+
white-space: pre-line;
|
|
1403
|
+
}
|
|
1404
|
+
|
|
1405
|
+
.pd-modalFooter {
|
|
1406
|
+
display: flex;
|
|
1407
|
+
justify-content: flex-end;
|
|
1408
|
+
gap: 8px;
|
|
1409
|
+
padding: 12px 20px 16px;
|
|
1410
|
+
}
|
|
1411
|
+
|
|
1412
|
+
/* 确认弹窗的危险确认钮(删除类操作):背景 / 边框走危险色 token,文字用反
|
|
1413
|
+
色标签 token——明暗两主题都由主题层自适应,不在样式里写死色值。选择器带
|
|
1414
|
+
.pd-modalFooter 前缀(0,2,0)压过 P.Button 变体类(0,1,0),不依赖样式表
|
|
1415
|
+
加载顺序;hover 用 85% 透明混合,深色下变暗、浅色下变淡,均读作「轻后退」。 */
|
|
1416
|
+
.pd-modalFooter .pd-dangerBtn {
|
|
1417
|
+
background: var(--dsw-alias-state-error-primary);
|
|
1418
|
+
border-color: var(--dsw-alias-state-error-primary);
|
|
1419
|
+
color: var(--dsw-alias-label-primary-inverted);
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1422
|
+
.pd-modalFooter .pd-dangerBtn:hover {
|
|
1423
|
+
background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 85%, transparent);
|
|
1424
|
+
border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 85%, transparent);
|
|
1425
|
+
}
|
|
1426
|
+
|
|
1427
|
+
.pd-modalFooter .pd-dangerBtn:disabled {
|
|
1428
|
+
opacity: 0.5;
|
|
1429
|
+
cursor: not-allowed;
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
/* ── Toast 反馈(fixed 悬浮于操作坞上方)──────────────────────────────── */
|
|
1433
|
+
.pd-toastHost {
|
|
1434
|
+
position: fixed;
|
|
1435
|
+
left: 50%;
|
|
1436
|
+
bottom: 88px; /* 操作坞(sticky 底部,约 64px)上方留出一截 */
|
|
1437
|
+
transform: translateX(-50%);
|
|
1438
|
+
z-index: 70; /* 高于弹窗遮罩 z-60:应用类操作不来自弹窗,不冲突 */
|
|
1439
|
+
display: flex;
|
|
1440
|
+
flex-direction: column;
|
|
1441
|
+
align-items: center;
|
|
1442
|
+
gap: 8px;
|
|
1443
|
+
max-width: min(640px, calc(100vw - 32px));
|
|
1444
|
+
pointer-events: none; /* host 不挡下方内容,只有 toast 本体接事件 */
|
|
1445
|
+
}
|
|
1446
|
+
|
|
1447
|
+
.pd-toast {
|
|
1448
|
+
display: flex;
|
|
1449
|
+
align-items: flex-start;
|
|
1450
|
+
gap: 10px;
|
|
1451
|
+
padding: 10px 12px;
|
|
1452
|
+
box-sizing: border-box;
|
|
1453
|
+
border: 1px solid var(--dsw-alias-border-l2);
|
|
1454
|
+
border-left: 3px solid var(--dsw-alias-border-l3);
|
|
1455
|
+
border-radius: 10px;
|
|
1456
|
+
background: var(--dsw-alias-bg-layer-1);
|
|
1457
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
|
|
1458
|
+
pointer-events: auto;
|
|
1459
|
+
animation: pd-toastIn 0.18s ease;
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
@keyframes pd-toastIn {
|
|
1463
|
+
from { opacity: 0; transform: translateY(6px); }
|
|
1464
|
+
to { opacity: 1; transform: translateY(0); }
|
|
1465
|
+
}
|
|
1466
|
+
|
|
1467
|
+
.pd-toastOk { border-left-color: var(--dsw-alias-state-success-primary); }
|
|
1468
|
+
.pd-toastWarn { border-left-color: var(--dsw-alias-state-warn-primary); }
|
|
1469
|
+
.pd-toastErr { border-left-color: var(--dsw-alias-state-error-primary); }
|
|
1470
|
+
|
|
1471
|
+
.pd-toastIcon { flex: none; font-size: 13px; line-height: 18px; }
|
|
1472
|
+
|
|
1473
|
+
.pd-toastText {
|
|
1474
|
+
min-width: 0;
|
|
1475
|
+
max-height: 200px; /* 错误文本可能很长(npx 输出尾部等),限高滚动 */
|
|
1476
|
+
overflow-y: auto;
|
|
1477
|
+
scrollbar-width: thin;
|
|
1478
|
+
font-size: 13px;
|
|
1479
|
+
line-height: 18px;
|
|
1480
|
+
color: var(--dsw-alias-label-primary);
|
|
1481
|
+
white-space: pre-wrap;
|
|
1482
|
+
overflow-wrap: anywhere;
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
.pd-toastClose {
|
|
1486
|
+
flex: none;
|
|
1487
|
+
width: 24px;
|
|
1488
|
+
height: 24px;
|
|
1489
|
+
/* 视觉复用 pd-closeBtn 的透明底做法 */
|
|
1490
|
+
display: inline-flex;
|
|
1491
|
+
align-items: center;
|
|
1492
|
+
justify-content: center;
|
|
1493
|
+
border: none;
|
|
1494
|
+
border-radius: 6px;
|
|
1495
|
+
background: transparent;
|
|
1496
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1497
|
+
font-size: 14px;
|
|
1498
|
+
line-height: 1;
|
|
1499
|
+
cursor: pointer;
|
|
1500
|
+
}
|
|
1501
|
+
|
|
1502
|
+
.pd-toastClose:hover {
|
|
1503
|
+
color: var(--dsw-alias-label-primary);
|
|
1504
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
.pd-toastClose:focus-visible {
|
|
1508
|
+
outline: 2px solid var(--dsw-alias-border-l4);
|
|
1509
|
+
outline-offset: 1px;
|
|
1510
|
+
}
|
|
1511
|
+
|
|
1512
|
+
/* ── 事件流委派行(tool.call.toolview 键控行替换)────────────────────── */
|
|
1513
|
+
|
|
1514
|
+
.pd-delegateRow {
|
|
1515
|
+
margin: 1px 0;
|
|
1516
|
+
min-width: 0;
|
|
1517
|
+
}
|
|
1518
|
+
|
|
1519
|
+
.pd-delegateHead {
|
|
1520
|
+
box-sizing: border-box;
|
|
1521
|
+
width: 100%;
|
|
1522
|
+
min-height: 30px;
|
|
1523
|
+
display: flex;
|
|
1524
|
+
align-items: center;
|
|
1525
|
+
gap: 8px;
|
|
1526
|
+
padding: 3px 8px;
|
|
1527
|
+
border: 0;
|
|
1528
|
+
border-radius: 8px;
|
|
1529
|
+
background: transparent;
|
|
1530
|
+
color: var(--dsw-alias-label-secondary);
|
|
1531
|
+
cursor: pointer;
|
|
1532
|
+
text-align: left;
|
|
1533
|
+
font-size: 13px;
|
|
1534
|
+
line-height: 20px;
|
|
1535
|
+
min-width: 0;
|
|
1536
|
+
transition: background 0.12s ease;
|
|
1537
|
+
}
|
|
1538
|
+
|
|
1539
|
+
.pd-delegateHead:hover,
|
|
1540
|
+
.pd-delegateHead:focus-visible {
|
|
1541
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
1542
|
+
outline: none;
|
|
1543
|
+
}
|
|
1544
|
+
|
|
1545
|
+
.pd-delegateState {
|
|
1546
|
+
flex: none;
|
|
1547
|
+
width: 14px;
|
|
1548
|
+
font-size: 12px;
|
|
1549
|
+
line-height: 20px;
|
|
1550
|
+
text-align: center;
|
|
1551
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1552
|
+
}
|
|
1553
|
+
|
|
1554
|
+
.pd-delegateDone { color: var(--dsw-alias-state-success-primary); }
|
|
1555
|
+
.pd-delegateFailed { color: var(--dsw-alias-state-error-primary); }
|
|
1556
|
+
.pd-delegateStopped { color: var(--dsw-alias-label-tertiary); }
|
|
1557
|
+
|
|
1558
|
+
.pd-delegateRunning {
|
|
1559
|
+
animation: pd-delegatePulse 1.2s ease-in-out infinite;
|
|
1560
|
+
}
|
|
1561
|
+
|
|
1562
|
+
@keyframes pd-delegatePulse {
|
|
1563
|
+
0%, 100% { opacity: 1; }
|
|
1564
|
+
50% { opacity: 0.35; }
|
|
1565
|
+
}
|
|
1566
|
+
|
|
1567
|
+
.pd-delegateTitle {
|
|
1568
|
+
flex: none;
|
|
1569
|
+
font-weight: 500;
|
|
1570
|
+
color: var(--dsw-alias-label-secondary);
|
|
1571
|
+
max-width: 200px;
|
|
1572
|
+
overflow: hidden;
|
|
1573
|
+
text-overflow: ellipsis;
|
|
1574
|
+
white-space: nowrap;
|
|
1575
|
+
}
|
|
1576
|
+
|
|
1577
|
+
.pd-delegateDesc {
|
|
1578
|
+
flex: 1 1 auto;
|
|
1579
|
+
min-width: 0;
|
|
1580
|
+
overflow: hidden;
|
|
1581
|
+
text-overflow: ellipsis;
|
|
1582
|
+
white-space: nowrap;
|
|
1583
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1584
|
+
}
|
|
1585
|
+
|
|
1586
|
+
.pd-delegateChev {
|
|
1587
|
+
margin-left: auto;
|
|
1588
|
+
flex: none;
|
|
1589
|
+
font-size: 12px;
|
|
1590
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1591
|
+
transition: transform 0.12s ease;
|
|
1592
|
+
}
|
|
1593
|
+
|
|
1594
|
+
.pd-delegateChevOpen { transform: rotate(90deg); }
|
|
1595
|
+
|
|
1596
|
+
.pd-delegateBody {
|
|
1597
|
+
margin: 2px 0 6px 22px;
|
|
1598
|
+
padding: 8px 10px;
|
|
1599
|
+
border-radius: 8px;
|
|
1600
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
1601
|
+
color: var(--dsw-alias-label-secondary);
|
|
1602
|
+
font-size: 12px;
|
|
1603
|
+
line-height: 18px;
|
|
1604
|
+
white-space: pre-wrap;
|
|
1605
|
+
word-break: break-word;
|
|
1606
|
+
max-height: 280px;
|
|
1607
|
+
overflow: auto;
|
|
1608
|
+
--dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);
|
|
1609
|
+
}
|
|
1610
|
+
|
|
1611
|
+
.pd-delegateErr .pd-delegateTitle { color: var(--dsw-alias-state-error-primary); }
|
|
1612
|
+
|
|
1613
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1614
|
+
.pd-delegateRunning { animation: none; }
|
|
1615
|
+
.pd-delegateChev { transition: none; }
|
|
1616
|
+
.pd-delegateHead { transition: none; }
|
|
1617
|
+
}
|
|
1618
|
+
|
|
1619
|
+
/* ── 侧栏底部入口(sidebar.footer.action)────────────────────────── */
|
|
1620
|
+
/* 观感对齐宿主:宽栏 = 42px 圆角行(图标 + 文案),与设置触发钮 / cordis
|
|
1621
|
+
徽章同族;窄栏(56px rail)= 36px 圆形图标钮,外距对齐设置行的 railRow。 */
|
|
1622
|
+
|
|
1623
|
+
.pd-footerBtn {
|
|
1624
|
+
box-sizing: border-box;
|
|
1625
|
+
width: calc(100% + 4px);
|
|
1626
|
+
height: 42px;
|
|
1627
|
+
color: var(--dsw-alias-label-primary);
|
|
1628
|
+
cursor: pointer;
|
|
1629
|
+
background: 0 0;
|
|
1630
|
+
border: none;
|
|
1631
|
+
border-radius: 12px;
|
|
1632
|
+
align-items: center;
|
|
1633
|
+
gap: 8px;
|
|
1634
|
+
margin: 0 -2px;
|
|
1635
|
+
padding: 0 10px 0 8px;
|
|
1636
|
+
font-family: inherit;
|
|
1637
|
+
font-size: 14px;
|
|
1638
|
+
display: inline-flex;
|
|
1639
|
+
overflow: hidden;
|
|
1640
|
+
}
|
|
1641
|
+
|
|
1642
|
+
.pd-footerBtn:hover,
|
|
1643
|
+
.pd-footerBtn[data-active="true"] {
|
|
1644
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
1645
|
+
}
|
|
1646
|
+
|
|
1647
|
+
.pd-footerLabel {
|
|
1648
|
+
text-overflow: ellipsis;
|
|
1649
|
+
white-space: nowrap;
|
|
1650
|
+
min-width: 0;
|
|
1651
|
+
overflow: hidden;
|
|
1652
|
+
}
|
|
1653
|
+
|
|
1654
|
+
/* footerActions 默认横向 flex,多个动作并排一行;用户要「一行一个」。
|
|
1655
|
+
注意层级:footerActions > div[data-slot="sidebar.footer.action"](宿主
|
|
1656
|
+
SlotOutlet 锚点,display: contents 透传)> 各家按钮——所以 flex-direction
|
|
1657
|
+
要落在锚点的父容器上,落在锚点自身无效(display: contents 不生成盒)。
|
|
1658
|
+
:has() 不支持的老浏览器回落并排,不破坏功能。窄栏下 36px 圆钮同样
|
|
1659
|
+
纵向排列、由 footArea 居中。 */
|
|
1660
|
+
div:has(> div[data-slot="sidebar.footer.action"]) {
|
|
1661
|
+
flex-direction: column;
|
|
1662
|
+
}
|
|
1663
|
+
|
|
1664
|
+
.pd-footerBtn.pd-footerRail {
|
|
1665
|
+
corner-shape: round;
|
|
1666
|
+
border-radius: 50%;
|
|
1667
|
+
justify-content: center;
|
|
1668
|
+
gap: 0;
|
|
1669
|
+
width: 36px;
|
|
1670
|
+
height: 36px;
|
|
1671
|
+
margin: 8px 0 10px;
|
|
1672
|
+
padding: 0;
|
|
632
1673
|
}
|