dsh-x-core 0.1.21 → 0.1.23
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/assets/dsh-preview.png +0 -0
- package/assets/dsh.ico +0 -0
- package/assets/icon.ico +0 -0
- package/assets/tray.ico +0 -0
- package/assets/tray.png +0 -0
- package/core-npm.js +201 -183
- package/desktop-plugins.js +86 -0
- package/desktop.js +200 -0
- package/filemanager-base.js +7 -8
- package/filemanager-linux.js +124 -0
- package/filemanager.js +4 -7
- package/native-notify.js +74 -0
- package/node/node +2 -1
- package/package.json +1 -1
- package/packs/dsh-x-workbench/README.md +61 -0
- package/packs/dsh-x-workbench/dspack.json +4 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/LICENSE-APACHE-2.0.txt +202 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/NOTICE.md +6 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/SKILL.md +697 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/references/authentication.md +313 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/references/commands.md +300 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/references/profiling.md +120 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/references/proxy-support.md +194 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/references/session-management.md +201 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/references/snapshot-refs.md +229 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/references/video-recording.md +173 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/templates/authenticated-session.sh +105 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/templates/capture-workflow.sh +69 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/templates/form-automation.sh +62 -0
- package/packs/dsh-x-workbench/home/skills/electron/LICENSE-APACHE-2.0.txt +202 -0
- package/packs/dsh-x-workbench/home/skills/electron/NOTICE.md +6 -0
- package/packs/dsh-x-workbench/home/skills/electron/SKILL.md +243 -0
- package/packs/dsh-x-workbench/manifest.json +35 -0
- package/perf/patch-hooks.mjs +14 -1
- package/perf/plugin-profile.mjs +204 -0
- package/perf/register.mjs +4 -0
- package/platform.js +2 -1
- package/public/booting.html +475 -0
- package/public/favicon.ico +0 -0
- package/public/favicon.png +0 -0
- package/public/icon.png +0 -0
- package/public/index.html +9277 -8173
- package/public/internal-tabs.js +45 -41
- package/public/launcher.css +285 -98
- package/public/mascot.js +1 -1
- package/public/theme.css +33 -6
- package/public/water.js +1 -1
- package/registry.js +38 -3
- package/server.js +1060 -119
- package/settings.js +78 -1
package/public/launcher.css
CHANGED
|
@@ -13,6 +13,19 @@
|
|
|
13
13
|
--control-font-size: 13px;
|
|
14
14
|
--control-radius: 9px;
|
|
15
15
|
--control-padding: 12px;
|
|
16
|
+
/* 顶栏两种形态共用这一组尺寸:
|
|
17
|
+
- 默认(浏览器里、外壳没开标签页):36px 控件 + 18px 上下留白,就是原来那条高顶栏;
|
|
18
|
+
- .internal-tabs.has-tabs(内部标签页):控件 30px、留白 5px,整条 40px,像浏览器标签栏那样扁。
|
|
19
|
+
internal-tabs.js 把 header 的真实高度报给外壳('layout'),dsh 页面的顶边跟着走,
|
|
20
|
+
所以两种形态切换时不会盖住页面内容。
|
|
21
|
+
标签条那层底色(--chrome-strip)只在标签页形态用:比页面底色深一档,选中的标签才显得
|
|
22
|
+
是从页面里长出来的(标签用 --card 填,和下面内容同一块面)。 */
|
|
23
|
+
--topbar-control: 36px;
|
|
24
|
+
--topbar-radius: 12px;
|
|
25
|
+
--chrome-strip: #dde5f4;
|
|
26
|
+
/* 设置页左侧导航的底色:用中性浅灰,不再往蓝里走 —— 偏蓝的底色会跟顶栏那条标签条
|
|
27
|
+
(--chrome-strip)撞成一片,也太压。灰一档既和白色卡片分得开,也不跟主题色抢。 */
|
|
28
|
+
--settings-nav-bg: #eef1f7;
|
|
16
29
|
/* 开关的轨道与圆钮:两档的 .toggle 和更新提醒的三档开关共用,暗色主题只改这里 */
|
|
17
30
|
--switch-off: #cfdcf3;
|
|
18
31
|
--switch-on: var(--accent);
|
|
@@ -28,6 +41,18 @@ body {
|
|
|
28
41
|
font: 15px/1.5 "Segoe UI", ui-sans-serif, system-ui, sans-serif;
|
|
29
42
|
display: grid;
|
|
30
43
|
grid-template-rows: auto 1fr;
|
|
44
|
+
/* 隐式列写死 minmax(0, 1fr):默认的 auto 会按内容的「最大宽度」把整列撑开,
|
|
45
|
+
标签条一宽(标签 + 两头按钮超过窗口)整条就跟着变宽,刷新/齿轮/窗口按钮被顶出窗口。 */
|
|
46
|
+
grid-template-columns: minmax(0, 1fr);
|
|
47
|
+
/* 桌面窗口:界面文字默认不可选,拖动页面时不会把导航、卡片、按钮选中。 */
|
|
48
|
+
-webkit-user-select: none;
|
|
49
|
+
user-select: none;
|
|
50
|
+
}
|
|
51
|
+
/* 该能复制的地方照旧:输入框、日志、代码/错误详情。 */
|
|
52
|
+
input, textarea, select, option, pre, code, kbd, samp,
|
|
53
|
+
#log, .launch-log-text, .notice-detail, .rc-details-pre {
|
|
54
|
+
-webkit-user-select: text;
|
|
55
|
+
user-select: text;
|
|
31
56
|
}
|
|
32
57
|
/* 高清角色独立成层,仅动画 transform / opacity,保留文字区域的对比度。 */
|
|
33
58
|
.backdrop {
|
|
@@ -109,6 +134,8 @@ header {
|
|
|
109
134
|
}
|
|
110
135
|
.brand { font-weight: 700; letter-spacing: 0.04em; font-size: 20px; line-height: 1; color: var(--accent); }
|
|
111
136
|
.brand-home { display: inline-flex; align-items: baseline; gap: 10px; border: 0; padding: 6px 8px; margin: -6px -8px; background: transparent; font: inherit; cursor: pointer; }
|
|
137
|
+
/* 「回主页」图标只在内部标签页里出现(.internal-tabs.has-tabs 底下的规则),其余形态仍是文字 logo */
|
|
138
|
+
.brand-icon { display: none; }
|
|
112
139
|
.brand-home:focus-visible { outline: 2px solid var(--accent); outline-offset: 5px; border-radius: 3px; }
|
|
113
140
|
.brand-block { display: flex; align-items: baseline; gap: 10px; }
|
|
114
141
|
.app-ver { color: var(--muted); font-size: 12px; }
|
|
@@ -149,30 +176,29 @@ header {
|
|
|
149
176
|
border-color: #b9ccf0;
|
|
150
177
|
box-shadow: 0 3px 10px rgba(59, 111, 224, 0.18);
|
|
151
178
|
}
|
|
152
|
-
/*
|
|
179
|
+
/* 设置入口:主页右上角的齿轮(原来那排 tab 已经并进去)。外观和内部标签页那排按钮是同一套:
|
|
180
|
+
静止只有图标(无底色、无描边、无投影),悬停才浮出底色——两种顶栏形态不再各画一种按钮。
|
|
181
|
+
尺寸/圆角跟 --topbar-control / --topbar-radius 走,所以开标签时自动缩成 30px 的扁按钮。 */
|
|
153
182
|
.gear-btn {
|
|
154
183
|
display: inline-flex;
|
|
155
184
|
align-items: center;
|
|
156
185
|
justify-content: center;
|
|
157
|
-
|
|
158
|
-
|
|
186
|
+
flex-shrink: 0;
|
|
187
|
+
width: var(--topbar-control);
|
|
188
|
+
height: var(--topbar-control);
|
|
159
189
|
padding: 0;
|
|
160
|
-
border:
|
|
161
|
-
border-radius:
|
|
162
|
-
background:
|
|
163
|
-
color: var(--
|
|
190
|
+
border: 0;
|
|
191
|
+
border-radius: var(--topbar-radius);
|
|
192
|
+
background: transparent;
|
|
193
|
+
color: var(--muted);
|
|
164
194
|
cursor: pointer;
|
|
165
|
-
transition:
|
|
195
|
+
transition: background 160ms ease, color 160ms ease;
|
|
166
196
|
}
|
|
167
|
-
.gear-btn svg { width:
|
|
197
|
+
.gear-btn svg { width: 16px; height: 16px; transition: transform 280ms cubic-bezier(.2, .8, .2, 1); }
|
|
168
198
|
.gear-btn.active svg { transform: rotate(45deg); }
|
|
169
|
-
.gear-btn:hover {
|
|
170
|
-
transform: translateY(-1px);
|
|
171
|
-
border-color: #b9ccf0;
|
|
172
|
-
box-shadow: 0 3px 10px rgba(59, 111, 224, 0.18);
|
|
173
|
-
}
|
|
199
|
+
.gear-btn:hover { background: var(--accent-soft); color: var(--accent); }
|
|
174
200
|
/* 已经在设置面板时齿轮压成实心,表示"就在这儿" */
|
|
175
|
-
.gear-btn.active { background: var(--accent);
|
|
201
|
+
.gear-btn.active { background: var(--accent); color: #fff; }
|
|
176
202
|
/* app 窗口模式:原生标题栏被去掉了,这排按钮顶上;浏览器里不显示 */
|
|
177
203
|
.win-controls { display: none; align-items: center; gap: 2px; margin-left: 2px; }
|
|
178
204
|
.app-window .win-controls { display: flex; }
|
|
@@ -187,6 +213,7 @@ header {
|
|
|
187
213
|
拖动同样只能靠 app-region。类由 shell/preload.cjs 加,只在 Windows 的 Electron 里出现。 */
|
|
188
214
|
.electron-window header { -webkit-app-region: drag; }
|
|
189
215
|
.electron-window header :is(button, a, input, select, .select, .internal-tab) { -webkit-app-region: no-drag; }
|
|
216
|
+
/* 窗口按钮:浏览器窗口右上角那种横向长条块,挨着排、没有描边,只有悬停底色。 */
|
|
190
217
|
.win-btn {
|
|
191
218
|
width: 34px;
|
|
192
219
|
height: 30px;
|
|
@@ -206,51 +233,148 @@ header {
|
|
|
206
233
|
.win-btn.close:hover { background: var(--danger); color: #fff; }
|
|
207
234
|
/* 顶栏要用来拖窗口,文字别被拖选 */
|
|
208
235
|
.app-window header { user-select: none; }
|
|
209
|
-
/*
|
|
210
|
-
.internal-tabs
|
|
211
|
-
|
|
212
|
-
|
|
236
|
+
/* 标签条:浏览器那种紧挨着的一排扁标签——静止没有描边、没有投影,选中标签是一块实底色。 */
|
|
237
|
+
/* 内部标签页(.internal-tabs.has-tabs,由 internal-tabs.js 按外壳状态挂到 <html> 上)就是浏览器标签栏形态:
|
|
238
|
+
齿轮、刷新、窗口按钮全部扁平(静止无底色、无描边、无投影,悬停才浮出底色);文字 logo 让位给一个
|
|
239
|
+
「回主页」图标按钮。没开标签页时(浏览器里、或外壳一个标签都没开)整条退回上面的高顶栏,
|
|
240
|
+
两种形态由这一组变量切换。
|
|
241
|
+
标签条的尺寸照 Chromium(Edge 同源)的实测参数来,不再凭感觉调:
|
|
242
|
+
- chrome/browser/ui/tabs/tab_style.cc:上圆角 GetTopCornerRadius=10、底部外扩圆角
|
|
243
|
+
GetBottomCornerRadius=12、标准宽 kTabWidth=232、分隔线 2×20(左右各 2px 边距、半径 1);
|
|
244
|
+
- chrome/browser/ui/layout_constants.cc:kTabHeight=34+1(与工具条的 1px 重叠)、
|
|
245
|
+
kTabStripPadding=6(条顶留白)、kTabVerticalPadding=6、kTabHorizontalPadding=8。
|
|
246
|
+
合起来:标签 35px + 顶留白 6px = 41px 一整条。 */
|
|
247
|
+
.internal-tabs.has-tabs {
|
|
248
|
+
--topbar-control: 30px;
|
|
249
|
+
--topbar-radius: 8px;
|
|
250
|
+
/* 高度照 Edge 的窗口实测:标签 40px,顶上留 4px 的空(贴太死会像被窗口边缘切掉),
|
|
251
|
+
底边压在内容区上沿 —— 整条 44px。 */
|
|
252
|
+
--tab-height: 40px;
|
|
253
|
+
--tab-strip-padding: 4px;
|
|
254
|
+
--tab-radius: 10px;
|
|
255
|
+
--tab-flare: 12px;
|
|
256
|
+
--tab-width: 232px;
|
|
257
|
+
--tab-min-width: 56px;
|
|
258
|
+
--tab-separator: #cdd9ee;
|
|
259
|
+
}
|
|
260
|
+
/* 下边不留内边距:标签的底边要压在内容区上沿,才能跟下面的页面连成一片(见下面 .internal-tab-list 的注)。
|
|
261
|
+
选择器带上 html,是为了压过 theme.css 里暗色的 `html[data-color-scheme="dark"] header { background: transparent }`
|
|
262
|
+
——两边同为 (0,1,1) 时后加载的那份会赢,标签条的底色就白设了。 */
|
|
263
|
+
/* 标签形态的顶栏用栅格排:左(回主页)auto、中(标签条)minmax(0,1fr)、右(刷新/齿轮/窗口按钮)auto。
|
|
264
|
+
用 flex 时标签一宽就会把右边那组挤出窗口(它们直接不见了),栅格的中列可以被压缩,两头永远在原位。 */
|
|
265
|
+
html.internal-tabs.has-tabs header {
|
|
266
|
+
display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center;
|
|
267
|
+
padding: var(--tab-strip-padding) 10px 0; gap: 12px; background: var(--chrome-strip);
|
|
268
|
+
}
|
|
269
|
+
/* macOS 的红绿灯还在左上角,标签条不能压过去(这条要在 .mac-window 的 96px 之后才生效) */
|
|
270
|
+
.internal-tabs.has-tabs.mac-window header { padding-left: 96px; }
|
|
271
|
+
/* 两头的控件组:行高是标签的 40px(从条顶那 4px 留白之后起算),补一条和留白等宽的下外边距,
|
|
272
|
+
30px 的按钮就居中在整条 44px 里(上 7 / 下 7)。 */
|
|
273
|
+
.internal-tabs.has-tabs .brand-block, .internal-tabs.has-tabs .header-right { flex-shrink: 0; margin-bottom: var(--tab-strip-padding); }
|
|
274
|
+
.internal-tabs.has-tabs .brand, .internal-tabs.has-tabs .app-ver { display: none; }
|
|
275
|
+
.internal-tabs.has-tabs .brand-home {
|
|
276
|
+
display: grid; place-items: center; width: var(--topbar-control); height: var(--topbar-control);
|
|
277
|
+
/* 左边这 7px 和上下的留白一样宽:顶栏的 padding-left 是 10px,按钮自己往左收 3px 补平(标签条位置不动)。 */
|
|
278
|
+
padding: 0; margin: 0 0 0 -3px; border-radius: var(--topbar-radius); background: transparent; color: var(--muted);
|
|
279
|
+
transition: background 160ms ease, color 160ms ease;
|
|
280
|
+
}
|
|
281
|
+
.internal-tabs.has-tabs .brand-home:hover { background: var(--accent-soft); color: var(--accent); }
|
|
282
|
+
.internal-tabs.has-tabs .brand-icon { display: grid; place-items: center; }
|
|
283
|
+
.internal-tabs.has-tabs .brand-icon svg { width: 16px; height: 16px; }
|
|
284
|
+
.internal-tabs.has-tabs .self-update { padding: 5px 10px; border-radius: var(--topbar-radius); }
|
|
285
|
+
.internal-tabs.has-tabs .win-controls { gap: 0; margin-left: 4px; }
|
|
286
|
+
.internal-tabs.has-tabs .win-btn { width: 40px; height: var(--topbar-control); border-radius: 6px; }
|
|
287
|
+
/* 标签要「长在页面顶上」:整条没有下内边距,标签高 35px(控件 30 + 顶上那 5px 内边距)正好
|
|
288
|
+
落到内容区上沿(外壳按 header 真实高度给 dsh 页面留位置,内容就从这条线开始);两侧留出
|
|
289
|
+
--tab-flare 的空当,让首尾标签那对反向圆角不被 overflow 裁掉。
|
|
290
|
+
上沿和两头那排按钮对齐(都从顶栏的 5px 内边距起),所以标签比按钮高 5px——浏览器就是这样:
|
|
291
|
+
标签长得比工具按钮高,底边和下面那块页面连成一片(原来标签又往下让了 5px,上沿比按钮低,
|
|
292
|
+
看着是陷下去的)。
|
|
293
|
+
选中标签用页面底色填,看着就是页面向上的延伸——Edge / Chrome 那种和内容融合的样子。 */
|
|
294
|
+
.internal-tabs.has-tabs .internal-tab-list { margin-top: 0; padding: 0 var(--tab-flare); }
|
|
295
|
+
|
|
296
|
+
.internal-tabs-area { display: flex; flex: 1; align-items: center; gap: 6px; min-width: 0; }
|
|
213
297
|
.internal-tabs-area[hidden] { display: none; }
|
|
214
|
-
|
|
298
|
+
/* 标签之间不留缝(Edge / Chromium 的标签是紧挨着的,重叠的是底部那对外扩圆角区域),
|
|
299
|
+
相邻靠那条 2×20 的小竖线分开。 */
|
|
300
|
+
.internal-tab-list { position: relative; isolation: isolate; display: flex; flex: 1; gap: 0; min-width: 0; overflow-x: auto; scrollbar-width: none; }
|
|
215
301
|
.internal-tab-list::-webkit-scrollbar { display: none; }
|
|
216
|
-
.internal-tab-indicator {
|
|
217
|
-
position: absolute; top: 0; left: 0; height: 36px; border: 1px solid var(--line); border-radius: 12px;
|
|
218
|
-
background: var(--card); box-shadow: 0 3px 10px rgba(59, 111, 224, .09); opacity: 0; pointer-events: none;
|
|
219
|
-
will-change: transform;
|
|
220
|
-
transition: transform 260ms cubic-bezier(.2, 1.3, .32, 1), width 260ms cubic-bezier(.2, 1.3, .32, 1), opacity 160ms ease;
|
|
221
|
-
}
|
|
222
|
-
.internal-tab-indicator.visible { opacity: 1; }
|
|
223
|
-
.internal-tab-indicator.instant { transition: none; }
|
|
224
302
|
.internal-tab {
|
|
225
303
|
position: relative;
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
304
|
+
/* 宽度:平分标签条、最多 --tab-width(Chromium 的 kTabWidth=232)、最少 --tab-min-width;
|
|
305
|
+
用「flex-basis 0 + grow 1 + max-width」而不是定宽 + shrink —— 定宽时浏览器不一定会压缩,
|
|
306
|
+
标签一多就会把右边的刷新/齿轮/窗口按钮顶出窗口。 */
|
|
307
|
+
display: flex; align-items: center; gap: 4px; flex: 1 1 0; max-width: var(--tab-width); min-width: var(--tab-min-width); height: var(--tab-height);
|
|
308
|
+
/* 上面两角圆;下面两角是外扩圆角(::before/::after 常驻,底色 inherit,见下) */
|
|
309
|
+
padding: 0 3px 0 9px; border: 1px solid transparent; border-radius: var(--tab-radius) var(--tab-radius) 0 0; color: var(--muted);
|
|
310
|
+
/* 底色不做过场:悬停/选中要像浏览器那样立刻到位(过渡会让底色和圆角错开一帧) */
|
|
311
|
+
transition: color 120ms ease, box-shadow 160ms ease;
|
|
312
|
+
}
|
|
313
|
+
/* 选中/悬停的标签自己画底色和外扩圆角(Chromium 也是逐张标签画形状的,不是拿一块滑块垫在下面),
|
|
314
|
+
再把自己抬到邻居上面 —— 邻居的边缘被这两块圆角压住,就是浏览器那种「叠层」。
|
|
315
|
+
--tab-surface 是外壳采样到的页面底色:和下面那块页面同色,接缝才看不出来(采不到退回 --card)。 */
|
|
316
|
+
.internal-tab:hover { background: var(--accent-soft); color: var(--accent); z-index: 1; }
|
|
317
|
+
/* 选中标签的字色跟着采到的底色走(--tab-ink:亮底深字 / 暗底浅字),
|
|
318
|
+
否则暗色主题下遇到浅色页面给的白色标签,字就糊成一片了。 */
|
|
319
|
+
.internal-tab.active { background: var(--tab-surface, var(--card)); color: var(--tab-ink, var(--accent)); z-index: 2; }
|
|
320
|
+
/* 标签之间那条 2×20 的小竖线(Chromium 的 kSeparatorThickness/Height,左右各 2px 边距):
|
|
321
|
+
挂在前一张标签的右边缘,第一个标签没有;悬停/选中、以及紧挨着选中标签的那条都让位。 */
|
|
322
|
+
.internal-tab + .internal-tab {
|
|
323
|
+
background-image: linear-gradient(var(--tab-separator), var(--tab-separator));
|
|
324
|
+
background-repeat: no-repeat;
|
|
325
|
+
background-position: 2px center;
|
|
326
|
+
background-size: 2px 20px;
|
|
229
327
|
}
|
|
230
|
-
.internal-tab
|
|
231
|
-
.internal-tab.active
|
|
328
|
+
.internal-tab + .internal-tab:hover,
|
|
329
|
+
.internal-tab + .internal-tab.active,
|
|
330
|
+
.internal-tab:hover + .internal-tab,
|
|
331
|
+
.internal-tab.active + .internal-tab { background-image: none; }
|
|
232
332
|
.internal-tab button { border: 0; background: transparent; color: inherit; font: inherit; cursor: pointer; }
|
|
233
|
-
.internal-tab-label { display: flex; align-items: center; gap:
|
|
333
|
+
.internal-tab-label { display: flex; align-items: center; gap: 5px; flex: 1; min-width: 0; padding: 0; height: 100%; font-size: 12px !important; font-weight: 500 !important; }
|
|
234
334
|
.internal-tab-label span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
235
|
-
.internal-tab-label svg { flex-shrink: 0; width:
|
|
236
|
-
.internal-tab-close { display: grid; place-items: center; flex-shrink: 0; width:
|
|
335
|
+
.internal-tab-label svg { flex-shrink: 0; width: 13px; height: 13px; }
|
|
336
|
+
.internal-tab-close { display: grid; place-items: center; flex-shrink: 0; width: 20px; height: 20px; padding: 3px; border-radius: 5px; opacity: .5; transition: opacity 140ms ease, background 140ms ease; }
|
|
237
337
|
.internal-tab:hover .internal-tab-close, .internal-tab.active .internal-tab-close { opacity: .8; }
|
|
238
|
-
.internal-tab-close:hover { opacity: 1 !important; background:
|
|
239
|
-
.internal-tab-close svg { width:
|
|
240
|
-
.
|
|
338
|
+
.internal-tab-close:hover { opacity: 1 !important; background: color-mix(in srgb, currentColor 14%, transparent); }
|
|
339
|
+
.internal-tab-close svg { width: 11px; height: 11px; }
|
|
340
|
+
/* 刷新按钮与齿轮同尺寸(都吃 .gear-btn 的 --topbar-control),别在标签条里单独放大 */
|
|
341
|
+
/* 标签条里的刷新按钮和两头那排控件一样高、一样居中:跟 .brand-block/.header-right 补同一条
|
|
342
|
+
下外边距,否则它贴在行顶、比右边的齿轮高 3px。 */
|
|
343
|
+
.internal-tab-reload { flex-shrink: 0; margin-bottom: var(--tab-strip-padding, 0px); }
|
|
241
344
|
.internal-tab.stopped .internal-tab-label { opacity: .6; }
|
|
242
345
|
.internal-tab button:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 5px; }
|
|
243
346
|
.internal-tab { touch-action: none; user-select: none; }
|
|
244
347
|
.internal-tab-label { cursor: grab !important; }
|
|
245
348
|
.internal-tab-list.dragging, .internal-tab-list.dragging * { cursor: grabbing !important; }
|
|
246
|
-
|
|
349
|
+
/* 底部那对外扩圆角(Chromium 的 GetBottomCornerRadius=12):标签底边两侧各补一小块,
|
|
350
|
+
把朝里的那个角裁成一个 1/4 圆,看着就是标签从下面那块页面里长出来。
|
|
351
|
+
用矢量路径裁剪(clip-path: path),不是在渐变里"画"出来的形状:抗锯齿和别的圆角一样,
|
|
352
|
+
图形也和浏览器画的一致。两块常驻、底色继承标签自己的填色 —— 悬停/选中只换颜色,
|
|
353
|
+
不会多出一层新图层,所以不会出现"底色先出来、圆角晚一帧"的跳变。
|
|
354
|
+
注:路径里的 12 就是 --tab-flare 的值,改那个变量时这里要一起改。 */
|
|
355
|
+
.internal-tab::before,
|
|
356
|
+
.internal-tab::after {
|
|
357
|
+
content: ""; position: absolute; bottom: -1px; width: var(--tab-flare); height: var(--tab-flare);
|
|
358
|
+
pointer-events: none; background-color: inherit;
|
|
359
|
+
clip-path: path("M12 0A12 12 0 0 1 0 12L12 12Z");
|
|
360
|
+
}
|
|
361
|
+
.internal-tab::before { left: calc(var(--tab-flare) * -1); }
|
|
362
|
+
.internal-tab::after { right: calc(var(--tab-flare) * -1); transform: scaleX(-1); }
|
|
363
|
+
/* 拖动中的标签要跟选中标签同一套形状:上两角圆 + 底部外扩圆角,只是多一层浮起来的阴影,并且压在最上面。
|
|
364
|
+
描边去掉:--card 比标签条底色亮得多,靠填色加阴影已经能看出是拎起来的那张。 */
|
|
365
|
+
.internal-tab.dragging { z-index: 3; background: var(--card); border-color: transparent; box-shadow: 0 3px 10px rgba(59, 111, 224, .14); }
|
|
247
366
|
/* 内容层接管前仍保留主页画面;交互和辅助阅读由 inert / aria-hidden 禁用,避免切换中露出空白。 */
|
|
248
367
|
.internal-dsh-active main { pointer-events: none; }
|
|
368
|
+
/* 内部标签页盖住内容区时装饰动画没有意义:rAF 循环由 mascot/water 自己停,这里管三条 CSS 动画。
|
|
369
|
+
标签页关闭(internal-dsh-active 摘掉)后动画从暂停处继续,不需要重排。 */
|
|
370
|
+
.internal-dsh-active .backdrop-character,
|
|
371
|
+
.internal-dsh-active .backdrop::before,
|
|
372
|
+
.internal-dsh-active .backdrop::after { animation-play-state: paused; }
|
|
249
373
|
@media (prefers-reduced-motion: reduce) {
|
|
250
|
-
.internal-tab
|
|
374
|
+
.internal-tab, .internal-tab-close { transition: none; }
|
|
251
375
|
}
|
|
252
376
|
@media (max-width: 900px) {
|
|
253
|
-
.internal-tabs header { gap: 14px; }
|
|
377
|
+
.internal-tabs.has-tabs header { gap: 14px; }
|
|
254
378
|
}
|
|
255
379
|
main { min-height: 0; overflow: hidden; }
|
|
256
380
|
/* 设置页外壳:左侧分组导航 + 右侧面板,四个面板都在这里切(顶栏那排 tab 已取消) */
|
|
@@ -267,8 +391,8 @@ main:not(.home) .shell {
|
|
|
267
391
|
position: relative;
|
|
268
392
|
flex: 0 0 216px;
|
|
269
393
|
padding: 16px 14px 24px;
|
|
270
|
-
|
|
271
|
-
background:
|
|
394
|
+
/* 和右侧靠底色分开(--settings-nav-bg),不再画中间那条分隔线 */
|
|
395
|
+
background: var(--settings-nav-bg);
|
|
272
396
|
overflow-y: auto;
|
|
273
397
|
scrollbar-width: thin;
|
|
274
398
|
scrollbar-color: #c3d3ee transparent;
|
|
@@ -295,7 +419,6 @@ main:not(.home) .shell {
|
|
|
295
419
|
/* 控制面板是主界面:回到它的时候把左侧导航收起来,它就是一张干净的主页 */
|
|
296
420
|
main.home .settings-nav { display: none; }
|
|
297
421
|
main:not(.home) .settings-nav { animation: nav-in 280ms cubic-bezier(.22, 1, .36, 1) both; }
|
|
298
|
-
main:not(.home) .settings-nav { background: transparent; }
|
|
299
422
|
@keyframes nav-in {
|
|
300
423
|
from { opacity: 0; transform: translateX(-12px); }
|
|
301
424
|
to { opacity: 1; transform: none; }
|
|
@@ -407,8 +530,7 @@ main.home .settings-body { padding-top: 34px; }
|
|
|
407
530
|
flex-wrap: wrap;
|
|
408
531
|
gap: 6px;
|
|
409
532
|
padding: 10px 12px;
|
|
410
|
-
|
|
411
|
-
border-bottom: 1px solid var(--line);
|
|
533
|
+
/* 窄窗口导航变成顶上一条横排:同样靠底色分界,不画线 */
|
|
412
534
|
}
|
|
413
535
|
.nav-group { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
|
|
414
536
|
.nav-group + .nav-group { margin-top: 0; }
|
|
@@ -550,6 +672,16 @@ html.reduce-motion .launch-status.is-working::before { animation: none; }
|
|
|
550
672
|
.launch-modal-fields { display: grid; grid-template-columns: minmax(0, 1fr); align-content: start; gap: 18px; margin: -2px; padding: 2px; flex: 1 1 auto; min-height: 0; overflow-y: auto; overflow-x: hidden; }
|
|
551
673
|
#launchDialog .home-field > label { font-size: 12px; letter-spacing: 0; }
|
|
552
674
|
.toggle.launch-auto-launch { margin: 0; font-size: 12px; }
|
|
675
|
+
/* 折叠里的自动启动开关:跟上面字段拉开一点,别贴着说明行 */
|
|
676
|
+
.launch-isolation-advanced-fields .launch-auto-launch { margin-top: 2px; }
|
|
677
|
+
/* 目录那一行:输入框 + 「选择…」图标按钮。按钮不许被输入框挤扁,窄屏上也要还在右边 */
|
|
678
|
+
.launch-path-row { display: flex; align-items: center; gap: 8px; }
|
|
679
|
+
.launch-path-row input { min-width: 0; flex: 1; }
|
|
680
|
+
.launch-path-row .icon-btn { flex: 0 0 auto; }
|
|
681
|
+
/* 项目目录的说明只在填了东西时才有意义,空着别占一行高度 */
|
|
682
|
+
#launchWorkdirHint:empty { display: none; }
|
|
683
|
+
/* 复制来源两行叠着放:目录 + Profile,选起来不用横着找 */
|
|
684
|
+
#launchCopyAdvancedPanel .launch-isolation-advanced-fields { display: grid; gap: 8px; }
|
|
553
685
|
/* 更新提醒跟版本下拉同一行:窄到放不下时整块换到下一行,两边的控件才对得齐。
|
|
554
686
|
版本类型给固定宽度,把开关和档名装进一个有边框的控件盒——跟下拉同高同圆角,读起来是一个设置项,
|
|
555
687
|
而不是飘在右上角的两粒零件;剩下的宽度都留给版本。 */
|
|
@@ -567,10 +699,16 @@ html.reduce-motion .launch-status.is-working::before { animation: none; }
|
|
|
567
699
|
.launch-isolation { display: grid; gap: 8px; }
|
|
568
700
|
.launch-isolation[hidden] { display: none; }
|
|
569
701
|
.launch-isolation-title { color: var(--muted); font-size: 12px; font-weight: 500; }
|
|
570
|
-
|
|
571
|
-
|
|
702
|
+
/* 三档用胶囊分段切:底槽固定在那一圈,当前档的浮块是底槽上的伪元素(data-active 决定滑到哪一档),
|
|
703
|
+
切档时浮块平移过去,比背景色硬切更像真的开关。tab 本身只改文字颜色,不再各自铺底,否则浮块会被盖住。 */
|
|
704
|
+
.launch-isolation-tabs { position: relative; display: flex; gap: 2px; padding: 4px; border-radius: 12px; background: var(--accent-soft); }
|
|
705
|
+
/* 浮块宽度 = 等分三份:底槽内宽 100% - 两侧 padding 8px - 两道 gap 4px,再除以 3 */
|
|
706
|
+
.launch-isolation-tabs::after { content: ''; position: absolute; top: 4px; bottom: 4px; left: 4px; width: calc((100% - 12px) / 3); border-radius: 9px; background: var(--card); box-shadow: 0 2px 8px rgba(22, 35, 61, .1); pointer-events: none; transition: transform 240ms cubic-bezier(.22, .61, .36, 1); }
|
|
707
|
+
.launch-isolation-tabs[data-active="home"]::after { transform: translateX(calc(100% + 2px)); }
|
|
708
|
+
.launch-isolation-tabs[data-active="custom"]::after { transform: translateX(calc(200% + 4px)); }
|
|
709
|
+
.launch-isolation-tab { flex: 1 1 0; position: relative; z-index: 1; padding: 8px; border: 0; border-radius: 9px; background: transparent; color: var(--muted); font-family: inherit; font-size: 13px; font-weight: 500; cursor: pointer; transition: color 160ms ease; }
|
|
572
710
|
.launch-isolation-tab:hover { color: var(--text); }
|
|
573
|
-
.launch-isolation-tab[aria-selected="true"] {
|
|
711
|
+
.launch-isolation-tab[aria-selected="true"] { color: var(--accent); font-weight: 600; }
|
|
574
712
|
.launch-isolation-tab:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
|
|
575
713
|
.launch-custom-fields { display: grid; gap: 14px; }
|
|
576
714
|
.launch-custom-fields[hidden] { display: none; }
|
|
@@ -581,11 +719,33 @@ html.reduce-motion .launch-status.is-working::before { animation: none; }
|
|
|
581
719
|
/* 换档时说明行淡入,文字别硬跳 */
|
|
582
720
|
#launchIsolationHint.isolation-hint-in { animation: launch-isolation-hint-in 200ms cubic-bezier(.22,.61,.36,1) both; }
|
|
583
721
|
@keyframes launch-isolation-hint-in { from { opacity: 0; transform: translateY(-2px); } }
|
|
584
|
-
|
|
722
|
+
/* ---- 前两档下面的折叠:默认收起 = 什么都不用填,展开再指定名字/目录 ---- */
|
|
723
|
+
/* 做成一条浅色小横条(跟 tab 底槽同色),比虚线框安静,展开后才在里面长出一块表单;
|
|
724
|
+
开合由 setLaunchAdvanced 做高度动画,箭头同步转 180°,跟仓库其它折叠的箭头方向一致。 */
|
|
725
|
+
.launch-isolation-advanced { border-radius: 12px; background: var(--accent-soft); overflow: hidden; transition: box-shadow 160ms ease; }
|
|
726
|
+
.launch-isolation-advanced[hidden] { display: none; }
|
|
727
|
+
.launch-isolation-advanced:hover { box-shadow: inset 0 0 0 1px var(--line); }
|
|
728
|
+
.launch-isolation-advanced.is-open { box-shadow: none; }
|
|
729
|
+
.launch-isolation-advanced-toggle { display: flex; align-items: center; gap: 8px; width: 100%; padding: 10px 12px; border: 0; border-radius: 12px; background: transparent; color: var(--muted); font-family: inherit; font-size: 12px; font-weight: 500; text-align: left; cursor: pointer; transition: color 160ms ease; }
|
|
730
|
+
.launch-isolation-advanced-toggle:hover { color: var(--text); }
|
|
731
|
+
.launch-isolation-advanced-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: 10px; }
|
|
732
|
+
.launch-isolation-advanced-label { flex: 1; min-width: 0; }
|
|
733
|
+
.launch-isolation-advanced-chevron { width: 14px; height: 14px; flex: 0 0 auto; transition: transform 220ms cubic-bezier(.22, .61, .36, 1); }
|
|
734
|
+
.launch-isolation-advanced.is-open .launch-isolation-advanced-chevron { transform: rotate(180deg); }
|
|
735
|
+
.launch-isolation-advanced-panel { overflow: hidden; }
|
|
736
|
+
.launch-isolation-advanced-panel[hidden] { display: none; }
|
|
737
|
+
.launch-isolation-advanced-fields { display: grid; gap: 10px; padding: 0 12px 10px; }
|
|
738
|
+
/* 折叠里的目录下拉也是 createUiSelect 包出来的,而 .ui-select 默认只有 148px 宽(给设置页那种小行用),
|
|
739
|
+
放在这个网格里会缩成一小截;这里让它跟下面的输入框一样占满。 */
|
|
740
|
+
.launch-isolation-advanced-fields .ui-select { width: 100%; }
|
|
741
|
+
html.reduce-motion .launch-isolation-tabs::after,
|
|
742
|
+
html.reduce-motion .launch-isolation-tab,
|
|
743
|
+
html.reduce-motion .launch-isolation-advanced-chevron { transition: none; }
|
|
585
744
|
html.reduce-motion .launch-custom-fields:not([hidden]),
|
|
586
745
|
html.reduce-motion #launchIsolationHint.isolation-hint-in { animation: none; }
|
|
587
746
|
@media (prefers-reduced-motion: reduce) {
|
|
588
|
-
.launch-isolation-
|
|
747
|
+
.launch-isolation-tabs::after,
|
|
748
|
+
.launch-isolation-tab, .launch-isolation-advanced-chevron { transition: none; }
|
|
589
749
|
.launch-custom-fields:not([hidden]), #launchIsolationHint.isolation-hint-in { animation: none; }
|
|
590
750
|
}
|
|
591
751
|
/* 开关的几何参数挂在包装层上:圆钮和 range 都要读,定义一处就不会两边对不上。
|
|
@@ -921,7 +1081,13 @@ section[data-category="advanced"] .set-group + .set-label + .set-group { margin-
|
|
|
921
1081
|
.set-row.stacked .set-control input[type=text], .set-row.stacked .set-control input[type=password] { flex: 1 1 auto; min-width: 0; }
|
|
922
1082
|
.set-control textarea { width: 100%; min-width: 0; resize: vertical; padding: 10px 12px; border: 1px solid var(--line); border-radius: 9px; background: var(--card); color: var(--text); font: 12px/1.7 ui-monospace, monospace; }
|
|
923
1083
|
.set-control textarea:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
924
|
-
|
|
1084
|
+
/* 设置行里的图标按钮:尺寸跟这一列的其它控件一样高(--control-height = 36),
|
|
1085
|
+
图标放到 24px —— 通用 .icon-btn svg 是 20px,铅笔那种只占画布 3/4 的图形缩完只剩 15px,看着太小。 */
|
|
1086
|
+
.set-control .icon-btn { width: var(--control-height); height: var(--control-height); border-radius: 10px; }
|
|
1087
|
+
.set-control .icon-btn svg { width: 24px; height: 24px; }
|
|
1088
|
+
/* 设置页的危险操作(浏览器数据 → 清除全部):红字红边,和其他 ghost 按钮同尺寸 */
|
|
1089
|
+
.set-control .ghost.danger { color: var(--danger); border-color: #f7ccd2; }
|
|
1090
|
+
.set-control .ghost.danger:hover:not(:disabled) { background: #fff1f2; }
|
|
925
1091
|
.set-row .hint { margin: 9px 0 0; }
|
|
926
1092
|
/* 整行可点的开关行:给个悬停反馈,别让人猜哪儿能点 */
|
|
927
1093
|
.toggle.set-row {
|
|
@@ -1034,19 +1200,6 @@ section[data-category="advanced"] .set-group + .set-label + .set-group { margin-
|
|
|
1034
1200
|
.hint a { color: var(--accent); text-decoration: underline; text-underline-offset: 3px; }
|
|
1035
1201
|
/* 提示行里的文字型按钮(恢复档的「还原」)与链接同款 */
|
|
1036
1202
|
.hint button { padding: 0; border: 0; background: none; font: inherit; color: var(--accent); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }
|
|
1037
|
-
/* 在跑的实例(多开):一行一个。没有实例时整块收起来(见 paintInstances) */
|
|
1038
|
-
.instances { margin-top: 14px; border-top: 1px solid var(--line); }
|
|
1039
|
-
.instances[hidden] { display: none; }
|
|
1040
|
-
.instances-title { display: block; color: var(--muted); font-size: 12px; letter-spacing: 0.08em; margin: 11px 0 2px; }
|
|
1041
|
-
.instance-row { display: flex; align-items: center; gap: 12px; padding: 9px 0; border-bottom: 1px solid var(--line); }
|
|
1042
|
-
.instance-row:last-child { border-bottom: 0; }
|
|
1043
|
-
.instance-main { flex: 1 1 auto; display: flex; flex-direction: column; gap: 3px; min-width: 0; }
|
|
1044
|
-
.instance-head { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
|
|
1045
|
-
.instance-name { color: var(--text); font-weight: 600; font-size: 14px; letter-spacing: 0; white-space: nowrap; }
|
|
1046
|
-
.instance-profile { color: var(--muted); font-weight: 500; font-size: 12.5px; white-space: nowrap; }
|
|
1047
|
-
.instance-state { flex: 0 0 auto; color: var(--muted); font-size: 11.5px; }
|
|
1048
|
-
.instance-url { color: var(--muted); font-size: 12.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-variant-numeric: tabular-nums; }
|
|
1049
|
-
.instance-actions { display: flex; align-items: center; gap: 8px; flex: 0 0 auto; }
|
|
1050
1203
|
#pane-settings .hint:empty { display: none; }
|
|
1051
1204
|
#settingsHint:not(:empty) { padding: 5px 10px; background: rgba(255, 255, 255, 0.92); border-radius: 8px; }
|
|
1052
1205
|
.progress {
|
|
@@ -1167,6 +1320,47 @@ section[data-category="advanced"] .set-group + .set-label + .set-group { margin-
|
|
|
1167
1320
|
white-space: pre-wrap;
|
|
1168
1321
|
}
|
|
1169
1322
|
.log-actions { display: flex; align-items: center; gap: 8px; flex: 0 0 auto; }
|
|
1323
|
+
/* 启动项日志弹窗:两张卡片(耗时 / 原始日志) */
|
|
1324
|
+
#launchLogDialog .dialog-heading { margin-bottom: 12px; }
|
|
1325
|
+
.launch-log-tools { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin-bottom: 8px; }
|
|
1326
|
+
.launch-log-tools[hidden] { display: none; }
|
|
1327
|
+
.launch-log-loading { display: flex; align-items: center; justify-content: center; gap: 10px; padding: 48px 0; color: var(--muted); font-size: 13px; }
|
|
1328
|
+
.launch-log-loading[hidden] { display: none; }
|
|
1329
|
+
.launch-log-loading .spin { display: block; width: 16px; height: 16px; }
|
|
1330
|
+
.launch-log-tools .hint { margin: 0; }
|
|
1331
|
+
.launch-log-tools .hint:empty { display: none; }
|
|
1332
|
+
.launch-log-meta { display: inline-flex; align-items: center; padding: 3px 10px; border-radius: 999px; background: rgba(127, 127, 127, .1); color: var(--text); font-size: 12px; }
|
|
1333
|
+
.launch-log-card { border: 1px solid var(--line); border-radius: 14px; padding: 14px; background: rgba(127, 127, 127, .035); }
|
|
1334
|
+
.launch-log-card + .launch-log-card { margin-top: 12px; }
|
|
1335
|
+
.launch-log-card-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 10px; }
|
|
1336
|
+
.launch-log-card-head h3 { margin: 0; color: var(--text); font-size: 13px; font-weight: 650; }
|
|
1337
|
+
.launch-log-card-head > span { color: var(--muted); font-size: 11.5px; }
|
|
1338
|
+
.launch-log-head-meta { display: inline-flex; align-items: baseline; gap: 4px; }
|
|
1339
|
+
.launch-log-head-meta #launchLogRss::before { content: '· '; opacity: .6; }
|
|
1340
|
+
.launch-log-actions { display: flex; gap: 6px; }
|
|
1341
|
+
.launch-log-card-head .ghost { padding: 3px 10px; font-size: 11.5px; }
|
|
1342
|
+
.launch-log-subhead { margin: 14px 0 6px; color: var(--muted); font-size: 11.5px; }
|
|
1343
|
+
.launch-log-legend { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
|
|
1344
|
+
.launch-log-legend span { display: inline-flex; align-items: center; gap: 5px; padding: 2px 8px; border-radius: 999px; background: rgba(127, 127, 127, .07); color: var(--muted); font-size: 11.5px; }
|
|
1345
|
+
.launch-log-legend i { width: 7px; height: 7px; border-radius: 2px; }
|
|
1346
|
+
.launch-log-legend b { color: var(--text); font-weight: 600; }
|
|
1347
|
+
.launch-log-ledger { display: flex; height: 22px; border-radius: 8px; overflow: hidden; background: rgba(127, 127, 127, .08); }
|
|
1348
|
+
.launch-log-ledger > span { display: flex; min-width: 3px; align-items: center; justify-content: center; overflow: hidden; color: #fff; font-size: 11px; font-weight: 600; white-space: nowrap; }
|
|
1349
|
+
.ledger-plugin { background: #4d6bfe; }
|
|
1350
|
+
.ledger-node { background: #6f7684; }
|
|
1351
|
+
.ledger-other { background: #b6bcc8; }
|
|
1352
|
+
.ledger-native { background: #d99a2b; }
|
|
1353
|
+
.ledger-rest { background: #dfe3ea; }
|
|
1354
|
+
.launch-log-ledger > .ledger-rest { color: #4a5160; }
|
|
1355
|
+
.launch-log-bars { display: flex; flex-direction: column; gap: 6px; }
|
|
1356
|
+
.launch-log-bar-row { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr) 56px; gap: 10px; align-items: center; font-size: 12px; }
|
|
1357
|
+
.launch-log-bar-row .name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text); }
|
|
1358
|
+
.launch-log-bar-row .track { height: 7px; border-radius: 999px; background: rgba(127, 127, 127, .12); overflow: hidden; }
|
|
1359
|
+
.launch-log-bar-row .fill { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, #9aa4b2, #c3c9d4); }
|
|
1360
|
+
.launch-log-bar-row.is-plugin .fill { background: linear-gradient(90deg, #4d6bfe, #7c93ff); }
|
|
1361
|
+
.launch-log-bar-row .value { text-align: right; color: var(--muted); font-variant-numeric: tabular-nums; }
|
|
1362
|
+
.launch-log-note { margin: 8px 0 0; }
|
|
1363
|
+
.launch-log-text { margin: 0; max-height: min(38vh, 380px); min-height: 150px; overflow: auto; padding: 12px; border-radius: 10px; background: #f7faff; color: #3f5478; font: 12px/1.5 ui-monospace, Consolas, monospace; white-space: pre-wrap; word-break: break-word; }
|
|
1170
1364
|
.ghost {
|
|
1171
1365
|
border: 1px solid #c7d8f7;
|
|
1172
1366
|
background: #fff;
|
|
@@ -1390,7 +1584,6 @@ section[data-category="advanced"] .set-group + .set-label + .set-group { margin-
|
|
|
1390
1584
|
#pluginPanel .plugin-overview-top .ghost { margin-top: 0; }
|
|
1391
1585
|
.plugin-home-bar { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; }
|
|
1392
1586
|
.plugin-home-bar .ui-select { flex: 0 1 280px; width: min(100%, 280px); min-width: 0; margin-left: auto; }
|
|
1393
|
-
.plugin-home-hint { margin: -8px 0 24px; overflow-wrap: anywhere; }
|
|
1394
1587
|
#pluginHomesDialog .ask-card { --dialog-width: 520px; }
|
|
1395
1588
|
#pluginHomesDialog .dialog-heading { margin-bottom: 12px; }
|
|
1396
1589
|
.plugin-homes-list { display: grid; gap: 10px; min-width: 0; }
|
|
@@ -1416,7 +1609,6 @@ section[data-category="advanced"] .set-group + .set-label + .set-group { margin-
|
|
|
1416
1609
|
#pluginHomesAdd.plugin-home-action { color: var(--text); background: var(--accent-soft); }
|
|
1417
1610
|
#pluginHomesAdd.plugin-home-action:hover:not(:disabled) { background: var(--accent-dim); }
|
|
1418
1611
|
#launchPluginsDialog .plugin-home-bar { display: none; }
|
|
1419
|
-
#launchPluginsDialog .plugin-home-hint { display: none; }
|
|
1420
1612
|
@media (max-width: 480px) {
|
|
1421
1613
|
#pluginPanel .plugin-overview-top .profile-add { margin-left: auto; }
|
|
1422
1614
|
.plugin-overview-top .plugin-home-bar { order: 1; flex-basis: 100%; }
|
|
@@ -1480,6 +1672,14 @@ section[data-category="advanced"] .set-group + .set-label + .set-group { margin-
|
|
|
1480
1672
|
to { opacity: 1; transform: none; }
|
|
1481
1673
|
}
|
|
1482
1674
|
.pack-more-meta { padding: 6px 10px 2px; border-top: 1px solid var(--line); margin-top: 4px; color: var(--muted); font-size: 11px; line-height: 1.5; overflow-wrap: anywhere; }
|
|
1675
|
+
/* Profile 备份与回退:列表限高滚动,每行时间 + 涉及文件 + 回退按钮 */
|
|
1676
|
+
.backup-list { display: grid; gap: 8px; max-height: min(46vh, 360px); overflow-y: auto; padding: 2px 0; }
|
|
1677
|
+
.backup-list .hint { margin: 4px 2px; }
|
|
1678
|
+
.backup-row { display: flex; align-items: center; gap: 12px; padding: 10px 12px; background: var(--card); border: 1px solid var(--line); border-radius: 12px; }
|
|
1679
|
+
.backup-row-text { display: grid; gap: 2px; min-width: 0; flex: 1; }
|
|
1680
|
+
.backup-time { font-size: 13px; color: var(--text); }
|
|
1681
|
+
.backup-files { font-size: 11px; color: var(--muted); overflow-wrap: anywhere; }
|
|
1682
|
+
.backup-row .ghost { flex: 0 0 auto; height: 32px; padding: 0 12px; border-radius: 999px; font-size: 12px; }
|
|
1483
1683
|
.pack-source { display: flex; align-items: center; gap: 8px; margin: 6px 0; }
|
|
1484
1684
|
.pack-source input { flex: 1 1 auto; min-width: 0; }
|
|
1485
1685
|
.pack-source .ghost { flex: 0 0 auto; }
|
|
@@ -1531,25 +1731,30 @@ section[data-category="advanced"] .set-group + .set-label + .set-group { margin-
|
|
|
1531
1731
|
.pack-source { flex-wrap: wrap; }
|
|
1532
1732
|
.pack-source input { flex: 1 1 100%; }
|
|
1533
1733
|
}
|
|
1534
|
-
/*
|
|
1535
|
-
.select-panel, .plugin-list, #log, .pane, .settings-nav { scrollbar-width: thin; scrollbar-color: #c3d3ee transparent; }
|
|
1536
|
-
.
|
|
1734
|
+
/* 细滚动条:默认亮灰条在浅色面板上太抢眼,统一成淡蓝灰;弹窗里的长表单(添加启动项的字段区、问句列表、备份列表)也收细,别让粗条压住圆角 */
|
|
1735
|
+
.select-panel, .plugin-list, #log, .pane, .settings-nav, .launch-modal-fields, .dialog-body, .ask-items, .backup-list { scrollbar-width: thin; scrollbar-color: #c3d3ee transparent; }
|
|
1736
|
+
.select-panel::-webkit-scrollbar, .plugin-list::-webkit-scrollbar, #log::-webkit-scrollbar,
|
|
1737
|
+
.pane::-webkit-scrollbar, .settings-nav::-webkit-scrollbar, .launch-modal-fields::-webkit-scrollbar,
|
|
1738
|
+
.dialog-body::-webkit-scrollbar, .ask-items::-webkit-scrollbar, .backup-list::-webkit-scrollbar {
|
|
1537
1739
|
width: 8px;
|
|
1538
1740
|
height: var(--control-height);
|
|
1539
1741
|
}
|
|
1540
1742
|
.select-panel::-webkit-scrollbar-track, .plugin-list::-webkit-scrollbar-track, #log::-webkit-scrollbar-track,
|
|
1541
|
-
.pane::-webkit-scrollbar-track, .settings-nav::-webkit-scrollbar-track
|
|
1743
|
+
.pane::-webkit-scrollbar-track, .settings-nav::-webkit-scrollbar-track, .launch-modal-fields::-webkit-scrollbar-track,
|
|
1744
|
+
.dialog-body::-webkit-scrollbar-track, .ask-items::-webkit-scrollbar-track, .backup-list::-webkit-scrollbar-track {
|
|
1542
1745
|
background: transparent;
|
|
1543
1746
|
}
|
|
1544
1747
|
.select-panel::-webkit-scrollbar-thumb, .plugin-list::-webkit-scrollbar-thumb, #log::-webkit-scrollbar-thumb,
|
|
1545
|
-
.pane::-webkit-scrollbar-thumb, .settings-nav::-webkit-scrollbar-thumb
|
|
1748
|
+
.pane::-webkit-scrollbar-thumb, .settings-nav::-webkit-scrollbar-thumb, .launch-modal-fields::-webkit-scrollbar-thumb,
|
|
1749
|
+
.dialog-body::-webkit-scrollbar-thumb, .ask-items::-webkit-scrollbar-thumb, .backup-list::-webkit-scrollbar-thumb {
|
|
1546
1750
|
background: #c3d3ee;
|
|
1547
1751
|
border-radius: var(--control-radius);
|
|
1548
1752
|
border: 2px solid transparent;
|
|
1549
1753
|
background-clip: content-box;
|
|
1550
1754
|
}
|
|
1551
1755
|
.select-panel::-webkit-scrollbar-thumb:hover, .plugin-list::-webkit-scrollbar-thumb:hover, #log::-webkit-scrollbar-thumb:hover,
|
|
1552
|
-
.pane::-webkit-scrollbar-thumb:hover, .settings-nav::-webkit-scrollbar-thumb:hover
|
|
1756
|
+
.pane::-webkit-scrollbar-thumb:hover, .settings-nav::-webkit-scrollbar-thumb:hover, .launch-modal-fields::-webkit-scrollbar-thumb:hover,
|
|
1757
|
+
.dialog-body::-webkit-scrollbar-thumb:hover, .ask-items::-webkit-scrollbar-thumb:hover, .backup-list::-webkit-scrollbar-thumb:hover {
|
|
1553
1758
|
background: #a3bcea;
|
|
1554
1759
|
background-clip: content-box;
|
|
1555
1760
|
}
|
|
@@ -2169,27 +2374,9 @@ html.reduce-motion #launchIconTrigger, html.reduce-motion #launchDialog .launch-
|
|
|
2169
2374
|
#skillInstallDialog .skill-source-tabs button[aria-pressed=true] { border-bottom-color: var(--accent); }
|
|
2170
2375
|
|
|
2171
2376
|
@media (max-width: 560px) { .version-manage-info { align-items: flex-start; flex-direction: column; gap: 2px; } .version-manage-row .version-manage-info span { max-width: 100%; } }
|
|
2172
|
-
|
|
2173
|
-
/*
|
|
2174
|
-
.
|
|
2175
|
-
.
|
|
2176
|
-
.
|
|
2177
|
-
.
|
|
2178
|
-
@keyframes boot-spin { to { transform: rotate(360deg); } }
|
|
2179
|
-
.boot-title { margin: 0; font-size: 14px; font-weight: 650; }
|
|
2180
|
-
.boot-phase { margin: 0; font-size: 12.5px; color: var(--muted); font-variant-numeric: tabular-nums; }
|
|
2181
|
-
.boot-bar { width: 190px; height: 3px; border-radius: 999px; background: var(--line); overflow: hidden; }
|
|
2182
|
-
.boot-bar span { display: block; width: 42%; height: 100%; border-radius: inherit; background: var(--accent); animation: boot-slide 1.2s ease-in-out infinite; }
|
|
2183
|
-
@keyframes boot-slide { 0% { transform: translateX(-110%); } 100% { transform: translateX(360%); } }
|
|
2184
|
-
.boot-hint { margin: 0; font-size: 11.5px; color: var(--muted); }
|
|
2185
|
-
@media (prefers-reduced-motion: reduce) {
|
|
2186
|
-
.boot-spinner { animation: none; }
|
|
2187
|
-
.boot-bar span { animation: none; width: 100%; }
|
|
2188
|
-
}
|
|
2189
|
-
html[data-color-scheme="dark"] .boot-overlay { background: rgba(10, 11, 14, .62); }
|
|
2190
|
-
|
|
2191
|
-
/* 更新弹窗右上角的关闭:下载在服务端进行,关掉弹窗不影响下载 */
|
|
2192
|
-
.ask-card { position: relative; }
|
|
2193
|
-
#ask .ask-title { padding-right: 36px; }
|
|
2194
|
-
.ask-close { position: absolute; top: 12px; right: 12px; width: 30px; height: 30px; display: grid; place-items: center; padding: 0; border: 0; border-radius: 9px; background: transparent; color: var(--muted); font-size: 18px; line-height: 1; cursor: pointer; transition: background-color .15s ease, color .15s ease; }
|
|
2195
|
-
.ask-close:hover { background: var(--accent-soft); color: var(--text); }
|
|
2377
|
+
|
|
2378
|
+
/* 更新弹窗右上角的关闭:下载在服务端进行,关掉弹窗不影响下载 */
|
|
2379
|
+
.ask-card { position: relative; }
|
|
2380
|
+
#ask .ask-title { padding-right: 36px; }
|
|
2381
|
+
.ask-close { position: absolute; top: 12px; right: 12px; width: 30px; height: 30px; display: grid; place-items: center; padding: 0; border: 0; border-radius: 9px; background: transparent; color: var(--muted); font-size: 18px; line-height: 1; cursor: pointer; transition: background-color .15s ease, color .15s ease; }
|
|
2382
|
+
.ask-close:hover { background: var(--accent-soft); color: var(--text); }
|
package/public/mascot.js
CHANGED
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
&& !document.documentElement.classList.contains('reduce-motion')
|
|
95
95
|
&& !document.documentElement.classList.contains('big-fish-hidden')
|
|
96
96
|
&& !document.documentElement.classList.contains('launcher-idle')
|
|
97
|
-
&& !document.body.classList.contains('subpage-open');
|
|
97
|
+
&& !document.body.classList.contains('subpage-open') && !document.documentElement.classList.contains('internal-dsh-active');
|
|
98
98
|
const refreshRect = () => { rect = host.getBoundingClientRect(); };
|
|
99
99
|
new ResizeObserver(refreshRect).observe(host);
|
|
100
100
|
window.addEventListener('resize', refreshRect);
|