codexmate 0.0.29 → 0.0.30

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 (143) 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 +1725 -1725
  7. package/cli/claude-proxy.js +1022 -1022
  8. package/cli/config-bootstrap.js +402 -384
  9. package/cli/config-health.js +454 -338
  10. package/cli/doctor-core.js +903 -903
  11. package/cli/import-skills-url.js +356 -356
  12. package/cli/local-bridge.js +324 -0
  13. package/cli/openai-bridge.js +1653 -1576
  14. package/cli/openclaw-config.js +629 -629
  15. package/cli/session-convert-args.js +65 -65
  16. package/cli/session-convert-io.js +82 -82
  17. package/cli/session-convert.js +43 -43
  18. package/cli/session-usage.concurrent.js +28 -28
  19. package/cli/session-usage.js +118 -118
  20. package/cli/session-usage.models.js +176 -176
  21. package/cli/skills.js +1141 -1141
  22. package/cli/zip-commands.js +510 -510
  23. package/cli.js +15481 -15340
  24. package/lib/automation.js +404 -404
  25. package/lib/cli-file-utils.js +151 -151
  26. package/lib/cli-models-utils.js +440 -440
  27. package/lib/cli-network-utils.js +190 -190
  28. package/lib/cli-path-utils.js +85 -85
  29. package/lib/cli-session-utils.js +121 -121
  30. package/lib/cli-sessions.js +417 -417
  31. package/lib/cli-utils.js +155 -155
  32. package/lib/cli-webhook.js +126 -126
  33. package/lib/download-artifacts.js +92 -92
  34. package/lib/mcp-stdio.js +453 -453
  35. package/lib/task-orchestrator.js +869 -869
  36. package/lib/text-diff.js +303 -303
  37. package/lib/workflow-engine.js +340 -340
  38. package/package.json +76 -76
  39. package/plugins/README.md +20 -20
  40. package/plugins/README.zh-CN.md +20 -20
  41. package/plugins/prompt-templates/comment-polish/index.mjs +25 -25
  42. package/plugins/prompt-templates/computed.mjs +253 -253
  43. package/plugins/prompt-templates/index.mjs +8 -8
  44. package/plugins/prompt-templates/manifest.mjs +15 -15
  45. package/plugins/prompt-templates/methods.mjs +553 -553
  46. package/plugins/prompt-templates/overview.mjs +91 -91
  47. package/plugins/prompt-templates/ownership.mjs +19 -19
  48. package/plugins/prompt-templates/rule-ack/index.mjs +21 -21
  49. package/plugins/prompt-templates/storage.mjs +64 -64
  50. package/plugins/registry.mjs +16 -16
  51. package/web-ui/app.js +645 -639
  52. package/web-ui/index.html +36 -36
  53. package/web-ui/logic.agents-diff.mjs +386 -386
  54. package/web-ui/logic.claude.mjs +168 -168
  55. package/web-ui/logic.codex.mjs +69 -69
  56. package/web-ui/logic.mjs +5 -5
  57. package/web-ui/logic.runtime.mjs +128 -128
  58. package/web-ui/logic.session-convert.mjs +70 -70
  59. package/web-ui/logic.sessions.mjs +765 -765
  60. package/web-ui/modules/api.mjs +90 -90
  61. package/web-ui/modules/app.computed.dashboard.mjs +248 -225
  62. package/web-ui/modules/app.computed.index.mjs +17 -17
  63. package/web-ui/modules/app.computed.main-tabs.mjs +205 -205
  64. package/web-ui/modules/app.computed.session.mjs +999 -999
  65. package/web-ui/modules/app.constants.mjs +15 -15
  66. package/web-ui/modules/app.methods.agents.mjs +632 -632
  67. package/web-ui/modules/app.methods.claude-config.mjs +200 -200
  68. package/web-ui/modules/app.methods.codex-config.mjs +917 -892
  69. package/web-ui/modules/app.methods.index.mjs +94 -94
  70. package/web-ui/modules/app.methods.install.mjs +205 -205
  71. package/web-ui/modules/app.methods.navigation.mjs +774 -761
  72. package/web-ui/modules/app.methods.openclaw-core.mjs +814 -814
  73. package/web-ui/modules/app.methods.openclaw-editing.mjs +372 -372
  74. package/web-ui/modules/app.methods.openclaw-persist.mjs +369 -369
  75. package/web-ui/modules/app.methods.providers.mjs +529 -493
  76. package/web-ui/modules/app.methods.runtime.mjs +345 -345
  77. package/web-ui/modules/app.methods.session-actions.mjs +593 -593
  78. package/web-ui/modules/app.methods.session-browser.mjs +984 -984
  79. package/web-ui/modules/app.methods.session-timeline.mjs +479 -479
  80. package/web-ui/modules/app.methods.session-trash.mjs +438 -438
  81. package/web-ui/modules/app.methods.startup-claude.mjs +534 -533
  82. package/web-ui/modules/app.methods.task-orchestration.mjs +556 -556
  83. package/web-ui/modules/app.methods.webhook.mjs +79 -79
  84. package/web-ui/modules/config-mode.computed.mjs +124 -124
  85. package/web-ui/modules/config-template-confirm-pref.mjs +33 -33
  86. package/web-ui/modules/i18n.dict.mjs +3146 -3131
  87. package/web-ui/modules/i18n.mjs +62 -62
  88. package/web-ui/modules/plugins.computed.mjs +3 -3
  89. package/web-ui/modules/plugins.methods.mjs +3 -3
  90. package/web-ui/modules/plugins.storage.mjs +11 -11
  91. package/web-ui/modules/provider-url-display.mjs +17 -17
  92. package/web-ui/modules/sessions-filters-url.mjs +85 -85
  93. package/web-ui/modules/skills.computed.mjs +107 -107
  94. package/web-ui/modules/skills.methods.mjs +482 -481
  95. package/web-ui/partials/index/layout-footer.html +13 -13
  96. package/web-ui/partials/index/layout-header.html +500 -500
  97. package/web-ui/partials/index/modal-config-template-agents.html +174 -174
  98. package/web-ui/partials/index/modal-confirm-toast.html +32 -32
  99. package/web-ui/partials/index/modal-health-check.html +45 -45
  100. package/web-ui/partials/index/modal-openclaw-config.html +280 -280
  101. package/web-ui/partials/index/modal-skills.html +200 -200
  102. package/web-ui/partials/index/modals-basic.html +162 -162
  103. package/web-ui/partials/index/panel-config-claude.html +194 -194
  104. package/web-ui/partials/index/panel-config-codex.html +337 -323
  105. package/web-ui/partials/index/panel-config-openclaw.html +83 -83
  106. package/web-ui/partials/index/panel-dashboard.html +219 -186
  107. package/web-ui/partials/index/panel-docs.html +147 -147
  108. package/web-ui/partials/index/panel-market.html +177 -177
  109. package/web-ui/partials/index/panel-orchestration.html +391 -391
  110. package/web-ui/partials/index/panel-plugins.html +253 -253
  111. package/web-ui/partials/index/panel-sessions.html +308 -316
  112. package/web-ui/partials/index/panel-settings.html +190 -190
  113. package/web-ui/partials/index/panel-trash.html +88 -88
  114. package/web-ui/partials/index/panel-usage.html +371 -371
  115. package/web-ui/res/json5.min.js +1 -1
  116. package/web-ui/res/vue.global.prod.js +13 -13
  117. package/web-ui/session-helpers.mjs +594 -576
  118. package/web-ui/source-bundle.cjs +233 -233
  119. package/web-ui/styles/base-theme.css +281 -281
  120. package/web-ui/styles/controls-forms.css +422 -422
  121. package/web-ui/styles/dashboard.css +406 -274
  122. package/web-ui/styles/docs-panel.css +271 -271
  123. package/web-ui/styles/feedback.css +108 -108
  124. package/web-ui/styles/health-check-dialog.css +144 -144
  125. package/web-ui/styles/layout-shell.css +626 -626
  126. package/web-ui/styles/modals-core.css +466 -466
  127. package/web-ui/styles/navigation-panels.css +391 -391
  128. package/web-ui/styles/openclaw-structured.css +266 -266
  129. package/web-ui/styles/plugins-panel.css +564 -523
  130. package/web-ui/styles/responsive.css +454 -454
  131. package/web-ui/styles/sessions-list.css +417 -419
  132. package/web-ui/styles/sessions-preview.css +407 -411
  133. package/web-ui/styles/sessions-toolbar-trash.css +334 -330
  134. package/web-ui/styles/sessions-usage.css +1040 -1040
  135. package/web-ui/styles/settings-panel.css +349 -349
  136. package/web-ui/styles/skills-list.css +305 -303
  137. package/web-ui/styles/skills-market.css +429 -406
  138. package/web-ui/styles/task-orchestration.css +822 -822
  139. package/web-ui/styles/titles-cards.css +472 -472
  140. package/web-ui/styles/trash-panel.css +90 -90
  141. package/web-ui/styles/webhook.css +81 -81
  142. package/web-ui/styles.css +23 -23
  143. package/web-ui.html +17 -17
@@ -1,281 +1,281 @@
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
- }
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
+ }