codexmate 0.0.21 → 0.0.22

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 (114) hide show
  1. package/README.md +389 -284
  2. package/README.zh.md +321 -0
  3. package/cli/agents-files.js +224 -162
  4. package/cli/archive-helpers.js +446 -446
  5. package/cli/auth-profiles.js +359 -359
  6. package/cli/builtin-proxy.js +1044 -580
  7. package/cli/claude-proxy.js +998 -998
  8. package/cli/config-bootstrap.js +384 -384
  9. package/cli/config-health.js +338 -338
  10. package/cli/openai-bridge.js +950 -0
  11. package/cli/openclaw-config.js +629 -629
  12. package/cli/session-usage.concurrent.js +28 -0
  13. package/cli/session-usage.js +112 -0
  14. package/cli/session-usage.models.js +176 -0
  15. package/cli/skills.js +1141 -1141
  16. package/cli/zip-commands.js +510 -510
  17. package/cli.js +13214 -13129
  18. package/lib/cli-file-utils.js +151 -151
  19. package/lib/cli-models-utils.js +419 -419
  20. package/lib/cli-network-utils.js +164 -164
  21. package/lib/cli-path-utils.js +69 -69
  22. package/lib/cli-session-utils.js +121 -121
  23. package/lib/cli-sessions.js +386 -386
  24. package/lib/cli-utils.js +155 -155
  25. package/lib/download-artifacts.js +77 -77
  26. package/lib/mcp-stdio.js +440 -440
  27. package/lib/task-orchestrator.js +869 -869
  28. package/lib/text-diff.js +303 -303
  29. package/lib/workflow-engine.js +340 -340
  30. package/package.json +74 -74
  31. package/res/json5.min.js +1 -1
  32. package/res/logo.png +0 -0
  33. package/res/vue.global.prod.js +13 -13
  34. package/web-ui/app.js +575 -530
  35. package/web-ui/index.html +34 -33
  36. package/web-ui/logic.agents-diff.mjs +386 -386
  37. package/web-ui/logic.claude.mjs +168 -168
  38. package/web-ui/logic.mjs +5 -5
  39. package/web-ui/logic.runtime.mjs +128 -124
  40. package/web-ui/logic.sessions.mjs +614 -581
  41. package/web-ui/modules/api.mjs +90 -90
  42. package/web-ui/modules/app.computed.dashboard.mjs +126 -113
  43. package/web-ui/modules/app.computed.index.mjs +17 -15
  44. package/web-ui/modules/app.computed.main-tabs.mjs +198 -195
  45. package/web-ui/modules/app.computed.session.mjs +653 -507
  46. package/web-ui/modules/app.constants.mjs +15 -15
  47. package/web-ui/modules/app.methods.agents.mjs +544 -493
  48. package/web-ui/modules/app.methods.claude-config.mjs +174 -174
  49. package/web-ui/modules/app.methods.codex-config.mjs +795 -640
  50. package/web-ui/modules/app.methods.index.mjs +92 -88
  51. package/web-ui/modules/app.methods.install.mjs +161 -149
  52. package/web-ui/modules/app.methods.navigation.mjs +619 -619
  53. package/web-ui/modules/app.methods.openclaw-core.mjs +814 -814
  54. package/web-ui/modules/app.methods.openclaw-editing.mjs +372 -372
  55. package/web-ui/modules/app.methods.openclaw-persist.mjs +369 -369
  56. package/web-ui/modules/app.methods.providers.mjs +404 -363
  57. package/web-ui/modules/app.methods.runtime.mjs +323 -323
  58. package/web-ui/modules/app.methods.session-actions.mjs +537 -520
  59. package/web-ui/modules/app.methods.session-browser.mjs +626 -626
  60. package/web-ui/modules/app.methods.session-timeline.mjs +448 -448
  61. package/web-ui/modules/app.methods.session-trash.mjs +422 -422
  62. package/web-ui/modules/app.methods.startup-claude.mjs +405 -412
  63. package/web-ui/modules/app.methods.task-orchestration.mjs +471 -471
  64. package/web-ui/modules/config-mode.computed.mjs +126 -126
  65. package/web-ui/modules/config-template-confirm-pref.mjs +33 -0
  66. package/web-ui/modules/i18n.mjs +1609 -0
  67. package/web-ui/modules/plugins.computed.mjs +220 -0
  68. package/web-ui/modules/plugins.methods.mjs +620 -0
  69. package/web-ui/modules/plugins.storage.mjs +37 -0
  70. package/web-ui/modules/skills.computed.mjs +107 -107
  71. package/web-ui/modules/skills.methods.mjs +481 -481
  72. package/web-ui/partials/index/layout-footer.html +13 -13
  73. package/web-ui/partials/index/layout-header.html +461 -402
  74. package/web-ui/partials/index/modal-config-template-agents.html +175 -125
  75. package/web-ui/partials/index/modal-confirm-toast.html +32 -32
  76. package/web-ui/partials/index/modal-health-check.html +72 -72
  77. package/web-ui/partials/index/modal-openclaw-config.html +280 -280
  78. package/web-ui/partials/index/modal-skills.html +200 -184
  79. package/web-ui/partials/index/modals-basic.html +165 -156
  80. package/web-ui/partials/index/panel-config-claude.html +138 -126
  81. package/web-ui/partials/index/panel-config-codex.html +234 -237
  82. package/web-ui/partials/index/panel-config-openclaw.html +78 -78
  83. package/web-ui/partials/index/panel-docs.html +147 -130
  84. package/web-ui/partials/index/panel-market.html +174 -174
  85. package/web-ui/partials/index/panel-orchestration.html +397 -397
  86. package/web-ui/partials/index/panel-plugins.html +243 -0
  87. package/web-ui/partials/index/panel-sessions.html +292 -292
  88. package/web-ui/partials/index/panel-settings.html +258 -190
  89. package/web-ui/partials/index/panel-usage.html +353 -213
  90. package/web-ui/session-helpers.mjs +573 -559
  91. package/web-ui/source-bundle.cjs +233 -233
  92. package/web-ui/styles/base-theme.css +264 -271
  93. package/web-ui/styles/controls-forms.css +362 -360
  94. package/web-ui/styles/docs-panel.css +247 -182
  95. package/web-ui/styles/feedback.css +108 -108
  96. package/web-ui/styles/health-check-dialog.css +144 -144
  97. package/web-ui/styles/layout-shell.css +596 -376
  98. package/web-ui/styles/modals-core.css +464 -464
  99. package/web-ui/styles/navigation-panels.css +382 -348
  100. package/web-ui/styles/openclaw-structured.css +266 -266
  101. package/web-ui/styles/plugins-panel.css +518 -0
  102. package/web-ui/styles/responsive.css +456 -450
  103. package/web-ui/styles/sessions-list.css +400 -400
  104. package/web-ui/styles/sessions-preview.css +411 -411
  105. package/web-ui/styles/sessions-toolbar-trash.css +268 -243
  106. package/web-ui/styles/sessions-usage.css +851 -628
  107. package/web-ui/styles/settings-panel.css +166 -0
  108. package/web-ui/styles/skills-list.css +303 -296
  109. package/web-ui/styles/skills-market.css +396 -335
  110. package/web-ui/styles/task-orchestration.css +776 -776
  111. package/web-ui/styles/titles-cards.css +408 -408
  112. package/web-ui/styles.css +20 -18
  113. package/web-ui.html +17 -17
  114. package/README.en.md +0 -349
@@ -1,271 +1,264 @@
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
-
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
+ }