dsh-plugin 0.1.1 → 1.0.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.en.md +49 -26
- package/README.md +49 -26
- package/client/client.js +2148 -229
- package/client/client.js.map +1 -1
- package/lib/http/routes.js +396 -0
- package/lib/index.js +17 -8
- package/lib/services/install-types.js +11 -0
- package/lib/services/install.js +4 -0
- package/lib/services/installed-versions.js +51 -0
- package/lib/services/loader.js +98 -0
- package/lib/services/pending-restart.js +34 -0
- package/lib/services/preflight.js +94 -0
- package/lib/services/profile.js +88 -0
- package/lib/services/progress.js +50 -0
- package/lib/services/task-queue.js +417 -0
- package/lib/types/http/routes.d.ts +23 -0
- package/lib/types/index.d.ts +27 -0
- package/lib/types/services/install-types.d.ts +63 -0
- package/lib/types/services/install.d.ts +18 -0
- package/lib/types/services/installed-versions.d.ts +14 -0
- package/lib/types/services/loader.d.ts +43 -0
- package/lib/types/services/pending-restart.d.ts +13 -0
- package/lib/types/services/preflight.d.ts +6 -0
- package/lib/types/services/profile.d.ts +24 -0
- package/lib/types/services/progress.d.ts +17 -0
- package/lib/types/services/task-queue.d.ts +76 -0
- package/package.json +27 -6
- package/src/client/components/CatalogControls.tsx +104 -0
- package/src/client/components/CatalogHeader.tsx +78 -0
- package/src/client/components/CatalogList.tsx +75 -0
- package/src/client/components/CategoryTabs.tsx +35 -0
- package/src/client/components/Dropdown.tsx +80 -0
- package/src/client/components/NotificationsModal.tsx +230 -0
- package/src/client/components/PluginCard.tsx +104 -0
- package/src/client/components/PluginHubSection.tsx +339 -0
- package/src/client/components/ProgressView.tsx +23 -0
- package/src/client/components/icons.tsx +125 -0
- package/src/client/components/modals.tsx +365 -0
- package/src/client/hooks/useCatalog.ts +192 -0
- package/src/client/hooks/useTaskQueue.ts +405 -0
- package/src/client/index.tsx +8 -422
- package/src/client/lib/catalog.ts +204 -0
- package/src/client/lib/env.ts +16 -0
- package/src/client/lib/failures.ts +153 -0
- package/src/client/lib/format.ts +22 -0
- package/src/client/locales.ts +186 -18
- package/src/client/styles/Dropdown.module.css +123 -0
- package/src/client/styles/Header.module.css +432 -0
- package/src/client/styles/List.module.css +324 -0
- package/src/client/styles/Modal.module.css +965 -0
- package/src/client/styles/tokens.module.css +86 -0
- package/src/client/types.ts +80 -0
- package/src/server/http/routes.ts +397 -0
- package/src/server/index.ts +35 -0
- package/src/server/services/install-types.ts +63 -0
- package/src/server/services/install.ts +18 -0
- package/src/server/services/installed-versions.ts +65 -0
- package/src/server/services/loader.ts +110 -0
- package/src/server/services/pending-restart.ts +36 -0
- package/src/server/services/preflight.ts +97 -0
- package/src/server/services/profile.ts +89 -0
- package/src/server/services/progress.ts +48 -0
- package/src/server/services/task-queue.ts +450 -0
- package/src/client/Section.module.css +0 -589
|
@@ -0,0 +1,965 @@
|
|
|
1
|
+
/* Plugin Hub dialogs and overlays: install / uninstall modals, error dialog,
|
|
2
|
+
* failure-record dialog, task-queue dialog, progress strip, inline progress
|
|
3
|
+
* and the global toast. Colors resolve through the --hub-* design tokens. */
|
|
4
|
+
|
|
5
|
+
/* —— modal base —— */
|
|
6
|
+
|
|
7
|
+
.overlay {
|
|
8
|
+
position: fixed;
|
|
9
|
+
inset: 0;
|
|
10
|
+
z-index: 998;
|
|
11
|
+
display: flex;
|
|
12
|
+
align-items: center;
|
|
13
|
+
justify-content: center;
|
|
14
|
+
background: rgba(0, 0, 0, 0.38);
|
|
15
|
+
animation: overlayIn 160ms ease-out;
|
|
16
|
+
user-select: none;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* 弹窗基座:安装/卸载确认、错误、失败记录共用;错误类弹窗(.errorModal)单独加宽 */
|
|
20
|
+
.modal,
|
|
21
|
+
.errorModal {
|
|
22
|
+
width: 420px;
|
|
23
|
+
max-width: calc(100vw - 32px);
|
|
24
|
+
/* 高度自适应屏幕(桌面/手机视口):内容超长时窗体内滚动,头部与按钮不消失 */
|
|
25
|
+
max-height: calc(100dvh - 64px);
|
|
26
|
+
max-height: calc(100vh - 64px);
|
|
27
|
+
display: flex;
|
|
28
|
+
flex-direction: column;
|
|
29
|
+
gap: 10px;
|
|
30
|
+
padding: 14px 16px;
|
|
31
|
+
border-radius: 10px;
|
|
32
|
+
background: var(--hub-bg-1);
|
|
33
|
+
border: 1px solid var(--hub-border-2);
|
|
34
|
+
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.24);
|
|
35
|
+
animation: modalIn 180ms ease-out;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* 错误/失败记录弹窗:宽一些,错误详情长行少折行、阅读更顺;两边留白也更稳 */
|
|
39
|
+
.errorModal {
|
|
40
|
+
width: 640px;
|
|
41
|
+
max-width: calc(100vw - 48px);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.modalHead {
|
|
45
|
+
display: flex;
|
|
46
|
+
align-items: center;
|
|
47
|
+
justify-content: space-between;
|
|
48
|
+
gap: 8px;
|
|
49
|
+
flex-shrink: 0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.modalTitle {
|
|
53
|
+
font-size: 14px;
|
|
54
|
+
font-weight: 600;
|
|
55
|
+
line-height: 20px;
|
|
56
|
+
color: var(--hub-text-primary);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* 进行中标题(插件名 + 安装中/卸载中):品牌蓝,与普通弹窗标题区分 */
|
|
60
|
+
.modalTitleBusy {
|
|
61
|
+
color: var(--hub-brand);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* 排队等待标题:琥珀色,提示任务还在队列里等待执行 */
|
|
65
|
+
.modalTitleQueued {
|
|
66
|
+
color: var(--hub-warning);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.modalClose {
|
|
70
|
+
flex-shrink: 0;
|
|
71
|
+
width: 24px;
|
|
72
|
+
height: 24px;
|
|
73
|
+
display: inline-flex;
|
|
74
|
+
align-items: center;
|
|
75
|
+
justify-content: center;
|
|
76
|
+
font-size: 16px;
|
|
77
|
+
line-height: 1;
|
|
78
|
+
color: var(--hub-text-tertiary);
|
|
79
|
+
background: transparent;
|
|
80
|
+
border: none;
|
|
81
|
+
border-radius: 6px;
|
|
82
|
+
cursor: pointer;
|
|
83
|
+
user-select: none;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.modalClose:hover {
|
|
87
|
+
color: var(--hub-text-primary);
|
|
88
|
+
background: var(--hub-bg-hover);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* 关闭按钮图标:内联 SVG,stroke 继承 currentColor,随按钮禁用态一起变淡 */
|
|
92
|
+
.modalCloseIcon {
|
|
93
|
+
width: 14px;
|
|
94
|
+
height: 14px;
|
|
95
|
+
flex-shrink: 0;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.modalDesc {
|
|
99
|
+
font-size: 12px;
|
|
100
|
+
line-height: 18px;
|
|
101
|
+
color: var(--hub-text-secondary);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* 信任警示(社区第三方代码):红色醒目,强调风险 */
|
|
105
|
+
.trustHint {
|
|
106
|
+
font-size: 12px;
|
|
107
|
+
line-height: 18px;
|
|
108
|
+
font-weight: 500;
|
|
109
|
+
color: var(--hub-danger-text);
|
|
110
|
+
background: var(--hub-danger-tint);
|
|
111
|
+
border: 1px solid var(--hub-danger-border-soft);
|
|
112
|
+
border-radius: 6px;
|
|
113
|
+
padding: 6px 10px;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.modalRow {
|
|
117
|
+
display: flex;
|
|
118
|
+
align-items: baseline;
|
|
119
|
+
gap: 8px;
|
|
120
|
+
font-size: 12px;
|
|
121
|
+
line-height: 18px;
|
|
122
|
+
min-width: 0;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.modalLabel {
|
|
126
|
+
flex-shrink: 0;
|
|
127
|
+
min-width: 64px;
|
|
128
|
+
color: var(--hub-text-tertiary);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.modalValue {
|
|
132
|
+
min-width: 0;
|
|
133
|
+
overflow: hidden;
|
|
134
|
+
text-overflow: ellipsis;
|
|
135
|
+
white-space: nowrap;
|
|
136
|
+
font-weight: 500;
|
|
137
|
+
color: var(--hub-text-primary);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* 来源仓库:蓝色可点击链接 + 链节图标,跳转官网收录详情页(新窗口),hover 加下划线提示可点 */
|
|
141
|
+
.modalLink {
|
|
142
|
+
min-width: 0;
|
|
143
|
+
overflow: hidden;
|
|
144
|
+
text-overflow: ellipsis;
|
|
145
|
+
white-space: nowrap;
|
|
146
|
+
display: inline-flex;
|
|
147
|
+
align-items: center;
|
|
148
|
+
gap: 4px;
|
|
149
|
+
font-weight: 500;
|
|
150
|
+
color: var(--hub-brand);
|
|
151
|
+
text-decoration: none;
|
|
152
|
+
cursor: pointer;
|
|
153
|
+
user-select: none;
|
|
154
|
+
transition: color 120ms ease;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.modalLink:hover {
|
|
158
|
+
color: var(--hub-brand-hover);
|
|
159
|
+
text-decoration: underline;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/* 来源链接图标:与文字垂直居中对齐,不参与省略号计算 */
|
|
163
|
+
.linkIcon {
|
|
164
|
+
flex-shrink: 0;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/* 手动安装命令条:整条可点击复制(flex 布局,命令文本 + 右侧小复制按钮) */
|
|
168
|
+
.modalCmd {
|
|
169
|
+
display: flex;
|
|
170
|
+
align-items: center;
|
|
171
|
+
justify-content: space-between;
|
|
172
|
+
gap: 8px;
|
|
173
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
174
|
+
font-size: 11px;
|
|
175
|
+
line-height: 18px;
|
|
176
|
+
color: var(--hub-text-primary);
|
|
177
|
+
background: var(--hub-bg-2);
|
|
178
|
+
border: 1px solid var(--hub-border-2);
|
|
179
|
+
border-radius: 6px;
|
|
180
|
+
padding: 6px 6px 6px 10px;
|
|
181
|
+
cursor: pointer;
|
|
182
|
+
user-select: none;
|
|
183
|
+
transition: border-color 120ms ease, background 120ms ease;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.modalCmd:hover {
|
|
187
|
+
border-color: var(--hub-border-ghost);
|
|
188
|
+
background: var(--hub-bg-3);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.modalCmdText {
|
|
192
|
+
min-width: 0;
|
|
193
|
+
overflow: hidden;
|
|
194
|
+
text-overflow: ellipsis;
|
|
195
|
+
white-space: nowrap;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/* 命令条右侧的小复制按钮:蓝色文字 + 图标,提示可复制 */
|
|
199
|
+
.modalCmdCopy {
|
|
200
|
+
flex-shrink: 0;
|
|
201
|
+
display: inline-flex;
|
|
202
|
+
align-items: center;
|
|
203
|
+
gap: 3px;
|
|
204
|
+
font-family: inherit;
|
|
205
|
+
font-size: 11px;
|
|
206
|
+
line-height: 16px;
|
|
207
|
+
color: var(--hub-brand);
|
|
208
|
+
background: transparent;
|
|
209
|
+
border: none;
|
|
210
|
+
border-radius: 4px;
|
|
211
|
+
padding: 1px 7px;
|
|
212
|
+
cursor: pointer;
|
|
213
|
+
user-select: none;
|
|
214
|
+
transition: color 120ms ease, background 120ms ease;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.modalCmdCopy:hover {
|
|
218
|
+
color: var(--hub-brand-hover);
|
|
219
|
+
background: var(--hub-bg-2);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.modalActions {
|
|
223
|
+
display: flex;
|
|
224
|
+
align-items: center;
|
|
225
|
+
justify-content: flex-end;
|
|
226
|
+
gap: 8px;
|
|
227
|
+
margin-top: 2px;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* 卸载弹窗确认/进行中内容区:与弹窗一致的纵向间距 */
|
|
231
|
+
.modalBody {
|
|
232
|
+
display: flex;
|
|
233
|
+
flex-direction: column;
|
|
234
|
+
gap: 10px;
|
|
235
|
+
/* 窗体内滚动:窗体高度触顶(max-height)后,内容在这里滚动,头部始终可见 */
|
|
236
|
+
flex: 1 1 auto;
|
|
237
|
+
min-height: 0;
|
|
238
|
+
overflow-y: auto;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/* —— toast —— */
|
|
242
|
+
|
|
243
|
+
/* 复制成功提示条:窗口正中央浮出,无遮罩无图标。采用反色浮层——亮色模式
|
|
244
|
+
黑底白字、暗色模式白底深字(复用主按钮 token:primary-fill 与
|
|
245
|
+
label-primary-foreground 在两种主题下正好互换),与页面背景相反,始终醒目。
|
|
246
|
+
base 上直接写死居中 transform,动画结束(fill-mode 默认 none)后
|
|
247
|
+
transform 会回落到 base 值,保证动画前后位置一致、不跳动。 */
|
|
248
|
+
.toast {
|
|
249
|
+
position: fixed;
|
|
250
|
+
left: 50%;
|
|
251
|
+
top: 50%;
|
|
252
|
+
transform: translate(-50%, -50%);
|
|
253
|
+
z-index: 1000;
|
|
254
|
+
padding: 10px 16px;
|
|
255
|
+
border-radius: 8px;
|
|
256
|
+
background: var(--hub-btn-fill);
|
|
257
|
+
border: none;
|
|
258
|
+
color: var(--hub-text-on-fill);
|
|
259
|
+
font-size: 12px;
|
|
260
|
+
font-weight: 500;
|
|
261
|
+
line-height: 18px;
|
|
262
|
+
box-shadow: 0 6px 24px rgba(0, 0, 0, 0.28);
|
|
263
|
+
animation: toastIn 220ms ease-out;
|
|
264
|
+
pointer-events: none;
|
|
265
|
+
white-space: nowrap;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
@keyframes toastIn {
|
|
269
|
+
from {
|
|
270
|
+
opacity: 0;
|
|
271
|
+
transform: translate(-50%, -44%);
|
|
272
|
+
}
|
|
273
|
+
to {
|
|
274
|
+
opacity: 1;
|
|
275
|
+
transform: translate(-50%, -50%);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/* 安装失败 Toast:固定红色底白字,两种主题下都醒目,与成功/复制反色态区分。 */
|
|
280
|
+
.toastFail {
|
|
281
|
+
background: var(--hub-danger);
|
|
282
|
+
border-color: rgba(255, 255, 255, 0.24);
|
|
283
|
+
color: #ffffff;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/* 弹窗内分区(待重启 / 进行中):分区之间留出呼吸感,标题区分两类任务 */
|
|
287
|
+
.queueSection {
|
|
288
|
+
display: flex;
|
|
289
|
+
flex-direction: column;
|
|
290
|
+
gap: 6px;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
.queueSectionTitle {
|
|
294
|
+
font-size: 12px;
|
|
295
|
+
font-weight: 600;
|
|
296
|
+
line-height: 18px;
|
|
297
|
+
color: var(--hub-text-secondary);
|
|
298
|
+
padding: 4px 2px 0;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/* 待重启状态文案:琥珀色 = 「需要你采取行动」,与「可更新」按钮同语义色 */
|
|
302
|
+
.pendingRowStatus {
|
|
303
|
+
flex-shrink: 0;
|
|
304
|
+
color: var(--hub-warn);
|
|
305
|
+
font-weight: 500;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/* 待重启操作按钮组:状态文案左侧、按钮靠右(稍后重启 / 立即重启) */
|
|
309
|
+
.pendingRowActions {
|
|
310
|
+
margin-left: auto;
|
|
311
|
+
display: flex;
|
|
312
|
+
flex-shrink: 0;
|
|
313
|
+
gap: 8px;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/* 每条任务 = 一张独立卡片:边框 + 底色 + 圆角,多条排队之间清晰分隔,互不混淆 */
|
|
317
|
+
.queueRow {
|
|
318
|
+
display: flex;
|
|
319
|
+
flex-direction: column;
|
|
320
|
+
gap: 5px;
|
|
321
|
+
padding: 8px 10px;
|
|
322
|
+
font-size: 12px;
|
|
323
|
+
line-height: 18px;
|
|
324
|
+
border: 1px solid var(--hub-border-2);
|
|
325
|
+
border-radius: 8px;
|
|
326
|
+
background: var(--hub-bg-2);
|
|
327
|
+
transition: background 120ms ease;
|
|
328
|
+
cursor: pointer;
|
|
329
|
+
user-select: none;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
.queueRow:hover {
|
|
333
|
+
background: var(--hub-brand-tint);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/* 插件名一行:名称占满剩余宽度,取消按钮固定在右侧 */
|
|
337
|
+
.queueRowHead {
|
|
338
|
+
display: flex;
|
|
339
|
+
align-items: center;
|
|
340
|
+
gap: 10px;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.queueRowTarget {
|
|
344
|
+
flex: 1;
|
|
345
|
+
min-width: 0;
|
|
346
|
+
overflow: hidden;
|
|
347
|
+
text-overflow: ellipsis;
|
|
348
|
+
white-space: nowrap;
|
|
349
|
+
color: var(--hub-text-primary);
|
|
350
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/* 仓库名下方的插件中文简介:灰字、最多两行截断,悬停完整显示 */
|
|
354
|
+
.queueRowDesc {
|
|
355
|
+
color: var(--hub-text-tertiary);
|
|
356
|
+
display: -webkit-box;
|
|
357
|
+
-webkit-line-clamp: 2;
|
|
358
|
+
-webkit-box-orient: vertical;
|
|
359
|
+
overflow: hidden;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/* 状态 + 蓝色进度条 + 百分比一行:与插件名分开展示 */
|
|
363
|
+
.queueRowBody {
|
|
364
|
+
display: flex;
|
|
365
|
+
align-items: center;
|
|
366
|
+
gap: 8px;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
.queueRowStatus {
|
|
370
|
+
flex-shrink: 0;
|
|
371
|
+
color: var(--hub-brand);
|
|
372
|
+
font-weight: 500;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/* 进度条轨道占满剩余宽度(蓝条样式复用 progressTrack/progressFill) */
|
|
376
|
+
.queueRowTrack {
|
|
377
|
+
flex: 1;
|
|
378
|
+
min-width: 0;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
.queueRowPct {
|
|
382
|
+
flex-shrink: 0;
|
|
383
|
+
color: var(--hub-text-tertiary);
|
|
384
|
+
font-variant-numeric: tabular-nums;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/* 取消单个任务:危险语义(红),hover 明显 */
|
|
388
|
+
.stripCancel {
|
|
389
|
+
flex-shrink: 0;
|
|
390
|
+
font-size: 12px;
|
|
391
|
+
line-height: 18px;
|
|
392
|
+
padding: 2px 10px;
|
|
393
|
+
color: var(--hub-text-secondary);
|
|
394
|
+
background: transparent;
|
|
395
|
+
border: none;
|
|
396
|
+
border-radius: 6px;
|
|
397
|
+
cursor: pointer;
|
|
398
|
+
user-select: none;
|
|
399
|
+
transition: background 120ms ease, color 120ms ease;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
.stripCancel:hover {
|
|
403
|
+
background: var(--hub-danger-tint);
|
|
404
|
+
color: var(--hub-danger-text);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/* 取消中:按钮失效置灰,避免重复取消 */
|
|
408
|
+
.stripCancel:disabled {
|
|
409
|
+
opacity: 0.45;
|
|
410
|
+
cursor: default;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/* 排队提示:任务已入队等待前序完成时,弹窗内显示 */
|
|
414
|
+
.queuedHint {
|
|
415
|
+
font-size: 12px;
|
|
416
|
+
line-height: 18px;
|
|
417
|
+
color: var(--hub-brand);
|
|
418
|
+
background: var(--hub-brand-tint);
|
|
419
|
+
border: 1px solid var(--hub-brand-border-soft);
|
|
420
|
+
border-radius: 6px;
|
|
421
|
+
padding: 5px 10px;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/* —— 操作失败弹窗 —— */
|
|
425
|
+
|
|
426
|
+
/* 失败标题:红色强调,明确「操作失败」语义 */
|
|
427
|
+
.errorTitle {
|
|
428
|
+
font-size: 14px;
|
|
429
|
+
line-height: 20px;
|
|
430
|
+
font-weight: 600;
|
|
431
|
+
color: var(--hub-danger-text);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/* 错误信息正文:等宽字体 + 可滚动 + 保留换行,完整展示服务端报错 */
|
|
435
|
+
.errorBox {
|
|
436
|
+
margin: 0;
|
|
437
|
+
max-height: 240px;
|
|
438
|
+
overflow: auto;
|
|
439
|
+
padding: 10px 12px;
|
|
440
|
+
border: 1px solid var(--hub-danger-border);
|
|
441
|
+
border-radius: 6px;
|
|
442
|
+
background: var(--hub-danger-tint-weak);
|
|
443
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
444
|
+
font-size: 11px;
|
|
445
|
+
line-height: 17px;
|
|
446
|
+
color: var(--hub-text-primary);
|
|
447
|
+
white-space: pre-wrap;
|
|
448
|
+
word-break: break-word;
|
|
449
|
+
/* 报错信息不让鼠标选择复制:只能点上面的复制按钮,避免误选带走全部日志 */
|
|
450
|
+
-webkit-user-select: none;
|
|
451
|
+
user-select: none;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/* 错误弹窗顶部的隐蔽复制按钮:浅灰小字、无边框,不抢视线,仍可一键复制日志 */
|
|
455
|
+
.errorCopySoft {
|
|
456
|
+
flex-shrink: 0;
|
|
457
|
+
display: inline-flex;
|
|
458
|
+
align-items: center;
|
|
459
|
+
font-size: 11px;
|
|
460
|
+
line-height: 16px;
|
|
461
|
+
color: var(--hub-text-tertiary);
|
|
462
|
+
background: transparent;
|
|
463
|
+
border: none;
|
|
464
|
+
border-radius: 4px;
|
|
465
|
+
padding: 2px 8px;
|
|
466
|
+
cursor: pointer;
|
|
467
|
+
user-select: none;
|
|
468
|
+
transition: color 120ms ease, background 120ms ease;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
.errorCopySoft:hover {
|
|
472
|
+
color: var(--hub-text-secondary);
|
|
473
|
+
background: var(--hub-bg-2);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/* 通知中心说明行:次要信息,弱化样式 */
|
|
477
|
+
.errorHint {
|
|
478
|
+
font-size: 12px;
|
|
479
|
+
line-height: 18px;
|
|
480
|
+
color: var(--hub-text-tertiary);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
.modalCancel,
|
|
484
|
+
.modalCopy {
|
|
485
|
+
font-size: 12px;
|
|
486
|
+
line-height: 18px;
|
|
487
|
+
color: var(--hub-text-secondary);
|
|
488
|
+
background: transparent;
|
|
489
|
+
border: none;
|
|
490
|
+
border-radius: 6px;
|
|
491
|
+
padding: 5px 14px;
|
|
492
|
+
cursor: pointer;
|
|
493
|
+
user-select: none;
|
|
494
|
+
transition: color 120ms ease, background 120ms ease;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
.modalCancel:hover,
|
|
498
|
+
.modalCopy:hover {
|
|
499
|
+
color: var(--hub-text-primary);
|
|
500
|
+
background: var(--hub-bg-hover);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
.modalInstall {
|
|
504
|
+
font-size: 12px;
|
|
505
|
+
font-weight: 600;
|
|
506
|
+
line-height: 18px;
|
|
507
|
+
color: var(--hub-text-on-fill);
|
|
508
|
+
background: var(--hub-btn-fill);
|
|
509
|
+
border: none;
|
|
510
|
+
border-radius: 6px;
|
|
511
|
+
padding: 5px 14px;
|
|
512
|
+
cursor: pointer;
|
|
513
|
+
user-select: none;
|
|
514
|
+
transition: background 120ms ease;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
.modalInstall:hover {
|
|
518
|
+
background: var(--hub-btn-hover);
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/* 安装进行中:禁用全部弹窗操作 */
|
|
522
|
+
.modalCopy:disabled,
|
|
523
|
+
.modalInstall:disabled,
|
|
524
|
+
.modalCancel:disabled,
|
|
525
|
+
.modalClose:disabled,
|
|
526
|
+
.uninstallConfirm:disabled {
|
|
527
|
+
opacity: 0.55;
|
|
528
|
+
cursor: not-allowed;
|
|
529
|
+
pointer-events: none;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
/* 卸载确认:危险色实底,与安装主按钮区分 */
|
|
533
|
+
.uninstallConfirm {
|
|
534
|
+
font-size: 12px;
|
|
535
|
+
font-weight: 600;
|
|
536
|
+
line-height: 18px;
|
|
537
|
+
color: #ffffff;
|
|
538
|
+
background: var(--hub-danger);
|
|
539
|
+
border: none;
|
|
540
|
+
border-radius: 6px;
|
|
541
|
+
padding: 5px 14px;
|
|
542
|
+
cursor: pointer;
|
|
543
|
+
user-select: none;
|
|
544
|
+
transition: background 120ms ease;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
.uninstallConfirm:hover {
|
|
548
|
+
background: var(--hub-danger-hover);
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/* —— 卸载完成结果视图 —— */
|
|
552
|
+
|
|
553
|
+
.result {
|
|
554
|
+
display: flex;
|
|
555
|
+
flex-direction: column;
|
|
556
|
+
align-items: center;
|
|
557
|
+
gap: 5px;
|
|
558
|
+
padding: 10px 0 2px;
|
|
559
|
+
text-align: center;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
.resultCheck {
|
|
563
|
+
width: 40px;
|
|
564
|
+
height: 40px;
|
|
565
|
+
display: inline-flex;
|
|
566
|
+
align-items: center;
|
|
567
|
+
justify-content: center;
|
|
568
|
+
border-radius: 50%;
|
|
569
|
+
background: var(--hub-success-tint);
|
|
570
|
+
color: var(--hub-success);
|
|
571
|
+
margin-bottom: 3px;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
.resultCheckIcon {
|
|
575
|
+
width: 20px;
|
|
576
|
+
height: 20px;
|
|
577
|
+
flex-shrink: 0;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
.resultTitle {
|
|
581
|
+
font-size: 13px;
|
|
582
|
+
font-weight: 600;
|
|
583
|
+
line-height: 20px;
|
|
584
|
+
color: var(--hub-text-primary);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
.resultDesc {
|
|
588
|
+
font-size: 12px;
|
|
589
|
+
line-height: 18px;
|
|
590
|
+
color: var(--hub-text-secondary);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
.resultRestarting {
|
|
594
|
+
font-size: 12px;
|
|
595
|
+
line-height: 18px;
|
|
596
|
+
color: var(--hub-text-tertiary);
|
|
597
|
+
padding: 12px 0 6px;
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
/* 重启选择按钮对:稍后(次级文字)+ 立即重启(主按钮) */
|
|
601
|
+
.restartLater {
|
|
602
|
+
font-size: 12px;
|
|
603
|
+
line-height: 18px;
|
|
604
|
+
color: var(--hub-text-secondary);
|
|
605
|
+
background: transparent;
|
|
606
|
+
border: none;
|
|
607
|
+
border-radius: 6px;
|
|
608
|
+
padding: 5px 14px;
|
|
609
|
+
cursor: pointer;
|
|
610
|
+
user-select: none;
|
|
611
|
+
transition: color 120ms ease, background 120ms ease;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
.restartLater:hover {
|
|
615
|
+
color: var(--hub-text-primary);
|
|
616
|
+
background: var(--hub-bg-hover);
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
.restartNow {
|
|
620
|
+
font-size: 12px;
|
|
621
|
+
font-weight: 600;
|
|
622
|
+
line-height: 18px;
|
|
623
|
+
color: var(--hub-text-on-fill);
|
|
624
|
+
background: var(--hub-btn-fill);
|
|
625
|
+
border: none;
|
|
626
|
+
border-radius: 6px;
|
|
627
|
+
padding: 5px 14px;
|
|
628
|
+
cursor: pointer;
|
|
629
|
+
user-select: none;
|
|
630
|
+
transition: background 120ms ease;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
.restartNow:hover {
|
|
634
|
+
background: var(--hub-btn-hover);
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
.restartNow:disabled {
|
|
638
|
+
opacity: 0.55;
|
|
639
|
+
cursor: not-allowed;
|
|
640
|
+
pointer-events: none;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
/* 成功结果视图(安装/卸载完成):按钮对居中,与上方居中的对勾/标题/说明对齐,
|
|
644
|
+
而不是沿用通用 modalActions 的右对齐;等宽成组,视觉上不散落 */
|
|
645
|
+
.result .modalActions {
|
|
646
|
+
justify-content: center;
|
|
647
|
+
gap: 10px;
|
|
648
|
+
margin-top: 0;
|
|
649
|
+
padding: 6px 0 2px;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
.result .modalActions .restartLater,
|
|
653
|
+
.result .modalActions .restartNow {
|
|
654
|
+
min-width: 100px;
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
/* —— 安装/卸载实时进度 —— */
|
|
658
|
+
|
|
659
|
+
.progress {
|
|
660
|
+
margin: 10px 0 2px;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
.progressHead {
|
|
664
|
+
display: flex;
|
|
665
|
+
align-items: center;
|
|
666
|
+
justify-content: flex-end;
|
|
667
|
+
margin-bottom: 3px;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
.progressText {
|
|
671
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
672
|
+
font-size: 11px;
|
|
673
|
+
line-height: 14px;
|
|
674
|
+
color: var(--hub-text-secondary);
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
/* 进度条轨道 + 真实百分比填充(宽度由任务估算值驱动) */
|
|
678
|
+
.progressTrack {
|
|
679
|
+
height: 4px;
|
|
680
|
+
border-radius: 2px;
|
|
681
|
+
background: var(--hub-border-2);
|
|
682
|
+
overflow: hidden;
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
.progressFill {
|
|
686
|
+
height: 100%;
|
|
687
|
+
border-radius: 2px;
|
|
688
|
+
background: var(--hub-brand);
|
|
689
|
+
transition: width 320ms ease;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
.progressFillFail {
|
|
693
|
+
background: var(--hub-danger);
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
@keyframes overlayIn {
|
|
697
|
+
from {
|
|
698
|
+
opacity: 0;
|
|
699
|
+
}
|
|
700
|
+
to {
|
|
701
|
+
opacity: 1;
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
@keyframes modalIn {
|
|
706
|
+
from {
|
|
707
|
+
opacity: 0;
|
|
708
|
+
transform: translateY(6px) scale(0.98);
|
|
709
|
+
}
|
|
710
|
+
to {
|
|
711
|
+
opacity: 1;
|
|
712
|
+
transform: translateY(0) scale(1);
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
/* —— 任务通知中心(成功 + 失败) —— */
|
|
717
|
+
|
|
718
|
+
/* 通知列表:纵向排列,高度随记录数自适应 —— 记录少时贴合内容,记录多时由窗体 max-height 兜底滚动 */
|
|
719
|
+
.noticeList {
|
|
720
|
+
display: flex;
|
|
721
|
+
flex-direction: column;
|
|
722
|
+
gap: 10px;
|
|
723
|
+
padding-right: 2px;
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
/* 每条通知 = 一张独立卡片:左侧圆形状态徽标 + 右侧内容列,
|
|
727
|
+
徽标垂直居中于整条(失败条目下方还有修复/提 Issue 动作,比成功条目高) */
|
|
728
|
+
.noticeRow {
|
|
729
|
+
display: flex;
|
|
730
|
+
align-items: center;
|
|
731
|
+
gap: 10px;
|
|
732
|
+
padding: 10px 12px;
|
|
733
|
+
border: 1px solid var(--hub-border-2);
|
|
734
|
+
border-radius: 8px;
|
|
735
|
+
background: var(--hub-bg-2);
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
/* 圆形状态徽标:成功 = 绿底白勾;失败 = 红底白叉(用户要求的「红色圆形 + 白色图形」语义) */
|
|
739
|
+
.noticeBadgeOk,
|
|
740
|
+
.noticeBadgeFail {
|
|
741
|
+
flex-shrink: 0;
|
|
742
|
+
width: 28px;
|
|
743
|
+
height: 28px;
|
|
744
|
+
display: inline-flex;
|
|
745
|
+
align-items: center;
|
|
746
|
+
justify-content: center;
|
|
747
|
+
border-radius: 50%;
|
|
748
|
+
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.18);
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
.noticeBadgeOk {
|
|
752
|
+
background: var(--hub-success);
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
.noticeBadgeFail {
|
|
756
|
+
background: var(--hub-danger);
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
/* 徽标内白色图形:对勾/叉,固定白色,红绿底上都清晰 */
|
|
760
|
+
.noticeBadgeIcon {
|
|
761
|
+
width: 12px;
|
|
762
|
+
height: 12px;
|
|
763
|
+
flex-shrink: 0;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
/* 徽标右侧内容列:头部行 + (失败时)修复指引/提 Issue 动作 */
|
|
767
|
+
.noticeMain {
|
|
768
|
+
flex: 1;
|
|
769
|
+
min-width: 0;
|
|
770
|
+
display: flex;
|
|
771
|
+
flex-direction: column;
|
|
772
|
+
gap: 8px;
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
.noticeHead {
|
|
776
|
+
display: flex;
|
|
777
|
+
align-items: center;
|
|
778
|
+
gap: 8px;
|
|
779
|
+
min-width: 0;
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
/* 消息文字:成功 = 绿色;失败 = 红色,与圆形徽标语义呼应 */
|
|
783
|
+
.noticeTextOk {
|
|
784
|
+
flex-shrink: 0;
|
|
785
|
+
font-size: 12px;
|
|
786
|
+
line-height: 18px;
|
|
787
|
+
font-weight: 600;
|
|
788
|
+
color: var(--hub-success);
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
.noticeTextFail {
|
|
792
|
+
flex-shrink: 0;
|
|
793
|
+
font-size: 12px;
|
|
794
|
+
line-height: 18px;
|
|
795
|
+
font-weight: 600;
|
|
796
|
+
color: var(--hub-danger-text);
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
/* —— 安装失败记录 —— */
|
|
800
|
+
|
|
801
|
+
/* 失败记录列表:纵向排列,高度随记录数自适应 —— 记录少时贴合内容,记录多时由窗体 max-height 兜底滚动 */
|
|
802
|
+
.failList {
|
|
803
|
+
display: flex;
|
|
804
|
+
flex-direction: column;
|
|
805
|
+
gap: 12px;
|
|
806
|
+
padding-right: 2px;
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
/* 每条失败记录 = 一张独立卡片:边框 + 底色 + 内边距,多条之间以间距清晰分隔,按钮归属一眼可辨 */
|
|
810
|
+
.failRow {
|
|
811
|
+
display: flex;
|
|
812
|
+
flex-direction: column;
|
|
813
|
+
gap: 8px;
|
|
814
|
+
padding: 10px 12px;
|
|
815
|
+
border: 1px solid var(--hub-border-2);
|
|
816
|
+
border-radius: 8px;
|
|
817
|
+
background: var(--hub-bg-2);
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
.failHead {
|
|
821
|
+
display: flex;
|
|
822
|
+
align-items: center;
|
|
823
|
+
gap: 8px;
|
|
824
|
+
min-width: 0;
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
/* 操作类型徽标:安装失败红 / 卸载失败黄 */
|
|
828
|
+
.failKind {
|
|
829
|
+
flex-shrink: 0;
|
|
830
|
+
font-size: 10px;
|
|
831
|
+
line-height: 16px;
|
|
832
|
+
font-weight: 500;
|
|
833
|
+
border-radius: 4px;
|
|
834
|
+
padding: 0 6px;
|
|
835
|
+
border: 1px solid transparent;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
.failKindInstall {
|
|
839
|
+
color: var(--hub-danger-text);
|
|
840
|
+
border-color: var(--hub-danger-border);
|
|
841
|
+
background: var(--hub-danger-tint);
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
.failKindUninstall {
|
|
845
|
+
color: var(--hub-warn);
|
|
846
|
+
border-color: var(--hub-warn-border);
|
|
847
|
+
background: var(--hub-warn-tint);
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
/* 仓库地址:等宽字体,点击直达 GitHub 仓库 */
|
|
851
|
+
.failRepo {
|
|
852
|
+
flex: 1;
|
|
853
|
+
min-width: 0;
|
|
854
|
+
overflow: hidden;
|
|
855
|
+
text-overflow: ellipsis;
|
|
856
|
+
white-space: nowrap;
|
|
857
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
858
|
+
font-size: 12px;
|
|
859
|
+
line-height: 18px;
|
|
860
|
+
color: var(--hub-brand);
|
|
861
|
+
text-decoration: none;
|
|
862
|
+
cursor: pointer;
|
|
863
|
+
user-select: none;
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
.failRepo:hover {
|
|
867
|
+
text-decoration: underline;
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
.failTime {
|
|
871
|
+
flex-shrink: 0;
|
|
872
|
+
font-size: 11px;
|
|
873
|
+
line-height: 16px;
|
|
874
|
+
color: var(--hub-text-tertiary);
|
|
875
|
+
font-variant-numeric: tabular-nums;
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
/* 记录内的复制按钮:纯灰文字、无边框,低调隐蔽,点击即可复制该条完整错误日志 */
|
|
879
|
+
.failCopy {
|
|
880
|
+
flex-shrink: 0;
|
|
881
|
+
display: inline-flex;
|
|
882
|
+
align-items: center;
|
|
883
|
+
font-size: 11px;
|
|
884
|
+
line-height: 16px;
|
|
885
|
+
color: var(--hub-text-tertiary);
|
|
886
|
+
background: transparent;
|
|
887
|
+
border: none;
|
|
888
|
+
border-radius: 4px;
|
|
889
|
+
padding: 2px 8px;
|
|
890
|
+
cursor: pointer;
|
|
891
|
+
user-select: none;
|
|
892
|
+
transition: color 120ms ease, background 120ms ease;
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
.failCopy:hover {
|
|
896
|
+
color: var(--hub-text-secondary);
|
|
897
|
+
background: var(--hub-bg-2);
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
.failEmpty {
|
|
901
|
+
padding: 24px 0;
|
|
902
|
+
text-align: center;
|
|
903
|
+
font-size: 12px;
|
|
904
|
+
line-height: 18px;
|
|
905
|
+
color: var(--hub-text-tertiary);
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
/* 清空记录:危险色文字按钮,无默认底,悬浮转鲜红实底白字 */
|
|
909
|
+
.failClear {
|
|
910
|
+
font-size: 12px;
|
|
911
|
+
line-height: 18px;
|
|
912
|
+
color: var(--hub-danger);
|
|
913
|
+
background: transparent;
|
|
914
|
+
border: none;
|
|
915
|
+
border-radius: 6px;
|
|
916
|
+
padding: 5px 14px;
|
|
917
|
+
cursor: pointer;
|
|
918
|
+
user-select: none;
|
|
919
|
+
transition: color 120ms ease, background 120ms ease;
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
.failClear:hover {
|
|
923
|
+
color: #ffffff;
|
|
924
|
+
background: var(--hub-danger);
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
/* 每条记录的一键提交按钮:红色 CTA 撑满整行,一条失败对应一个提交入口。
|
|
928
|
+
用户指定红色按钮:默认即宿主 danger 主红(红底白字),悬浮再加深一档 + 红色投影 */
|
|
929
|
+
.failBigIssue {
|
|
930
|
+
display: block;
|
|
931
|
+
width: 100%;
|
|
932
|
+
box-sizing: border-box;
|
|
933
|
+
margin-top: 4px;
|
|
934
|
+
padding: 3px 16px;
|
|
935
|
+
font-size: 13px;
|
|
936
|
+
line-height: 18px;
|
|
937
|
+
font-weight: 600;
|
|
938
|
+
text-align: center;
|
|
939
|
+
color: #ffffff;
|
|
940
|
+
background: var(--hub-danger);
|
|
941
|
+
border: 1px solid var(--hub-danger);
|
|
942
|
+
border-radius: 8px;
|
|
943
|
+
cursor: pointer;
|
|
944
|
+
user-select: none;
|
|
945
|
+
text-decoration: none;
|
|
946
|
+
transition: background 120ms ease, border-color 120ms ease, box-shadow 120ms ease;
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
.failBigIssue:hover {
|
|
950
|
+
background: var(--hub-danger-hover);
|
|
951
|
+
border-color: var(--hub-danger-hover);
|
|
952
|
+
box-shadow: 0 3px 10px rgba(209, 36, 47, 0.35);
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
/* 插件 prepare 构建脚本失败说明:位于提 Issue 按钮上方的补充说明,同琥珀警示样式 */
|
|
956
|
+
.failPrepareHint {
|
|
957
|
+
margin-top: 6px;
|
|
958
|
+
padding: 8px 12px;
|
|
959
|
+
font-size: 12px;
|
|
960
|
+
line-height: 18px;
|
|
961
|
+
color: var(--hub-warning);
|
|
962
|
+
background: var(--hub-warning-tint);
|
|
963
|
+
border: 1px solid var(--hub-warning-border);
|
|
964
|
+
border-radius: 6px;
|
|
965
|
+
}
|