codexmate 0.0.20 → 0.0.21

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 (102) hide show
  1. package/README.en.md +349 -259
  2. package/README.md +284 -252
  3. package/cli/agents-files.js +162 -0
  4. package/cli/archive-helpers.js +446 -0
  5. package/cli/auth-profiles.js +359 -0
  6. package/cli/builtin-proxy.js +580 -0
  7. package/cli/claude-proxy.js +998 -0
  8. package/cli/config-bootstrap.js +384 -0
  9. package/cli/config-health.js +338 -338
  10. package/cli/openclaw-config.js +629 -0
  11. package/cli/skills.js +1141 -0
  12. package/cli/zip-commands.js +510 -0
  13. package/cli.js +13101 -13497
  14. package/lib/cli-file-utils.js +151 -151
  15. package/lib/cli-models-utils.js +419 -311
  16. package/lib/cli-network-utils.js +164 -164
  17. package/lib/cli-path-utils.js +69 -0
  18. package/lib/cli-session-utils.js +121 -121
  19. package/lib/cli-sessions.js +386 -0
  20. package/lib/cli-utils.js +155 -155
  21. package/lib/download-artifacts.js +77 -0
  22. package/lib/mcp-stdio.js +440 -440
  23. package/lib/task-orchestrator.js +869 -0
  24. package/lib/text-diff.js +303 -303
  25. package/lib/workflow-engine.js +340 -340
  26. package/package.json +74 -70
  27. package/res/json5.min.js +1 -1
  28. package/res/vue.global.prod.js +13 -0
  29. package/web-ui/app.js +530 -397
  30. package/web-ui/index.html +33 -30
  31. package/web-ui/logic.agents-diff.mjs +386 -386
  32. package/web-ui/logic.claude.mjs +168 -108
  33. package/web-ui/logic.mjs +5 -5
  34. package/web-ui/logic.runtime.mjs +124 -124
  35. package/web-ui/logic.sessions.mjs +581 -263
  36. package/web-ui/modules/api.mjs +90 -69
  37. package/web-ui/modules/app.computed.dashboard.mjs +113 -113
  38. package/web-ui/modules/app.computed.index.mjs +15 -13
  39. package/web-ui/modules/app.computed.main-tabs.mjs +195 -0
  40. package/web-ui/modules/app.computed.session.mjs +507 -141
  41. package/web-ui/modules/app.constants.mjs +15 -15
  42. package/web-ui/modules/app.methods.agents.mjs +493 -493
  43. package/web-ui/modules/app.methods.claude-config.mjs +174 -174
  44. package/web-ui/modules/app.methods.codex-config.mjs +640 -640
  45. package/web-ui/modules/app.methods.index.mjs +88 -86
  46. package/web-ui/modules/app.methods.install.mjs +149 -157
  47. package/web-ui/modules/app.methods.navigation.mjs +619 -478
  48. package/web-ui/modules/app.methods.openclaw-core.mjs +814 -514
  49. package/web-ui/modules/app.methods.openclaw-editing.mjs +372 -337
  50. package/web-ui/modules/app.methods.openclaw-persist.mjs +369 -251
  51. package/web-ui/modules/app.methods.providers.mjs +363 -265
  52. package/web-ui/modules/app.methods.runtime.mjs +323 -323
  53. package/web-ui/modules/app.methods.session-actions.mjs +520 -457
  54. package/web-ui/modules/app.methods.session-browser.mjs +626 -435
  55. package/web-ui/modules/app.methods.session-timeline.mjs +448 -441
  56. package/web-ui/modules/app.methods.session-trash.mjs +422 -419
  57. package/web-ui/modules/app.methods.startup-claude.mjs +412 -406
  58. package/web-ui/modules/app.methods.task-orchestration.mjs +471 -0
  59. package/web-ui/modules/config-mode.computed.mjs +126 -124
  60. package/web-ui/modules/skills.computed.mjs +107 -107
  61. package/web-ui/modules/skills.methods.mjs +481 -481
  62. package/web-ui/partials/index/layout-footer.html +13 -69
  63. package/web-ui/partials/index/layout-header.html +402 -337
  64. package/web-ui/partials/index/modal-config-template-agents.html +125 -125
  65. package/web-ui/partials/index/modal-confirm-toast.html +32 -32
  66. package/web-ui/partials/index/modal-health-check.html +72 -72
  67. package/web-ui/partials/index/modal-openclaw-config.html +280 -275
  68. package/web-ui/partials/index/modal-skills.html +184 -184
  69. package/web-ui/partials/index/modals-basic.html +156 -196
  70. package/web-ui/partials/index/panel-config-claude.html +126 -100
  71. package/web-ui/partials/index/panel-config-codex.html +237 -237
  72. package/web-ui/partials/index/panel-config-openclaw.html +78 -84
  73. package/web-ui/partials/index/panel-docs.html +130 -0
  74. package/web-ui/partials/index/panel-market.html +174 -174
  75. package/web-ui/partials/index/panel-orchestration.html +397 -0
  76. package/web-ui/partials/index/panel-sessions.html +292 -387
  77. package/web-ui/partials/index/panel-settings.html +190 -166
  78. package/web-ui/partials/index/panel-usage.html +213 -0
  79. package/web-ui/session-helpers.mjs +559 -362
  80. package/web-ui/source-bundle.cjs +233 -233
  81. package/web-ui/styles/base-theme.css +271 -373
  82. package/web-ui/styles/controls-forms.css +360 -354
  83. package/web-ui/styles/docs-panel.css +182 -0
  84. package/web-ui/styles/feedback.css +108 -108
  85. package/web-ui/styles/health-check-dialog.css +144 -144
  86. package/web-ui/styles/layout-shell.css +376 -330
  87. package/web-ui/styles/modals-core.css +464 -449
  88. package/web-ui/styles/navigation-panels.css +348 -381
  89. package/web-ui/styles/openclaw-structured.css +266 -266
  90. package/web-ui/styles/responsive.css +450 -416
  91. package/web-ui/styles/sessions-list.css +400 -414
  92. package/web-ui/styles/sessions-preview.css +411 -405
  93. package/web-ui/styles/sessions-toolbar-trash.css +243 -243
  94. package/web-ui/styles/sessions-usage.css +628 -276
  95. package/web-ui/styles/skills-list.css +296 -298
  96. package/web-ui/styles/skills-market.css +335 -335
  97. package/web-ui/styles/task-orchestration.css +776 -0
  98. package/web-ui/styles/titles-cards.css +408 -407
  99. package/web-ui/styles.css +18 -16
  100. package/web-ui.html +17 -17
  101. package/res/screenshot.png +0 -0
  102. package/res/vue.global.js +0 -18552
@@ -1,373 +1,271 @@
1
- /* Use local font stacks only; avoid third-party font fetches. */
2
-
3
- /* ============================================
4
- 设计系统 - Design Tokens
5
- ============================================ */
6
- :root {
7
- /* 色彩系统:去除杂纹,强调干净留白与温柔橙红 */
8
- --color-brand: #D0583A;
9
- --color-brand-dark: #B8442B;
10
- --color-brand-light: rgba(208, 88, 58, 0.14);
11
- --color-brand-subtle: rgba(201, 94, 75, 0.2);
12
-
13
- --color-bg: #F8F2EA;
14
- --color-surface: #FFFDFC;
15
- --color-surface-alt: #FFF8F2;
16
- --color-surface-elevated: #FFFFFF;
17
- --color-surface-tint: rgba(255, 255, 255, 0.84);
18
- --color-text-primary: #1B1714;
19
- --color-text-secondary: #473C34;
20
- --color-text-tertiary: #6F6054;
21
- --color-text-muted: #6C5B50;
22
- --color-border: #D8C9B8;
23
- --color-border-soft: rgba(216, 201, 184, 0.38);
24
- --color-border-strong: rgba(216, 201, 184, 0.68);
25
-
26
- --color-success: #4B8B6A;
27
- --color-error: #C44536;
28
-
29
- --bg-warm-gradient:
30
- linear-gradient(180deg, #F8F2EA 0%, #F8F2EA 100%);
31
-
32
- /* 字体系统 */
33
- --font-family-body: 'JetBrainsMono Nerd Font Mono', 'OPPO Sans 4.0', 'Fira Mono', 'JetBrains Mono', 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', monospace;
34
- --font-family-display: 'JetBrainsMono Nerd Font Mono', 'OPPO Sans 4.0', 'Fira Mono', 'JetBrains Mono', 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', monospace;
35
- --font-family-mono: 'JetBrainsMono Nerd Font Mono', 'OPPO Sans 4.0', 'Fira Mono', 'JetBrains Mono', 'SFMono-Regular', Consolas, 'Liberation Mono', monospace;
36
- --font-family: var(--font-family-body);
37
-
38
- --font-size-display: 52px;
39
- --font-size-title: 18px;
40
- --font-size-large: 20px;
41
- --font-size-body: 15px;
42
- --font-size-secondary: 13px;
43
- --font-size-caption: 11px;
44
-
45
- --font-weight-display: 600;
46
- --font-weight-primary: 600;
47
- --font-weight-title: 600;
48
- --font-weight-body: 400;
49
- --font-weight-secondary: 500;
50
- --font-weight-caption: 500;
51
-
52
- --line-height-tight: 1.12;
53
- --line-height-normal: 1.5;
54
-
55
- /* 间距系统 */
56
- --spacing-xs: 8px;
57
- --spacing-sm: 16px;
58
- --spacing-md: 24px;
59
- --spacing-lg: 40px;
60
- --spacing-xl: 64px;
61
-
62
- /* 圆角系统 */
63
- --radius-sm: 8px;
64
- --radius-md: 10px;
65
- --radius-lg: 12px;
66
- --radius-xl: 18px;
67
- --radius-full: 50px;
68
-
69
- /* 阴影系统 - 多层叠加提升真实感 */
70
- --shadow-subtle: 0 1px 2px rgba(31, 26, 23, 0.03);
71
- --shadow-card: 0 6px 18px rgba(31, 26, 23, 0.06);
72
- --shadow-card-hover: 0 10px 24px rgba(31, 26, 23, 0.08);
73
- --shadow-float: 0 12px 26px rgba(31, 26, 23, 0.12);
74
- --shadow-raised: 0 10px 20px rgba(31, 26, 23, 0.1);
75
- --shadow-modal:
76
- 0 8px 24px rgba(31, 26, 23, 0.08),
77
- 0 24px 64px rgba(31, 26, 23, 0.06);
78
- --shadow-input-focus:
79
- 0 0 0 3px var(--color-brand-light),
80
- 0 1px 3px rgba(31, 26, 23, 0.04);
81
-
82
- /* 动画 - 更细腻的曲线 */
83
- --transition-instant: 100ms;
84
- --transition-fast: 120ms;
85
- --transition-normal: 200ms;
86
- --transition-slow: 300ms;
87
- --ease-spring: cubic-bezier(0.16, 1, 0.3, 1);
88
- --ease-spring-soft: cubic-bezier(0.25, 1, 0.5, 1);
89
- --ease-smooth: cubic-bezier(0.4, 0, 0.2, 1);
90
- --ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1);
91
- }
92
-
93
- /* ============================================
94
- 手机桌面 UA 兜底:触控设备强制紧凑排版
95
- ============================================ */
96
- body.force-compact {
97
- --font-size-title: 20px;
98
- --font-size-body: 16px;
99
- --font-size-secondary: 14px;
100
- --font-size-caption: 12px;
101
- }
102
-
103
- body.force-compact .container {
104
- max-width: 760px;
105
- padding: 10px 10px 16px;
106
- }
107
-
108
- body.force-compact .provider-fast-switch {
109
- position: sticky;
110
- top: 8px;
111
- z-index: 16;
112
- }
113
-
114
- body.force-compact .provider-fast-switch-select {
115
- min-height: 44px;
116
- font-size: 16px;
117
- }
118
-
119
- body.force-compact .app-shell {
120
- grid-template-columns: 1fr;
121
- gap: 12px;
122
- }
123
-
124
- body.force-compact .main-panel {
125
- position: relative;
126
- top: auto;
127
- align-self: stretch;
128
- width: 100%;
129
- height: auto;
130
- }
131
-
132
- body.force-compact .side-rail,
133
- body.force-compact .status-inspector {
134
- display: none;
135
- }
136
-
137
- body.force-compact .top-tabs {
138
- display: grid !important;
139
- grid-template-columns: repeat(1, minmax(0, 1fr));
140
- }
141
-
142
- @media (min-width: 541px) {
143
- body.force-compact .top-tabs {
144
- grid-template-columns: repeat(2, minmax(0, 1fr));
145
- }
146
- }
147
-
148
- body.force-compact .hero-logo {
149
- display: block;
150
- }
151
-
152
- body.force-compact .hero-github {
153
- display: flex;
154
- }
155
-
156
- body.force-compact .main-panel {
157
- padding: 14px 12px;
158
- }
159
-
160
- body.force-compact .hero-title {
161
- font-size: 34px;
162
- }
163
-
164
- body.force-compact .card {
165
- display: flex;
166
- flex-direction: column;
167
- align-items: flex-start;
168
- justify-content: flex-start;
169
- padding: 12px;
170
- gap: 8px;
171
- }
172
-
173
- body.force-compact .card-leading {
174
- align-items: flex-start;
175
- width: 100%;
176
- }
177
-
178
- body.force-compact .card-content {
179
- width: 100%;
180
- }
181
-
182
- body.force-compact .card-title,
183
- body.force-compact .card-title > span:first-child {
184
- white-space: normal;
185
- overflow: visible;
186
- text-overflow: clip;
187
- overflow-wrap: anywhere;
188
- }
189
-
190
- body.force-compact .card-subtitle {
191
- white-space: normal;
192
- overflow: hidden;
193
- text-overflow: clip;
194
- overflow-wrap: anywhere;
195
- display: -webkit-box;
196
- -webkit-line-clamp: 2;
197
- -webkit-box-orient: vertical;
198
- }
199
-
200
- body.force-compact .card-trailing {
201
- width: 100%;
202
- margin-top: 0;
203
- grid-auto-flow: row;
204
- grid-auto-columns: 1fr;
205
- justify-content: stretch;
206
- justify-items: end;
207
- }
208
-
209
- body.force-compact .card-trailing .card-actions {
210
- width: 100%;
211
- justify-content: flex-end;
212
- justify-self: stretch;
213
- flex-wrap: wrap;
214
- }
215
-
216
- body.force-compact .card-actions {
217
- opacity: 1;
218
- transform: none;
219
- }
220
-
221
- body.force-compact .card-trailing .pill,
222
- body.force-compact .card-trailing .latency {
223
- justify-self: end;
224
- }
225
-
226
- body.force-compact .btn-add,
227
- body.force-compact .btn-tool,
228
- body.force-compact .card-action-btn {
229
- min-height: 44px;
230
- }
231
-
232
- /* ============================================
233
- 基础重置
234
- ============================================ */
235
- * {
236
- margin: 0;
237
- padding: 0;
238
- box-sizing: border-box;
239
- }
240
-
241
- /* 仅屏幕阅读器可见 */
242
- .sr-only {
243
- position: absolute;
244
- width: 1px;
245
- height: 1px;
246
- padding: 0;
247
- margin: -1px;
248
- overflow: hidden;
249
- clip: rect(0, 0, 0, 0);
250
- white-space: nowrap;
251
- border: 0;
252
- }
253
-
254
- body {
255
- font-family: var(--font-family-body);
256
- background-color: var(--color-bg);
257
- background: var(--bg-warm-gradient);
258
- color: var(--color-text-primary);
259
- display: flex;
260
- justify-content: center;
261
- align-items: center;
262
- min-height: 100vh;
263
- padding: var(--spacing-lg) var(--spacing-md);
264
- -webkit-font-smoothing: antialiased;
265
- -moz-osx-font-smoothing: grayscale;
266
- position: relative;
267
- overflow-x: hidden;
268
- }
269
-
270
- .fab-install {
271
- position: fixed;
272
- left: 16px;
273
- bottom: calc(16px + env(safe-area-inset-bottom, 0px));
274
- z-index: 90;
275
- display: inline-grid;
276
- place-items: center;
277
- width: 50px;
278
- height: 50px;
279
- min-width: 44px;
280
- min-height: 44px;
281
- padding: 0;
282
- border-radius: var(--radius-full);
283
- border: 1px solid rgba(255, 255, 255, 0.28);
284
- background:
285
- linear-gradient(135deg, rgba(255, 255, 255, 0.18) 0%, rgba(255, 255, 255, 0.04) 100%),
286
- linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);
287
- color: #fff;
288
- font-size: var(--font-size-secondary);
289
- font-weight: var(--font-weight-secondary);
290
- letter-spacing: 0.015em;
291
- box-shadow: var(--shadow-float);
292
- cursor: pointer;
293
- overflow: hidden;
294
- transition:
295
- transform var(--transition-fast) var(--ease-spring),
296
- box-shadow var(--transition-fast) var(--ease-spring),
297
- filter var(--transition-fast) var(--ease-smooth);
298
- animation: fabPulse 3.2s ease-in-out infinite;
299
- }
300
-
301
- .fab-install::after {
302
- content: "";
303
- position: absolute;
304
- inset: 1px;
305
- border-radius: inherit;
306
- border: 1px solid rgba(255, 255, 255, 0.12);
307
- pointer-events: none;
308
- }
309
-
310
- .fab-install-icon {
311
- width: 20px;
312
- height: 20px;
313
- display: inline-grid;
314
- place-items: center;
315
- color: #fff;
316
- background: transparent;
317
- box-shadow: none;
318
- flex-shrink: 0;
319
- }
320
-
321
- .fab-install-icon svg {
322
- width: 18px;
323
- height: 18px;
324
- }
325
-
326
- .fab-install:hover {
327
- transform: translateY(-1px);
328
- box-shadow: var(--shadow-raised);
329
- filter: saturate(1.04);
330
- }
331
-
332
- .fab-install:active {
333
- transform: translateY(0);
334
- filter: saturate(0.98);
335
- }
336
-
337
- @media (max-width: 640px) {
338
- .fab-install {
339
- left: 12px;
340
- bottom: calc(12px + env(safe-area-inset-bottom, 0px));
341
- width: 44px;
342
- height: 44px;
343
- padding: 0;
344
- font-size: var(--font-size-secondary);
345
- }
346
-
347
- .fab-install-icon {
348
- width: 18px;
349
- height: 18px;
350
- }
351
-
352
- .fab-install-icon svg {
353
- width: 16px;
354
- height: 16px;
355
- }
356
- }
357
-
358
- @keyframes fabPulse {
359
- 0%,
360
- 100% {
361
- box-shadow: var(--shadow-float);
362
- }
363
- 50% {
364
- box-shadow: 0 14px 30px rgba(31, 26, 23, 0.14);
365
- }
366
- }
367
-
368
- @media (prefers-reduced-motion: reduce) {
369
- .fab-install {
370
- animation: none;
371
- transition: none;
372
- }
373
- }
1
+ /* Use local font stacks only; avoid third-party font fetches. */
2
+
3
+ /* ============================================
4
+ 设计系统 - Design Tokens
5
+ ============================================ */
6
+ :root {
7
+ /* 色彩系统:温和中性暖灰 + 柔粉强调 */
8
+ --color-brand: #C77462;
9
+ --color-brand-dark: #B45E4E;
10
+ --color-brand-light: rgba(199, 116, 98, 0.14);
11
+ --color-brand-subtle: rgba(199, 116, 98, 0.2);
12
+
13
+ --color-bg: #F7F3EF;
14
+ --color-surface: #FFFDFC;
15
+ --color-surface-alt: #F8F3EE;
16
+ --color-surface-elevated: #FFFFFF;
17
+ --color-surface-tint: rgba(255, 253, 252, 0.9);
18
+ --color-text-primary: #241F1C;
19
+ --color-text-secondary: #5A514B;
20
+ --color-text-tertiary: #7A6E66;
21
+ --color-text-muted: #A39286;
22
+ --color-border: #E7DDD4;
23
+ --color-border-soft: rgba(163, 146, 134, 0.22);
24
+ --color-border-strong: rgba(163, 146, 134, 0.4);
25
+
26
+ --color-success: #4B8B6A;
27
+ --color-error: #C44536;
28
+
29
+ --bg-warm-gradient:
30
+ linear-gradient(180deg, #F7F3EF 0%, #F7F3EF 100%);
31
+
32
+ /* 字体系统 */
33
+ --font-family-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
34
+ --font-family-display: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
35
+ --font-family-mono: 'JetBrainsMono Nerd Font Mono', 'JetBrains Mono', 'Fira Code', 'SFMono-Regular', Consolas, 'Liberation Mono', monospace;
36
+ --font-family: var(--font-family-body);
37
+
38
+ --font-size-display: 52px;
39
+ --font-size-title: 18px;
40
+ --font-size-large: 20px;
41
+ --font-size-body: 15px;
42
+ --font-size-secondary: 13px;
43
+ --font-size-caption: 11px;
44
+
45
+ --font-weight-display: 600;
46
+ --font-weight-primary: 600;
47
+ --font-weight-title: 600;
48
+ --font-weight-body: 400;
49
+ --font-weight-secondary: 500;
50
+ --font-weight-caption: 500;
51
+
52
+ --line-height-tight: 1.12;
53
+ --line-height-normal: 1.5;
54
+
55
+ /* 间距系统 */
56
+ --spacing-xs: 8px;
57
+ --spacing-sm: 16px;
58
+ --spacing-md: 24px;
59
+ --spacing-lg: 40px;
60
+ --spacing-xl: 64px;
61
+
62
+ /* 圆角系统 */
63
+ --radius-sm: 8px;
64
+ --radius-md: 10px;
65
+ --radius-lg: 12px;
66
+ --radius-xl: 18px;
67
+ --radius-full: 50px;
68
+
69
+ /* 阴影系统 - 温和、轻量 */
70
+ --shadow-subtle: 0 1px 2px rgba(36, 31, 28, 0.03);
71
+ --shadow-card: 0 4px 12px rgba(36, 31, 28, 0.045);
72
+ --shadow-card-hover: 0 8px 22px rgba(36, 31, 28, 0.07);
73
+ --shadow-float: 0 12px 28px rgba(36, 31, 28, 0.1);
74
+ --shadow-raised: 0 8px 18px rgba(36, 31, 28, 0.08);
75
+ --shadow-modal:
76
+ 0 8px 24px rgba(36, 31, 28, 0.08),
77
+ 0 24px 64px rgba(36, 31, 28, 0.05);
78
+ --shadow-input-focus:
79
+ 0 0 0 3px var(--color-brand-light),
80
+ 0 1px 3px rgba(31, 26, 23, 0.04);
81
+
82
+ /* 动画 - 更细腻的曲线 */
83
+ --transition-instant: 100ms;
84
+ --transition-fast: 120ms;
85
+ --transition-normal: 200ms;
86
+ --transition-slow: 300ms;
87
+ --ease-spring: cubic-bezier(0.16, 1, 0.3, 1);
88
+ --ease-spring-soft: cubic-bezier(0.25, 1, 0.5, 1);
89
+ --ease-smooth: cubic-bezier(0.4, 0, 0.2, 1);
90
+ --ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1);
91
+ }
92
+
93
+ /* ============================================
94
+ 手机桌面 UA 兜底:触控设备强制紧凑排版
95
+ ============================================ */
96
+ body.force-compact {
97
+ --font-size-title: 20px;
98
+ --font-size-body: 16px;
99
+ --font-size-secondary: 14px;
100
+ --font-size-caption: 12px;
101
+ }
102
+
103
+ body.force-compact .container {
104
+ max-width: none;
105
+ padding: 0;
106
+ }
107
+
108
+ body.force-compact .provider-fast-switch {
109
+ position: sticky;
110
+ top: 8px;
111
+ z-index: 16;
112
+ }
113
+
114
+ body.force-compact .provider-fast-switch-select {
115
+ min-height: 44px;
116
+ font-size: 16px;
117
+ }
118
+
119
+ body.force-compact .app-shell {
120
+ grid-template-columns: 1fr;
121
+ gap: 12px;
122
+ height: auto;
123
+ min-height: auto;
124
+ overflow: visible;
125
+ }
126
+
127
+ body.force-compact .main-panel {
128
+ position: relative;
129
+ top: auto;
130
+ align-self: stretch;
131
+ width: 100%;
132
+ height: auto;
133
+ overflow-y: visible;
134
+ }
135
+
136
+ body.force-compact .side-rail,
137
+ body.force-compact .status-inspector {
138
+ display: none;
139
+ }
140
+
141
+ body.force-compact .top-tabs {
142
+ display: flex !important;
143
+ flex-wrap: nowrap;
144
+ overflow-x: auto;
145
+ overflow-y: hidden;
146
+ -webkit-overflow-scrolling: touch;
147
+ scrollbar-width: none;
148
+ }
149
+
150
+ body.force-compact .top-tabs::-webkit-scrollbar {
151
+ display: none;
152
+ }
153
+
154
+ body.force-compact .main-panel {
155
+ padding: 14px 12px;
156
+ }
157
+
158
+ body.force-compact .main-panel-topbar {
159
+ position: static;
160
+ margin: 0 0 10px;
161
+ padding: 0;
162
+ background: transparent;
163
+ backdrop-filter: none;
164
+ }
165
+
166
+ body.force-compact .card {
167
+ display: flex;
168
+ flex-direction: column;
169
+ align-items: flex-start;
170
+ justify-content: flex-start;
171
+ padding: 12px;
172
+ gap: 8px;
173
+ }
174
+
175
+ body.force-compact .card-leading {
176
+ align-items: flex-start;
177
+ width: 100%;
178
+ }
179
+
180
+ body.force-compact .card-content {
181
+ width: 100%;
182
+ }
183
+
184
+ body.force-compact .card-title,
185
+ body.force-compact .card-title > span:first-child {
186
+ white-space: normal;
187
+ overflow: visible;
188
+ text-overflow: clip;
189
+ overflow-wrap: anywhere;
190
+ }
191
+
192
+ body.force-compact .card-subtitle {
193
+ white-space: normal;
194
+ overflow: hidden;
195
+ text-overflow: clip;
196
+ overflow-wrap: anywhere;
197
+ display: -webkit-box;
198
+ -webkit-line-clamp: 2;
199
+ -webkit-box-orient: vertical;
200
+ }
201
+
202
+ body.force-compact .card-trailing {
203
+ width: 100%;
204
+ margin-top: 0;
205
+ grid-auto-flow: row;
206
+ grid-auto-columns: 1fr;
207
+ justify-content: stretch;
208
+ justify-items: end;
209
+ }
210
+
211
+ body.force-compact .card-trailing .card-actions {
212
+ width: 100%;
213
+ justify-content: flex-end;
214
+ justify-self: stretch;
215
+ flex-wrap: wrap;
216
+ }
217
+
218
+ body.force-compact .card-actions {
219
+ opacity: 1;
220
+ transform: none;
221
+ }
222
+
223
+ body.force-compact .card-trailing .pill,
224
+ body.force-compact .card-trailing .latency {
225
+ justify-self: end;
226
+ }
227
+
228
+ body.force-compact .btn-add,
229
+ body.force-compact .btn-tool,
230
+ body.force-compact .card-action-btn {
231
+ min-height: 44px;
232
+ }
233
+
234
+ /* ============================================
235
+ 基础重置
236
+ ============================================ */
237
+ * {
238
+ margin: 0;
239
+ padding: 0;
240
+ box-sizing: border-box;
241
+ }
242
+
243
+ /* 仅屏幕阅读器可见 */
244
+ .sr-only {
245
+ position: absolute;
246
+ width: 1px;
247
+ height: 1px;
248
+ padding: 0;
249
+ margin: -1px;
250
+ overflow: hidden;
251
+ clip: rect(0, 0, 0, 0);
252
+ white-space: nowrap;
253
+ border: 0;
254
+ }
255
+
256
+ body {
257
+ font-family: var(--font-family-body);
258
+ background-color: var(--color-bg);
259
+ background: var(--bg-warm-gradient);
260
+ color: var(--color-text-primary);
261
+ display: flex;
262
+ justify-content: stretch;
263
+ align-items: stretch;
264
+ min-height: 100vh;
265
+ padding: 0;
266
+ -webkit-font-smoothing: antialiased;
267
+ -moz-osx-font-smoothing: grayscale;
268
+ position: relative;
269
+ overflow-x: hidden;
270
+ }
271
+