codexmate 0.0.40 → 0.0.41

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 (155) hide show
  1. package/README.md +168 -156
  2. package/README.zh.md +168 -156
  3. package/cli/agents-files.js +230 -230
  4. package/cli/analytics-export-args.js +68 -68
  5. package/cli/archive-helpers.js +453 -453
  6. package/cli/auth-profiles.js +375 -375
  7. package/cli/builtin-proxy.js +2144 -2144
  8. package/cli/claude-proxy.js +1022 -1022
  9. package/cli/config-bootstrap.js +407 -407
  10. package/cli/config-health.js +454 -454
  11. package/cli/doctor-core.js +903 -903
  12. package/cli/import-skills-url.js +356 -356
  13. package/cli/local-bridge.js +556 -556
  14. package/cli/openai-bridge.js +1984 -1984
  15. package/cli/openclaw-config.js +629 -629
  16. package/cli/session-convert-args.js +69 -69
  17. package/cli/session-convert-io.js +82 -82
  18. package/cli/session-convert.js +150 -150
  19. package/cli/session-usage.concurrent.js +28 -28
  20. package/cli/session-usage.js +304 -304
  21. package/cli/session-usage.models.js +176 -176
  22. package/cli/skills.js +1141 -1141
  23. package/cli/update.js +171 -171
  24. package/cli/zip-commands.js +510 -510
  25. package/cli.js +16458 -16341
  26. package/lib/automation.js +404 -404
  27. package/lib/cli-file-utils.js +151 -151
  28. package/lib/cli-models-utils.js +440 -440
  29. package/lib/cli-network-utils.js +190 -190
  30. package/lib/cli-path-utils.js +85 -85
  31. package/lib/cli-session-utils.js +121 -121
  32. package/lib/cli-sessions.js +427 -427
  33. package/lib/cli-utils.js +155 -155
  34. package/lib/cli-webhook.js +154 -154
  35. package/lib/download-artifacts.js +92 -92
  36. package/lib/mcp-stdio.js +453 -453
  37. package/lib/task-orchestrator.js +869 -869
  38. package/lib/text-diff.js +303 -303
  39. package/lib/win-tray.js +119 -119
  40. package/lib/workflow-engine.js +340 -340
  41. package/package.json +77 -77
  42. package/plugins/README.md +20 -20
  43. package/plugins/README.zh-CN.md +20 -20
  44. package/plugins/prompt-templates/comment-polish/index.mjs +25 -25
  45. package/plugins/prompt-templates/computed.mjs +311 -311
  46. package/plugins/prompt-templates/index.mjs +8 -8
  47. package/plugins/prompt-templates/manifest.mjs +18 -18
  48. package/plugins/prompt-templates/methods.mjs +553 -553
  49. package/plugins/prompt-templates/overview.mjs +91 -91
  50. package/plugins/prompt-templates/ownership.mjs +19 -19
  51. package/plugins/prompt-templates/rule-ack/index.mjs +21 -21
  52. package/plugins/prompt-templates/storage.mjs +64 -64
  53. package/plugins/registry.mjs +16 -16
  54. package/web-ui/app.js +695 -695
  55. package/web-ui/index.html +37 -37
  56. package/web-ui/logic.agents-diff.mjs +386 -386
  57. package/web-ui/logic.claude.mjs +172 -172
  58. package/web-ui/logic.codex.mjs +69 -69
  59. package/web-ui/logic.mjs +5 -5
  60. package/web-ui/logic.runtime.mjs +128 -128
  61. package/web-ui/logic.session-convert.mjs +70 -70
  62. package/web-ui/logic.sessions.mjs +782 -782
  63. package/web-ui/modules/api.mjs +90 -90
  64. package/web-ui/modules/app.computed.dashboard.mjs +252 -252
  65. package/web-ui/modules/app.computed.index.mjs +17 -17
  66. package/web-ui/modules/app.computed.main-tabs.mjs +214 -214
  67. package/web-ui/modules/app.computed.session.mjs +876 -876
  68. package/web-ui/modules/app.constants.mjs +15 -15
  69. package/web-ui/modules/app.methods.agents.mjs +651 -651
  70. package/web-ui/modules/app.methods.claude-config.mjs +412 -412
  71. package/web-ui/modules/app.methods.codex-config.mjs +869 -869
  72. package/web-ui/modules/app.methods.index.mjs +96 -96
  73. package/web-ui/modules/app.methods.install.mjs +205 -205
  74. package/web-ui/modules/app.methods.navigation.mjs +804 -804
  75. package/web-ui/modules/app.methods.openclaw-core.mjs +814 -814
  76. package/web-ui/modules/app.methods.openclaw-editing.mjs +420 -420
  77. package/web-ui/modules/app.methods.openclaw-persist.mjs +375 -375
  78. package/web-ui/modules/app.methods.providers.mjs +601 -601
  79. package/web-ui/modules/app.methods.runtime.mjs +420 -420
  80. package/web-ui/modules/app.methods.session-actions.mjs +591 -591
  81. package/web-ui/modules/app.methods.session-browser.mjs +1018 -1018
  82. package/web-ui/modules/app.methods.session-timeline.mjs +479 -479
  83. package/web-ui/modules/app.methods.session-trash.mjs +468 -468
  84. package/web-ui/modules/app.methods.startup-claude.mjs +554 -554
  85. package/web-ui/modules/app.methods.task-orchestration.mjs +556 -556
  86. package/web-ui/modules/app.methods.tool-config-permissions.mjs +87 -87
  87. package/web-ui/modules/app.methods.webhook.mjs +87 -87
  88. package/web-ui/modules/config-mode.computed.mjs +124 -124
  89. package/web-ui/modules/config-template-confirm-pref.mjs +33 -33
  90. package/web-ui/modules/i18n/locales/en.mjs +1140 -1140
  91. package/web-ui/modules/i18n/locales/ja.mjs +1130 -1130
  92. package/web-ui/modules/i18n/locales/vi.mjs +239 -239
  93. package/web-ui/modules/i18n/locales/zh.mjs +1143 -1143
  94. package/web-ui/modules/i18n.dict.mjs +14 -14
  95. package/web-ui/modules/i18n.mjs +111 -111
  96. package/web-ui/modules/plugins.computed.mjs +3 -3
  97. package/web-ui/modules/plugins.methods.mjs +3 -3
  98. package/web-ui/modules/plugins.storage.mjs +11 -11
  99. package/web-ui/modules/provider-url-display.mjs +17 -17
  100. package/web-ui/modules/sessions-filters-url.mjs +138 -138
  101. package/web-ui/modules/skills.computed.mjs +107 -107
  102. package/web-ui/modules/skills.methods.mjs +513 -513
  103. package/web-ui/partials/index/layout-footer.html +13 -13
  104. package/web-ui/partials/index/layout-header.html +478 -478
  105. package/web-ui/partials/index/modal-config-template-agents.html +185 -185
  106. package/web-ui/partials/index/modal-confirm-toast.html +32 -32
  107. package/web-ui/partials/index/modal-health-check.html +45 -45
  108. package/web-ui/partials/index/modal-openclaw-config.html +344 -344
  109. package/web-ui/partials/index/modal-skills.html +200 -200
  110. package/web-ui/partials/index/modal-webhook.html +42 -42
  111. package/web-ui/partials/index/modals-basic.html +263 -263
  112. package/web-ui/partials/index/panel-config-claude.html +187 -187
  113. package/web-ui/partials/index/panel-config-codex.html +205 -205
  114. package/web-ui/partials/index/panel-config-openclaw.html +89 -89
  115. package/web-ui/partials/index/panel-dashboard.html +171 -171
  116. package/web-ui/partials/index/panel-docs.html +114 -114
  117. package/web-ui/partials/index/panel-market.html +104 -104
  118. package/web-ui/partials/index/panel-orchestration.html +391 -391
  119. package/web-ui/partials/index/panel-plugins.html +253 -253
  120. package/web-ui/partials/index/panel-sessions.html +319 -319
  121. package/web-ui/partials/index/panel-settings.html +181 -181
  122. package/web-ui/partials/index/panel-trash.html +82 -82
  123. package/web-ui/partials/index/panel-usage.html +181 -181
  124. package/web-ui/res/json5.min.js +1 -1
  125. package/web-ui/res/vue.global.prod.js +13 -13
  126. package/web-ui/res/vue.runtime.global.prod.js +7 -7
  127. package/web-ui/res/web-ui-render.precompiled.js +7666 -7666
  128. package/web-ui/session-helpers.mjs +602 -602
  129. package/web-ui/source-bundle.cjs +305 -305
  130. package/web-ui/styles/base-theme.css +291 -291
  131. package/web-ui/styles/bridge-pool.css +266 -266
  132. package/web-ui/styles/controls-forms.css +532 -532
  133. package/web-ui/styles/dashboard.css +438 -438
  134. package/web-ui/styles/docs-panel.css +245 -245
  135. package/web-ui/styles/feedback.css +108 -108
  136. package/web-ui/styles/health-check-dialog.css +144 -144
  137. package/web-ui/styles/layout-shell.css +711 -711
  138. package/web-ui/styles/modals-core.css +499 -499
  139. package/web-ui/styles/navigation-panels.css +399 -399
  140. package/web-ui/styles/openclaw-structured.css +616 -616
  141. package/web-ui/styles/plugins-panel.css +564 -564
  142. package/web-ui/styles/responsive.css +501 -501
  143. package/web-ui/styles/sessions-list.css +683 -683
  144. package/web-ui/styles/sessions-preview.css +407 -407
  145. package/web-ui/styles/sessions-toolbar-trash.css +518 -518
  146. package/web-ui/styles/sessions-usage.css +849 -849
  147. package/web-ui/styles/settings-panel.css +419 -419
  148. package/web-ui/styles/skills-list.css +305 -305
  149. package/web-ui/styles/skills-market.css +723 -723
  150. package/web-ui/styles/task-orchestration.css +822 -822
  151. package/web-ui/styles/titles-cards.css +486 -486
  152. package/web-ui/styles/trash-panel.css +90 -90
  153. package/web-ui/styles/webhook.css +115 -115
  154. package/web-ui/styles.css +24 -24
  155. package/web-ui.html +17 -17
@@ -1,291 +1,291 @@
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
- /* Delta 指示色 */
30
- --color-delta-up: #4caf50;
31
- --color-delta-down: #f44336;
32
-
33
- /* 热力图色阶 */
34
- --color-heatmap-1: rgba(200, 121, 99, 0.2);
35
- --color-heatmap-2: rgba(200, 121, 99, 0.4);
36
- --color-heatmap-3: rgba(200, 121, 99, 0.6);
37
- --color-heatmap-4: rgba(200, 121, 99, 0.85);
38
-
39
- --bg-warm-gradient:
40
- radial-gradient(circle at 14% 8%, rgba(255, 219, 196, 0.5) 0%, rgba(255, 219, 196, 0) 32%),
41
- radial-gradient(circle at 88% 0%, rgba(252, 239, 207, 0.58) 0%, rgba(252, 239, 207, 0) 30%),
42
- linear-gradient(135deg, #FFF8F1 0%, #F7F0E9 46%, #F1E8DF 100%);
43
-
44
- --color-bg-topbar-strong: rgba(255, 248, 241, 0.96);
45
- --color-bg-topbar-soft: rgba(255, 248, 241, 0.86);
46
- --color-bg-topbar-clear: rgba(255, 248, 241, 0);
47
-
48
- /* 字体系统 */
49
- --font-family-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
50
- --font-family-display: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
51
- --font-family-mono: 'JetBrainsMono Nerd Font Mono', 'JetBrains Mono', 'Fira Code', 'SFMono-Regular', Consolas, 'Liberation Mono', monospace;
52
- --font-family: var(--font-family-body);
53
-
54
- --font-size-display: 52px;
55
- --font-size-title: 18px;
56
- --font-size-large: 20px;
57
- --font-size-body: 15px;
58
- --font-size-secondary: 13px;
59
- --font-size-caption: 11px;
60
-
61
- --font-weight-display: 600;
62
- --font-weight-primary: 600;
63
- --font-weight-title: 600;
64
- --font-weight-body: 400;
65
- --font-weight-secondary: 500;
66
- --font-weight-caption: 500;
67
-
68
- --line-height-tight: 1.12;
69
- --line-height-normal: 1.5;
70
-
71
- /* 间距系统 */
72
- --spacing-xs: 8px;
73
- --spacing-sm: 16px;
74
- --spacing-md: 24px;
75
- --spacing-lg: 40px;
76
- --spacing-xl: 64px;
77
-
78
- /* 圆角系统 */
79
- --radius-sm: 10px;
80
- --radius-md: 14px;
81
- --radius-lg: 18px;
82
- --radius-xl: 24px;
83
- --radius-full: 50px;
84
-
85
- /* 阴影系统 - 柔和桌面浮层 */
86
- --shadow-subtle: 0 1px 2px rgba(60, 47, 38, 0.05);
87
- --shadow-card: 0 12px 30px rgba(92, 68, 52, 0.08);
88
- --shadow-card-hover: 0 18px 44px rgba(92, 68, 52, 0.14);
89
- --shadow-float: 0 22px 56px rgba(70, 51, 39, 0.18);
90
- --shadow-raised: 0 14px 30px rgba(92, 68, 52, 0.14);
91
- --shadow-modal:
92
- 0 16px 42px rgba(70, 51, 39, 0.16),
93
- 0 34px 84px rgba(70, 51, 39, 0.16);
94
- --shadow-input-focus:
95
- 0 0 0 3px var(--color-brand-light),
96
- 0 1px 2px rgba(60, 47, 38, 0.06);
97
-
98
- /* 动画 - 更细腻的曲线 */
99
- --transition-instant: 100ms;
100
- --transition-fast: 120ms;
101
- --transition-normal: 200ms;
102
- --transition-slow: 300ms;
103
- --ease-spring: cubic-bezier(0.16, 1, 0.3, 1);
104
- --ease-spring-soft: cubic-bezier(0.25, 1, 0.5, 1);
105
- --ease-smooth: cubic-bezier(0.4, 0, 0.2, 1);
106
- --ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1);
107
- }
108
-
109
- /* ============================================
110
- 手机桌面 UA 兜底:触控设备强制紧凑排版
111
- ============================================ */
112
- body.force-compact {
113
- --font-size-title: 20px;
114
- --font-size-body: 16px;
115
- --font-size-secondary: 14px;
116
- --font-size-caption: 12px;
117
- }
118
-
119
- body.force-compact .provider-fast-switch {
120
- position: sticky;
121
- top: 8px;
122
- z-index: 16;
123
- }
124
-
125
- body.force-compact .provider-fast-switch-select {
126
- min-height: 44px;
127
- font-size: 16px;
128
- }
129
-
130
- @media (max-width: 720px) {
131
- body.force-compact .app-shell {
132
- grid-template-columns: 1fr;
133
- gap: 12px;
134
- height: auto;
135
- min-height: auto;
136
- overflow: visible;
137
- }
138
-
139
- body.force-compact .main-panel {
140
- position: relative;
141
- top: auto;
142
- align-self: stretch;
143
- width: 100%;
144
- height: auto;
145
- overflow-y: visible;
146
- padding: 14px 12px;
147
- }
148
-
149
- body.force-compact .side-rail,
150
- body.force-compact .status-inspector {
151
- display: none;
152
- }
153
-
154
- body.force-compact .top-tabs {
155
- display: flex !important;
156
- flex-wrap: nowrap;
157
- overflow-x: auto;
158
- overflow-y: hidden;
159
- -webkit-overflow-scrolling: touch;
160
- scrollbar-width: none;
161
- }
162
-
163
- body.force-compact .top-tabs::-webkit-scrollbar {
164
- display: none;
165
- }
166
-
167
- body.force-compact .main-panel-topbar {
168
- position: static;
169
- margin: 0 0 10px;
170
- padding: 0;
171
- background: transparent;
172
- backdrop-filter: none;
173
- }
174
-
175
- body.force-compact .card {
176
- display: flex;
177
- flex-direction: column;
178
- align-items: flex-start;
179
- justify-content: flex-start;
180
- padding: 12px;
181
- gap: 8px;
182
- }
183
-
184
- body.force-compact .card-leading {
185
- align-items: flex-start;
186
- width: 100%;
187
- }
188
-
189
- body.force-compact .card-content {
190
- width: 100%;
191
- }
192
-
193
- body.force-compact .card-title,
194
- body.force-compact .card-title > span:first-child {
195
- white-space: normal;
196
- overflow: visible;
197
- text-overflow: clip;
198
- overflow-wrap: anywhere;
199
- }
200
-
201
- body.force-compact .card-subtitle {
202
- white-space: normal;
203
- overflow: hidden;
204
- text-overflow: clip;
205
- overflow-wrap: anywhere;
206
- display: -webkit-box;
207
- -webkit-line-clamp: 2;
208
- -webkit-box-orient: vertical;
209
- }
210
-
211
- body.force-compact .card-trailing {
212
- width: 100%;
213
- margin-top: 0;
214
- grid-auto-flow: row;
215
- grid-auto-columns: 1fr;
216
- justify-content: stretch;
217
- justify-items: end;
218
- }
219
-
220
- body.force-compact .card-trailing .card-actions {
221
- width: 100%;
222
- justify-content: flex-end;
223
- justify-self: stretch;
224
- flex-wrap: wrap;
225
- }
226
-
227
- body.force-compact .card-actions {
228
- opacity: 1;
229
- transform: none;
230
- }
231
-
232
- body.force-compact .card-trailing .pill,
233
- body.force-compact .card-trailing .latency {
234
- justify-self: end;
235
- }
236
- }
237
-
238
- body.force-compact .btn-add,
239
- body.force-compact .btn-tool,
240
- body.force-compact .card-action-btn {
241
- min-height: 44px;
242
- }
243
-
244
- /* ============================================
245
- 基础重置
246
- ============================================ */
247
- * {
248
- margin: 0;
249
- padding: 0;
250
- box-sizing: border-box;
251
- }
252
-
253
- /* 仅屏幕阅读器可见 */
254
- .sr-only {
255
- position: absolute;
256
- width: 1px;
257
- height: 1px;
258
- padding: 0;
259
- margin: -1px;
260
- overflow: hidden;
261
- clip: rect(0, 0, 0, 0);
262
- white-space: nowrap;
263
- border: 0;
264
- }
265
-
266
- body {
267
- font-family: var(--font-family-body);
268
- background-color: var(--color-bg);
269
- background: var(--bg-warm-gradient);
270
- color: var(--color-text-primary);
271
- display: flex;
272
- justify-content: stretch;
273
- align-items: stretch;
274
- min-height: 100vh;
275
- padding: 0;
276
- -webkit-font-smoothing: antialiased;
277
- -moz-osx-font-smoothing: grayscale;
278
- position: relative;
279
- overflow-x: hidden;
280
- }
281
-
282
- body::before {
283
- content: "";
284
- position: fixed;
285
- inset: 0;
286
- pointer-events: none;
287
- background:
288
- radial-gradient(circle at 18% 16%, rgba(255, 255, 255, 0.62), rgba(255, 255, 255, 0) 26%),
289
- radial-gradient(circle at 86% 18%, rgba(255, 232, 206, 0.36), rgba(255, 232, 206, 0) 30%);
290
- z-index: 0;
291
- }
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
+ /* Delta 指示色 */
30
+ --color-delta-up: #4caf50;
31
+ --color-delta-down: #f44336;
32
+
33
+ /* 热力图色阶 */
34
+ --color-heatmap-1: rgba(200, 121, 99, 0.2);
35
+ --color-heatmap-2: rgba(200, 121, 99, 0.4);
36
+ --color-heatmap-3: rgba(200, 121, 99, 0.6);
37
+ --color-heatmap-4: rgba(200, 121, 99, 0.85);
38
+
39
+ --bg-warm-gradient:
40
+ radial-gradient(circle at 14% 8%, rgba(255, 219, 196, 0.5) 0%, rgba(255, 219, 196, 0) 32%),
41
+ radial-gradient(circle at 88% 0%, rgba(252, 239, 207, 0.58) 0%, rgba(252, 239, 207, 0) 30%),
42
+ linear-gradient(135deg, #FFF8F1 0%, #F7F0E9 46%, #F1E8DF 100%);
43
+
44
+ --color-bg-topbar-strong: rgba(255, 248, 241, 0.96);
45
+ --color-bg-topbar-soft: rgba(255, 248, 241, 0.86);
46
+ --color-bg-topbar-clear: rgba(255, 248, 241, 0);
47
+
48
+ /* 字体系统 */
49
+ --font-family-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
50
+ --font-family-display: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif;
51
+ --font-family-mono: 'JetBrainsMono Nerd Font Mono', 'JetBrains Mono', 'Fira Code', 'SFMono-Regular', Consolas, 'Liberation Mono', monospace;
52
+ --font-family: var(--font-family-body);
53
+
54
+ --font-size-display: 52px;
55
+ --font-size-title: 18px;
56
+ --font-size-large: 20px;
57
+ --font-size-body: 15px;
58
+ --font-size-secondary: 13px;
59
+ --font-size-caption: 11px;
60
+
61
+ --font-weight-display: 600;
62
+ --font-weight-primary: 600;
63
+ --font-weight-title: 600;
64
+ --font-weight-body: 400;
65
+ --font-weight-secondary: 500;
66
+ --font-weight-caption: 500;
67
+
68
+ --line-height-tight: 1.12;
69
+ --line-height-normal: 1.5;
70
+
71
+ /* 间距系统 */
72
+ --spacing-xs: 8px;
73
+ --spacing-sm: 16px;
74
+ --spacing-md: 24px;
75
+ --spacing-lg: 40px;
76
+ --spacing-xl: 64px;
77
+
78
+ /* 圆角系统 */
79
+ --radius-sm: 10px;
80
+ --radius-md: 14px;
81
+ --radius-lg: 18px;
82
+ --radius-xl: 24px;
83
+ --radius-full: 50px;
84
+
85
+ /* 阴影系统 - 柔和桌面浮层 */
86
+ --shadow-subtle: 0 1px 2px rgba(60, 47, 38, 0.05);
87
+ --shadow-card: 0 12px 30px rgba(92, 68, 52, 0.08);
88
+ --shadow-card-hover: 0 18px 44px rgba(92, 68, 52, 0.14);
89
+ --shadow-float: 0 22px 56px rgba(70, 51, 39, 0.18);
90
+ --shadow-raised: 0 14px 30px rgba(92, 68, 52, 0.14);
91
+ --shadow-modal:
92
+ 0 16px 42px rgba(70, 51, 39, 0.16),
93
+ 0 34px 84px rgba(70, 51, 39, 0.16);
94
+ --shadow-input-focus:
95
+ 0 0 0 3px var(--color-brand-light),
96
+ 0 1px 2px rgba(60, 47, 38, 0.06);
97
+
98
+ /* 动画 - 更细腻的曲线 */
99
+ --transition-instant: 100ms;
100
+ --transition-fast: 120ms;
101
+ --transition-normal: 200ms;
102
+ --transition-slow: 300ms;
103
+ --ease-spring: cubic-bezier(0.16, 1, 0.3, 1);
104
+ --ease-spring-soft: cubic-bezier(0.25, 1, 0.5, 1);
105
+ --ease-smooth: cubic-bezier(0.4, 0, 0.2, 1);
106
+ --ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1);
107
+ }
108
+
109
+ /* ============================================
110
+ 手机桌面 UA 兜底:触控设备强制紧凑排版
111
+ ============================================ */
112
+ body.force-compact {
113
+ --font-size-title: 20px;
114
+ --font-size-body: 16px;
115
+ --font-size-secondary: 14px;
116
+ --font-size-caption: 12px;
117
+ }
118
+
119
+ body.force-compact .provider-fast-switch {
120
+ position: sticky;
121
+ top: 8px;
122
+ z-index: 16;
123
+ }
124
+
125
+ body.force-compact .provider-fast-switch-select {
126
+ min-height: 44px;
127
+ font-size: 16px;
128
+ }
129
+
130
+ @media (max-width: 720px) {
131
+ body.force-compact .app-shell {
132
+ grid-template-columns: 1fr;
133
+ gap: 12px;
134
+ height: auto;
135
+ min-height: auto;
136
+ overflow: visible;
137
+ }
138
+
139
+ body.force-compact .main-panel {
140
+ position: relative;
141
+ top: auto;
142
+ align-self: stretch;
143
+ width: 100%;
144
+ height: auto;
145
+ overflow-y: visible;
146
+ padding: 14px 12px;
147
+ }
148
+
149
+ body.force-compact .side-rail,
150
+ body.force-compact .status-inspector {
151
+ display: none;
152
+ }
153
+
154
+ body.force-compact .top-tabs {
155
+ display: flex !important;
156
+ flex-wrap: nowrap;
157
+ overflow-x: auto;
158
+ overflow-y: hidden;
159
+ -webkit-overflow-scrolling: touch;
160
+ scrollbar-width: none;
161
+ }
162
+
163
+ body.force-compact .top-tabs::-webkit-scrollbar {
164
+ display: none;
165
+ }
166
+
167
+ body.force-compact .main-panel-topbar {
168
+ position: static;
169
+ margin: 0 0 10px;
170
+ padding: 0;
171
+ background: transparent;
172
+ backdrop-filter: none;
173
+ }
174
+
175
+ body.force-compact .card {
176
+ display: flex;
177
+ flex-direction: column;
178
+ align-items: flex-start;
179
+ justify-content: flex-start;
180
+ padding: 12px;
181
+ gap: 8px;
182
+ }
183
+
184
+ body.force-compact .card-leading {
185
+ align-items: flex-start;
186
+ width: 100%;
187
+ }
188
+
189
+ body.force-compact .card-content {
190
+ width: 100%;
191
+ }
192
+
193
+ body.force-compact .card-title,
194
+ body.force-compact .card-title > span:first-child {
195
+ white-space: normal;
196
+ overflow: visible;
197
+ text-overflow: clip;
198
+ overflow-wrap: anywhere;
199
+ }
200
+
201
+ body.force-compact .card-subtitle {
202
+ white-space: normal;
203
+ overflow: hidden;
204
+ text-overflow: clip;
205
+ overflow-wrap: anywhere;
206
+ display: -webkit-box;
207
+ -webkit-line-clamp: 2;
208
+ -webkit-box-orient: vertical;
209
+ }
210
+
211
+ body.force-compact .card-trailing {
212
+ width: 100%;
213
+ margin-top: 0;
214
+ grid-auto-flow: row;
215
+ grid-auto-columns: 1fr;
216
+ justify-content: stretch;
217
+ justify-items: end;
218
+ }
219
+
220
+ body.force-compact .card-trailing .card-actions {
221
+ width: 100%;
222
+ justify-content: flex-end;
223
+ justify-self: stretch;
224
+ flex-wrap: wrap;
225
+ }
226
+
227
+ body.force-compact .card-actions {
228
+ opacity: 1;
229
+ transform: none;
230
+ }
231
+
232
+ body.force-compact .card-trailing .pill,
233
+ body.force-compact .card-trailing .latency {
234
+ justify-self: end;
235
+ }
236
+ }
237
+
238
+ body.force-compact .btn-add,
239
+ body.force-compact .btn-tool,
240
+ body.force-compact .card-action-btn {
241
+ min-height: 44px;
242
+ }
243
+
244
+ /* ============================================
245
+ 基础重置
246
+ ============================================ */
247
+ * {
248
+ margin: 0;
249
+ padding: 0;
250
+ box-sizing: border-box;
251
+ }
252
+
253
+ /* 仅屏幕阅读器可见 */
254
+ .sr-only {
255
+ position: absolute;
256
+ width: 1px;
257
+ height: 1px;
258
+ padding: 0;
259
+ margin: -1px;
260
+ overflow: hidden;
261
+ clip: rect(0, 0, 0, 0);
262
+ white-space: nowrap;
263
+ border: 0;
264
+ }
265
+
266
+ body {
267
+ font-family: var(--font-family-body);
268
+ background-color: var(--color-bg);
269
+ background: var(--bg-warm-gradient);
270
+ color: var(--color-text-primary);
271
+ display: flex;
272
+ justify-content: stretch;
273
+ align-items: stretch;
274
+ min-height: 100vh;
275
+ padding: 0;
276
+ -webkit-font-smoothing: antialiased;
277
+ -moz-osx-font-smoothing: grayscale;
278
+ position: relative;
279
+ overflow-x: hidden;
280
+ }
281
+
282
+ body::before {
283
+ content: "";
284
+ position: fixed;
285
+ inset: 0;
286
+ pointer-events: none;
287
+ background:
288
+ radial-gradient(circle at 18% 16%, rgba(255, 255, 255, 0.62), rgba(255, 255, 255, 0) 26%),
289
+ radial-gradient(circle at 86% 18%, rgba(255, 232, 206, 0.36), rgba(255, 232, 206, 0) 30%);
290
+ z-index: 0;
291
+ }