codexmate 0.0.26 → 0.0.27

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 (135) hide show
  1. package/README.md +421 -416
  2. package/README.zh.md +354 -349
  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 +1299 -1079
  7. package/cli/claude-proxy.js +1022 -1022
  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 -356
  12. package/cli/openai-bridge.js +1091 -997
  13. package/cli/openclaw-config.js +629 -629
  14. package/cli/session-convert-args.js +65 -65
  15. package/cli/session-convert-io.js +82 -82
  16. package/cli/session-convert.js +43 -43
  17. package/cli/session-usage.concurrent.js +28 -28
  18. package/cli/session-usage.js +118 -118
  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 +15251 -15218
  23. package/lib/automation.js +404 -404
  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 -85
  28. package/lib/cli-session-utils.js +121 -121
  29. package/lib/cli-sessions.js +417 -417
  30. package/lib/cli-utils.js +155 -155
  31. package/lib/download-artifacts.js +92 -92
  32. package/lib/mcp-stdio.js +453 -453
  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 +1 -1
  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 +634 -625
  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 -70
  56. package/web-ui/logic.sessions.mjs +765 -709
  57. package/web-ui/modules/api.mjs +90 -90
  58. package/web-ui/modules/app.computed.dashboard.mjs +171 -171
  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 +994 -946
  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 +184 -179
  65. package/web-ui/modules/app.methods.codex-config.mjs +860 -860
  66. package/web-ui/modules/app.methods.index.mjs +92 -92
  67. package/web-ui/modules/app.methods.install.mjs +205 -205
  68. package/web-ui/modules/app.methods.navigation.mjs +743 -743
  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 -596
  75. package/web-ui/modules/app.methods.session-browser.mjs +989 -985
  76. package/web-ui/modules/app.methods.session-timeline.mjs +479 -479
  77. package/web-ui/modules/app.methods.session-trash.mjs +439 -424
  78. package/web-ui/modules/app.methods.startup-claude.mjs +526 -522
  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 +2131 -2113
  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 -475
  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 +187 -184
  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 -326
  107. package/web-ui/partials/index/panel-settings.html +274 -258
  108. package/web-ui/partials/index/panel-usage.html +371 -342
  109. package/web-ui/res/json5.min.js +1 -1
  110. package/web-ui/res/vue.global.prod.js +13 -13
  111. package/web-ui/session-helpers.mjs +576 -576
  112. package/web-ui/source-bundle.cjs +233 -233
  113. package/web-ui/styles/base-theme.css +268 -268
  114. package/web-ui/styles/controls-forms.css +423 -423
  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 -603
  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 -454
  125. package/web-ui/styles/sessions-list.css +415 -415
  126. package/web-ui/styles/sessions-preview.css +411 -411
  127. package/web-ui/styles/sessions-toolbar-trash.css +330 -330
  128. package/web-ui/styles/sessions-usage.css +1040 -945
  129. package/web-ui/styles/settings-panel.css +185 -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
@@ -1,268 +1,268 @@
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
- }
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
+ }