codexmate 0.0.20 → 0.0.21

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 (102) hide show
  1. package/README.en.md +349 -259
  2. package/README.md +284 -252
  3. package/cli/agents-files.js +162 -0
  4. package/cli/archive-helpers.js +446 -0
  5. package/cli/auth-profiles.js +359 -0
  6. package/cli/builtin-proxy.js +580 -0
  7. package/cli/claude-proxy.js +998 -0
  8. package/cli/config-bootstrap.js +384 -0
  9. package/cli/config-health.js +338 -338
  10. package/cli/openclaw-config.js +629 -0
  11. package/cli/skills.js +1141 -0
  12. package/cli/zip-commands.js +510 -0
  13. package/cli.js +13101 -13497
  14. package/lib/cli-file-utils.js +151 -151
  15. package/lib/cli-models-utils.js +419 -311
  16. package/lib/cli-network-utils.js +164 -164
  17. package/lib/cli-path-utils.js +69 -0
  18. package/lib/cli-session-utils.js +121 -121
  19. package/lib/cli-sessions.js +386 -0
  20. package/lib/cli-utils.js +155 -155
  21. package/lib/download-artifacts.js +77 -0
  22. package/lib/mcp-stdio.js +440 -440
  23. package/lib/task-orchestrator.js +869 -0
  24. package/lib/text-diff.js +303 -303
  25. package/lib/workflow-engine.js +340 -340
  26. package/package.json +74 -70
  27. package/res/json5.min.js +1 -1
  28. package/res/vue.global.prod.js +13 -0
  29. package/web-ui/app.js +530 -397
  30. package/web-ui/index.html +33 -30
  31. package/web-ui/logic.agents-diff.mjs +386 -386
  32. package/web-ui/logic.claude.mjs +168 -108
  33. package/web-ui/logic.mjs +5 -5
  34. package/web-ui/logic.runtime.mjs +124 -124
  35. package/web-ui/logic.sessions.mjs +581 -263
  36. package/web-ui/modules/api.mjs +90 -69
  37. package/web-ui/modules/app.computed.dashboard.mjs +113 -113
  38. package/web-ui/modules/app.computed.index.mjs +15 -13
  39. package/web-ui/modules/app.computed.main-tabs.mjs +195 -0
  40. package/web-ui/modules/app.computed.session.mjs +507 -141
  41. package/web-ui/modules/app.constants.mjs +15 -15
  42. package/web-ui/modules/app.methods.agents.mjs +493 -493
  43. package/web-ui/modules/app.methods.claude-config.mjs +174 -174
  44. package/web-ui/modules/app.methods.codex-config.mjs +640 -640
  45. package/web-ui/modules/app.methods.index.mjs +88 -86
  46. package/web-ui/modules/app.methods.install.mjs +149 -157
  47. package/web-ui/modules/app.methods.navigation.mjs +619 -478
  48. package/web-ui/modules/app.methods.openclaw-core.mjs +814 -514
  49. package/web-ui/modules/app.methods.openclaw-editing.mjs +372 -337
  50. package/web-ui/modules/app.methods.openclaw-persist.mjs +369 -251
  51. package/web-ui/modules/app.methods.providers.mjs +363 -265
  52. package/web-ui/modules/app.methods.runtime.mjs +323 -323
  53. package/web-ui/modules/app.methods.session-actions.mjs +520 -457
  54. package/web-ui/modules/app.methods.session-browser.mjs +626 -435
  55. package/web-ui/modules/app.methods.session-timeline.mjs +448 -441
  56. package/web-ui/modules/app.methods.session-trash.mjs +422 -419
  57. package/web-ui/modules/app.methods.startup-claude.mjs +412 -406
  58. package/web-ui/modules/app.methods.task-orchestration.mjs +471 -0
  59. package/web-ui/modules/config-mode.computed.mjs +126 -124
  60. package/web-ui/modules/skills.computed.mjs +107 -107
  61. package/web-ui/modules/skills.methods.mjs +481 -481
  62. package/web-ui/partials/index/layout-footer.html +13 -69
  63. package/web-ui/partials/index/layout-header.html +402 -337
  64. package/web-ui/partials/index/modal-config-template-agents.html +125 -125
  65. package/web-ui/partials/index/modal-confirm-toast.html +32 -32
  66. package/web-ui/partials/index/modal-health-check.html +72 -72
  67. package/web-ui/partials/index/modal-openclaw-config.html +280 -275
  68. package/web-ui/partials/index/modal-skills.html +184 -184
  69. package/web-ui/partials/index/modals-basic.html +156 -196
  70. package/web-ui/partials/index/panel-config-claude.html +126 -100
  71. package/web-ui/partials/index/panel-config-codex.html +237 -237
  72. package/web-ui/partials/index/panel-config-openclaw.html +78 -84
  73. package/web-ui/partials/index/panel-docs.html +130 -0
  74. package/web-ui/partials/index/panel-market.html +174 -174
  75. package/web-ui/partials/index/panel-orchestration.html +397 -0
  76. package/web-ui/partials/index/panel-sessions.html +292 -387
  77. package/web-ui/partials/index/panel-settings.html +190 -166
  78. package/web-ui/partials/index/panel-usage.html +213 -0
  79. package/web-ui/session-helpers.mjs +559 -362
  80. package/web-ui/source-bundle.cjs +233 -233
  81. package/web-ui/styles/base-theme.css +271 -373
  82. package/web-ui/styles/controls-forms.css +360 -354
  83. package/web-ui/styles/docs-panel.css +182 -0
  84. package/web-ui/styles/feedback.css +108 -108
  85. package/web-ui/styles/health-check-dialog.css +144 -144
  86. package/web-ui/styles/layout-shell.css +376 -330
  87. package/web-ui/styles/modals-core.css +464 -449
  88. package/web-ui/styles/navigation-panels.css +348 -381
  89. package/web-ui/styles/openclaw-structured.css +266 -266
  90. package/web-ui/styles/responsive.css +450 -416
  91. package/web-ui/styles/sessions-list.css +400 -414
  92. package/web-ui/styles/sessions-preview.css +411 -405
  93. package/web-ui/styles/sessions-toolbar-trash.css +243 -243
  94. package/web-ui/styles/sessions-usage.css +628 -276
  95. package/web-ui/styles/skills-list.css +296 -298
  96. package/web-ui/styles/skills-market.css +335 -335
  97. package/web-ui/styles/task-orchestration.css +776 -0
  98. package/web-ui/styles/titles-cards.css +408 -407
  99. package/web-ui/styles.css +18 -16
  100. package/web-ui.html +17 -17
  101. package/res/screenshot.png +0 -0
  102. package/res/vue.global.js +0 -18552
@@ -1,330 +1,376 @@
1
- /* ============================================
2
- 容器
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
- /* 背景网格 */
16
- 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;
27
- }
28
-
29
- /* ============================================
30
- 容器
31
- ============================================ */
32
- .container {
33
- width: 100%;
34
- max-width: 2200px;
35
- margin: 0 auto;
36
- padding: 16px 12px 28px;
37
- position: relative;
38
- z-index: 1;
39
- }
40
-
41
- /* ============================================
42
- 布局:三栏(侧栏 + 主区 + 状态检查器)
43
- ============================================ */
44
- .app-shell {
45
- display: grid;
46
- grid-template-columns: 260px minmax(0, 1fr) 340px;
47
- gap: 16px;
48
- align-items: flex-start;
49
- }
50
-
51
- .app-shell.standalone {
52
- grid-template-columns: 1fr;
53
- }
54
-
55
- .side-rail {
56
- position: sticky;
57
- top: var(--spacing-md);
58
- align-self: start;
59
- display: flex;
60
- 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;
68
- }
69
-
70
- .side-rail .brand-title {
71
- font-size: 24px;
72
- margin-bottom: 2px;
73
- }
74
-
75
- .side-section {
76
- display: flex;
77
- flex-direction: column;
78
- gap: 10px;
79
- }
80
-
81
- .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);
87
- }
88
-
89
- .side-item {
90
- width: 100%;
91
- 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%);
96
- color: var(--color-text-secondary);
97
- cursor: pointer;
98
- transition: none;
99
- display: flex;
100
- flex-direction: column;
101
- gap: 6px;
102
- box-shadow: var(--shadow-subtle);
103
- }
104
-
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);
110
- }
111
-
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));
115
- color: var(--color-text-primary);
116
- box-shadow: var(--shadow-float);
117
- }
118
-
119
- .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);
124
- }
125
-
126
- .side-item.nav-intent-inactive,
127
- .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%);
130
- color: var(--color-text-secondary);
131
- box-shadow: var(--shadow-subtle);
132
- }
133
-
134
- .side-item-title {
135
- font-size: var(--font-size-body);
136
- font-weight: var(--font-weight-secondary);
137
- letter-spacing: -0.01em;
138
- }
139
-
140
- .side-item-meta {
141
- font-size: var(--font-size-caption);
142
- color: var(--color-text-tertiary);
143
- display: flex;
144
- gap: 8px;
145
- flex-wrap: wrap;
146
- }
147
-
148
- .side-item-meta > span {
149
- min-width: 0;
150
- overflow-wrap: anywhere;
151
- word-break: break-word;
152
- }
153
-
154
- @media (min-width: 961px) {
155
- body:not(.force-compact) #app > .top-tabs {
156
- display: none;
157
- }
158
- }
159
-
160
- .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);
168
- }
169
-
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;
181
- }
182
-
183
- .brand-logo {
184
- width: 34px;
185
- height: 34px;
186
- object-fit: contain;
187
- display: block;
188
- }
189
-
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;
196
- }
197
-
198
- .brand-title .accent {
199
- color: var(--color-brand);
200
- }
201
-
202
- .brand-subtitle {
203
- margin-top: 8px;
204
- font-size: var(--font-size-secondary);
205
- color: var(--color-text-tertiary);
206
- line-height: 1.45;
207
- }
208
-
209
- .github-badge {
210
- grid-column: 2;
211
- display: inline-flex;
212
- align-items: center;
213
- justify-content: space-between;
214
- 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%);
220
- color: var(--color-text-secondary);
221
- font-size: var(--font-size-caption);
222
- text-decoration: none;
223
- box-shadow: var(--shadow-subtle);
224
- transition: all var(--transition-fast) var(--ease-spring);
225
- min-width: 0;
226
- }
227
-
228
- .github-badge-rail {
229
- width: 100%;
230
- align-items: center;
231
- justify-content: flex-start;
232
- 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);
238
- }
239
-
240
- .github-badge:hover {
241
- border-color: rgba(201, 94, 75, 0.5);
242
- color: var(--color-text-primary);
243
- transform: translateY(-1px);
244
- box-shadow: 0 6px 12px rgba(27, 23, 20, 0.08);
245
- }
246
-
247
- .github-badge-icon {
248
- width: 16px;
249
- height: 16px;
250
- flex-shrink: 0;
251
- }
252
-
253
- .github-badge-left {
254
- display: inline-flex;
255
- align-items: center;
256
- gap: 6px;
257
- flex-shrink: 0;
258
- }
259
-
260
- .github-badge-label {
261
- font-size: var(--font-size-caption);
262
- font-weight: var(--font-weight-secondary);
263
- color: var(--color-text-secondary);
264
- }
265
-
266
- .github-badge-text {
267
- min-width: 0;
268
- font-family: var(--font-family-mono);
269
- font-size: var(--font-size-caption);
270
- color: var(--color-text-tertiary);
271
- line-height: 1.3;
272
- display: inline-block;
273
- overflow: hidden;
274
- text-overflow: ellipsis;
275
- white-space: nowrap;
276
- }
277
-
278
- .github-badge-text > span {
279
- white-space: nowrap;
280
- }
281
-
282
- .github-owner {
283
- font-weight: 600;
284
- color: var(--color-text-secondary);
285
- }
286
-
287
- .github-sep {
288
- margin: 0 2px;
289
- color: var(--color-text-tertiary);
290
- }
291
-
292
- .github-repo {
293
- font-weight: 600;
294
- color: var(--color-text-primary);
295
- }
296
-
297
- .github-badge-rail .github-badge-text {
298
- display: flex;
299
- flex-direction: column;
300
- align-items: flex-start;
301
- gap: 2px;
302
- white-space: normal;
303
- overflow: visible;
304
- text-overflow: clip;
305
- color: var(--color-text-secondary);
306
- }
307
-
308
- .github-badge-rail .github-sep {
309
- display: none;
310
- }
311
-
312
- .github-badge-rail .github-owner,
313
- .github-badge-rail .github-repo {
314
- font-weight: 600;
315
- }
316
-
317
- .github-badge-rail .github-badge-left {
318
- padding: 4px;
319
- border-radius: 999px;
320
- background: rgba(201, 94, 75, 0.12);
321
- }
322
-
323
- .github-badge-rail .github-badge-label {
324
- display: none;
325
- }
326
-
327
- .github-badge-rail:hover {
328
- transform: translateY(-1px);
329
- border-color: rgba(201, 94, 75, 0.5);
330
- }
1
+ /* ============================================
2
+ 容器
3
+ ============================================ */
4
+ body::before,
5
+ body::after {
6
+ content: none;
7
+ }
8
+
9
+ /* ============================================
10
+ 容器
11
+ ============================================ */
12
+ .container {
13
+ width: 100%;
14
+ max-width: none;
15
+ margin: 0;
16
+ padding: 0;
17
+ position: relative;
18
+ z-index: 1;
19
+ min-height: 100vh;
20
+ }
21
+
22
+ /* ============================================
23
+ 布局:双栏(侧栏 + 主区)
24
+ ============================================ */
25
+ .app-shell {
26
+ display: grid;
27
+ grid-template-columns: 248px minmax(0, 1fr);
28
+ gap: 0;
29
+ align-items: stretch;
30
+ min-height: 100vh;
31
+ height: 100vh;
32
+ overflow: hidden;
33
+ background: var(--color-bg);
34
+ }
35
+
36
+ .app-shell.standalone {
37
+ grid-template-columns: 1fr;
38
+ }
39
+
40
+ .side-rail {
41
+ position: sticky;
42
+ top: 0;
43
+ align-self: stretch;
44
+ display: flex;
45
+ flex-direction: column;
46
+ gap: 0;
47
+ padding: 0;
48
+ background: var(--color-surface);
49
+ border-right: 1px solid var(--color-border);
50
+ border-radius: 0;
51
+ box-shadow: none;
52
+ min-height: 100vh;
53
+ overflow-y: auto;
54
+ scrollbar-width: none;
55
+ -ms-overflow-style: none;
56
+ backdrop-filter: none;
57
+ }
58
+
59
+ .side-rail::-webkit-scrollbar {
60
+ display: none;
61
+ }
62
+
63
+ .side-rail .brand-title {
64
+ font-size: 22px;
65
+ margin-bottom: 0;
66
+ }
67
+
68
+ .side-section {
69
+ display: flex;
70
+ flex-direction: column;
71
+ gap: 4px;
72
+ padding: 14px 10px;
73
+ }
74
+
75
+ .side-section + .side-section {
76
+ border-top: 1px solid var(--color-border);
77
+ }
78
+
79
+ .side-rail-nav {
80
+ display: flex;
81
+ flex-direction: column;
82
+ gap: 0;
83
+ flex: 1 1 auto;
84
+ }
85
+
86
+ .side-section-title {
87
+ font-size: 11px;
88
+ font-weight: 700;
89
+ color: var(--color-text-muted);
90
+ letter-spacing: 0.06em;
91
+ text-transform: uppercase;
92
+ padding: 0 8px;
93
+ margin-bottom: 8px;
94
+ }
95
+
96
+ .side-item {
97
+ width: 100%;
98
+ text-align: left;
99
+ padding: 7px 10px;
100
+ border-radius: 8px;
101
+ border: 1px solid transparent;
102
+ background: transparent;
103
+ color: var(--color-text-secondary);
104
+ cursor: pointer;
105
+ transition: border-color var(--transition-fast) var(--ease-smooth), background-color var(--transition-fast) var(--ease-smooth), color var(--transition-fast) var(--ease-smooth);
106
+ display: flex;
107
+ flex-direction: column;
108
+ gap: 2px;
109
+ box-shadow: none;
110
+ position: relative;
111
+ }
112
+
113
+ .side-item::before {
114
+ content: "";
115
+ position: absolute;
116
+ left: 0;
117
+ top: 50%;
118
+ transform: translateY(-50%);
119
+ width: 3px;
120
+ height: 16px;
121
+ border-radius: 0 2px 2px 0;
122
+ background: transparent;
123
+ transition: background-color var(--transition-fast) var(--ease-smooth);
124
+ }
125
+
126
+ .side-item:hover {
127
+ background: var(--color-surface-alt);
128
+ color: var(--color-text-primary);
129
+ }
130
+
131
+ .side-item.active,
132
+ .side-item.nav-intent-active {
133
+ border-color: transparent;
134
+ background: var(--color-brand-light);
135
+ color: var(--color-brand-dark);
136
+ box-shadow: none;
137
+ }
138
+
139
+ .side-item.nav-intent-inactive,
140
+ .side-item.active.nav-intent-inactive {
141
+ border-color: transparent;
142
+ background: transparent;
143
+ color: var(--color-text-secondary);
144
+ box-shadow: none;
145
+ }
146
+
147
+ .side-item.active::before,
148
+ .side-item.nav-intent-active::before {
149
+ background: var(--color-brand);
150
+ }
151
+
152
+ .side-item.nav-intent-inactive::before,
153
+ .side-item.active.nav-intent-inactive::before {
154
+ background: transparent;
155
+ }
156
+
157
+ .side-item-title {
158
+ font-size: 13px;
159
+ font-weight: 600;
160
+ letter-spacing: -0.01em;
161
+ }
162
+
163
+ .side-item-meta {
164
+ font-size: 11px;
165
+ color: var(--color-text-muted);
166
+ display: flex;
167
+ opacity: 1;
168
+ gap: 5px;
169
+ flex-wrap: wrap;
170
+ line-height: 1.4;
171
+ min-height: 1.4em;
172
+ }
173
+
174
+ .side-item.active .side-item-meta,
175
+ .side-item.nav-intent-active .side-item-meta {
176
+ color: var(--color-text-secondary);
177
+ }
178
+
179
+ .side-item-meta > span {
180
+ min-width: 0;
181
+ overflow-wrap: anywhere;
182
+ word-break: break-word;
183
+ }
184
+
185
+ @media (min-width: 721px) {
186
+ body:not(.force-compact) #app > .top-tabs {
187
+ display: none;
188
+ }
189
+ }
190
+
191
+ .brand-block {
192
+ display: flex;
193
+ flex-direction: column;
194
+ align-items: flex-start;
195
+ gap: 10px;
196
+ margin-bottom: 0;
197
+ padding: 20px;
198
+ border-bottom: 1px solid var(--color-border);
199
+ }
200
+
201
+ .brand-head {
202
+ display: flex;
203
+ align-items: center;
204
+ gap: 12px;
205
+ }
206
+
207
+ .brand-logo {
208
+ width: 38px;
209
+ height: 38px;
210
+ border-radius: 10px;
211
+ object-fit: cover;
212
+ flex-shrink: 0;
213
+ box-shadow: var(--shadow-subtle);
214
+ }
215
+
216
+ .brand-copy {
217
+ display: flex;
218
+ flex-direction: column;
219
+ gap: 4px;
220
+ min-width: 0;
221
+ }
222
+
223
+ .brand-kicker {
224
+ font-size: 11px;
225
+ line-height: 1;
226
+ letter-spacing: 0.06em;
227
+ text-transform: uppercase;
228
+ color: var(--color-text-muted);
229
+ font-weight: 700;
230
+ }
231
+
232
+ .brand-subtitle {
233
+ font-size: 12px;
234
+ line-height: 1.45;
235
+ color: var(--color-text-secondary);
236
+ max-width: 22ch;
237
+ }
238
+
239
+ .brand-title {
240
+ font-size: 18px;
241
+ line-height: 1.1;
242
+ font-family: var(--font-family-display);
243
+ color: var(--color-text-primary);
244
+ letter-spacing: -0.02em;
245
+ }
246
+
247
+ .github-badge {
248
+ display: inline-flex;
249
+ align-items: center;
250
+ justify-content: space-between;
251
+ gap: 10px;
252
+ margin-top: 0;
253
+ padding: 8px 10px;
254
+ border-radius: 8px;
255
+ border: 1px solid var(--color-border);
256
+ background: var(--color-surface);
257
+ color: var(--color-text-secondary);
258
+ font-size: var(--font-size-caption);
259
+ text-decoration: none;
260
+ box-shadow: none;
261
+ 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);
262
+ min-width: 0;
263
+ backdrop-filter: none;
264
+ }
265
+
266
+ .github-badge-rail {
267
+ width: calc(100% - 24px);
268
+ margin: 0 12px 12px;
269
+ align-items: center;
270
+ justify-content: flex-start;
271
+ gap: 8px;
272
+ padding: 8px 10px;
273
+ border-radius: 8px;
274
+ background: var(--color-surface);
275
+ border: 1px solid var(--color-border);
276
+ box-shadow: none;
277
+ }
278
+
279
+ .github-badge:hover {
280
+ border-color: var(--color-border-strong);
281
+ background: var(--color-surface-alt);
282
+ color: var(--color-text-primary);
283
+ box-shadow: none;
284
+ }
285
+
286
+ .github-badge:focus-visible {
287
+ outline: 3px solid rgba(199, 116, 98, 0.18);
288
+ outline-offset: 2px;
289
+ border-color: var(--color-brand);
290
+ color: var(--color-text-primary);
291
+ background: var(--color-surface);
292
+ }
293
+
294
+ .github-badge-icon {
295
+ width: 16px;
296
+ height: 16px;
297
+ flex-shrink: 0;
298
+ }
299
+
300
+ .github-badge-left {
301
+ display: inline-flex;
302
+ align-items: center;
303
+ gap: 6px;
304
+ flex-shrink: 0;
305
+ }
306
+
307
+ .github-badge-label {
308
+ font-size: var(--font-size-caption);
309
+ font-weight: var(--font-weight-secondary);
310
+ color: var(--color-text-secondary);
311
+ }
312
+
313
+ .github-badge-text {
314
+ min-width: 0;
315
+ font-family: var(--font-family-mono);
316
+ font-size: var(--font-size-caption);
317
+ color: var(--color-text-tertiary);
318
+ line-height: 1.3;
319
+ display: inline-block;
320
+ overflow: hidden;
321
+ text-overflow: ellipsis;
322
+ white-space: nowrap;
323
+ }
324
+
325
+ .github-badge-text > span {
326
+ white-space: nowrap;
327
+ }
328
+
329
+ .github-owner {
330
+ font-weight: 600;
331
+ color: var(--color-text-secondary);
332
+ }
333
+
334
+ .github-sep {
335
+ margin: 0 2px;
336
+ color: var(--color-text-tertiary);
337
+ }
338
+
339
+ .github-repo {
340
+ font-weight: 600;
341
+ color: var(--color-text-primary);
342
+ }
343
+
344
+ .github-badge-rail .github-badge-text {
345
+ display: flex;
346
+ flex-direction: column;
347
+ align-items: flex-start;
348
+ gap: 2px;
349
+ white-space: normal;
350
+ overflow: visible;
351
+ text-overflow: clip;
352
+ color: var(--color-text-secondary);
353
+ }
354
+
355
+ .github-badge-rail .github-sep {
356
+ display: none;
357
+ }
358
+
359
+ .github-badge-rail .github-owner,
360
+ .github-badge-rail .github-repo {
361
+ font-weight: 600;
362
+ }
363
+
364
+ .github-badge-rail .github-badge-left {
365
+ padding: 4px;
366
+ border-radius: 999px;
367
+ background: var(--color-brand-light);
368
+ }
369
+
370
+ .github-badge-rail .github-badge-label {
371
+ display: none;
372
+ }
373
+
374
+ .github-badge-rail:hover {
375
+ border-color: var(--color-border-strong);
376
+ }