codexmate 0.0.27 → 0.0.28

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 (137) hide show
  1. package/README.md +421 -421
  2. package/README.zh.md +354 -354
  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 +1620 -1299
  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 +1489 -1091
  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 +15264 -15251
  23. package/lib/automation.js +404 -404
  24. package/lib/cli-file-utils.js +151 -151
  25. package/lib/cli-models-utils.js +440 -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 +3 -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 +553 -619
  44. package/plugins/prompt-templates/overview.mjs +91 -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 -634
  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.codex.mjs +56 -0
  54. package/web-ui/logic.mjs +5 -5
  55. package/web-ui/logic.runtime.mjs +128 -128
  56. package/web-ui/logic.session-convert.mjs +70 -70
  57. package/web-ui/logic.sessions.mjs +765 -765
  58. package/web-ui/modules/api.mjs +90 -90
  59. package/web-ui/modules/app.computed.dashboard.mjs +225 -171
  60. package/web-ui/modules/app.computed.index.mjs +17 -17
  61. package/web-ui/modules/app.computed.main-tabs.mjs +205 -205
  62. package/web-ui/modules/app.computed.session.mjs +994 -994
  63. package/web-ui/modules/app.constants.mjs +15 -15
  64. package/web-ui/modules/app.methods.agents.mjs +632 -632
  65. package/web-ui/modules/app.methods.claude-config.mjs +190 -184
  66. package/web-ui/modules/app.methods.codex-config.mjs +892 -860
  67. package/web-ui/modules/app.methods.index.mjs +92 -92
  68. package/web-ui/modules/app.methods.install.mjs +205 -205
  69. package/web-ui/modules/app.methods.navigation.mjs +743 -743
  70. package/web-ui/modules/app.methods.openclaw-core.mjs +814 -814
  71. package/web-ui/modules/app.methods.openclaw-editing.mjs +372 -372
  72. package/web-ui/modules/app.methods.openclaw-persist.mjs +369 -369
  73. package/web-ui/modules/app.methods.providers.mjs +412 -404
  74. package/web-ui/modules/app.methods.runtime.mjs +345 -345
  75. package/web-ui/modules/app.methods.session-actions.mjs +593 -596
  76. package/web-ui/modules/app.methods.session-browser.mjs +984 -989
  77. package/web-ui/modules/app.methods.session-timeline.mjs +479 -479
  78. package/web-ui/modules/app.methods.session-trash.mjs +439 -439
  79. package/web-ui/modules/app.methods.startup-claude.mjs +533 -526
  80. package/web-ui/modules/app.methods.task-orchestration.mjs +556 -556
  81. package/web-ui/modules/config-mode.computed.mjs +124 -124
  82. package/web-ui/modules/config-template-confirm-pref.mjs +33 -33
  83. package/web-ui/modules/i18n.dict.mjs +2109 -2131
  84. package/web-ui/modules/i18n.mjs +56 -56
  85. package/web-ui/modules/plugins.computed.mjs +3 -3
  86. package/web-ui/modules/plugins.methods.mjs +3 -3
  87. package/web-ui/modules/plugins.storage.mjs +11 -11
  88. package/web-ui/modules/provider-url-display.mjs +17 -0
  89. package/web-ui/modules/sessions-filters-url.mjs +85 -85
  90. package/web-ui/modules/skills.computed.mjs +107 -107
  91. package/web-ui/modules/skills.methods.mjs +481 -481
  92. package/web-ui/partials/index/layout-footer.html +13 -13
  93. package/web-ui/partials/index/layout-header.html +475 -475
  94. package/web-ui/partials/index/modal-config-template-agents.html +174 -174
  95. package/web-ui/partials/index/modal-confirm-toast.html +32 -32
  96. package/web-ui/partials/index/modal-health-check.html +45 -45
  97. package/web-ui/partials/index/modal-openclaw-config.html +280 -280
  98. package/web-ui/partials/index/modal-skills.html +200 -200
  99. package/web-ui/partials/index/modals-basic.html +165 -165
  100. package/web-ui/partials/index/panel-config-claude.html +188 -187
  101. package/web-ui/partials/index/panel-config-codex.html +312 -283
  102. package/web-ui/partials/index/panel-config-openclaw.html +83 -83
  103. package/web-ui/partials/index/panel-dashboard.html +186 -186
  104. package/web-ui/partials/index/panel-docs.html +147 -147
  105. package/web-ui/partials/index/panel-market.html +177 -177
  106. package/web-ui/partials/index/panel-orchestration.html +391 -391
  107. package/web-ui/partials/index/panel-plugins.html +253 -279
  108. package/web-ui/partials/index/panel-sessions.html +316 -326
  109. package/web-ui/partials/index/panel-settings.html +253 -274
  110. package/web-ui/partials/index/panel-usage.html +371 -371
  111. package/web-ui/res/json5.min.js +1 -1
  112. package/web-ui/res/vue.global.prod.js +13 -13
  113. package/web-ui/session-helpers.mjs +576 -576
  114. package/web-ui/source-bundle.cjs +233 -233
  115. package/web-ui/styles/base-theme.css +281 -268
  116. package/web-ui/styles/controls-forms.css +422 -423
  117. package/web-ui/styles/dashboard.css +274 -274
  118. package/web-ui/styles/docs-panel.css +247 -247
  119. package/web-ui/styles/feedback.css +108 -108
  120. package/web-ui/styles/health-check-dialog.css +144 -144
  121. package/web-ui/styles/layout-shell.css +606 -603
  122. package/web-ui/styles/modals-core.css +466 -464
  123. package/web-ui/styles/navigation-panels.css +391 -390
  124. package/web-ui/styles/openclaw-structured.css +266 -266
  125. package/web-ui/styles/plugins-panel.css +523 -523
  126. package/web-ui/styles/responsive.css +454 -454
  127. package/web-ui/styles/sessions-list.css +419 -415
  128. package/web-ui/styles/sessions-preview.css +411 -411
  129. package/web-ui/styles/sessions-toolbar-trash.css +330 -330
  130. package/web-ui/styles/sessions-usage.css +1040 -1040
  131. package/web-ui/styles/settings-panel.css +185 -185
  132. package/web-ui/styles/skills-list.css +303 -303
  133. package/web-ui/styles/skills-market.css +406 -406
  134. package/web-ui/styles/task-orchestration.css +822 -822
  135. package/web-ui/styles/titles-cards.css +472 -408
  136. package/web-ui/styles.css +21 -21
  137. package/web-ui.html +17 -17
@@ -1,268 +1,281 @@
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
+ /* 色彩系统:低饱和暖色 + 桌面助理式柔和层级 */
8
+ --color-brand: #C87963;
9
+ --color-brand-dark: #A95845;
10
+ --color-brand-light: rgba(200, 121, 99, 0.13);
11
+ --color-brand-subtle: rgba(200, 121, 99, 0.2);
12
+
13
+ --color-bg: #F7F0E9;
14
+ --color-surface: #FFFDFC;
15
+ --color-surface-alt: #F7EFE8;
16
+ --color-surface-elevated: #FFFFFF;
17
+ --color-surface-tint: rgba(255, 253, 250, 0.86);
18
+ --color-text-primary: #241F1C;
19
+ --color-text-secondary: #5A504A;
20
+ --color-text-tertiary: #82746A;
21
+ --color-text-muted: #A99B91;
22
+ --color-border: rgba(137, 111, 94, 0.18);
23
+ --color-border-soft: rgba(137, 111, 94, 0.13);
24
+ --color-border-strong: rgba(137, 111, 94, 0.34);
25
+
26
+ --color-success: #4B8B6A;
27
+ --color-error: #C44536;
28
+
29
+ --bg-warm-gradient:
30
+ radial-gradient(circle at 14% 8%, rgba(255, 219, 196, 0.5) 0%, rgba(255, 219, 196, 0) 32%),
31
+ radial-gradient(circle at 88% 0%, rgba(252, 239, 207, 0.58) 0%, rgba(252, 239, 207, 0) 30%),
32
+ linear-gradient(135deg, #FFF8F1 0%, #F7F0E9 46%, #F1E8DF 100%);
33
+
34
+ --color-bg-topbar-strong: rgba(255, 248, 241, 0.96);
35
+ --color-bg-topbar-soft: rgba(255, 248, 241, 0.86);
36
+ --color-bg-topbar-clear: rgba(255, 248, 241, 0);
37
+
38
+ /* 字体系统 */
39
+ --font-family-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
40
+ --font-family-display: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
41
+ --font-family-mono: 'JetBrainsMono Nerd Font Mono', 'JetBrains Mono', 'Fira Code', 'SFMono-Regular', Consolas, 'Liberation Mono', monospace;
42
+ --font-family: var(--font-family-body);
43
+
44
+ --font-size-display: 52px;
45
+ --font-size-title: 18px;
46
+ --font-size-large: 20px;
47
+ --font-size-body: 15px;
48
+ --font-size-secondary: 13px;
49
+ --font-size-caption: 11px;
50
+
51
+ --font-weight-display: 600;
52
+ --font-weight-primary: 600;
53
+ --font-weight-title: 600;
54
+ --font-weight-body: 400;
55
+ --font-weight-secondary: 500;
56
+ --font-weight-caption: 500;
57
+
58
+ --line-height-tight: 1.12;
59
+ --line-height-normal: 1.5;
60
+
61
+ /* 间距系统 */
62
+ --spacing-xs: 8px;
63
+ --spacing-sm: 16px;
64
+ --spacing-md: 24px;
65
+ --spacing-lg: 40px;
66
+ --spacing-xl: 64px;
67
+
68
+ /* 圆角系统 */
69
+ --radius-sm: 10px;
70
+ --radius-md: 14px;
71
+ --radius-lg: 18px;
72
+ --radius-xl: 24px;
73
+ --radius-full: 50px;
74
+
75
+ /* 阴影系统 - 柔和桌面浮层 */
76
+ --shadow-subtle: 0 1px 2px rgba(60, 47, 38, 0.05);
77
+ --shadow-card: 0 12px 30px rgba(92, 68, 52, 0.08);
78
+ --shadow-card-hover: 0 18px 44px rgba(92, 68, 52, 0.14);
79
+ --shadow-float: 0 22px 56px rgba(70, 51, 39, 0.18);
80
+ --shadow-raised: 0 14px 30px rgba(92, 68, 52, 0.14);
81
+ --shadow-modal:
82
+ 0 16px 42px rgba(70, 51, 39, 0.16),
83
+ 0 34px 84px rgba(70, 51, 39, 0.16);
84
+ --shadow-input-focus:
85
+ 0 0 0 3px var(--color-brand-light),
86
+ 0 1px 2px rgba(60, 47, 38, 0.06);
87
+
88
+ /* 动画 - 更细腻的曲线 */
89
+ --transition-instant: 100ms;
90
+ --transition-fast: 120ms;
91
+ --transition-normal: 200ms;
92
+ --transition-slow: 300ms;
93
+ --ease-spring: cubic-bezier(0.16, 1, 0.3, 1);
94
+ --ease-spring-soft: cubic-bezier(0.25, 1, 0.5, 1);
95
+ --ease-smooth: cubic-bezier(0.4, 0, 0.2, 1);
96
+ --ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1);
97
+ }
98
+
99
+ /* ============================================
100
+ 手机桌面 UA 兜底:触控设备强制紧凑排版
101
+ ============================================ */
102
+ body.force-compact {
103
+ --font-size-title: 20px;
104
+ --font-size-body: 16px;
105
+ --font-size-secondary: 14px;
106
+ --font-size-caption: 12px;
107
+ }
108
+
109
+ body.force-compact .provider-fast-switch {
110
+ position: sticky;
111
+ top: 8px;
112
+ z-index: 16;
113
+ }
114
+
115
+ body.force-compact .provider-fast-switch-select {
116
+ min-height: 44px;
117
+ font-size: 16px;
118
+ }
119
+
120
+ @media (max-width: 720px) {
121
+ body.force-compact .app-shell {
122
+ grid-template-columns: 1fr;
123
+ gap: 12px;
124
+ height: auto;
125
+ min-height: auto;
126
+ overflow: visible;
127
+ }
128
+
129
+ body.force-compact .main-panel {
130
+ position: relative;
131
+ top: auto;
132
+ align-self: stretch;
133
+ width: 100%;
134
+ height: auto;
135
+ overflow-y: visible;
136
+ padding: 14px 12px;
137
+ }
138
+
139
+ body.force-compact .side-rail,
140
+ body.force-compact .status-inspector {
141
+ display: none;
142
+ }
143
+
144
+ body.force-compact .top-tabs {
145
+ display: flex !important;
146
+ flex-wrap: nowrap;
147
+ overflow-x: auto;
148
+ overflow-y: hidden;
149
+ -webkit-overflow-scrolling: touch;
150
+ scrollbar-width: none;
151
+ }
152
+
153
+ body.force-compact .top-tabs::-webkit-scrollbar {
154
+ display: none;
155
+ }
156
+
157
+ body.force-compact .main-panel-topbar {
158
+ position: static;
159
+ margin: 0 0 10px;
160
+ padding: 0;
161
+ background: transparent;
162
+ backdrop-filter: none;
163
+ }
164
+
165
+ body.force-compact .card {
166
+ display: flex;
167
+ flex-direction: column;
168
+ align-items: flex-start;
169
+ justify-content: flex-start;
170
+ padding: 12px;
171
+ gap: 8px;
172
+ }
173
+
174
+ body.force-compact .card-leading {
175
+ align-items: flex-start;
176
+ width: 100%;
177
+ }
178
+
179
+ body.force-compact .card-content {
180
+ width: 100%;
181
+ }
182
+
183
+ body.force-compact .card-title,
184
+ body.force-compact .card-title > span:first-child {
185
+ white-space: normal;
186
+ overflow: visible;
187
+ text-overflow: clip;
188
+ overflow-wrap: anywhere;
189
+ }
190
+
191
+ body.force-compact .card-subtitle {
192
+ white-space: normal;
193
+ overflow: hidden;
194
+ text-overflow: clip;
195
+ overflow-wrap: anywhere;
196
+ display: -webkit-box;
197
+ -webkit-line-clamp: 2;
198
+ -webkit-box-orient: vertical;
199
+ }
200
+
201
+ body.force-compact .card-trailing {
202
+ width: 100%;
203
+ margin-top: 0;
204
+ grid-auto-flow: row;
205
+ grid-auto-columns: 1fr;
206
+ justify-content: stretch;
207
+ justify-items: end;
208
+ }
209
+
210
+ body.force-compact .card-trailing .card-actions {
211
+ width: 100%;
212
+ justify-content: flex-end;
213
+ justify-self: stretch;
214
+ flex-wrap: wrap;
215
+ }
216
+
217
+ body.force-compact .card-actions {
218
+ opacity: 1;
219
+ transform: none;
220
+ }
221
+
222
+ body.force-compact .card-trailing .pill,
223
+ body.force-compact .card-trailing .latency {
224
+ justify-self: end;
225
+ }
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
+
272
+ body::before {
273
+ content: "";
274
+ position: fixed;
275
+ inset: 0;
276
+ pointer-events: none;
277
+ background:
278
+ radial-gradient(circle at 18% 16%, rgba(255, 255, 255, 0.62), rgba(255, 255, 255, 0) 26%),
279
+ radial-gradient(circle at 86% 18%, rgba(255, 232, 206, 0.36), rgba(255, 232, 206, 0) 30%);
280
+ z-index: 0;
281
+ }