codexmate 0.0.20 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +289 -152
  2. package/README.zh.md +321 -0
  3. package/cli/agents-files.js +224 -0
  4. package/cli/archive-helpers.js +446 -0
  5. package/cli/auth-profiles.js +359 -0
  6. package/cli/builtin-proxy.js +1044 -0
  7. package/cli/claude-proxy.js +998 -0
  8. package/cli/config-bootstrap.js +384 -0
  9. package/cli/openai-bridge.js +950 -0
  10. package/cli/openclaw-config.js +629 -0
  11. package/cli/session-usage.concurrent.js +28 -0
  12. package/cli/session-usage.js +112 -0
  13. package/cli/session-usage.models.js +176 -0
  14. package/cli/skills.js +1141 -0
  15. package/cli/zip-commands.js +510 -0
  16. package/cli.js +9408 -9719
  17. package/lib/cli-models-utils.js +109 -1
  18. package/lib/cli-path-utils.js +69 -0
  19. package/lib/cli-sessions.js +386 -0
  20. package/lib/download-artifacts.js +77 -0
  21. package/lib/task-orchestrator.js +869 -0
  22. package/package.json +14 -10
  23. package/res/logo.png +0 -0
  24. package/res/vue.global.prod.js +13 -0
  25. package/web-ui/app.js +193 -15
  26. package/web-ui/index.html +5 -1
  27. package/web-ui/logic.agents-diff.mjs +1 -1
  28. package/web-ui/logic.claude.mjs +60 -0
  29. package/web-ui/logic.runtime.mjs +11 -7
  30. package/web-ui/logic.sessions.mjs +372 -21
  31. package/web-ui/modules/api.mjs +22 -1
  32. package/web-ui/modules/app.computed.dashboard.mjs +23 -10
  33. package/web-ui/modules/app.computed.index.mjs +4 -0
  34. package/web-ui/modules/app.computed.main-tabs.mjs +198 -0
  35. package/web-ui/modules/app.computed.session.mjs +521 -9
  36. package/web-ui/modules/app.methods.agents.mjs +62 -11
  37. package/web-ui/modules/app.methods.codex-config.mjs +189 -34
  38. package/web-ui/modules/app.methods.index.mjs +7 -1
  39. package/web-ui/modules/app.methods.install.mjs +24 -20
  40. package/web-ui/modules/app.methods.navigation.mjs +142 -1
  41. package/web-ui/modules/app.methods.openclaw-core.mjs +339 -39
  42. package/web-ui/modules/app.methods.openclaw-editing.mjs +39 -4
  43. package/web-ui/modules/app.methods.openclaw-persist.mjs +122 -4
  44. package/web-ui/modules/app.methods.providers.mjs +192 -53
  45. package/web-ui/modules/app.methods.session-actions.mjs +99 -19
  46. package/web-ui/modules/app.methods.session-browser.mjs +196 -5
  47. package/web-ui/modules/app.methods.session-timeline.mjs +22 -15
  48. package/web-ui/modules/app.methods.session-trash.mjs +3 -0
  49. package/web-ui/modules/app.methods.startup-claude.mjs +70 -71
  50. package/web-ui/modules/app.methods.task-orchestration.mjs +471 -0
  51. package/web-ui/modules/config-mode.computed.mjs +2 -0
  52. package/web-ui/modules/config-template-confirm-pref.mjs +33 -0
  53. package/web-ui/modules/i18n.mjs +1609 -0
  54. package/web-ui/modules/plugins.computed.mjs +220 -0
  55. package/web-ui/modules/plugins.methods.mjs +620 -0
  56. package/web-ui/modules/plugins.storage.mjs +37 -0
  57. package/web-ui/partials/index/layout-footer.html +1 -57
  58. package/web-ui/partials/index/layout-header.html +299 -175
  59. package/web-ui/partials/index/modal-config-template-agents.html +79 -29
  60. package/web-ui/partials/index/modal-confirm-toast.html +1 -1
  61. package/web-ui/partials/index/modal-health-check.html +14 -14
  62. package/web-ui/partials/index/modal-openclaw-config.html +47 -42
  63. package/web-ui/partials/index/modal-skills.html +130 -114
  64. package/web-ui/partials/index/modals-basic.html +71 -102
  65. package/web-ui/partials/index/panel-config-claude.html +50 -12
  66. package/web-ui/partials/index/panel-config-codex.html +34 -37
  67. package/web-ui/partials/index/panel-config-openclaw.html +10 -16
  68. package/web-ui/partials/index/panel-docs.html +147 -0
  69. package/web-ui/partials/index/panel-market.html +38 -38
  70. package/web-ui/partials/index/panel-orchestration.html +397 -0
  71. package/web-ui/partials/index/panel-plugins.html +243 -0
  72. package/web-ui/partials/index/panel-sessions.html +51 -146
  73. package/web-ui/partials/index/panel-settings.html +188 -96
  74. package/web-ui/partials/index/panel-usage.html +353 -0
  75. package/web-ui/session-helpers.mjs +221 -10
  76. package/web-ui/styles/base-theme.css +120 -229
  77. package/web-ui/styles/controls-forms.css +59 -51
  78. package/web-ui/styles/docs-panel.css +247 -0
  79. package/web-ui/styles/layout-shell.css +394 -128
  80. package/web-ui/styles/modals-core.css +18 -3
  81. package/web-ui/styles/navigation-panels.css +184 -183
  82. package/web-ui/styles/plugins-panel.css +518 -0
  83. package/web-ui/styles/responsive.css +102 -62
  84. package/web-ui/styles/sessions-list.css +13 -27
  85. package/web-ui/styles/sessions-preview.css +13 -7
  86. package/web-ui/styles/sessions-toolbar-trash.css +25 -0
  87. package/web-ui/styles/sessions-usage.css +581 -6
  88. package/web-ui/styles/settings-panel.css +166 -0
  89. package/web-ui/styles/skills-list.css +16 -11
  90. package/web-ui/styles/skills-market.css +63 -2
  91. package/web-ui/styles/task-orchestration.css +776 -0
  92. package/web-ui/styles/titles-cards.css +67 -66
  93. package/web-ui/styles.css +4 -0
  94. package/README.en.md +0 -259
  95. package/res/screenshot.png +0 -0
  96. package/res/vue.global.js +0 -18552
@@ -1,29 +1,9 @@
1
1
  /* ============================================
2
2
  容器
3
3
  ============================================ */
4
- body::before {
5
- content: "";
6
- position: fixed;
7
- inset: 0;
8
- background-image:
9
- linear-gradient(180deg, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0));
10
- opacity: 0.16;
11
- pointer-events: none;
12
- z-index: 0;
13
- }
14
-
15
- /* 背景网格 */
4
+ body::before,
16
5
  body::after {
17
- content: "";
18
- position: fixed;
19
- inset: 0;
20
- background-image:
21
- linear-gradient(90deg, rgba(255, 255, 255, 0.08) 1px, transparent 1px),
22
- linear-gradient(0deg, rgba(255, 255, 255, 0.06) 1px, transparent 1px);
23
- background-size: 180px 180px;
24
- opacity: 0.08;
25
- pointer-events: none;
26
- z-index: 0;
6
+ content: none;
27
7
  }
28
8
 
29
9
  /* ============================================
@@ -31,21 +11,30 @@ body::after {
31
11
  ============================================ */
32
12
  .container {
33
13
  width: 100%;
34
- max-width: 2200px;
35
- margin: 0 auto;
36
- padding: 16px 12px 28px;
14
+ max-width: none;
15
+ margin: 0;
16
+ padding: 0;
37
17
  position: relative;
38
18
  z-index: 1;
19
+ min-height: 100vh;
20
+ }
21
+
22
+ :root {
23
+ --side-rail-width: 248px;
39
24
  }
40
25
 
41
26
  /* ============================================
42
- 布局:三栏(侧栏 + 主区 + 状态检查器)
27
+ 布局:双栏(侧栏 + 主区)
43
28
  ============================================ */
44
29
  .app-shell {
45
30
  display: grid;
46
- grid-template-columns: 260px minmax(0, 1fr) 340px;
47
- gap: 16px;
48
- align-items: flex-start;
31
+ grid-template-columns: 248px minmax(0, 1fr);
32
+ gap: 0;
33
+ align-items: stretch;
34
+ min-height: 100vh;
35
+ height: 100vh;
36
+ overflow: hidden;
37
+ background: var(--color-bg);
49
38
  }
50
39
 
51
40
  .app-shell.standalone {
@@ -54,95 +43,357 @@ body::after {
54
43
 
55
44
  .side-rail {
56
45
  position: sticky;
57
- top: var(--spacing-md);
58
- align-self: start;
46
+ top: 0;
47
+ align-self: stretch;
59
48
  display: flex;
60
49
  flex-direction: column;
61
- gap: var(--spacing-sm);
62
- padding: var(--spacing-md) var(--spacing-sm);
63
- background: linear-gradient(180deg, rgba(255, 255, 255, 0.95) 0%, rgba(255, 250, 245, 0.9) 100%);
64
- border: 1px solid rgba(216, 201, 184, 0.65);
65
- border-radius: var(--radius-xl);
66
- box-shadow: var(--shadow-card);
67
- min-height: 420px;
50
+ gap: 0;
51
+ padding: 0;
52
+ background: var(--color-surface);
53
+ border-right: 1px solid var(--color-border);
54
+ border-radius: 0;
55
+ box-shadow: none;
56
+ min-height: 100vh;
57
+ overflow-y: auto;
58
+ scrollbar-width: none;
59
+ -ms-overflow-style: none;
60
+ backdrop-filter: none;
61
+ }
62
+
63
+ .side-rail::-webkit-scrollbar {
64
+ display: none;
68
65
  }
69
66
 
70
67
  .side-rail .brand-title {
71
- font-size: 24px;
72
- margin-bottom: 2px;
68
+ font-size: 22px;
69
+ margin-bottom: 0;
73
70
  }
74
71
 
75
72
  .side-section {
76
73
  display: flex;
77
74
  flex-direction: column;
78
- gap: 10px;
75
+ gap: 4px;
76
+ padding: 14px 10px;
77
+ }
78
+
79
+ .side-section + .side-section {
80
+ border-top: 1px solid var(--color-border);
81
+ }
82
+
83
+ .side-rail-nav {
84
+ display: flex;
85
+ flex-direction: column;
86
+ gap: 0;
87
+ flex: 1 1 auto;
88
+ }
89
+
90
+ .lang-fab {
91
+ display: none;
92
+ }
93
+
94
+ .lang-fab .lang-switch {
95
+ width: auto;
96
+ }
97
+
98
+ .lang-choice {
99
+ display: inline-flex;
100
+ align-items: center;
101
+ gap: 4px;
102
+ padding: 4px;
103
+ border-radius: 999px;
104
+ border: 1px solid rgba(163, 146, 134, 0.32);
105
+ background: rgba(255, 253, 252, 0.92);
106
+ box-shadow: 0 14px 34px rgba(27, 23, 20, 0.22);
107
+ backdrop-filter: blur(10px);
108
+ }
109
+
110
+ .lang-choice-btn {
111
+ min-width: 44px;
112
+ height: 30px;
113
+ border-radius: 999px;
114
+ border: 1px solid transparent;
115
+ background: transparent;
116
+ color: var(--color-text-secondary);
117
+ font-family: var(--font-family-mono);
118
+ font-size: 12px;
119
+ font-weight: 700;
120
+ letter-spacing: 0.08em;
121
+ text-transform: uppercase;
122
+ transition: background-color var(--transition-fast) var(--ease-smooth), border-color var(--transition-fast) var(--ease-smooth), color var(--transition-fast) var(--ease-smooth), transform var(--transition-fast) var(--ease-smooth);
123
+ }
124
+
125
+ .lang-choice-btn:hover {
126
+ border-color: rgba(163, 146, 134, 0.32);
127
+ background: rgba(255, 255, 255, 0.72);
128
+ color: var(--color-text-primary);
129
+ }
130
+
131
+ .lang-choice-btn.active {
132
+ border-color: rgba(199, 116, 98, 0.55);
133
+ background: rgba(199, 116, 98, 0.14);
134
+ color: var(--color-brand-dark);
135
+ }
136
+
137
+ .lang-choice-btn:active {
138
+ transform: translateY(1px);
139
+ }
140
+
141
+ .lang-fab .lang-switch-track {
142
+ box-shadow: 0 14px 34px rgba(27, 23, 20, 0.22);
143
+ background: rgba(255, 253, 252, 0.92);
144
+ }
145
+
146
+ .lang-fab .lang-switch:hover .lang-switch-track {
147
+ transform: translateY(-1px);
148
+ }
149
+
150
+ .lang-fab .lang-switch:active .lang-switch-track {
151
+ transform: translateY(0);
152
+ }
153
+
154
+ .lang-fab .lang-switch-track::after {
155
+ opacity: 1;
156
+ }
157
+
158
+ .lang-fab .lang-switch-text {
159
+ color: var(--color-text-primary);
160
+ }
161
+
162
+ .lang-fab {
163
+ position: fixed;
164
+ left: 0;
165
+ bottom: calc(12px + env(safe-area-inset-bottom, 0px));
166
+ width: var(--side-rail-width, 248px);
167
+ transform: none;
168
+ z-index: 60;
169
+ pointer-events: none;
170
+ display: flex;
171
+ justify-content: center;
172
+ }
173
+
174
+ .lang-fab .lang-choice {
175
+ pointer-events: auto;
176
+ position: relative;
177
+ z-index: 1;
178
+ }
179
+
180
+ .lang-fab .lang-switch {
181
+ pointer-events: auto;
182
+ }
183
+
184
+ .lang-fab::before {
185
+ content: "";
186
+ position: absolute;
187
+ inset: -12px -18px;
188
+ background: radial-gradient(circle at 50% 70%, rgba(247, 243, 239, 0.92), rgba(247, 243, 239, 0));
189
+ filter: blur(2px);
190
+ pointer-events: none;
191
+ }
192
+
193
+ .lang-fab > .lang-switch {
194
+ position: relative;
195
+ z-index: 1;
196
+ }
197
+
198
+ .lang-fab .lang-switch-track {
199
+ border-color: rgba(163, 146, 134, 0.32);
200
+ backdrop-filter: blur(10px);
201
+ }
202
+
203
+ .lang-fab .lang-switch:hover .lang-switch-track {
204
+ border-color: rgba(199, 116, 98, 0.7);
205
+ }
206
+
207
+ .side-rail-lang {
208
+ position: sticky;
209
+ bottom: 0;
210
+ z-index: 2;
211
+ margin-top: auto;
212
+ padding: 12px 10px;
213
+ background: linear-gradient(180deg, rgba(255, 253, 252, 0.45) 0%, rgba(255, 253, 252, 0.95) 48%, rgba(255, 253, 252, 1) 100%);
214
+ border-top: 1px solid var(--color-border);
215
+ backdrop-filter: blur(10px);
216
+ display: flex;
217
+ justify-content: center;
218
+ }
219
+
220
+ .lang-switch {
221
+ width: 100%;
222
+ border: none;
223
+ background: transparent;
224
+ padding: 0;
225
+ cursor: pointer;
226
+ display: flex;
227
+ justify-content: center;
228
+ align-items: center;
229
+ }
230
+
231
+ .lang-switch-track {
232
+ width: 52px;
233
+ height: 34px;
234
+ border-radius: 999px;
235
+ border: 1px solid rgba(163, 146, 134, 0.38);
236
+ background: rgba(255, 253, 252, 0.78);
237
+ box-shadow: 0 1px 2px rgba(36, 31, 28, 0.06);
238
+ display: grid;
239
+ place-items: center;
240
+ position: relative;
241
+ overflow: hidden;
242
+ transition: border-color var(--transition-fast) var(--ease-smooth), background-color var(--transition-fast) var(--ease-smooth), transform var(--transition-fast) var(--ease-smooth);
243
+ }
244
+
245
+ .lang-switch:hover .lang-switch-track {
246
+ border-color: rgba(199, 116, 98, 0.6);
247
+ background: rgba(255, 253, 252, 0.92);
248
+ transform: translateY(-1px);
249
+ }
250
+
251
+ .lang-switch:active .lang-switch-track {
252
+ transform: translateY(0);
253
+ }
254
+
255
+ .lang-switch-text {
256
+ position: absolute;
257
+ inset: 0;
258
+ display: grid;
259
+ place-items: center;
260
+ font-family: var(--font-family-mono);
261
+ font-size: 12px;
262
+ font-weight: 700;
263
+ letter-spacing: 0.08em;
264
+ text-transform: uppercase;
265
+ color: var(--color-text-secondary);
266
+ transition: transform 220ms var(--ease-spring), opacity 220ms var(--ease-spring);
267
+ will-change: transform, opacity;
268
+ opacity: 0;
269
+ transform: translateY(10px);
270
+ }
271
+
272
+ .lang-switch-track[data-lang="zh"] .lang-switch-zh {
273
+ opacity: 1;
274
+ transform: translateY(0);
275
+ }
276
+
277
+ .lang-switch-track[data-lang="zh"] .lang-switch-en {
278
+ opacity: 0;
279
+ }
280
+
281
+ .lang-switch-track[data-lang="en"] .lang-switch-en {
282
+ opacity: 1;
283
+ transform: translateY(0);
284
+ }
285
+
286
+ .lang-switch-track[data-lang="en"] .lang-switch-zh {
287
+ opacity: 0;
288
+ }
289
+
290
+ .lang-switch-track::after {
291
+ content: "";
292
+ position: absolute;
293
+ inset: -20px;
294
+ background: radial-gradient(circle at 30% 20%, rgba(199, 116, 98, 0.18), rgba(199, 116, 98, 0) 55%);
295
+ opacity: 0;
296
+ transform: translateY(10px);
297
+ transition: opacity 240ms var(--ease-smooth), transform 240ms var(--ease-smooth);
298
+ pointer-events: none;
299
+ }
300
+
301
+ .lang-switch:hover .lang-switch-track::after {
302
+ opacity: 1;
303
+ transform: translateY(0);
79
304
  }
80
305
 
81
306
  .side-section-title {
82
- font-size: var(--font-size-secondary);
83
- font-weight: var(--font-weight-secondary);
84
- color: var(--color-text-tertiary);
85
- letter-spacing: 0.01em;
86
- padding: 0 var(--spacing-xs);
307
+ font-size: 11px;
308
+ font-weight: 700;
309
+ color: var(--color-text-muted);
310
+ letter-spacing: 0.06em;
311
+ text-transform: uppercase;
312
+ padding: 0 8px;
313
+ margin-bottom: 8px;
87
314
  }
88
315
 
89
316
  .side-item {
90
317
  width: 100%;
91
318
  text-align: left;
92
- padding: 12px var(--spacing-sm);
93
- border-radius: var(--radius-lg);
94
- border: 1px solid var(--color-border-soft);
95
- background: linear-gradient(180deg, rgba(255, 255, 255, 0.98) 0%, rgba(255, 247, 240, 0.95) 100%);
319
+ padding: 7px 10px;
320
+ border-radius: 8px;
321
+ border: 1px solid transparent;
322
+ background: transparent;
96
323
  color: var(--color-text-secondary);
97
324
  cursor: pointer;
98
- transition: none;
325
+ transition: border-color var(--transition-fast) var(--ease-smooth), background-color var(--transition-fast) var(--ease-smooth), color var(--transition-fast) var(--ease-smooth);
99
326
  display: flex;
100
327
  flex-direction: column;
101
- gap: 6px;
102
- box-shadow: var(--shadow-subtle);
328
+ gap: 2px;
329
+ box-shadow: none;
330
+ position: relative;
103
331
  }
104
332
 
105
- .side-item:hover {
106
- border-color: var(--color-brand);
107
- color: var(--color-text-primary);
108
- transform: translateY(-1px);
109
- box-shadow: var(--shadow-card-hover);
333
+ .side-item::before {
334
+ content: "";
335
+ position: absolute;
336
+ left: 0;
337
+ top: 50%;
338
+ transform: translateY(-50%);
339
+ width: 3px;
340
+ height: 16px;
341
+ border-radius: 0 2px 2px 0;
342
+ background: transparent;
343
+ transition: background-color var(--transition-fast) var(--ease-smooth);
110
344
  }
111
345
 
112
- .side-item.active {
113
- border-color: var(--color-brand);
114
- background: linear-gradient(135deg, rgba(201, 94, 75, 0.14), rgba(255, 255, 255, 0.96));
346
+ .side-item:hover {
347
+ background: var(--color-surface-alt);
115
348
  color: var(--color-text-primary);
116
- box-shadow: var(--shadow-float);
117
349
  }
118
350
 
351
+ .side-item.active,
119
352
  .side-item.nav-intent-active {
120
- border-color: var(--color-brand);
121
- background: linear-gradient(135deg, rgba(201, 94, 75, 0.14), rgba(255, 255, 255, 0.96));
122
- color: var(--color-text-primary);
123
- box-shadow: var(--shadow-float);
353
+ border-color: transparent;
354
+ background: var(--color-brand-light);
355
+ color: var(--color-brand-dark);
356
+ box-shadow: none;
124
357
  }
125
358
 
126
359
  .side-item.nav-intent-inactive,
127
360
  .side-item.active.nav-intent-inactive {
128
- border-color: var(--color-border-soft);
129
- background: linear-gradient(180deg, rgba(255, 255, 255, 0.98) 0%, rgba(255, 247, 240, 0.95) 100%);
361
+ border-color: transparent;
362
+ background: transparent;
130
363
  color: var(--color-text-secondary);
131
- box-shadow: var(--shadow-subtle);
364
+ box-shadow: none;
365
+ }
366
+
367
+ .side-item.active::before,
368
+ .side-item.nav-intent-active::before {
369
+ background: var(--color-brand);
370
+ }
371
+
372
+ .side-item.nav-intent-inactive::before,
373
+ .side-item.active.nav-intent-inactive::before {
374
+ background: transparent;
132
375
  }
133
376
 
134
377
  .side-item-title {
135
- font-size: var(--font-size-body);
136
- font-weight: var(--font-weight-secondary);
378
+ font-size: 13px;
379
+ font-weight: 600;
137
380
  letter-spacing: -0.01em;
138
381
  }
139
382
 
140
383
  .side-item-meta {
141
- font-size: var(--font-size-caption);
142
- color: var(--color-text-tertiary);
384
+ font-size: 11px;
385
+ color: var(--color-text-muted);
143
386
  display: flex;
144
- gap: 8px;
387
+ opacity: 1;
388
+ gap: 5px;
145
389
  flex-wrap: wrap;
390
+ line-height: 1.4;
391
+ min-height: 1.4em;
392
+ }
393
+
394
+ .side-item.active .side-item-meta,
395
+ .side-item.nav-intent-active .side-item-meta {
396
+ color: var(--color-text-secondary);
146
397
  }
147
398
 
148
399
  .side-item-meta > span {
@@ -151,97 +402,113 @@ body::after {
151
402
  word-break: break-word;
152
403
  }
153
404
 
154
- @media (min-width: 961px) {
405
+ @media (min-width: 721px) {
155
406
  body:not(.force-compact) #app > .top-tabs {
156
407
  display: none;
157
408
  }
158
409
  }
159
410
 
160
411
  .brand-block {
161
- display: grid;
162
- grid-template-columns: 48px 1fr;
163
- grid-template-rows: auto auto;
164
- column-gap: var(--spacing-sm);
165
- row-gap: 2px;
166
- align-items: center;
167
- margin-bottom: var(--spacing-md);
412
+ display: flex;
413
+ flex-direction: column;
414
+ align-items: flex-start;
415
+ gap: 10px;
416
+ margin-bottom: 0;
417
+ padding: 20px;
418
+ border-bottom: 1px solid var(--color-border);
168
419
  }
169
420
 
170
- .brand-logo-wrap {
171
- width: 48px;
172
- height: 48px;
173
- border-radius: 14px;
174
- background: rgba(208, 88, 58, 0.08);
175
- border: 1px solid var(--color-border-soft);
176
- display: grid;
177
- place-items: center;
178
- box-shadow: var(--shadow-subtle);
179
- flex-shrink: 0;
180
- grid-row: 1 / span 2;
421
+ .brand-head {
422
+ display: flex;
423
+ align-items: center;
424
+ gap: 12px;
181
425
  }
182
426
 
183
427
  .brand-logo {
184
- width: 34px;
185
- height: 34px;
186
- object-fit: contain;
187
- display: block;
428
+ width: 38px;
429
+ height: 38px;
430
+ border-radius: 10px;
431
+ object-fit: cover;
432
+ flex-shrink: 0;
433
+ box-shadow: var(--shadow-subtle);
188
434
  }
189
435
 
190
- .brand-title {
191
- font-size: 30px;
192
- line-height: 1.05;
193
- font-family: var(--font-family-display);
194
- color: var(--color-text-primary);
195
- letter-spacing: -0.02em;
436
+ .brand-copy {
437
+ display: flex;
438
+ flex-direction: column;
439
+ gap: 4px;
440
+ min-width: 0;
196
441
  }
197
442
 
198
- .brand-title .accent {
199
- color: var(--color-brand);
443
+ .brand-kicker {
444
+ font-size: 11px;
445
+ line-height: 1;
446
+ letter-spacing: 0.06em;
447
+ text-transform: uppercase;
448
+ color: var(--color-text-muted);
449
+ font-weight: 700;
200
450
  }
201
451
 
202
452
  .brand-subtitle {
203
- margin-top: 8px;
204
- font-size: var(--font-size-secondary);
205
- color: var(--color-text-tertiary);
453
+ font-size: 12px;
206
454
  line-height: 1.45;
455
+ color: var(--color-text-secondary);
456
+ max-width: 22ch;
457
+ }
458
+
459
+ .brand-title {
460
+ font-size: 18px;
461
+ line-height: 1.1;
462
+ font-family: var(--font-family-display);
463
+ color: var(--color-text-primary);
464
+ letter-spacing: -0.02em;
207
465
  }
208
466
 
209
467
  .github-badge {
210
- grid-column: 2;
211
468
  display: inline-flex;
212
469
  align-items: center;
213
470
  justify-content: space-between;
214
471
  gap: 10px;
215
- margin-top: 6px;
216
- padding: 6px 10px;
217
- border-radius: 999px;
218
- border: 1px solid var(--color-border-soft);
219
- background: linear-gradient(to bottom, rgba(255, 255, 255, 0.92) 0%, rgba(255, 255, 255, 0.72) 100%);
472
+ margin-top: 0;
473
+ padding: 8px 10px;
474
+ border-radius: 8px;
475
+ border: 1px solid var(--color-border);
476
+ background: var(--color-surface);
220
477
  color: var(--color-text-secondary);
221
478
  font-size: var(--font-size-caption);
222
479
  text-decoration: none;
223
- box-shadow: var(--shadow-subtle);
224
- transition: all var(--transition-fast) var(--ease-spring);
480
+ box-shadow: none;
481
+ transition: border-color var(--transition-fast) var(--ease-smooth), background-color var(--transition-fast) var(--ease-smooth), color var(--transition-fast) var(--ease-smooth), box-shadow var(--transition-fast) var(--ease-smooth);
225
482
  min-width: 0;
483
+ backdrop-filter: none;
226
484
  }
227
485
 
228
486
  .github-badge-rail {
229
- width: 100%;
487
+ width: calc(100% - 24px);
488
+ margin: 0 12px 12px;
230
489
  align-items: center;
231
490
  justify-content: flex-start;
232
491
  gap: 8px;
233
- padding: 6px 8px;
234
- border-radius: 10px;
235
- background: rgba(255, 255, 255, 0.8);
236
- border: 1px solid rgba(216, 201, 184, 0.5);
237
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7);
492
+ padding: 8px 10px;
493
+ border-radius: 8px;
494
+ background: var(--color-surface);
495
+ border: 1px solid var(--color-border);
496
+ box-shadow: none;
238
497
  }
239
498
 
240
499
  .github-badge:hover {
241
- border-color: rgba(201, 94, 75, 0.5);
500
+ border-color: var(--color-border-strong);
501
+ background: var(--color-surface-alt);
242
502
  color: var(--color-text-primary);
243
- transform: translateY(-1px);
244
- box-shadow: 0 6px 12px rgba(27, 23, 20, 0.08);
503
+ box-shadow: none;
504
+ }
505
+
506
+ .github-badge:focus-visible {
507
+ outline: 3px solid rgba(199, 116, 98, 0.18);
508
+ outline-offset: 2px;
509
+ border-color: var(--color-brand);
510
+ color: var(--color-text-primary);
511
+ background: var(--color-surface);
245
512
  }
246
513
 
247
514
  .github-badge-icon {
@@ -317,7 +584,7 @@ body::after {
317
584
  .github-badge-rail .github-badge-left {
318
585
  padding: 4px;
319
586
  border-radius: 999px;
320
- background: rgba(201, 94, 75, 0.12);
587
+ background: var(--color-brand-light);
321
588
  }
322
589
 
323
590
  .github-badge-rail .github-badge-label {
@@ -325,6 +592,5 @@ body::after {
325
592
  }
326
593
 
327
594
  .github-badge-rail:hover {
328
- transform: translateY(-1px);
329
- border-color: rgba(201, 94, 75, 0.5);
595
+ border-color: var(--color-border-strong);
330
596
  }
@@ -155,9 +155,9 @@
155
155
  }
156
156
 
157
157
  .install-action-tabs .btn-mini.active {
158
- background: rgba(201, 94, 75, 0.16);
159
- border-color: rgba(201, 94, 75, 0.32);
160
- color: var(--color-text-primary);
158
+ background: var(--color-brand-light);
159
+ border-color: rgba(199, 116, 98, 0.22);
160
+ color: var(--color-brand-dark);
161
161
  }
162
162
 
163
163
  .install-registry-input {
@@ -249,6 +249,16 @@
249
249
  box-shadow: var(--shadow-input-focus);
250
250
  }
251
251
 
252
+ .form-input.invalid,
253
+ .form-input.invalid:hover,
254
+ .form-input.invalid:focus {
255
+ border-color: var(--color-error);
256
+ }
257
+
258
+ .form-input.invalid:focus {
259
+ box-shadow: 0 0 0 3px rgba(196, 69, 54, 0.14);
260
+ }
261
+
252
262
  .form-input::placeholder {
253
263
  color: var(--color-text-tertiary);
254
264
  opacity: 0.7;
@@ -447,3 +457,8 @@
447
457
  margin-top: 5px;
448
458
  opacity: 0.8;
449
459
  }
460
+
461
+ .form-hint.form-error {
462
+ color: var(--color-error);
463
+ opacity: 1;
464
+ }