pi-web-ui 0.95.0 → 0.96.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/CHANGELOG.md +63 -1
  2. package/bin/pi-web-ui.mjs +159 -31
  3. package/dist/server/agent-service.js +880 -240
  4. package/dist/server/approval-rules.js +56 -10
  5. package/dist/server/attachment-store.js +21 -4
  6. package/dist/server/attachments.js +30 -3
  7. package/dist/server/bg-servers.js +45 -7
  8. package/dist/server/claim-files-tool.js +4 -8
  9. package/dist/server/claim-store.js +4 -2
  10. package/dist/server/client-state.js +63 -14
  11. package/dist/server/compact-context-tool.js +6 -5
  12. package/dist/server/composer-drafts.js +9 -0
  13. package/dist/server/control-socket.js +57 -28
  14. package/dist/server/conversation-read-tool.js +7 -17
  15. package/dist/server/dangling-tools.js +72 -5
  16. package/dist/server/delegate-task.js +25 -28
  17. package/dist/server/dsh/dsh-agent-service.js +19 -6
  18. package/dist/server/edit-soft-tool.js +14 -11
  19. package/dist/server/eval-tool.js +67 -14
  20. package/dist/server/file-archives.js +16 -5
  21. package/dist/server/files-service.js +30 -11
  22. package/dist/server/goal-service.js +141 -19
  23. package/dist/server/hashline-engine.js +59 -21
  24. package/dist/server/host-guard.js +94 -0
  25. package/dist/server/i18n.js +3 -3
  26. package/dist/server/index.js +331 -78
  27. package/dist/server/lsp-tool.js +752 -60
  28. package/dist/server/mcp-bridge.js +47 -3
  29. package/dist/server/model-admin.js +94 -34
  30. package/dist/server/office-parse.js +96 -30
  31. package/dist/server/patch-tool.js +9 -15
  32. package/dist/server/permission-preset.js +25 -0
  33. package/dist/server/plan-manager.js +11 -1
  34. package/dist/server/plugin-catalog-sync.js +36 -19
  35. package/dist/server/plugin-catalog.js +11 -4
  36. package/dist/server/plugin-facilities.js +92 -21
  37. package/dist/server/plugin-installer.js +30 -0
  38. package/dist/server/plugin-llm.js +71 -65
  39. package/dist/server/plugin-project.js +70 -2
  40. package/dist/server/plugin-updater.js +115 -12
  41. package/dist/server/plugins.js +205 -44
  42. package/dist/server/present-files-tool.js +9 -12
  43. package/dist/server/process-utils.js +4 -0
  44. package/dist/server/prompt-composer.js +9 -0
  45. package/dist/server/protocol-version.js +1 -1
  46. package/dist/server/read-tool.js +69 -30
  47. package/dist/server/resolve-global-sdk.js +30 -16
  48. package/dist/server/schedule-agent-tool.js +12 -15
  49. package/dist/server/sdk-origin.js +18 -2
  50. package/dist/server/serialize.js +108 -21
  51. package/dist/server/settings-service.js +4 -2
  52. package/dist/server/skill-tool.js +5 -7
  53. package/dist/server/subagent-templates.js +51 -0
  54. package/dist/server/subagents.js +48 -72
  55. package/dist/server/terminals.js +181 -69
  56. package/dist/server/tool-manager.js +24 -7
  57. package/dist/server/tool-overrides.js +59 -0
  58. package/dist/server/update-check.js +28 -1
  59. package/dist/server/uploads.js +17 -2
  60. package/dist/server/wait-subscription-scan.js +18 -21
  61. package/dist/server/ws-client-id.js +29 -0
  62. package/dist/server/ws-pending-queue.js +60 -0
  63. package/extensions/webui.ts +60 -2
  64. package/package.json +4 -2
  65. package/plugins/catalog.json +20 -0
  66. package/themes/aetheris.css +457 -0
  67. package/themes/zhupi-dark.css +718 -0
  68. package/themes/zhupi.css +771 -0
  69. package/web/dist/assets/{TerminalPanel-DlGBF2MD.js → TerminalPanel-O3GyFIGG.js} +1 -1
  70. package/web/dist/assets/index-B7Zp23Vc.css +1 -0
  71. package/web/dist/assets/index-ByfoaDwp.js +366 -0
  72. package/web/dist/assets/{markdown-eUQn_o9D.js → markdown-DXwnfD9T.js} +1 -1
  73. package/web/dist/index.html +3 -3
  74. package/web/dist/assets/index-BXnCQL9p.js +0 -364
  75. package/web/dist/assets/index-RpIGFyi_.css +0 -1
@@ -0,0 +1,457 @@
1
+ /* theme-name: 以太座舱 */
2
+ /* theme-name-en: Aetheris HUD */
3
+ /* theme-group: builtin */
4
+ :root {
5
+ color-scheme: dark;
6
+ --bg: #040507;
7
+ --bg-elev: #0a0c13;
8
+ --bg-elev2: #10131d;
9
+ --bg-elev3: rgba(255, 255, 255, 0.05);
10
+ --border: rgba(255, 255, 255, 0.08);
11
+ --border-soft: rgba(255, 255, 255, 0.04);
12
+ --text: #f0f3f8;
13
+ --text-dim: #8e96aa;
14
+ --text-faint: #525a70;
15
+ --accent: #00f5d4;
16
+ --accent-soft: rgba(0, 245, 212, 0.12);
17
+ --green: #10b981;
18
+ --green-soft: rgba(16, 185, 129, 0.12);
19
+ --red: #ff4a6e;
20
+ --red-soft: rgba(255, 74, 110, 0.12);
21
+ --amber: #fbbf24;
22
+ --blue: #6366f1;
23
+ --blue-soft: rgba(99, 102, 241, 0.12);
24
+
25
+ /* 终端 ANSI 调色板 */
26
+ --term-bg: #040507;
27
+ --term-fg: #f0f3f8;
28
+ --term-cursor: #00f5d4;
29
+ --term-cursor-accent: #040507;
30
+ --term-selection: rgba(0, 245, 212, 0.32);
31
+ --term-black: #10131d;
32
+ --term-red: #ff4a6e;
33
+ --term-green: #10b981;
34
+ --term-yellow: #fbbf24;
35
+ --term-blue: #6366f1;
36
+ --term-magenta: #c084fc;
37
+ --term-cyan: #00f5d4;
38
+ --term-white: #f0f3f8;
39
+ --term-bright-black: #525a70;
40
+ --term-bright-red: #ff6b8b;
41
+ --term-bright-green: #34d399;
42
+ --term-bright-yellow: #fde047;
43
+ --term-bright-blue: #818cf8;
44
+ --term-bright-magenta: #e879f9;
45
+ --term-bright-cyan: #5eead4;
46
+ --term-bright-white: #ffffff;
47
+
48
+ --mono: "JetBrains Mono", "SF Mono", ui-monospace, Menlo, Consolas, monospace;
49
+ --mermaid-font-size: 12px;
50
+ --tooltip-bg: #141722;
51
+ --code-bg: #06070c;
52
+ --code-text: #e2e8f0;
53
+ --code-border: var(--border-soft);
54
+ --code-pad: 8px 10px;
55
+ --card-body-pad: 4px 14px 12px;
56
+ --err-text: #ff859c;
57
+ --red-text: #ffa3b4;
58
+ --amber-text: #fde68a;
59
+ --info-blue: #818cf8;
60
+ --link: #00f5d4;
61
+ --link-hover: #5eead4;
62
+ --link-soft: #99f6e4;
63
+ --md-strong: #ffffff;
64
+ --skill-blue: #818cf8;
65
+ --plugin-purple: #c084fc;
66
+ --auth-green: #34d399;
67
+ --scroll-thumb: rgba(255, 255, 255, 0.1);
68
+ --scroll-thumb-hover: rgba(0, 245, 212, 0.45);
69
+ --notice-err-bg: #2d0e16;
70
+ --notice-warn-bg: #281a0b;
71
+ --notice-info-bg: #11152a;
72
+ --notice-err-border: #ff4a6e;
73
+ --notice-warn-border: #fbbf24;
74
+ --notice-info-border: #6366f1;
75
+ --send-blue: #00f5d4;
76
+ --send-blue-hover: #2dd4bf;
77
+ --stop-red: #ff4a6e;
78
+ --stop-red-hover: #e11d48;
79
+ --brand-grad-a: #00f5d4;
80
+ --brand-grad-b: #6366f1;
81
+ --on-amber: #040507;
82
+ --search-active-fg: #040507;
83
+ --switch-knob: #ffffff;
84
+ --sunken-bg: rgba(0, 0, 0, 0.45);
85
+ --glow-015: rgba(0, 245, 212, 0.015);
86
+ --glow-025: rgba(0, 245, 212, 0.025);
87
+ --glow-03: rgba(0, 245, 212, 0.03);
88
+ --glow-04: rgba(0, 245, 212, 0.04);
89
+ --glow-05: rgba(0, 245, 212, 0.05);
90
+ --glow-12: rgba(0, 245, 212, 0.12);
91
+ --glow-18: rgba(0, 245, 212, 0.18);
92
+ --glow-22: rgba(0, 245, 212, 0.22);
93
+ --glow-38: rgba(0, 245, 212, 0.38);
94
+ --control-fg: #8e96aa;
95
+ --control-bg: #10131d;
96
+ --control-border: rgba(255, 255, 255, 0.08);
97
+ --bg-image: none;
98
+ --bg-image-dim: 0.84;
99
+ --bg-image-blur: 0px;
100
+ --wallpaper-panel-alpha: 65%;
101
+ --topbar-bg: color-mix(in srgb, var(--bg-elev) var(--wallpaper-panel-alpha, 65%), transparent);
102
+ --statusbar-bg: color-mix(in srgb, var(--bg-elev) var(--wallpaper-panel-alpha, 65%), transparent);
103
+ --panel-bg: color-mix(in srgb, var(--bg-elev) var(--wallpaper-panel-alpha, 65%), transparent);
104
+ --card-bg: color-mix(in srgb, var(--bg-elev) var(--wallpaper-panel-alpha, 65%), transparent);
105
+ --chip-bg: color-mix(in srgb, var(--bg-elev2) var(--wallpaper-panel-alpha, 65%), transparent);
106
+ --msgs-bg: color-mix(in srgb, var(--bg) var(--wallpaper-panel-alpha, 65%), transparent);
107
+ --inputbox-bg: color-mix(in srgb, var(--bg-elev2) var(--wallpaper-panel-alpha, 65%), transparent);
108
+ --menu-bg: #10131d;
109
+ }
110
+
111
+ /* =========================================================================
112
+ Aetheris HUD — 颠覆性全境空间与交互重塑 (Mission Control Paradigm)
113
+ ========================================================================= */
114
+
115
+ /* ---------------- 1. 虚空点阵场与空间景深 (Cyber Matrix Backdrop) ---------------- */
116
+ body,
117
+ .app-root {
118
+ background-color: var(--bg);
119
+ background-image:
120
+ radial-gradient(rgba(255, 255, 255, 0.055) 1px, transparent 1px),
121
+ radial-gradient(ellipse 70% 55% at 20% 0%, rgba(0, 245, 212, 0.045) 0%, transparent 70%),
122
+ radial-gradient(ellipse 70% 55% at 80% 100%, rgba(99, 102, 241, 0.055) 0%, transparent 70%);
123
+ background-size:
124
+ 32px 32px,
125
+ 100% 100%,
126
+ 100% 100%;
127
+ background-attachment: fixed;
128
+ }
129
+
130
+ /* ---------------- 2. 悬浮机载平显顶栏 (Avionics HUD Topbar) ---------------- */
131
+ .topbar {
132
+ background: rgba(4, 5, 7, 0.6) !important;
133
+ backdrop-filter: blur(24px) saturate(180%) !important;
134
+ -webkit-backdrop-filter: blur(24px) saturate(180%) !important;
135
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06) !important;
136
+ box-shadow: 0 4px 30px rgba(0, 0, 0, 0.5) !important;
137
+ }
138
+
139
+ .topbar .chip,
140
+ .topbar .tb-tab,
141
+ .topbar .plugin-topbar-item {
142
+ border-radius: 8px !important;
143
+ border: 1px solid rgba(255, 255, 255, 0.06) !important;
144
+ background: rgba(255, 255, 255, 0.02) !important;
145
+ transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1) !important;
146
+ }
147
+
148
+ .topbar .chip:hover,
149
+ .topbar .tb-tab:hover,
150
+ .topbar .plugin-topbar-item:hover {
151
+ border-color: rgba(0, 245, 212, 0.35) !important;
152
+ background: rgba(0, 245, 212, 0.07) !important;
153
+ box-shadow: 0 0 16px rgba(0, 245, 212, 0.12) !important;
154
+ transform: translateY(-1px);
155
+ }
156
+
157
+ .brand-name {
158
+ letter-spacing: 0.08em;
159
+ text-transform: uppercase;
160
+ font-weight: 700;
161
+ background: linear-gradient(135deg, #00f5d4 0%, #6366f1 100%);
162
+ -webkit-background-clip: text;
163
+ -webkit-text-fill-color: transparent;
164
+ }
165
+
166
+ /* ---------------- 3. 悬浮指挥中岛 (Floating Command Dock) ---------------- */
167
+ /* 彻底打破贴底通栏传统,将输入框重构为居中浮空战术控制台 */
168
+ .inputbar {
169
+ background: transparent !important;
170
+ padding: 12px var(--chat-inset) 28px !important;
171
+ position: relative !important;
172
+ z-index: 30 !important;
173
+ border-top: none !important;
174
+ }
175
+
176
+ .inputbox {
177
+ background: rgba(10, 12, 20, 0.84) !important;
178
+ backdrop-filter: blur(36px) saturate(220%) !important;
179
+ -webkit-backdrop-filter: blur(36px) saturate(220%) !important;
180
+ border: 1px solid rgba(255, 255, 255, 0.1) !important;
181
+ border-radius: 22px !important;
182
+ padding: 14px 16px 12px !important;
183
+ box-shadow:
184
+ 0 28px 70px -12px rgba(0, 0, 0, 0.85),
185
+ 0 0 0 1px rgba(255, 255, 255, 0.04),
186
+ inset 0 1px 0 rgba(255, 255, 255, 0.16) !important;
187
+ transition:
188
+ border-color 0.25s cubic-bezier(0.16, 1, 0.3, 1),
189
+ box-shadow 0.25s cubic-bezier(0.16, 1, 0.3, 1),
190
+ transform 0.25s cubic-bezier(0.16, 1, 0.3, 1) !important;
191
+ }
192
+
193
+ .inputbox:focus-within {
194
+ border-color: rgba(0, 245, 212, 0.5) !important;
195
+ box-shadow:
196
+ 0 36px 85px -12px rgba(0, 0, 0, 0.95),
197
+ 0 0 35px rgba(0, 245, 212, 0.24),
198
+ inset 0 1px 0 rgba(255, 255, 255, 0.28) !important;
199
+ transform: translateY(-3px);
200
+ }
201
+
202
+ .composer-textarea {
203
+ font-size: 14.5px !important;
204
+ line-height: 1.65 !important;
205
+ }
206
+
207
+ /* 发送按键高阶能量发光体 */
208
+ .btn-send {
209
+ background: linear-gradient(135deg, #00f5d4 0%, #05d5b9 100%) !important;
210
+ color: #040507 !important;
211
+ font-weight: 700 !important;
212
+ border-radius: 12px !important;
213
+ box-shadow: 0 4px 16px rgba(0, 245, 212, 0.35) !important;
214
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1) !important;
215
+ }
216
+
217
+ .btn-send:hover {
218
+ transform: scale(1.05) translateY(-1px);
219
+ box-shadow: 0 6px 24px rgba(0, 245, 212, 0.6) !important;
220
+ }
221
+
222
+ /* ---------------- 4. 任务目标工单化 (Mission Objective Directives) ---------------- */
223
+ /* 颠覆微信式右侧聊天气泡:用户提问直接升级为任务工程指令卡片 */
224
+ .msg-user {
225
+ margin-top: 28px !important;
226
+ margin-bottom: 28px !important;
227
+ max-width: 100% !important;
228
+ }
229
+
230
+ .msg-user .msg-meta {
231
+ display: flex !important;
232
+ align-items: center !important;
233
+ gap: 8px !important;
234
+ margin-bottom: 8px !important;
235
+ }
236
+
237
+ .msg-user .msg-role::before {
238
+ content: "MISSION DIRECTIVE // " !important;
239
+ font-family: var(--mono) !important;
240
+ font-size: 10px !important;
241
+ letter-spacing: 0.15em !important;
242
+ font-weight: 700 !important;
243
+ color: var(--accent) !important;
244
+ opacity: 0.9;
245
+ }
246
+
247
+ .msg-user .msg-body {
248
+ position: relative !important;
249
+ background: linear-gradient(145deg, rgba(16, 20, 32, 0.9) 0%, rgba(9, 11, 19, 0.9) 100%) !important;
250
+ border: 1px solid rgba(0, 245, 212, 0.24) !important;
251
+ border-left: 4px solid var(--accent) !important;
252
+ border-radius: 14px !important;
253
+ padding: 16px 20px !important;
254
+ box-shadow:
255
+ 0 14px 36px -6px rgba(0, 0, 0, 0.55),
256
+ 0 0 28px rgba(0, 245, 212, 0.06),
257
+ inset 0 1px 0 rgba(255, 255, 255, 0.12) !important;
258
+ backdrop-filter: blur(18px) !important;
259
+ -webkit-backdrop-filter: blur(18px) !important;
260
+ }
261
+
262
+ /* ---------------- 5. 神经主导线与自动化流水线 (Execution Neural Spine) ---------------- */
263
+ /* 为 Agent 回复构建统一的垂直神经脉络导轨,将零散的 toolcall 串联为高科技流水线 */
264
+ .msg-assistant .msg-body {
265
+ position: relative !important;
266
+ padding-left: 20px !important;
267
+ border-left: 2px solid rgba(0, 245, 212, 0.2) !important;
268
+ margin-left: 6px !important;
269
+ }
270
+
271
+ /* 工具调用节点微芯片化 */
272
+ .toolcall {
273
+ position: relative !important;
274
+ border-radius: 10px !important;
275
+ border: 1px solid rgba(255, 255, 255, 0.08) !important;
276
+ background: rgba(9, 11, 18, 0.72) !important;
277
+ backdrop-filter: blur(14px) !important;
278
+ -webkit-backdrop-filter: blur(14px) !important;
279
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.35) !important;
280
+ margin: 8px 0 !important;
281
+ transition:
282
+ border-color 0.2s cubic-bezier(0.16, 1, 0.3, 1),
283
+ box-shadow 0.2s cubic-bezier(0.16, 1, 0.3, 1),
284
+ transform 0.15s ease !important;
285
+ }
286
+
287
+ /* 钉在神经导轨上的微型量子状态芯片引脚 */
288
+ .msg-assistant .toolcall::before {
289
+ content: "";
290
+ position: absolute;
291
+ left: -26px;
292
+ top: 14px;
293
+ width: 10px;
294
+ height: 10px;
295
+ border-radius: 50%;
296
+ background: #040507;
297
+ border: 2px solid rgba(255, 255, 255, 0.25);
298
+ box-shadow: 0 0 6px rgba(0, 0, 0, 0.8);
299
+ transition: all 0.25s ease;
300
+ z-index: 2;
301
+ }
302
+
303
+ .toolcall:hover {
304
+ border-color: rgba(255, 255, 255, 0.2) !important;
305
+ transform: translateX(2px);
306
+ }
307
+
308
+ .toolcall-head {
309
+ padding: 6px 14px !important;
310
+ font-family: var(--mono) !important;
311
+ font-size: 13px !important;
312
+ }
313
+
314
+ .toolcall-name {
315
+ color: #00f5d4 !important;
316
+ font-weight: 600 !important;
317
+ letter-spacing: 0.04em !important;
318
+ }
319
+
320
+ /* 运行态量子发光流水线 */
321
+ .toolcall.run {
322
+ border-color: rgba(0, 245, 212, 0.55) !important;
323
+ box-shadow:
324
+ 0 0 24px rgba(0, 245, 212, 0.16),
325
+ inset 0 0 16px rgba(0, 245, 212, 0.06) !important;
326
+ animation: aetheris-pulse 2s ease-in-out infinite alternate !important;
327
+ }
328
+
329
+ .msg-assistant .toolcall.run::before {
330
+ border-color: var(--accent);
331
+ background: var(--accent);
332
+ box-shadow:
333
+ 0 0 12px var(--accent),
334
+ 0 0 20px var(--accent);
335
+ }
336
+
337
+ @keyframes aetheris-pulse {
338
+ 0% {
339
+ border-color: rgba(0, 245, 212, 0.3);
340
+ box-shadow: 0 0 12px rgba(0, 245, 212, 0.08);
341
+ }
342
+ 100% {
343
+ border-color: rgba(0, 245, 212, 0.65);
344
+ box-shadow: 0 0 30px rgba(0, 245, 212, 0.25);
345
+ }
346
+ }
347
+
348
+ .toolcall.ok {
349
+ border-color: rgba(16, 185, 129, 0.35) !important;
350
+ }
351
+
352
+ .msg-assistant .toolcall.ok::before {
353
+ border-color: #10b981;
354
+ background: #10b981;
355
+ box-shadow: 0 0 8px #10b981;
356
+ }
357
+
358
+ .toolcall.ok .toolcall-status {
359
+ color: #10b981 !important;
360
+ text-shadow: 0 0 10px rgba(16, 185, 129, 0.55);
361
+ }
362
+
363
+ .toolcall.err {
364
+ border-color: rgba(255, 74, 110, 0.5) !important;
365
+ box-shadow: 0 0 20px rgba(255, 74, 110, 0.18) !important;
366
+ }
367
+
368
+ .msg-assistant .toolcall.err::before {
369
+ border-color: #ff4a6e;
370
+ background: #ff4a6e;
371
+ box-shadow: 0 0 10px #ff4a6e;
372
+ }
373
+
374
+ .toolcall.err .toolcall-status {
375
+ color: #ff4a6e !important;
376
+ text-shadow: 0 0 10px rgba(255, 74, 110, 0.65);
377
+ }
378
+
379
+ /* ---------------- 6. 神经思维链暗舱 (Neural Synapse Vault) ---------------- */
380
+ .thinking {
381
+ position: relative !important;
382
+ border-radius: 12px !important;
383
+ border: 1px dashed rgba(99, 102, 241, 0.35) !important;
384
+ background: rgba(8, 10, 16, 0.65) !important;
385
+ backdrop-filter: blur(14px) !important;
386
+ -webkit-backdrop-filter: blur(14px) !important;
387
+ margin: 12px 0 !important;
388
+ transition: border-color 0.25s ease !important;
389
+ }
390
+
391
+ .thinking:hover {
392
+ border-color: rgba(99, 102, 241, 0.55) !important;
393
+ }
394
+
395
+ .thinking-head {
396
+ font-family: var(--mono) !important;
397
+ font-size: 12.5px !important;
398
+ letter-spacing: 0.05em !important;
399
+ color: #818cf8 !important;
400
+ }
401
+
402
+ /* ---------------- 7. 工件画布与代码沉浸舱 (Artifact Canvas) ---------------- */
403
+ /* 将代码产出物提升为主画布核心工件视觉 */
404
+ .codeblock {
405
+ border-radius: 12px !important;
406
+ border: 1px solid rgba(255, 255, 255, 0.09) !important;
407
+ background: #06070c !important;
408
+ box-shadow:
409
+ 0 10px 30px -4px rgba(0, 0, 0, 0.65),
410
+ inset 0 1px 0 rgba(255, 255, 255, 0.08) !important;
411
+ overflow: hidden !important;
412
+ margin: 14px 0 !important;
413
+ }
414
+
415
+ .codeblock-head {
416
+ background: rgba(255, 255, 255, 0.035) !important;
417
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06) !important;
418
+ font-family: var(--mono) !important;
419
+ font-size: 12px !important;
420
+ letter-spacing: 0.04em !important;
421
+ }
422
+
423
+ .codeblock pre {
424
+ background: #06070c !important;
425
+ }
426
+
427
+ /* ---------------- 8. 遥测指示底栏 (Avionics Statusbar) ---------------- */
428
+ .statusbar {
429
+ background: rgba(4, 5, 7, 0.75) !important;
430
+ backdrop-filter: blur(24px) !important;
431
+ -webkit-backdrop-filter: blur(24px) !important;
432
+ border-top: 1px solid rgba(255, 255, 255, 0.06) !important;
433
+ font-family: var(--mono) !important;
434
+ font-size: 11.5px !important;
435
+ letter-spacing: 0.03em !important;
436
+ }
437
+
438
+ /* ---------------- 9. 极客悬浮滚动条 (Quiet Cybernetic Scrollbar) ---------------- */
439
+ ::-webkit-scrollbar {
440
+ width: 5px;
441
+ height: 5px;
442
+ }
443
+
444
+ ::-webkit-scrollbar-track {
445
+ background: transparent;
446
+ }
447
+
448
+ ::-webkit-scrollbar-thumb {
449
+ background: rgba(255, 255, 255, 0.08);
450
+ border-radius: 999px;
451
+ transition: background 0.2s ease;
452
+ }
453
+
454
+ ::-webkit-scrollbar-thumb:hover {
455
+ background: rgba(0, 245, 212, 0.5);
456
+ box-shadow: 0 0 10px rgba(0, 245, 212, 0.45);
457
+ }