pi-web-ui 0.94.0 → 0.95.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.
Files changed (65) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/README.md +5 -6
  3. package/README.zh-CN.md +4 -5
  4. package/bin/pi-web-ui.mjs +751 -206
  5. package/dist/server/agent-service.js +1869 -85
  6. package/dist/server/approval-rules.js +550 -0
  7. package/dist/server/attachment-store.js +112 -0
  8. package/dist/server/attachments.js +62 -171
  9. package/dist/server/client-state.js +4 -0
  10. package/dist/server/compact-context-tool.js +125 -0
  11. package/dist/server/context-budget.js +317 -0
  12. package/dist/server/dangling-tools.js +162 -0
  13. package/dist/server/dsh/dsh-agent-service.js +50 -60
  14. package/dist/server/edit-soft-tool.js +70 -5
  15. package/dist/server/eval-tool.js +535 -0
  16. package/dist/server/files-service.js +35 -7
  17. package/dist/server/goal-service.js +240 -68
  18. package/dist/server/hashline-engine.js +665 -0
  19. package/dist/server/host-metrics.js +26 -2
  20. package/dist/server/http-proxy.js +11 -1
  21. package/dist/server/index.js +157 -9
  22. package/dist/server/lsp-tool.js +679 -0
  23. package/dist/server/model-admin.js +20 -0
  24. package/dist/server/office-parse.js +309 -0
  25. package/dist/server/patch-tool.js +91 -0
  26. package/dist/server/plan-manager.js +104 -0
  27. package/dist/server/plugin-api-catalog.js +296 -0
  28. package/dist/server/plugin-install-spec.js +196 -0
  29. package/dist/server/plugin-installer.js +73 -0
  30. package/dist/server/plugin-manifest-validate.js +305 -0
  31. package/dist/server/plugin-project.js +47 -11
  32. package/dist/server/plugin-tool-guard.js +120 -0
  33. package/dist/server/plugins.js +745 -161
  34. package/dist/server/process-utils.js +12 -6
  35. package/dist/server/scheduler-tasks.js +6 -0
  36. package/dist/server/serialize.js +13 -3
  37. package/dist/server/settings-service.js +108 -1
  38. package/dist/server/subagents.js +41 -0
  39. package/dist/server/terminals.js +69 -14
  40. package/dist/server/tool-approval.js +84 -0
  41. package/dist/server/tool-manager.js +214 -6
  42. package/dist/server/workspace-snapshot.js +113 -0
  43. package/package.json +3 -2
  44. package/plugin-sdk/README.md +25 -0
  45. package/plugin-sdk/index.d.ts +31 -38
  46. package/plugin-sdk/index.mjs +35 -19
  47. package/plugins/catalog.json +20 -0
  48. package/themes/ayu-light.css +6 -6
  49. package/themes/catppuccin-latte.css +6 -6
  50. package/themes/claude-code-dark.css +144 -0
  51. package/themes/codex.css +6 -6
  52. package/themes/dark-teal.css +20 -6
  53. package/themes/everforest-light.css +6 -6
  54. package/themes/geist.css +6 -6
  55. package/themes/gruvbox-light.css +6 -6
  56. package/themes/kanagawa-lotus.css +6 -6
  57. package/themes/rose-pine-dawn.css +6 -6
  58. package/themes/solarized-light.css +6 -6
  59. package/themes/vs-code-dark.css +146 -0
  60. package/web/dist/assets/{TerminalPanel-B-CMQuzm.js → TerminalPanel-DlGBF2MD.js} +1 -1
  61. package/web/dist/assets/index-BXnCQL9p.js +364 -0
  62. package/web/dist/assets/index-RpIGFyi_.css +1 -0
  63. package/web/dist/index.html +2 -2
  64. package/web/dist/assets/index-18jK6al2.js +0 -364
  65. package/web/dist/assets/index-B3S9MxnN.css +0 -1
@@ -211,18 +211,20 @@ export function createMockHost(overrides) {
211
211
  // 订阅类:存 handler + 返回注销函数(调用本身由外层统一记进 calls)。
212
212
  // handler 缺省取首参;fs.watch(path, handler) / events.on(topic, handler) /
213
213
  // shortcuts.register(key, handler) 这类回调在第二参,用 sub(method, 1)。
214
- const sub = (method, argIndex = 0) => (...args) => {
215
- const handler = args[argIndex];
216
- if (typeof handler === "function") handlersOf(method).push(handler);
217
- let done = false;
218
- return () => {
219
- if (done) return;
220
- done = true;
221
- const arr = handlersOf(method);
222
- const i = arr.indexOf(handler);
223
- if (i >= 0) arr.splice(i, 1);
214
+ const sub =
215
+ (method, argIndex = 0) =>
216
+ (...args) => {
217
+ const handler = args[argIndex];
218
+ if (typeof handler === "function") handlersOf(method).push(handler);
219
+ let done = false;
220
+ return () => {
221
+ if (done) return;
222
+ done = true;
223
+ const arr = handlersOf(method);
224
+ const i = arr.indexOf(handler);
225
+ if (i >= 0) arr.splice(i, 1);
226
+ };
224
227
  };
225
- };
226
228
  const logImpl = (levelOrArg, ...args) => {
227
229
  const levels = ["debug", "info", "warn", "error"];
228
230
  const level = levels.includes(levelOrArg) ? levelOrArg : "info";
@@ -243,12 +245,16 @@ export function createMockHost(overrides) {
243
245
  try {
244
246
  console.error("[mock-host]", text);
245
247
  } catch {
246
- /* 打印失败不影响单测 */
248
+ /* 打印失败不影响单测 */
247
249
  }
248
250
  }
249
251
  };
250
252
  const statImpl = (p) => ({
251
- name: String(p ?? "").split(/[\\/]/).filter(Boolean).pop() ?? "",
253
+ name:
254
+ String(p ?? "")
255
+ .split(/[\\/]/)
256
+ .filter(Boolean)
257
+ .pop() ?? "",
252
258
  type: "file",
253
259
  size: 0,
254
260
  mtime: 0,
@@ -264,6 +270,7 @@ export function createMockHost(overrides) {
264
270
  const routeStore = [];
265
271
  const proxyStore = [];
266
272
  const scheduleStore = [];
273
+ const effectStore = [];
267
274
  // 注册类:存定义体 + 返回只摘除本次注册的注销函数(与宿主同语义)。
268
275
  const remember = (store, entry) => {
269
276
  if (entry !== undefined) store.push(entry);
@@ -283,6 +290,8 @@ export function createMockHost(overrides) {
283
290
  sendTo: noop,
284
291
  onAttach: sub("onAttach"),
285
292
  onToolEvent: sub("onToolEvent"),
293
+ onToolPre: sub("onToolPre"),
294
+ onToolPost: sub("onToolPost"),
286
295
  onRunEvent: sub("onRunEvent"),
287
296
  getActiveConversation: () => null,
288
297
  chat: async () => okFalse("chatProvider(无头调用未接入)"),
@@ -313,8 +322,7 @@ export function createMockHost(overrides) {
313
322
  const list = Array.isArray(items) ? items : [items];
314
323
  const added = [];
315
324
  for (const raw of list.slice(0, 32)) {
316
- const id =
317
- raw && typeof raw.id === "string" && raw.id ? raw.id : `mock-${++uiAutoId}`;
325
+ const id = raw && typeof raw.id === "string" && raw.id ? raw.id : `mock-${++uiAutoId}`;
318
326
  uiItems.set(id, isPlainObject(raw) ? { ...raw, id } : { id });
319
327
  added.push(id);
320
328
  }
@@ -421,6 +429,12 @@ export function createMockHost(overrides) {
421
429
  on: sub("events.on", 1),
422
430
  },
423
431
  log: logImpl,
432
+ // effect 栈:mock 里只记调用 + 返回可撤函数(真实宿主在反激活时逆序回卷)。
433
+ // 单测里测试 dispose 真跑的写法:拿到 off() 后调它,或断言 host.calls 里有 effect。
434
+ effect: (label, dispose) => {
435
+ const entry = { label, dispose };
436
+ return remember(effectStore, entry);
437
+ },
424
438
  // 浏览器桥兼容(client 侧逻辑单测也能用同一个 mock):无注入回退语义。
425
439
  dialogs: {
426
440
  select: async () => ({ ok: false }),
@@ -527,10 +541,12 @@ export function createMockHost(overrides) {
527
541
  }
528
542
  }
529
543
  // 记录层:所有 host 方法(mock/reset 除外)先记 calls 再委托。
530
- const record = (method, fn) => (...args) => {
531
- calls.push({ method, args, seq: calls.length });
532
- return fn(...args);
533
- };
544
+ const record =
545
+ (method, fn) =>
546
+ (...args) => {
547
+ calls.push({ method, args, seq: calls.length });
548
+ return fn(...args);
549
+ };
534
550
  for (const [key, value] of Object.entries(host)) {
535
551
  if (key === "calls" || key === "logs" || key === "mock" || key === "reset") continue;
536
552
  if (typeof value === "function") {
@@ -109,6 +109,16 @@
109
109
  "source": "xing-shuyin/pi-web-ui/plugins/notes",
110
110
  "homepage": "https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/notes"
111
111
  },
112
+ {
113
+ "id": "desktop-use",
114
+ "name": "桌面控制",
115
+ "icon": "🖱️",
116
+ "iconSvg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"7\"/><line x1=\"12\" y1=\"6\" x2=\"12\" y2=\"10\"/></svg>",
117
+ "description": "让 AI 操作 Windows 桌面:按元素名查控件坐标(UI Automation,无需截图)→ 点击 / 输入(含中文粘贴)/ 按键 / 聚焦窗口。输入库缺失时自动安装,卸载时连带删除。",
118
+ "descriptionEn": "Let the AI drive the Windows desktop: find controls by name via UI Automation (no screenshots) → click / type (CJK via paste) / hotkeys / focus windows. The input library auto-installs on activate and is removed with the plugin.",
119
+ "source": "xing-shuyin/pi-web-ui/plugins/desktop-use",
120
+ "homepage": "https://github.com/xing-shuyin/pi-web-ui/tree/main/plugins/desktop-use"
121
+ },
112
122
  {
113
123
  "id": "pi-web-multigit",
114
124
  "name": "multi-git",
@@ -118,5 +128,15 @@
118
128
  "descriptionEn": "Multi-repo Git overview: changes, diffs, history, branches, stashes, cross-repo search and a timeline for every repository in the workspace, plus a workspace-wide branch view, Fetch/Pull and an optional terminal.",
119
129
  "source": "EinErste/pi-web-multigit",
120
130
  "homepage": "https://github.com/EinErste/pi-web-multigit"
131
+ },
132
+ {
133
+ "id": "reconnect",
134
+ "name": "重连",
135
+ "icon": "🔄",
136
+ "iconSvg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\"/><path d=\"M21 3v5h-5\"/><path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\"/><path d=\"M3 21v-5h5\"/></svg>",
137
+ "description": "断连恢复:查看网页服务与重启守护状态,一键重新连接或重启网页服务(支持单服务/全服务重启,配套可选独立守护进程)。",
138
+ "descriptionEn": "Reconnection & service recovery: inspect web service and companion watchdog health, reconnect or restart services in one click (supports multi-service restarts with companion watchdog).",
139
+ "source": "xieweimo/pi-web-ui-reconnect-watchdog/reconnect-plugin",
140
+ "homepage": "https://github.com/xieweimo/pi-web-ui-reconnect-watchdog"
121
141
  }
122
142
  ]
@@ -62,12 +62,12 @@
62
62
  --auth-green: #18a97c;
63
63
  --scroll-thumb: #d8dade;
64
64
  --scroll-thumb-hover: #b9bcc2;
65
- --notice-err-bg: #401d23;
66
- --notice-warn-bg: #38251f;
67
- --notice-info-bg: #1b2544;
68
- --notice-err-border: #ef4444;
69
- --notice-warn-border: #f59e0b;
70
- --notice-info-border: #3b82f6;
65
+ --notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
66
+ --notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
67
+ --notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
68
+ --notice-err-border: var(--red);
69
+ --notice-warn-border: var(--amber);
70
+ --notice-info-border: var(--info-blue);
71
71
  --send-blue: #f29718;
72
72
  --send-blue-hover: #e08a0d;
73
73
  --stop-red: #ef4444;
@@ -62,12 +62,12 @@
62
62
  --auth-green: #40a02b;
63
63
  --scroll-thumb: #ccd0da;
64
64
  --scroll-thumb-hover: #bcc0cc;
65
- --notice-err-bg: #401d23;
66
- --notice-warn-bg: #38251f;
67
- --notice-info-bg: #1b2544;
68
- --notice-err-border: #ef4444;
69
- --notice-warn-border: #f59e0b;
70
- --notice-info-border: #3b82f6;
65
+ --notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
66
+ --notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
67
+ --notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
68
+ --notice-err-border: var(--red);
69
+ --notice-warn-border: var(--amber);
70
+ --notice-info-border: var(--info-blue);
71
71
  --send-blue: #1e66f5;
72
72
  --send-blue-hover: #7287fd;
73
73
  --stop-red: #ef4444;
@@ -0,0 +1,144 @@
1
+ /* theme-name: Claude Code 暗色 */
2
+ /* theme-name-en: Claude Code Dark */
3
+ /* theme-group: classic */
4
+ :root {
5
+ color-scheme: dark;
6
+ --bg: #191917;
7
+ --bg-elev: #21201d;
8
+ --bg-elev2: #282622;
9
+ --border: #3a3730;
10
+ --border-soft: #2d2b25;
11
+ --text: #f0ede4;
12
+ --text-dim: #b8b3a6;
13
+ --text-faint: #7e7a6e;
14
+ --accent: #cc785c;
15
+ --accent-soft: rgba(204, 120, 92, 0.14);
16
+ --green: #82b573;
17
+ --green-soft: rgba(130, 181, 115, 0.12);
18
+ --red: #e5765a;
19
+ --red-soft: rgba(229, 118, 90, 0.12);
20
+ --amber: #d9a05b;
21
+ --blue: #7da7d9;
22
+ --blue-soft: rgba(125, 167, 217, 0.12);
23
+ --term-bg: #141312;
24
+ --term-fg: #f0ede4;
25
+ --term-cursor: #cc785c;
26
+ --term-cursor-accent: #141312;
27
+ --term-selection: rgba(204, 120, 92, 0.28);
28
+ --term-black: #282622;
29
+ --term-red: #e5765a;
30
+ --term-green: #82b573;
31
+ --term-yellow: #d9a05b;
32
+ --term-blue: #7da7d9;
33
+ --term-magenta: #b48ead;
34
+ --term-cyan: #7fb5b0;
35
+ --term-white: #e3ded2;
36
+ --term-bright-black: #7e7a6e;
37
+ --term-bright-red: #e5765a;
38
+ --term-bright-green: #82b573;
39
+ --term-bright-yellow: #d9a05b;
40
+ --term-bright-blue: #7da7d9;
41
+ --term-bright-magenta: #b48ead;
42
+ --term-bright-cyan: #7fb5b0;
43
+ --term-bright-white: #ffffff;
44
+ --mono: "SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace;
45
+ --mermaid-font-size: 12px;
46
+ --tooltip-bg: #21201d;
47
+ --code-bg: #141312;
48
+ --code-text: #e3ded2;
49
+ --code-border: var(--border-soft);
50
+ --code-pad: 8px 10px;
51
+ --card-body-pad: 4px 14px 12px;
52
+ --err-text: #f0a08c;
53
+ --red-text: #f5b3a3;
54
+ --amber-text: #e8c08a;
55
+ --info-blue: #7da7d9;
56
+ --link: #d98e73;
57
+ --link-hover: #e3a189;
58
+ --link-soft: #e3a189;
59
+ --md-strong: #f0ede4;
60
+ --skill-blue: #7da7d9;
61
+ --plugin-purple: #b48ead;
62
+ --auth-green: #82b573;
63
+ --scroll-thumb: #33302a;
64
+ --scroll-thumb-hover: #454138;
65
+ --notice-err-bg: #3d1f1a;
66
+ --notice-warn-bg: #382c1c;
67
+ --notice-info-bg: #1c2530;
68
+ --notice-err-border: #e5765a;
69
+ --notice-warn-border: #d9a05b;
70
+ --notice-info-border: #7da7d9;
71
+ --send-blue: #cc785c;
72
+ --send-blue-hover: #d98e73;
73
+ --stop-red: #e5765a;
74
+ --stop-red-hover: #d96247;
75
+ --brand-grad-a: #cc785c;
76
+ --brand-grad-b: #d9a05b;
77
+ --on-amber: #1a1a1a;
78
+ --search-active-fg: #191917;
79
+ --switch-knob: #ffffff;
80
+ --bg-elev3: rgba(255, 255, 255, 0.05);
81
+ --sunken-bg: rgba(0, 0, 0, 0.18);
82
+ --glow-015: rgba(255, 255, 255, 0.015);
83
+ --glow-025: rgba(255, 255, 255, 0.025);
84
+ --glow-03: rgba(255, 255, 255, 0.03);
85
+ --glow-04: rgba(255, 255, 255, 0.04);
86
+ --glow-05: rgba(255, 255, 255, 0.05);
87
+ --glow-12: rgba(255, 255, 255, 0.12);
88
+ --glow-18: rgba(255, 255, 255, 0.18);
89
+ --glow-22: rgba(255, 255, 255, 0.22);
90
+ --glow-38: rgba(255, 255, 255, 0.38);
91
+ --control-fg: #b8b3a6;
92
+ --control-bg: #21201d;
93
+ --control-border: #3a3730;
94
+ --bg-image: none;
95
+ --bg-image-dim: 0.78;
96
+ --bg-image-blur: 0px;
97
+ --wallpaper-panel-alpha: 100%;
98
+ --topbar-bg: #21201d;
99
+ --statusbar-bg: #141312;
100
+ --panel-bg: #21201d;
101
+ --card-bg: #21201d;
102
+ --chip-bg: #282622;
103
+ --msgs-bg: #191917;
104
+ --inputbox-bg: #21201d;
105
+ --menu-bg: var(--bg-elev2);
106
+ }
107
+
108
+ /* ---- syntax highlighting (Claude Code Dark) ---- */
109
+ .hljs {
110
+ color: #e3ded2;
111
+ background: #141312;
112
+ }
113
+ .hljs-doctag,
114
+ .hljs-keyword,
115
+ .hljs-meta .hljs-keyword {
116
+ color: #cc785c;
117
+ }
118
+ .hljs-title,
119
+ .hljs-title.class_,
120
+ .hljs-title.function_ {
121
+ color: #d9a05b;
122
+ }
123
+ .hljs-attr,
124
+ .hljs-attribute,
125
+ .hljs-literal,
126
+ .hljs-number {
127
+ color: #e08d5f;
128
+ }
129
+ .hljs-string,
130
+ .hljs-regexp {
131
+ color: #9cbf8a;
132
+ }
133
+ .hljs-built_in,
134
+ .hljs-type {
135
+ color: #7fb5b0;
136
+ }
137
+ .hljs-comment,
138
+ .hljs-code {
139
+ color: #7e7a6e;
140
+ }
141
+ .hljs-tag,
142
+ .hljs-name {
143
+ color: #7da7d9;
144
+ }
package/themes/codex.css CHANGED
@@ -62,12 +62,12 @@
62
62
  --auth-green: #10a37f;
63
63
  --scroll-thumb: #d4d4d8;
64
64
  --scroll-thumb-hover: #a1a1aa;
65
- --notice-err-bg: #401d23;
66
- --notice-warn-bg: #38251f;
67
- --notice-info-bg: #1b2544;
68
- --notice-err-border: #ef4444;
69
- --notice-warn-border: #f59e0b;
70
- --notice-info-border: #3b82f6;
65
+ --notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
66
+ --notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
67
+ --notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
68
+ --notice-err-border: var(--red);
69
+ --notice-warn-border: var(--amber);
70
+ --notice-info-border: var(--info-blue);
71
71
  --send-blue: #10a37f;
72
72
  --send-blue-hover: #0e8c6d;
73
73
  --stop-red: #ef4444;
@@ -4,10 +4,11 @@
4
4
  color-scheme: dark;
5
5
  --bg: #0a0a0a;
6
6
  --bg-elev: #17171c;
7
- --bg-elev2: #1c1c22;
7
+ --bg-elev2: #222228;
8
8
  --border: #26262e;
9
9
  --border-soft: #1f1f26;
10
10
  --text: #dadada;
11
+ --text-strong: #3c9185; /* 深色主题下,用主题色使粗体更明显 */
11
12
  --text-dim: #a8a8b3;
12
13
  --text-faint: #6e6e7a;
13
14
  --accent: #31ac9d;
@@ -53,8 +54,8 @@
53
54
  --notice-info-border: #2dd4bf;
54
55
  --send-blue: #0f766e;
55
56
  --send-blue-hover: #0b5a54;
56
- --brand-grad-a: #28a696;
57
- --brand-grad-b: #38e6f8;
57
+ --brand-grad-a: #00ffe7;
58
+ --brand-grad-b: #202020;
58
59
  --on-amber: #12121a;
59
60
  --search-active-fg: #0f0f12;
60
61
  --switch-knob: #f5f5f7;
@@ -169,12 +170,12 @@
169
170
  color: #0f0f12;
170
171
  }
171
172
 
172
-
173
173
  /* 模板卡悬停阴影 */
174
174
  .empty-template:hover {
175
175
  box-shadow: 0 8px 22px #5DC7B040;
176
176
  }
177
177
 
178
+ /* 描边 */
178
179
  /* 内置几处写死的紫描边,换成符合主题的青 */
179
180
  .empty-template:hover,
180
181
  .empty-template.add:hover,
@@ -187,7 +188,8 @@
187
188
  .attach-chip,
188
189
  .attachcard-mode.bridged,
189
190
  .browser-control-modal .bc-cite,
190
- .notice-info {
191
+ .notice-info,
192
+ .set-catalog-custom {
191
193
  border-color: #5DC7B080;
192
194
  }
193
195
  .chip.newchat {
@@ -215,6 +217,11 @@
215
217
  .fp-html-bar {
216
218
  background: var(--accent-soft);
217
219
  }
220
+ /* 侧栏 Hover */
221
+ .lp-section-title:hover {
222
+ background: var(--chip-bg);
223
+ }
224
+
218
225
 
219
226
  /* 输入框发送\停止按钮阴影 */
220
227
  .inputbox .btn.send,
@@ -228,10 +235,15 @@
228
235
  box-shadow: 0 8px 22px #5dc7b040;
229
236
  }
230
237
 
231
- /* 使正文行内代码更显眼 */
238
+ /* 正文 */
239
+ /* 行内代码更显眼 */
232
240
  .msg-text code {
233
241
  background: #303038;
234
242
  }
243
+ /* 粗体用 --text-strong */
244
+ strong {
245
+ color: var(--text-strong);
246
+ }
235
247
 
236
248
  /* 调整 MD 文件预览样式 */
237
249
  .fp-markdown :not(pre)>code,
@@ -250,3 +262,5 @@
250
262
  .fp-markdown {
251
263
  background: radial-gradient(circle at 10% 0%, #5CCBF60D, transparent 34%), #00000038;
252
264
  }
265
+
266
+
@@ -62,12 +62,12 @@
62
62
  --auth-green: #8da101;
63
63
  --scroll-thumb: #d8d3bd;
64
64
  --scroll-thumb-hover: #bdc3af;
65
- --notice-err-bg: #401d23;
66
- --notice-warn-bg: #38251f;
67
- --notice-info-bg: #1b2544;
68
- --notice-err-border: #ef4444;
69
- --notice-warn-border: #f59e0b;
70
- --notice-info-border: #3b82f6;
65
+ --notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
66
+ --notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
67
+ --notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
68
+ --notice-err-border: var(--red);
69
+ --notice-warn-border: var(--amber);
70
+ --notice-info-border: var(--info-blue);
71
71
  --send-blue: #3a94c5;
72
72
  --send-blue-hover: #2e7aa6;
73
73
  --stop-red: #ef4444;
package/themes/geist.css CHANGED
@@ -62,12 +62,12 @@
62
62
  --auth-green: #059669;
63
63
  --scroll-thumb: #d4d4d4;
64
64
  --scroll-thumb-hover: #a3a3a3;
65
- --notice-err-bg: #401d23;
66
- --notice-warn-bg: #38251f;
67
- --notice-info-bg: #1b2544;
68
- --notice-err-border: #ef4444;
69
- --notice-warn-border: #f59e0b;
70
- --notice-info-border: #3b82f6;
65
+ --notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
66
+ --notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
67
+ --notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
68
+ --notice-err-border: var(--red);
69
+ --notice-warn-border: var(--amber);
70
+ --notice-info-border: var(--info-blue);
71
71
  --send-blue: #000000;
72
72
  --send-blue-hover: #333333;
73
73
  --stop-red: #ef4444;
@@ -62,12 +62,12 @@
62
62
  --auth-green: #79740e;
63
63
  --scroll-thumb: #d5c4a1;
64
64
  --scroll-thumb-hover: #bdae93;
65
- --notice-err-bg: #401d23;
66
- --notice-warn-bg: #38251f;
67
- --notice-info-bg: #1b2544;
68
- --notice-err-border: #ef4444;
69
- --notice-warn-border: #f59e0b;
70
- --notice-info-border: #3b82f6;
65
+ --notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
66
+ --notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
67
+ --notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
68
+ --notice-err-border: var(--red);
69
+ --notice-warn-border: var(--amber);
70
+ --notice-info-border: var(--info-blue);
71
71
  --send-blue: #9d0006;
72
72
  --send-blue-hover: #af3a03;
73
73
  --stop-red: #ef4444;
@@ -62,12 +62,12 @@
62
62
  --auth-green: #6f894e;
63
63
  --scroll-thumb: #d5cea3;
64
64
  --scroll-thumb-hover: #bfb586;
65
- --notice-err-bg: #401d23;
66
- --notice-warn-bg: #38251f;
67
- --notice-info-bg: #1b2544;
68
- --notice-err-border: #ef4444;
69
- --notice-warn-border: #f59e0b;
70
- --notice-info-border: #3b82f6;
65
+ --notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
66
+ --notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
67
+ --notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
68
+ --notice-err-border: var(--red);
69
+ --notice-warn-border: var(--amber);
70
+ --notice-info-border: var(--info-blue);
71
71
  --send-blue: #4d699b;
72
72
  --send-blue-hover: #3d5680;
73
73
  --stop-red: #ef4444;
@@ -62,12 +62,12 @@
62
62
  --auth-green: #56949f;
63
63
  --scroll-thumb: #e0d8ce;
64
64
  --scroll-thumb-hover: #c9bfb2;
65
- --notice-err-bg: #401d23;
66
- --notice-warn-bg: #38251f;
67
- --notice-info-bg: #1b2544;
68
- --notice-err-border: #ef4444;
69
- --notice-warn-border: #f59e0b;
70
- --notice-info-border: #3b82f6;
65
+ --notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
66
+ --notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
67
+ --notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
68
+ --notice-err-border: var(--red);
69
+ --notice-warn-border: var(--amber);
70
+ --notice-info-border: var(--info-blue);
71
71
  --send-blue: #907aa9;
72
72
  --send-blue-hover: #79759c;
73
73
  --stop-red: #ef4444;
@@ -62,12 +62,12 @@
62
62
  --auth-green: #859900;
63
63
  --scroll-thumb: #d5cbab;
64
64
  --scroll-thumb-hover: #b7a982;
65
- --notice-err-bg: #401d23;
66
- --notice-warn-bg: #38251f;
67
- --notice-info-bg: #1b2544;
68
- --notice-err-border: #ef4444;
69
- --notice-warn-border: #f59e0b;
70
- --notice-info-border: #3b82f6;
65
+ --notice-err-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--red));
66
+ --notice-warn-bg: color-mix(in srgb, var(--bg-elev) 90%, var(--amber));
67
+ --notice-info-bg: color-mix(in srgb, var(--bg) 95%, var(--info-blue));
68
+ --notice-err-border: var(--red);
69
+ --notice-warn-border: var(--amber);
70
+ --notice-info-border: var(--info-blue);
71
71
  --send-blue: #268bd2;
72
72
  --send-blue-hover: #2aa198;
73
73
  --stop-red: #ef4444;