codexmate 0.0.24 → 0.0.26

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 (136) hide show
  1. package/README.md +416 -391
  2. package/README.zh.md +349 -324
  3. package/cli/agents-files.js +224 -224
  4. package/cli/archive-helpers.js +446 -446
  5. package/cli/auth-profiles.js +375 -375
  6. package/cli/builtin-proxy.js +1079 -1044
  7. package/cli/claude-proxy.js +1022 -998
  8. package/cli/config-bootstrap.js +384 -384
  9. package/cli/config-health.js +338 -338
  10. package/cli/doctor-core.js +903 -903
  11. package/cli/import-skills-url.js +356 -334
  12. package/cli/openai-bridge.js +997 -950
  13. package/cli/openclaw-config.js +629 -629
  14. package/cli/session-convert-args.js +65 -0
  15. package/cli/session-convert-io.js +82 -0
  16. package/cli/session-convert.js +43 -0
  17. package/cli/session-usage.concurrent.js +28 -28
  18. package/cli/session-usage.js +118 -112
  19. package/cli/session-usage.models.js +176 -176
  20. package/cli/skills.js +1141 -1141
  21. package/cli/zip-commands.js +510 -510
  22. package/cli.js +15218 -13310
  23. package/lib/automation.js +404 -0
  24. package/lib/cli-file-utils.js +151 -151
  25. package/lib/cli-models-utils.js +379 -379
  26. package/lib/cli-network-utils.js +190 -190
  27. package/lib/cli-path-utils.js +85 -69
  28. package/lib/cli-session-utils.js +121 -121
  29. package/lib/cli-sessions.js +417 -386
  30. package/lib/cli-utils.js +155 -155
  31. package/lib/download-artifacts.js +92 -77
  32. package/lib/mcp-stdio.js +453 -440
  33. package/lib/task-orchestrator.js +869 -869
  34. package/lib/text-diff.js +303 -303
  35. package/lib/workflow-engine.js +340 -340
  36. package/package.json +74 -77
  37. package/plugins/README.md +20 -20
  38. package/plugins/README.zh-CN.md +20 -20
  39. package/plugins/prompt-templates/comment-polish/index.mjs +25 -25
  40. package/plugins/prompt-templates/computed.mjs +253 -253
  41. package/plugins/prompt-templates/index.mjs +8 -8
  42. package/plugins/prompt-templates/manifest.mjs +15 -15
  43. package/plugins/prompt-templates/methods.mjs +619 -619
  44. package/plugins/prompt-templates/overview.mjs +90 -90
  45. package/plugins/prompt-templates/ownership.mjs +19 -19
  46. package/plugins/prompt-templates/rule-ack/index.mjs +21 -21
  47. package/plugins/prompt-templates/storage.mjs +64 -64
  48. package/plugins/registry.mjs +16 -16
  49. package/web-ui/app.js +625 -609
  50. package/web-ui/index.html +35 -35
  51. package/web-ui/logic.agents-diff.mjs +386 -386
  52. package/web-ui/logic.claude.mjs +168 -168
  53. package/web-ui/logic.mjs +5 -5
  54. package/web-ui/logic.runtime.mjs +128 -128
  55. package/web-ui/logic.session-convert.mjs +70 -0
  56. package/web-ui/logic.sessions.mjs +709 -614
  57. package/web-ui/modules/api.mjs +90 -90
  58. package/web-ui/modules/app.computed.dashboard.mjs +171 -126
  59. package/web-ui/modules/app.computed.index.mjs +17 -17
  60. package/web-ui/modules/app.computed.main-tabs.mjs +205 -205
  61. package/web-ui/modules/app.computed.session.mjs +946 -653
  62. package/web-ui/modules/app.constants.mjs +15 -15
  63. package/web-ui/modules/app.methods.agents.mjs +632 -632
  64. package/web-ui/modules/app.methods.claude-config.mjs +179 -174
  65. package/web-ui/modules/app.methods.codex-config.mjs +860 -784
  66. package/web-ui/modules/app.methods.index.mjs +92 -92
  67. package/web-ui/modules/app.methods.install.mjs +205 -177
  68. package/web-ui/modules/app.methods.navigation.mjs +743 -695
  69. package/web-ui/modules/app.methods.openclaw-core.mjs +814 -814
  70. package/web-ui/modules/app.methods.openclaw-editing.mjs +372 -372
  71. package/web-ui/modules/app.methods.openclaw-persist.mjs +369 -369
  72. package/web-ui/modules/app.methods.providers.mjs +404 -404
  73. package/web-ui/modules/app.methods.runtime.mjs +345 -345
  74. package/web-ui/modules/app.methods.session-actions.mjs +596 -537
  75. package/web-ui/modules/app.methods.session-browser.mjs +985 -698
  76. package/web-ui/modules/app.methods.session-timeline.mjs +479 -448
  77. package/web-ui/modules/app.methods.session-trash.mjs +424 -422
  78. package/web-ui/modules/app.methods.startup-claude.mjs +522 -417
  79. package/web-ui/modules/app.methods.task-orchestration.mjs +556 -556
  80. package/web-ui/modules/config-mode.computed.mjs +124 -124
  81. package/web-ui/modules/config-template-confirm-pref.mjs +33 -33
  82. package/web-ui/modules/i18n.dict.mjs +2113 -2039
  83. package/web-ui/modules/i18n.mjs +56 -56
  84. package/web-ui/modules/plugins.computed.mjs +3 -3
  85. package/web-ui/modules/plugins.methods.mjs +3 -3
  86. package/web-ui/modules/plugins.storage.mjs +11 -11
  87. package/web-ui/modules/sessions-filters-url.mjs +85 -85
  88. package/web-ui/modules/skills.computed.mjs +107 -107
  89. package/web-ui/modules/skills.methods.mjs +481 -481
  90. package/web-ui/partials/index/layout-footer.html +13 -13
  91. package/web-ui/partials/index/layout-header.html +475 -465
  92. package/web-ui/partials/index/modal-config-template-agents.html +174 -174
  93. package/web-ui/partials/index/modal-confirm-toast.html +32 -32
  94. package/web-ui/partials/index/modal-health-check.html +45 -45
  95. package/web-ui/partials/index/modal-openclaw-config.html +280 -280
  96. package/web-ui/partials/index/modal-skills.html +200 -200
  97. package/web-ui/partials/index/modals-basic.html +165 -165
  98. package/web-ui/partials/index/panel-config-claude.html +184 -179
  99. package/web-ui/partials/index/panel-config-codex.html +283 -283
  100. package/web-ui/partials/index/panel-config-openclaw.html +83 -83
  101. package/web-ui/partials/index/panel-dashboard.html +186 -186
  102. package/web-ui/partials/index/panel-docs.html +147 -147
  103. package/web-ui/partials/index/panel-market.html +177 -177
  104. package/web-ui/partials/index/panel-orchestration.html +391 -391
  105. package/web-ui/partials/index/panel-plugins.html +279 -279
  106. package/web-ui/partials/index/panel-sessions.html +326 -301
  107. package/web-ui/partials/index/panel-settings.html +258 -258
  108. package/web-ui/partials/index/panel-usage.html +342 -354
  109. package/{res → web-ui/res}/json5.min.js +1 -1
  110. package/{res → web-ui/res}/vue.global.prod.js +13 -13
  111. package/web-ui/session-helpers.mjs +576 -573
  112. package/web-ui/source-bundle.cjs +233 -233
  113. package/web-ui/styles/base-theme.css +268 -264
  114. package/web-ui/styles/controls-forms.css +423 -376
  115. package/web-ui/styles/dashboard.css +274 -274
  116. package/web-ui/styles/docs-panel.css +247 -247
  117. package/web-ui/styles/feedback.css +108 -108
  118. package/web-ui/styles/health-check-dialog.css +144 -144
  119. package/web-ui/styles/layout-shell.css +603 -602
  120. package/web-ui/styles/modals-core.css +464 -464
  121. package/web-ui/styles/navigation-panels.css +390 -390
  122. package/web-ui/styles/openclaw-structured.css +266 -266
  123. package/web-ui/styles/plugins-panel.css +523 -523
  124. package/web-ui/styles/responsive.css +454 -456
  125. package/web-ui/styles/sessions-list.css +415 -400
  126. package/web-ui/styles/sessions-preview.css +411 -411
  127. package/web-ui/styles/sessions-toolbar-trash.css +330 -268
  128. package/web-ui/styles/sessions-usage.css +945 -888
  129. package/web-ui/styles/settings-panel.css +166 -166
  130. package/web-ui/styles/skills-list.css +303 -303
  131. package/web-ui/styles/skills-market.css +406 -406
  132. package/web-ui/styles/task-orchestration.css +822 -822
  133. package/web-ui/styles/titles-cards.css +408 -408
  134. package/web-ui/styles.css +21 -21
  135. package/web-ui.html +17 -17
  136. /package/{res → web-ui/res}/logo-pack.webp +0 -0
@@ -1,264 +1,268 @@
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 .provider-fast-switch {
104
- position: sticky;
105
- top: 8px;
106
- z-index: 16;
107
- }
108
-
109
- body.force-compact .provider-fast-switch-select {
110
- min-height: 44px;
111
- font-size: 16px;
112
- }
113
-
114
- @media (max-width: 720px) {
115
- body.force-compact .app-shell {
116
- grid-template-columns: 1fr;
117
- gap: 12px;
118
- height: auto;
119
- min-height: auto;
120
- overflow: visible;
121
- }
122
-
123
- body.force-compact .main-panel {
124
- position: relative;
125
- top: auto;
126
- align-self: stretch;
127
- width: 100%;
128
- height: auto;
129
- overflow-y: visible;
130
- padding: 14px 12px;
131
- }
132
-
133
- body.force-compact .side-rail,
134
- body.force-compact .status-inspector {
135
- display: none;
136
- }
137
-
138
- body.force-compact .top-tabs {
139
- display: flex !important;
140
- flex-wrap: nowrap;
141
- overflow-x: auto;
142
- overflow-y: hidden;
143
- -webkit-overflow-scrolling: touch;
144
- scrollbar-width: none;
145
- }
146
-
147
- body.force-compact .top-tabs::-webkit-scrollbar {
148
- display: none;
149
- }
150
-
151
- body.force-compact .main-panel-topbar {
152
- position: static;
153
- margin: 0 0 10px;
154
- padding: 0;
155
- background: transparent;
156
- backdrop-filter: none;
157
- }
158
-
159
- body.force-compact .card {
160
- display: flex;
161
- flex-direction: column;
162
- align-items: flex-start;
163
- justify-content: flex-start;
164
- padding: 12px;
165
- gap: 8px;
166
- }
167
-
168
- body.force-compact .card-leading {
169
- align-items: flex-start;
170
- width: 100%;
171
- }
172
-
173
- body.force-compact .card-content {
174
- width: 100%;
175
- }
176
-
177
- body.force-compact .card-title,
178
- body.force-compact .card-title > span:first-child {
179
- white-space: normal;
180
- overflow: visible;
181
- text-overflow: clip;
182
- overflow-wrap: anywhere;
183
- }
184
-
185
- body.force-compact .card-subtitle {
186
- white-space: normal;
187
- overflow: hidden;
188
- text-overflow: clip;
189
- overflow-wrap: anywhere;
190
- display: -webkit-box;
191
- -webkit-line-clamp: 2;
192
- -webkit-box-orient: vertical;
193
- }
194
-
195
- body.force-compact .card-trailing {
196
- width: 100%;
197
- margin-top: 0;
198
- grid-auto-flow: row;
199
- grid-auto-columns: 1fr;
200
- justify-content: stretch;
201
- justify-items: end;
202
- }
203
-
204
- body.force-compact .card-trailing .card-actions {
205
- width: 100%;
206
- justify-content: flex-end;
207
- justify-self: stretch;
208
- flex-wrap: wrap;
209
- }
210
-
211
- body.force-compact .card-actions {
212
- opacity: 1;
213
- transform: none;
214
- }
215
-
216
- body.force-compact .card-trailing .pill,
217
- body.force-compact .card-trailing .latency {
218
- justify-self: end;
219
- }
220
- }
221
-
222
- body.force-compact .btn-add,
223
- body.force-compact .btn-tool,
224
- body.force-compact .card-action-btn {
225
- min-height: 44px;
226
- }
227
-
228
- /* ============================================
229
- 基础重置
230
- ============================================ */
231
- * {
232
- margin: 0;
233
- padding: 0;
234
- box-sizing: border-box;
235
- }
236
-
237
- /* 仅屏幕阅读器可见 */
238
- .sr-only {
239
- position: absolute;
240
- width: 1px;
241
- height: 1px;
242
- padding: 0;
243
- margin: -1px;
244
- overflow: hidden;
245
- clip: rect(0, 0, 0, 0);
246
- white-space: nowrap;
247
- border: 0;
248
- }
249
-
250
- body {
251
- font-family: var(--font-family-body);
252
- background-color: var(--color-bg);
253
- background: var(--bg-warm-gradient);
254
- color: var(--color-text-primary);
255
- display: flex;
256
- justify-content: stretch;
257
- align-items: stretch;
258
- min-height: 100vh;
259
- padding: 0;
260
- -webkit-font-smoothing: antialiased;
261
- -moz-osx-font-smoothing: grayscale;
262
- position: relative;
263
- overflow-x: hidden;
264
- }
1
+ /* Use local font stacks only; avoid third-party font fetches. */
2
+
3
+ /* ============================================
4
+ 设计系统 - Design Tokens
5
+ ============================================ */
6
+ :root {
7
+ /* 色彩系统:中性灰(更贴近 craft/shadcn 观感)+ 品牌强调 */
8
+ --color-brand: #C77462;
9
+ --color-brand-dark: #B45E4E;
10
+ --color-brand-light: rgba(199, 116, 98, 0.12);
11
+ --color-brand-subtle: rgba(199, 116, 98, 0.18);
12
+
13
+ --color-bg: #FAFAFA;
14
+ --color-surface: #FFFFFF;
15
+ --color-surface-alt: #F4F4F5;
16
+ --color-surface-elevated: #FFFFFF;
17
+ --color-surface-tint: rgba(255, 255, 255, 0.92);
18
+ --color-text-primary: #18181B;
19
+ --color-text-secondary: #3F3F46;
20
+ --color-text-tertiary: #71717A;
21
+ --color-text-muted: #A1A1AA;
22
+ --color-border: #E4E4E7;
23
+ --color-border-soft: rgba(24, 24, 27, 0.12);
24
+ --color-border-strong: rgba(24, 24, 27, 0.24);
25
+
26
+ --color-success: #4B8B6A;
27
+ --color-error: #C44536;
28
+
29
+ --bg-warm-gradient:
30
+ linear-gradient(180deg, #FAFAFA 0%, #FAFAFA 100%);
31
+
32
+ --color-bg-topbar-strong: rgba(250, 250, 250, 0.96);
33
+ --color-bg-topbar-soft: rgba(250, 250, 250, 0.9);
34
+ --color-bg-topbar-clear: rgba(250, 250, 250, 0);
35
+
36
+ /* 字体系统 */
37
+ --font-family-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
38
+ --font-family-display: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
39
+ --font-family-mono: 'JetBrainsMono Nerd Font Mono', 'JetBrains Mono', 'Fira Code', 'SFMono-Regular', Consolas, 'Liberation Mono', monospace;
40
+ --font-family: var(--font-family-body);
41
+
42
+ --font-size-display: 52px;
43
+ --font-size-title: 18px;
44
+ --font-size-large: 20px;
45
+ --font-size-body: 15px;
46
+ --font-size-secondary: 13px;
47
+ --font-size-caption: 11px;
48
+
49
+ --font-weight-display: 600;
50
+ --font-weight-primary: 600;
51
+ --font-weight-title: 600;
52
+ --font-weight-body: 400;
53
+ --font-weight-secondary: 500;
54
+ --font-weight-caption: 500;
55
+
56
+ --line-height-tight: 1.12;
57
+ --line-height-normal: 1.5;
58
+
59
+ /* 间距系统 */
60
+ --spacing-xs: 8px;
61
+ --spacing-sm: 16px;
62
+ --spacing-md: 24px;
63
+ --spacing-lg: 40px;
64
+ --spacing-xl: 64px;
65
+
66
+ /* 圆角系统 */
67
+ --radius-sm: 8px;
68
+ --radius-md: 10px;
69
+ --radius-lg: 12px;
70
+ --radius-xl: 16px;
71
+ --radius-full: 50px;
72
+
73
+ /* 阴影系统 - 更偏中性与克制 */
74
+ --shadow-subtle: 0 1px 2px rgba(24, 24, 27, 0.04);
75
+ --shadow-card: 0 1px 3px rgba(24, 24, 27, 0.06);
76
+ --shadow-card-hover: 0 8px 26px rgba(24, 24, 27, 0.12);
77
+ --shadow-float: 0 14px 36px rgba(24, 24, 27, 0.16);
78
+ --shadow-raised: 0 8px 18px rgba(24, 24, 27, 0.12);
79
+ --shadow-modal:
80
+ 0 10px 30px rgba(24, 24, 27, 0.14),
81
+ 0 28px 72px rgba(24, 24, 27, 0.12);
82
+ --shadow-input-focus:
83
+ 0 0 0 3px var(--color-brand-light),
84
+ 0 1px 2px rgba(24, 24, 27, 0.06);
85
+
86
+ /* 动画 - 更细腻的曲线 */
87
+ --transition-instant: 100ms;
88
+ --transition-fast: 120ms;
89
+ --transition-normal: 200ms;
90
+ --transition-slow: 300ms;
91
+ --ease-spring: cubic-bezier(0.16, 1, 0.3, 1);
92
+ --ease-spring-soft: cubic-bezier(0.25, 1, 0.5, 1);
93
+ --ease-smooth: cubic-bezier(0.4, 0, 0.2, 1);
94
+ --ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1);
95
+ }
96
+
97
+ /* ============================================
98
+ 手机桌面 UA 兜底:触控设备强制紧凑排版
99
+ ============================================ */
100
+ body.force-compact {
101
+ --font-size-title: 20px;
102
+ --font-size-body: 16px;
103
+ --font-size-secondary: 14px;
104
+ --font-size-caption: 12px;
105
+ }
106
+
107
+ body.force-compact .provider-fast-switch {
108
+ position: sticky;
109
+ top: 8px;
110
+ z-index: 16;
111
+ }
112
+
113
+ body.force-compact .provider-fast-switch-select {
114
+ min-height: 44px;
115
+ font-size: 16px;
116
+ }
117
+
118
+ @media (max-width: 720px) {
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
+ padding: 14px 12px;
135
+ }
136
+
137
+ body.force-compact .side-rail,
138
+ body.force-compact .status-inspector {
139
+ display: none;
140
+ }
141
+
142
+ body.force-compact .top-tabs {
143
+ display: flex !important;
144
+ flex-wrap: nowrap;
145
+ overflow-x: auto;
146
+ overflow-y: hidden;
147
+ -webkit-overflow-scrolling: touch;
148
+ scrollbar-width: none;
149
+ }
150
+
151
+ body.force-compact .top-tabs::-webkit-scrollbar {
152
+ display: none;
153
+ }
154
+
155
+ body.force-compact .main-panel-topbar {
156
+ position: static;
157
+ margin: 0 0 10px;
158
+ padding: 0;
159
+ background: transparent;
160
+ backdrop-filter: none;
161
+ }
162
+
163
+ body.force-compact .card {
164
+ display: flex;
165
+ flex-direction: column;
166
+ align-items: flex-start;
167
+ justify-content: flex-start;
168
+ padding: 12px;
169
+ gap: 8px;
170
+ }
171
+
172
+ body.force-compact .card-leading {
173
+ align-items: flex-start;
174
+ width: 100%;
175
+ }
176
+
177
+ body.force-compact .card-content {
178
+ width: 100%;
179
+ }
180
+
181
+ body.force-compact .card-title,
182
+ body.force-compact .card-title > span:first-child {
183
+ white-space: normal;
184
+ overflow: visible;
185
+ text-overflow: clip;
186
+ overflow-wrap: anywhere;
187
+ }
188
+
189
+ body.force-compact .card-subtitle {
190
+ white-space: normal;
191
+ overflow: hidden;
192
+ text-overflow: clip;
193
+ overflow-wrap: anywhere;
194
+ display: -webkit-box;
195
+ -webkit-line-clamp: 2;
196
+ -webkit-box-orient: vertical;
197
+ }
198
+
199
+ body.force-compact .card-trailing {
200
+ width: 100%;
201
+ margin-top: 0;
202
+ grid-auto-flow: row;
203
+ grid-auto-columns: 1fr;
204
+ justify-content: stretch;
205
+ justify-items: end;
206
+ }
207
+
208
+ body.force-compact .card-trailing .card-actions {
209
+ width: 100%;
210
+ justify-content: flex-end;
211
+ justify-self: stretch;
212
+ flex-wrap: wrap;
213
+ }
214
+
215
+ body.force-compact .card-actions {
216
+ opacity: 1;
217
+ transform: none;
218
+ }
219
+
220
+ body.force-compact .card-trailing .pill,
221
+ body.force-compact .card-trailing .latency {
222
+ justify-self: end;
223
+ }
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: stretch;
261
+ align-items: stretch;
262
+ min-height: 100vh;
263
+ padding: 0;
264
+ -webkit-font-smoothing: antialiased;
265
+ -moz-osx-font-smoothing: grayscale;
266
+ position: relative;
267
+ overflow-x: hidden;
268
+ }