lumencode 0.4.4 → 1.1.0

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.
package/public/style.css CHANGED
@@ -1,1864 +1,992 @@
1
+ /* ── CSS Variables ── */
1
2
  :root {
2
- --primary: #111111;
3
- --primary-active: #242424;
4
- --ink: #111111;
5
- --body: #374151;
6
- --muted: #6b7280;
7
- --muted-soft: #898989;
8
- --hairline: #e5e7eb;
9
- --hairline-soft: #f3f4f6;
10
- --canvas: #ffffff;
11
- --surface-soft: #f8f9fa;
12
- --surface-card: #f5f5f5;
13
- --surface-strong: #e5e7eb;
14
- --surface-dark: #101010;
15
- --on-primary: #ffffff;
16
- --on-dark: #ffffff;
17
- --on-dark-soft: #a1a1aa;
18
- --badge-orange: #fb923c;
19
- --badge-pink: #ec4899;
20
- --badge-violet: #8b5cf6;
21
- --badge-emerald: #34d399;
22
- --brand-accent: #3b82f6;
23
- }
24
-
25
- * { box-sizing: border-box; margin: 0; padding: 0; }
26
-
27
- /* Screen-reader only utility */
28
- .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
29
-
30
- /* Focus-visible for keyboard accessibility */
31
- :focus-visible { outline: 2px solid var(--brand-accent); outline-offset: 2px; }
32
-
33
- /* 全局自定义滚动条 */
34
- * {
35
- scrollbar-width: thin;
36
- scrollbar-color: #c4c4c4 transparent;
37
- }
3
+ --font-body: 'Inter Tight', system-ui, -apple-system, sans-serif;
4
+ --font-mono: 'JetBrains Mono', ui-monospace, monospace;
5
+ --font-size: 15px;
6
+
7
+ /* Light mode — cool linen on graphite ink */
8
+ --background: #e7e5de;
9
+ --foreground: #15151a;
10
+ --card: #f0eee7;
11
+ --card-foreground: #15151a;
12
+ --popover: #f0eee7;
13
+ --popover-foreground: #15151a;
14
+ --primary: #15151a;
15
+ --primary-foreground: #f0eee7;
16
+ --secondary: #d8d6cd;
17
+ --secondary-foreground: #15151a;
18
+ --muted: #d8d6cd;
19
+ --muted-foreground: #6a6a66;
20
+ --accent: #4a52a8;
21
+ --accent-foreground: #f0eee7;
22
+ --destructive: #8e4040;
23
+ --destructive-foreground: #f0eee7;
24
+ --border: rgba(21, 21, 26, 0.12);
25
+ --input: transparent;
26
+ --input-background: #dcdad1;
27
+ --switch-background: #bdbbb1;
28
+ --ring: #4a52a8;
29
+ --radius: 0.625rem;
30
+
31
+ /* Brand / semantic light */
32
+ --rail: #dcdad1;
33
+ --rail-foreground: #15151a;
34
+ --rail-hover: rgba(0, 0, 0, 0.05);
35
+ --rail-active: rgba(0, 0, 0, 0.08);
36
+ --rust: #4a52a8;
37
+ --dest: #8e4040;
38
+ --forest: #3d7558;
39
+ --ochre: #9a7836;
40
+ --clay: #525e6e;
41
+ --claude: #a26049;
42
+ --codex: #347876;
43
+ --opencode: #4a5d8a;
44
+ --ink-4: rgba(21, 21, 26, 0.04);
45
+ --ink-8: rgba(21, 21, 26, 0.08);
46
+ --ink-12: rgba(21, 21, 26, 0.12);
47
+ --ink-18: rgba(21, 21, 26, 0.18);
48
+ --ink-22: rgba(21, 21, 26, 0.22);
49
+ --ink-32: rgba(21, 21, 26, 0.32);
50
+ --ink-46: rgba(21, 21, 26, 0.46);
51
+ --ink-50: rgba(21, 21, 26, 0.50);
52
+ --ink-62: rgba(21, 21, 26, 0.62);
53
+ --ink-82: rgba(21, 21, 26, 0.82);
54
+ --card-lift-inset: rgba(255, 255, 255, 0.55);
55
+ --card-lift-drop-1: rgba(21, 21, 26, 0.04);
56
+ --card-lift-drop-2: rgba(21, 21, 26, 0.06);
57
+ }
58
+
59
+ .dark {
60
+ /* Dark mode — deep graphite canvas + AI signature accents */
61
+ --background: #0e1014;
62
+ --foreground: #e8e9ef;
63
+ --card: #16181f;
64
+ --card-foreground: #e8e9ef;
65
+ --popover: #16181f;
66
+ --popover-foreground: #e8e9ef;
67
+ --primary: #e8e9ef;
68
+ --primary-foreground: #0e1014;
69
+ --secondary: #1f222a;
70
+ --secondary-foreground: #e8e9ef;
71
+ --muted: #1f222a;
72
+ --muted-foreground: #8a8f9e;
73
+ --accent: #7480e8;
74
+ --accent-foreground: #0e1014;
75
+ --destructive: #b75e5e;
76
+ --destructive-foreground: #f0eee7;
77
+ --border: rgba(232, 233, 239, 0.10);
78
+ --input: transparent;
79
+ --input-background: #1a1d24;
80
+ --switch-background: #2a2d36;
81
+ --ring: #7480e8;
82
+
83
+ --rail: #08090c;
84
+ --rail-foreground: #e8e9ef;
85
+ --rail-hover: rgba(255, 255, 255, 0.04);
86
+ --rail-active: rgba(255, 255, 255, 0.06);
87
+ --rust: #7480e8;
88
+ --dest: #b75e5e;
89
+ --forest: #5ec2a8;
90
+ --ochre: #c9a86b;
91
+ --clay: #6a7088;
92
+ --claude: #d68966;
93
+ --codex: #5ec2a8;
94
+ --opencode: #7faedc;
95
+ --ink-4: rgba(232, 233, 239, 0.04);
96
+ --ink-8: rgba(232, 233, 239, 0.08);
97
+ --ink-12: rgba(232, 233, 239, 0.12);
98
+ --ink-18: rgba(232, 233, 239, 0.18);
99
+ --ink-22: rgba(232, 233, 239, 0.22);
100
+ --ink-32: rgba(232, 233, 239, 0.32);
101
+ --ink-46: rgba(232, 233, 239, 0.46);
102
+ --ink-50: rgba(232, 233, 239, 0.50);
103
+ --ink-62: rgba(232, 233, 239, 0.62);
104
+ --ink-82: rgba(232, 233, 239, 0.82);
105
+ --card-lift-inset: rgba(255, 255, 255, 0.05);
106
+ --card-lift-drop-1: rgba(0, 0, 0, 0.4);
107
+ --card-lift-drop-2: rgba(0, 0, 0, 0.5);
108
+ }
109
+
110
+ /* ── Reset & Base ── */
111
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
112
+ html { font-size: var(--font-size); font-family: var(--font-body); -webkit-font-smoothing: antialiased; font-variant-numeric: tabular-nums; }
113
+ body { background: var(--background); color: var(--foreground); line-height: 1.5; min-height: 100vh; }
114
+ button { font-family: inherit; cursor: pointer; border: none; background: none; color: inherit; }
115
+ input, textarea { font-family: inherit; color: inherit; }
116
+
117
+ /* Scrollbar */
118
+ * { scrollbar-width: thin; scrollbar-color: var(--ink-32) transparent; }
38
119
  ::-webkit-scrollbar { width: 5px; height: 5px; }
39
120
  ::-webkit-scrollbar-track { background: transparent; }
40
- ::-webkit-scrollbar-thumb {
41
- background: #c4c4c4;
42
- border-radius: 9999px;
43
- }
44
- ::-webkit-scrollbar-thumb:hover { background: #999; }
45
- ::-webkit-scrollbar-corner { background: transparent; }
46
-
47
- [data-theme="dark"] * {
48
- scrollbar-color: #4b5563 transparent;
49
- }
50
- [data-theme="dark"] ::-webkit-scrollbar-thumb {
51
- background: #4b5563;
52
- }
53
- [data-theme="dark"] ::-webkit-scrollbar-thumb:hover {
54
- background: #6b7280;
55
- }
56
-
57
- html { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-size: 16px; }
58
-
59
- body {
60
- background: var(--canvas);
61
- color: var(--ink);
62
- line-height: 1.5;
121
+ ::-webkit-scrollbar-thumb { background: var(--ink-32); border-radius: 9999px; }
122
+ ::-webkit-scrollbar-thumb:hover { background: var(--ink-46); }
123
+
124
+ /* ── Layout ── */
125
+ #app { min-height: 100vh; background: var(--background); color: var(--foreground); }
126
+ .app-grid { display: grid; grid-template-columns: 260px 1fr; }
127
+ .app-grid.rail-collapsed { grid-template-columns: 56px 1fr; }
128
+
129
+ /* ── Rail ── */
130
+ .rail {
131
+ background: var(--rail);
132
+ color: var(--rail-foreground);
63
133
  min-height: 100vh;
134
+ min-width: 0;
64
135
  display: flex;
65
136
  flex-direction: column;
66
- }
67
-
68
- .app-layout {
69
- display: flex;
70
- flex: 1;
71
- min-height: 0;
72
- }
73
-
74
- /* Top Nav */
75
- .top-nav {
76
- background: var(--canvas);
77
- border-bottom: 1px solid var(--hairline);
78
- height: 56px;
79
137
  position: sticky;
80
138
  top: 0;
81
- z-index: 100;
82
- }
83
-
84
- .nav-inner {
85
- max-width: 1560px;
86
- margin: 0 auto;
87
- height: 100%;
88
- display: flex;
89
- align-items: center;
90
- justify-content: space-between;
91
- padding: 0 32px;
139
+ height: 100vh;
140
+ overflow-y: auto;
141
+ overflow-x: hidden;
92
142
  }
93
-
94
- .logo {
95
- font-size: 16px;
96
- font-weight: 600;
97
- letter-spacing: -0.3px;
98
- color: var(--ink);
143
+ .rail-header {
144
+ padding: 24px 24px 20px;
145
+ border-bottom: 1px solid var(--ink-12);
99
146
  }
100
-
101
- .nav-controls {
147
+ .rail-brand-row {
102
148
  display: flex;
103
149
  align-items: center;
104
- gap: 12px;
105
- }
106
-
107
- .nav-pill-group {
108
- background: var(--surface-soft);
109
- border-radius: 9999px;
110
- padding: 4px;
111
- display: flex;
112
- gap: 2px;
113
- }
114
-
115
- .category-tab {
116
- background: transparent;
117
- border: none;
118
- color: var(--muted);
119
- font-family: inherit;
120
- font-size: 13px;
121
- font-weight: 500;
122
- padding: 6px 12px;
123
- border-radius: 6px;
124
- cursor: pointer;
125
- transition: all 0.15s;
150
+ gap: 8px;
151
+ margin-bottom: 4px;
126
152
  }
127
-
128
- .category-tab:hover { color: var(--ink); }
129
-
130
- .category-tab.active {
131
- background: var(--canvas);
132
- color: var(--ink);
133
- box-shadow: 0 1px 2px rgba(0,0,0,0.05);
153
+ .rail-dot { width: 8px; height: 8px; background: linear-gradient(135deg, #7480e8, #5ec2dc, #5ec2a8); border-radius: 1px; }
154
+ .rail-version {
155
+ font-family: var(--font-mono);
156
+ font-size: 10px;
157
+ letter-spacing: 0.22em;
158
+ text-transform: uppercase;
159
+ opacity: 0.55;
160
+ flex: 1;
134
161
  }
135
-
136
- /* Work report control bar */
137
- .work-report-actions {
138
- display: flex;
162
+ .rail-actions { display: flex; gap: 4px; }
163
+ .rail-btn-icon {
164
+ padding: 4px;
165
+ border-radius: 4px;
166
+ color: var(--rail-foreground);
167
+ opacity: 0.55;
168
+ transition: opacity 0.15s, background 0.15s;
169
+ display: inline-flex;
139
170
  align-items: center;
140
- gap: 12px;
141
- flex-wrap: wrap;
142
- }
143
-
144
- /* Level tabs (详报/简报) — 主切换,带底部指示条 */
145
- .level-tab-group {
146
- display: flex;
147
- gap: 0;
148
- border-bottom: 1px solid var(--hairline);
149
- padding: 0 2px;
150
- }
151
-
152
- .level-tab {
153
- background: transparent;
154
- border: none;
155
- border-bottom: 2px solid transparent;
156
- color: var(--muted);
157
- font-family: inherit;
158
- font-size: 13px;
159
- font-weight: 500;
160
- padding: 6px 14px;
161
- margin-bottom: -1px;
162
- cursor: pointer;
163
- transition: all 0.15s;
164
- border-radius: 0;
165
- }
166
-
167
- .level-tab:hover { color: var(--body); }
168
-
169
- .level-tab.active {
170
- color: var(--ink);
171
- border-bottom-color: var(--ink);
171
+ justify-content: center;
172
172
  }
173
-
174
- /* Platform tabs (标准/飞书/钉钉) — 次要选择,小标签 */
175
- .platform-pill-group {
176
- background: var(--surface-soft);
177
- border-radius: 9999px;
178
- padding: 3px;
173
+ .rail-btn-icon:hover { opacity: 1; background: var(--rail-active); }
174
+ .rail-gh-link {
179
175
  display: flex;
180
- gap: 1px;
181
- }
182
-
183
- .platform-tab {
184
- background: transparent;
185
- border: none;
186
- color: var(--muted);
187
- font-family: inherit;
188
- font-size: 11px;
176
+ align-items: center;
177
+ margin-left: auto;
178
+ padding-top: 6px;
179
+ opacity: 0.35;
180
+ color: var(--rail-foreground);
181
+ transition: opacity 0.2s;
182
+ }
183
+ .rail-gh-link:hover { opacity: 0.8; }
184
+ .dark .rail-gh-link { opacity: 0.55; }
185
+ .rail-title {
186
+ font-size: 20px;
189
187
  font-weight: 500;
190
- padding: 3px 10px;
191
- border-radius: 9999px;
192
- cursor: pointer;
193
- transition: all 0.15s;
194
- }
195
-
196
- .platform-tab:hover { color: var(--body); }
197
-
198
- .platform-tab.active {
199
- background: var(--canvas);
200
- color: var(--ink);
201
- box-shadow: 0 1px 2px rgba(0,0,0,0.06);
202
- }
203
-
204
- /* 按钮组之间的分隔线 */
205
- .action-divider {
206
- width: 1px;
207
- height: 20px;
208
- background: var(--hairline);
209
- flex-shrink: 0;
210
- }
211
-
212
- .text-input {
213
- background: var(--canvas);
214
- border: 1px solid var(--hairline);
215
- border-radius: 6px;
216
- color: var(--ink);
217
- font-family: inherit;
218
- font-size: 13px;
219
- padding: 6px 10px;
220
- height: 32px;
221
- outline: none;
222
- }
223
-
224
- .text-input:focus { border-color: var(--ink); }
225
-
226
- /* Container */
227
- .container {
228
- max-width: 1560px;
229
- margin: 0 auto;
230
- padding: 0 32px;
231
- flex: 1;
232
- width: 100%;
233
- }
234
-
235
- /* Hero — compact */
236
- .hero-band {
237
- padding: 20px 0 12px;
238
- }
239
-
240
- .display-lg {
241
- font-size: 22px;
242
- font-weight: 600;
243
188
  line-height: 1.2;
244
- letter-spacing: -0.3px;
245
- color: var(--ink);
246
- }
247
-
248
- .body-md {
249
- font-size: 13px;
250
- font-weight: 400;
251
- line-height: 1.4;
252
- margin-top: 2px;
253
- }
254
-
255
- .muted { color: var(--muted); }
256
-
257
- /* Stats Grid — fixed 5-col */
258
- .stats-grid {
259
- display: grid;
260
- grid-template-columns: repeat(5, 1fr);
261
- gap: 10px;
262
- margin-bottom: 12px;
263
- }
264
-
265
- .feature-card {
266
- background: var(--surface-card);
267
- border-radius: 10px;
268
- padding: 14px 16px;
269
- transition: box-shadow 0.2s ease, transform 0.2s ease;
270
- }
271
-
272
- .feature-card:hover {
273
- box-shadow: 0 4px 12px rgba(0,0,0,0.06);
274
- transform: translateY(-1px);
189
+ margin-top: 12px;
190
+ letter-spacing: -0.02em;
275
191
  }
276
-
277
- .card-label {
192
+ .rail-title span:last-child { opacity: 0.55; }
193
+ .rail-subtitle {
278
194
  font-size: 12px;
279
- font-weight: 500;
280
- color: var(--muted);
281
- margin-bottom: 4px;
282
- }
283
-
284
- .card-value {
285
- font-size: 24px;
286
- font-weight: 600;
287
- letter-spacing: -0.5px;
288
- color: var(--ink);
289
- }
290
-
291
- .card-sub {
292
- font-size: 11px;
293
- color: var(--muted);
195
+ opacity: 0.55;
294
196
  margin-top: 4px;
295
- line-height: 1.4;
296
197
  }
297
198
 
298
- .card-sub span {
299
- display: inline-block;
300
- margin-right: 8px;
199
+ .rail-nav { padding: 12px 16px; flex: 1; }
200
+ .rail-nav-label {
201
+ font-family: var(--font-mono);
202
+ font-size: 10px;
203
+ text-transform: uppercase;
204
+ letter-spacing: 0.18em;
205
+ opacity: 0.45;
206
+ padding: 0 8px;
207
+ margin-bottom: 12px;
208
+ display: block;
301
209
  }
302
-
303
- /* Section header */
304
- .section-header {
210
+ .rail-nav-list { list-style: none; display: flex; flex-direction: column; gap: 2px; }
211
+ .rail-nav-item {
212
+ width: 100%;
213
+ text-align: left;
214
+ padding: 10px 10px;
215
+ border-radius: 6px;
216
+ border-left: 2px solid transparent;
217
+ transition: background 0.15s;
305
218
  display: flex;
306
219
  align-items: center;
307
- justify-content: space-between;
308
- margin-bottom: 10px;
309
- }
310
-
311
- .section-header .title-md {
312
- font-size: 14px;
313
- margin-bottom: 0;
220
+ gap: 10px;
221
+ color: var(--rail-foreground);
314
222
  }
315
-
316
- /* Charts Dashboard — side-by-side layout */
317
- .charts-dashboard {
223
+ .rail-nav-item:hover { background: var(--rail-hover); }
224
+ .rail-nav-item.active { background: var(--rail-active); }
225
+ .rail-nav-item .source-mark { flex-shrink: 0; }
226
+ .rail-nav-meta { flex: 1; min-width: 0; }
227
+ .rail-nav-meta-top, .rail-nav-meta-bottom {
318
228
  display: flex;
319
- gap: 14px;
320
- margin-bottom: 20px;
321
- align-items: stretch;
229
+ align-items: baseline;
230
+ justify-content: space-between;
231
+ gap: 8px;
322
232
  }
323
-
324
- .charts-dashboard .charts-section {
325
- flex: 3;
326
- margin-bottom: 0;
233
+ .rail-nav-name { font-size: 13px; }
234
+ .rail-nav-tokens {
235
+ font-family: var(--font-mono);
236
+ font-size: 10px;
237
+ opacity: 0.55;
238
+ white-space: nowrap;
327
239
  }
328
-
329
- .charts-dashboard .trend-section {
330
- flex: 2;
331
- margin-bottom: 0;
240
+ .rail-nav-sub {
241
+ font-family: var(--font-mono);
242
+ font-size: 9px;
243
+ letter-spacing: 0.2em;
244
+ text-transform: uppercase;
245
+ opacity: 0.4;
246
+ }
247
+ .rail-nav-sessions {
248
+ font-family: var(--font-mono);
249
+ font-size: 10px;
250
+ opacity: 0.4;
251
+ white-space: nowrap;
332
252
  }
333
253
 
334
- .trend-card {
335
- height: 100%;
254
+ .rail-footer {
255
+ padding: 16px 24px;
256
+ border-top: 1px solid var(--ink-12);
336
257
  display: flex;
337
258
  flex-direction: column;
259
+ gap: 6px;
338
260
  }
339
-
340
- .chart-wrap-tall {
341
- flex: 1;
342
- min-height: 300px;
343
- position: relative;
344
- }
345
-
346
- /* Charts */
347
- .charts-section { margin-bottom: 20px; }
348
-
349
- .chart-row {
350
- display: grid;
351
- grid-template-columns: 1fr 1fr;
352
- gap: 10px;
353
- margin-bottom: 10px;
261
+ .rail-footer-row {
262
+ display: flex;
263
+ align-items: center;
264
+ justify-content: space-between;
354
265
  }
355
-
356
- .chart-card {
357
- background: var(--surface-card);
358
- border-radius: 10px;
359
- padding: 14px;
360
- transition: box-shadow 0.2s ease, transform 0.2s ease;
266
+ .rail-footer-label {
267
+ font-family: var(--font-mono);
268
+ font-size: 10px;
269
+ text-transform: uppercase;
270
+ letter-spacing: 0.18em;
271
+ opacity: 0.45;
361
272
  }
362
-
363
- .chart-card:hover {
364
- box-shadow: 0 4px 12px rgba(0,0,0,0.06);
365
- transform: translateY(-1px);
273
+ .rail-footer-value {
274
+ font-family: var(--font-mono);
275
+ font-size: 10px;
276
+ opacity: 0.75;
366
277
  }
367
-
368
- .title-md {
369
- font-size: 13px;
370
- font-weight: 600;
371
- line-height: 1.4;
372
- margin-bottom: 10px;
373
- color: var(--ink);
278
+ .rail-status-dot {
279
+ width: 6px;
280
+ height: 6px;
281
+ border-radius: 50%;
282
+ background: var(--forest);
283
+ box-shadow: 0 0 8px var(--forest);
284
+ animation: breath 2.4s ease-in-out infinite;
285
+ }
286
+
287
+ /* Collapsed rail */
288
+ .rail.collapsed { align-items: center; padding-top: 16px; }
289
+ .rail.collapsed .rail-header,
290
+ .rail.collapsed .rail-nav-label,
291
+ .rail.collapsed .rail-nav-meta,
292
+ .rail.collapsed .rail-footer { display: none; }
293
+ .rail.collapsed .rail-nav-list { align-items: center; }
294
+ .rail.collapsed .rail-nav-item {
295
+ width: 36px;
296
+ height: 36px;
297
+ padding: 0;
298
+ justify-content: center;
299
+ border-left: none;
374
300
  }
375
-
376
- .chart-wrap {
301
+ .rail.collapsed .rail-nav-item.active {
377
302
  position: relative;
378
- height: 210px;
379
- }
380
-
381
- /* Git Section — compact */
382
- .git-section { margin-bottom: 12px; }
383
-
384
- .cta-band-light {
385
- background: var(--surface-card);
386
- border-radius: 10px;
387
- padding: 14px 20px;
388
303
  }
389
-
390
- .title-lg {
391
- font-size: 14px;
392
- font-weight: 600;
393
- line-height: 1.3;
394
- letter-spacing: -0.3px;
395
- margin-bottom: 10px;
304
+ .rail.collapsed .rail-nav-item.active::before {
305
+ content: '';
306
+ position: absolute;
307
+ left: 0;
308
+ top: 6px;
309
+ bottom: 6px;
310
+ width: 2px;
311
+ border-radius: 0 2px 2px 0;
312
+ background: var(--rust);
396
313
  }
314
+ .rail.collapsed .rail-toggle { display: flex; }
397
315
 
398
- .git-stats {
399
- display: grid;
400
- grid-template-columns: repeat(4, 1fr);
401
- gap: 16px;
402
- }
316
+ /* ── Main ── */
317
+ .main-content { min-height: 100vh; min-width: 0; overflow-x: hidden; }
403
318
 
404
- .git-stat-item {
405
- text-align: center;
406
- }
319
+ /* ── Primitives ── */
320
+ .font-mono { font-family: var(--font-mono); }
407
321
 
408
- .git-stat-value {
409
- font-size: 20px;
410
- font-weight: 600;
411
- letter-spacing: -0.5px;
412
- color: var(--ink);
322
+ .label {
323
+ font-family: var(--font-mono);
324
+ font-size: 10px;
325
+ text-transform: uppercase;
326
+ letter-spacing: 0.18em;
327
+ opacity: 0.55;
328
+ display: inline-block;
413
329
  }
414
330
 
415
- .git-stat-label {
416
- font-size: 12px;
417
- color: var(--muted);
418
- margin-top: 2px;
331
+ .delta {
332
+ font-family: var(--font-mono);
333
+ font-size: 11px;
334
+ display: inline-flex;
335
+ align-items: center;
336
+ gap: 4px;
419
337
  }
338
+ .delta.up { color: var(--forest); }
339
+ .delta.down { color: var(--dest); }
340
+ .delta.flat { color: var(--clay); }
420
341
 
421
- /* Git AI cards — compact metrics */
422
- .git-ai-stats {
423
- margin-top: 12px;
342
+ .section-head {
424
343
  display: flex;
425
- flex-direction: column;
426
- gap: 10px;
344
+ align-items: baseline;
345
+ gap: 16px;
346
+ margin-bottom: 16px;
427
347
  }
428
- .git-ai-stats:empty {
429
- display: none;
348
+ .section-head-num { opacity: 0.45; }
349
+ .section-head-title { font-size: 15px; font-weight: 500; letter-spacing: -0.01em; }
350
+ .section-head-en { opacity: 0.55; }
351
+ .section-head-line {
352
+ flex: 1;
353
+ height: 1px;
354
+ background: var(--foreground);
355
+ opacity: 0.10;
430
356
  }
357
+ .section-head-meta { margin-left: auto; }
431
358
 
432
- /* AI Summary Card — hero band */
433
- .ai-summary-card {
434
- background: var(--surface-card);
435
- border-radius: 12px;
436
- padding: 16px 20px;
437
- display: flex;
359
+ /* ── Buttons ── */
360
+ .btn {
361
+ display: inline-flex;
438
362
  align-items: center;
439
- justify-content: space-between;
440
- gap: 24px;
441
- border: none;
442
- position: relative;
443
- overflow: hidden;
444
- }
445
- .ai-summary-card::before {
446
- content: '';
447
- position: absolute;
448
- top: 0;
449
- left: 0;
450
- right: 0;
451
- height: 2px;
452
- background: var(--ink);
453
- }
454
- .ai-summary-left {
455
- display: flex;
456
- align-items: baseline;
457
- gap: 10px;
458
- }
459
- .ai-summary-pct {
460
- font-size: 32px;
461
- font-weight: 600;
462
- letter-spacing: -1px;
463
- color: var(--ink);
464
- line-height: 1;
465
- }
466
- .ai-summary-desc {
467
- font-size: 13px;
468
- color: var(--muted);
469
- line-height: 1.4;
470
- }
471
- .ai-summary-desc strong {
472
- font-weight: 600;
473
- color: var(--ink);
474
- }
475
- .ai-summary-right {
476
- display: flex;
477
- flex-direction: column;
478
- align-items: flex-end;
479
- gap: 6px;
480
- min-width: 180px;
481
- }
482
- .ai-summary-commits {
483
- font-size: 13px;
484
- color: var(--body);
363
+ gap: 8px;
364
+ padding: 8px 16px;
365
+ font-size: 12px;
485
366
  font-weight: 500;
367
+ border-radius: 6px;
368
+ transition: all 0.15s;
369
+ white-space: nowrap;
486
370
  }
487
- .ai-summary-bar {
488
- width: 100%;
489
- height: 6px;
490
- background: var(--surface-strong);
491
- border-radius: 9999px;
492
- overflow: hidden;
493
- }
494
- .ai-summary-bar-fill {
495
- height: 100%;
496
- border-radius: 9999px;
497
- background: var(--ink);
498
- transition: width 0.4s ease;
499
- }
500
-
501
- /* Tool theme colors */
502
- .ai-summary-card.theme-all .ai-summary-pct {
503
- background: linear-gradient(135deg, #d97757, #10a37f, #6366f1);
504
- -webkit-background-clip: text;
505
- -webkit-text-fill-color: transparent;
506
- background-clip: text;
507
- }
508
- .ai-summary-card.theme-all .ai-summary-bar-fill {
509
- background: linear-gradient(90deg, #d97757, #10a37f, #6366f1);
371
+ .btn-primary {
372
+ background: var(--primary);
373
+ color: var(--primary-foreground);
510
374
  }
511
- .ai-summary-card.theme-all::before {
512
- background: linear-gradient(90deg, #d97757, #10a37f, #6366f1);
375
+ .btn-primary:hover { opacity: 0.9; }
376
+ .btn-outline {
377
+ border: 1px solid var(--border);
378
+ color: var(--foreground);
513
379
  }
514
-
515
- .ai-summary-card.theme-claude .ai-summary-pct { color: #d97757; }
516
- .ai-summary-card.theme-claude .ai-summary-bar-fill { background: #d97757; }
517
- .ai-summary-card.theme-claude::before { background: #d97757; }
518
-
519
- .ai-summary-card.theme-codex .ai-summary-pct { color: #10a37f; }
520
- .ai-summary-card.theme-codex .ai-summary-bar-fill { background: #10a37f; }
521
- .ai-summary-card.theme-codex::before { background: #10a37f; }
522
-
523
- .ai-summary-card.theme-opencode .ai-summary-pct { color: #6366f1; }
524
- .ai-summary-card.theme-opencode .ai-summary-bar-fill { background: #6366f1; }
525
- .ai-summary-card.theme-opencode::before { background: #6366f1; }
526
-
527
- /* Dark mode adjustments for tool colors */
528
- [data-theme="dark"] .ai-summary-card.theme-all .ai-summary-pct {
529
- background: linear-gradient(135deg, #e8956e, #3dd9a8, #8b80f5);
530
- -webkit-background-clip: text;
531
- -webkit-text-fill-color: transparent;
532
- background-clip: text;
533
- }
534
- [data-theme="dark"] .ai-summary-card.theme-all .ai-summary-bar-fill {
535
- background: linear-gradient(90deg, #e8956e, #3dd9a8, #8b80f5);
536
- }
537
-
538
- /* AI Metrics — compact key-value list */
539
- .ai-metrics-list {
540
- display: grid;
541
- grid-template-columns: 1fr 1fr;
542
- gap: 0;
543
- }
544
- .ai-kv-row {
545
- display: flex;
546
- align-items: baseline;
547
- gap: 6px;
548
- padding: 5px 8px;
549
- border-bottom: 1px solid var(--hairline-soft);
550
- font-size: 12px;
551
- line-height: 1.4;
552
- }
553
- .ai-kv-row:nth-child(odd) {
554
- border-right: 1px solid var(--hairline-soft);
555
- }
556
- .ai-kv-val {
557
- font-weight: 600;
558
- color: var(--ink);
559
- font-variant-numeric: tabular-nums;
560
- white-space: nowrap;
561
- min-width: 48px;
562
- }
563
- .ai-kv-lbl {
564
- color: var(--muted);
565
- }
566
-
567
- /* Dark mode AI summary */
568
- [data-theme="dark"] .ai-summary-card {
569
- border-color: var(--hairline);
570
- }
571
- [data-theme="dark"] .ai-summary-bar-fill {
572
- background: var(--on-primary);
573
- }
574
-
575
- /* Metric tooltip */
576
- .metric-tip {
577
- display: inline-flex;
578
- align-items: center;
579
- justify-content: center;
580
- width: 14px;
581
- height: 14px;
582
- border-radius: 50%;
583
- background: var(--border, #d1d5db);
584
- color: var(--muted, #6b7280);
585
- font-size: 10px;
586
- font-weight: 600;
587
- cursor: help;
588
- margin-left: 3px;
589
- vertical-align: middle;
590
- position: relative;
591
- line-height: 1;
592
- }
593
- .metric-tip:hover::after {
594
- content: attr(data-tip);
595
- position: absolute;
596
- bottom: calc(100% + 6px);
597
- left: 50%;
598
- transform: translateX(-50%);
599
- background: #1f2937;
600
- color: #f9fafb;
601
- font-size: 11px;
602
- font-weight: 400;
380
+ .btn-outline:hover { border-color: var(--foreground); background: var(--ink-8); }
381
+ .btn-ghost {
603
382
  padding: 6px 10px;
604
- border-radius: 6px;
605
- white-space: normal;
606
- width: max-content;
607
- max-width: 240px;
608
- line-height: 1.4;
609
- z-index: 100;
610
- pointer-events: none;
611
- box-shadow: 0 4px 12px rgba(0,0,0,.15);
612
- }
613
-
614
- /* Git skeleton grid */
615
- .git-skeleton-grid {
616
- display: grid;
617
- grid-template-columns: repeat(4, 1fr);
618
- gap: 16px;
619
- padding: 16px 0;
620
- }
621
-
622
- /* Git insights row(提交类型 + 文件热点)*/
623
- .git-insights-row {
624
- margin-top: 12px;
625
- }
626
-
627
- /* 文件热点表格 */
628
- .hotspots-table {
629
- font-size: 12px;
630
- max-height: 280px;
631
- overflow-y: auto;
632
- }
633
- .hotspots-tbl {
634
- width: 100%;
635
- border-collapse: collapse;
636
- }
637
- .hotspots-tbl th,
638
- .hotspots-tbl td {
639
- padding: 6px 8px;
640
- border-bottom: 1px solid var(--border, #f1f5f9);
641
- text-align: left;
642
- }
643
- .hotspots-tbl th {
644
- font-weight: 500;
645
- color: var(--muted);
646
- font-size: 11px;
647
- background: var(--surface-soft, #fafafa);
648
- position: sticky;
649
- top: 0;
650
- }
651
- .hotspots-tbl td.num {
652
- text-align: right;
653
- font-variant-numeric: tabular-nums;
654
- }
655
- .hotspots-tbl td.pos { color: #16a34a; }
656
- .hotspots-tbl td.neg { color: #dc2626; }
657
- .hotspot-path {
658
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
659
- color: var(--ink);
660
- max-width: 280px;
661
- white-space: nowrap;
662
- overflow: hidden;
663
- text-overflow: ellipsis;
664
- }
665
- .hotspot-bar {
666
- background: var(--surface-soft, #f1f5f9);
667
- border-radius: 3px;
668
- height: 6px;
669
- width: 80px;
670
- overflow: hidden;
671
- }
672
- .hotspot-bar-fill {
673
- background: #111111;
674
- height: 100%;
675
- border-radius: 3px;
676
- }
677
- .hotspots-empty {
678
- padding: 24px;
679
- color: var(--muted);
680
- text-align: center;
681
- font-size: 12px;
682
- }
683
-
684
- /* 暗色主题适配 */
685
- [data-theme="dark"] .hotspots-tbl th {
686
- background: var(--surface-dark-soft, #1f2937);
687
- }
688
- [data-theme="dark"] .hotspots-tbl td.pos { color: #4ade80; }
689
- [data-theme="dark"] .hotspots-tbl td.neg { color: #f87171; }
690
- [data-theme="dark"] .hotspot-bar-fill {
691
- background: #e5e7eb;
692
- }
693
-
694
- /* Session drill commits 展开 */
695
- .commit-toggle {
696
- background: none;
697
- border: none;
698
- cursor: pointer;
699
- font-size: 12px;
700
- color: var(--muted);
701
- padding: 0 4px;
702
- }
703
- .commit-toggle:hover { color: var(--ink); }
704
- .commit-subrow > td {
705
- background: var(--surface-soft, #f8fafc);
706
- padding: 0 !important;
707
- }
708
- .commit-subtable {
709
- width: 100%;
710
- border-collapse: collapse;
711
- font-size: 11px;
712
- }
713
- .commit-subtable th,
714
- .commit-subtable td {
715
- padding: 4px 8px;
716
- border-bottom: 1px solid var(--border, #f1f5f9);
717
- }
718
- .commit-subtable th {
719
- color: var(--muted);
720
- font-weight: 500;
721
- background: var(--surface-card);
722
- }
723
- .commit-subtable td.hash code {
724
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
725
- font-size: 11px;
726
- }
727
- .commit-subtable td.num {
728
- text-align: right;
729
- font-variant-numeric: tabular-nums;
730
- }
731
- .commit-subtable td.num.pos { color: #16a34a; }
732
- .commit-subtable td.num.neg { color: #dc2626; }
733
- .commit-subject {
734
- max-width: 360px;
735
- white-space: nowrap;
736
- overflow: hidden;
737
- text-overflow: ellipsis;
738
- }
739
- .commit-type-tag {
740
- display: inline-block;
741
- padding: 1px 8px;
742
- border-radius: 9999px;
743
- font-size: 11px;
744
- font-weight: 500;
745
- background: #f5f5f5;
746
- color: #111111;
747
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
748
- letter-spacing: 0.2px;
749
- }
750
- [data-theme="dark"] .commit-subrow > td {
751
- background: var(--surface-dark-soft, #1f2937);
752
- }
753
- [data-theme="dark"] .commit-subtable td.num.pos { color: #4ade80; }
754
- [data-theme="dark"] .commit-subtable td.num.neg { color: #f87171; }
755
-
756
- /* Footer */
757
- .footer {
758
- background: var(--surface-dark);
759
- color: var(--on-dark-soft);
760
- padding: 32px 24px;
761
- margin-top: auto;
762
- }
763
-
764
- .footer-inner {
765
- max-width: 1560px;
766
- margin: 0 auto;
767
- text-align: center;
768
- }
769
-
770
- .footer p { font-size: 13px; margin-bottom: 4px; }
771
-
772
- .muted-soft { color: var(--muted-soft); }
773
-
774
- .icon-btn {
775
- background: transparent;
776
- border: none;
777
- color: var(--muted);
778
- cursor: pointer;
779
- padding: 6px;
780
- border-radius: 6px;
781
- display: flex;
782
- align-items: center;
783
- justify-content: center;
784
- transition: all 0.15s;
785
- }
786
-
787
- .icon-btn:hover { color: var(--ink); background: var(--hairline-soft); }
788
-
789
- /* Modal */
790
- .modal {
791
- position: fixed;
792
- inset: 0;
793
- z-index: 200;
794
- display: flex;
795
- align-items: center;
796
- justify-content: center;
797
- }
798
-
799
- .modal-backdrop {
800
- position: absolute;
801
- inset: 0;
802
- background: rgba(0,0,0,0.3);
803
- }
804
-
805
- .modal-panel {
806
- position: relative;
807
- background: var(--canvas);
808
- border-radius: 14px;
809
- width: 100%;
810
- max-width: 520px;
811
- max-height: 85vh;
812
- overflow: hidden;
813
- display: flex;
814
- flex-direction: column;
815
- box-shadow: 0 20px 60px rgba(0,0,0,0.15);
816
- }
817
-
818
- .modal-header {
819
- display: flex;
820
- align-items: center;
821
- justify-content: space-between;
822
- padding: 20px 24px 0;
823
- }
824
-
825
- .modal-header .title-md { margin-bottom: 0; }
826
-
827
- .modal-body {
828
- padding: 24px;
829
- overflow-y: auto;
830
- }
831
-
832
- .modal-footer {
833
- padding: 16px 24px 24px;
834
- display: flex;
835
- justify-content: flex-end;
836
- }
837
-
838
- .form-group { margin-bottom: 20px; }
839
- .form-group:last-child { margin-bottom: 0; }
840
-
841
- .form-label {
842
- display: block;
843
- font-size: 13px;
844
- font-weight: 500;
845
- color: var(--ink);
846
- margin-bottom: 6px;
847
- }
848
-
849
- .form-input, .form-textarea {
850
- width: 100%;
851
- font-family: inherit;
852
- resize: vertical;
853
- }
854
-
855
- .form-hint {
856
- font-size: 12px;
857
- color: var(--muted);
858
- margin-top: 4px;
859
- }
860
-
861
- .btn-primary {
862
- background: var(--ink);
863
- color: var(--on-primary);
864
- border: none;
865
- border-radius: 6px;
866
- padding: 8px 16px;
867
- font-family: inherit;
868
- font-size: 13px;
869
- font-weight: 500;
870
- cursor: pointer;
871
- transition: opacity 0.15s;
872
- }
873
-
874
- .btn-primary:hover { opacity: 0.85; }
875
-
876
- .btn-secondary {
877
- background: var(--surface-card);
878
- color: var(--ink);
879
- border: 1px solid var(--hairline);
880
- border-radius: 6px;
881
- padding: 8px 16px;
882
- font-family: inherit;
883
- font-size: 13px;
884
- font-weight: 500;
885
- cursor: pointer;
886
- transition: all 0.15s;
887
- }
888
-
889
- .btn-secondary:hover { background: var(--hairline-soft); }
890
-
891
- .btn-outline {
892
- background: transparent;
893
- color: var(--ink);
894
- border: 1px solid var(--hairline);
895
- border-radius: 6px;
896
- padding: 6px 14px;
897
- font-family: inherit;
898
- font-size: 13px;
899
- font-weight: 500;
900
- cursor: pointer;
901
- transition: all 0.15s;
902
- height: 32px;
903
- }
904
-
905
- .btn-outline:hover { background: var(--hairline-soft); }
906
-
907
- .hero-row {
908
- display: flex;
909
- align-items: center;
910
- justify-content: space-between;
911
- gap: 16px;
912
- }
913
-
914
- /* Work Report */
915
- .work-report-section { margin-bottom: 20px; }
916
-
917
- .work-report-header {
918
- display: flex;
919
- align-items: center;
920
- justify-content: space-between;
921
- margin-bottom: 16px;
922
- }
923
-
924
- .work-report-header .title-md { margin-bottom: 0; }
925
-
926
- /* 平台标识徽章 */
927
- .platform-badge {
928
- display: inline-flex;
929
- align-items: center;
930
- gap: 4px;
931
- font-size: 11px;
932
- font-weight: 500;
933
- padding: 2px 8px;
934
- border-radius: 4px;
935
- margin-right: 4px;
936
- }
937
- .platform-badge.feishu {
938
- background: #e8f1fc;
939
- color: #3370ff;
940
- }
941
- .platform-badge.dingtalk {
942
- background: #e6f7ff;
943
- color: #0089ff;
944
- }
945
- .platform-badge.default {
946
- background: var(--surface-soft);
947
- color: var(--muted);
948
- }
949
- [data-theme="dark"] .platform-badge.feishu {
950
- background: #1a2744;
951
- color: #5b8ff9;
952
- }
953
- [data-theme="dark"] .platform-badge.dingtalk {
954
- background: #0d2137;
955
- color: #4da6ff;
956
- }
957
-
958
- /* 简报/详报内容区 —— 使用卡片式分层设计 */
959
- .work-report-content {
960
- background: var(--surface-card);
961
- border-radius: 12px;
962
- padding: 28px 32px;
963
- font-size: 14px;
964
- line-height: 1.75;
965
- overflow-x: auto;
966
- max-height: 70vh;
967
- overflow-y: auto;
968
- color: var(--body);
969
- border: 1px solid var(--hairline);
970
- transition: box-shadow 0.2s ease;
971
- }
972
- .work-report-content:hover {
973
- box-shadow: 0 4px 16px rgba(0,0,0,0.05);
974
- }
975
-
976
- /* Markdown 标题层级 */
977
- .work-report-content .md-h1 {
978
- font-size: 22px;
979
- font-weight: 600;
980
- color: var(--ink);
981
- margin-bottom: 16px;
982
- margin-top: 0;
983
- letter-spacing: -0.3px;
984
- line-height: 1.3;
985
- }
986
-
987
- .work-report-content .md-h2 {
988
- font-size: 15px;
989
- font-weight: 600;
990
- color: var(--ink);
991
- margin-top: 24px;
992
- margin-bottom: 12px;
993
- padding-bottom: 8px;
994
- border-bottom: 1px solid var(--hairline);
995
- display: flex;
996
- align-items: center;
997
- gap: 6px;
998
- }
999
-
1000
- .work-report-content .md-h2::before {
1001
- content: '';
1002
- display: inline-block;
1003
- width: 3px;
1004
- height: 14px;
1005
- background: var(--ink);
1006
- border-radius: 2px;
1007
- flex-shrink: 0;
1008
- }
1009
-
1010
- /* 段落 */
1011
- .work-report-content .md-p {
1012
- margin-bottom: 10px;
1013
- }
1014
-
1015
- /* 列表 —— 自定义标记 */
1016
- .work-report-content .md-ul {
1017
- margin-bottom: 14px;
1018
- padding-left: 0;
1019
- list-style: none;
1020
- }
1021
-
1022
- .work-report-content .md-li {
1023
- margin-bottom: 8px;
1024
- padding-left: 18px;
1025
- position: relative;
1026
- }
1027
-
1028
- .work-report-content .md-li::before {
1029
- content: '';
1030
- position: absolute;
1031
- left: 0;
1032
- top: 10px;
1033
- width: 5px;
1034
- height: 5px;
1035
- border-radius: 50%;
1036
- background: var(--muted-soft);
1037
- }
1038
-
1039
- /* 表格 —— 与热点表格风格一致 */
1040
- .work-report-content .md-table {
1041
- width: 100%;
1042
- border-collapse: collapse;
1043
- margin-bottom: 16px;
1044
- font-size: 13px;
1045
- border-radius: 8px;
1046
- overflow: hidden;
1047
- }
1048
-
1049
- .work-report-content .md-table th,
1050
- .work-report-content .md-table td {
1051
- padding: 10px 14px;
1052
- text-align: left;
1053
- border-bottom: 1px solid var(--hairline-soft);
1054
- }
1055
-
1056
- .work-report-content .md-table th {
1057
- font-weight: 600;
1058
- color: var(--ink);
1059
- background: var(--surface-soft);
1060
- font-size: 12px;
1061
- text-transform: uppercase;
1062
- letter-spacing: 0.3px;
1063
- }
1064
-
1065
- .work-report-content .md-table tr:last-child td {
1066
- border-bottom: none;
1067
- }
1068
-
1069
- .work-report-content .md-table tr:hover td {
1070
- background: var(--surface-soft);
1071
- }
1072
-
1073
- /* 代码片段 */
1074
- .work-report-content code {
1075
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1076
- font-size: 12px;
1077
- background: var(--surface-soft);
1078
- padding: 2px 6px;
1079
- border-radius: 4px;
1080
- color: var(--ink);
1081
- border: 1px solid var(--hairline);
1082
- }
1083
-
1084
- .work-report-content strong {
1085
- font-weight: 600;
1086
- color: var(--ink);
1087
- }
1088
-
1089
- /* 钉钉纯文本模式的分隔线样式 */
1090
- .work-report-content .md-divider {
1091
- display: block;
1092
- color: var(--muted);
1093
- font-size: 13px;
1094
- font-weight: 500;
1095
- margin: 20px 0 12px;
1096
- padding-bottom: 8px;
1097
- border-bottom: 1px solid var(--hairline);
1098
- letter-spacing: 0.5px;
1099
- }
1100
-
1101
- /* 简报模式 —— 更紧凑 */
1102
- .work-report-content.is-brief {
1103
- padding: 24px 28px;
1104
- font-size: 13.5px;
1105
- }
1106
-
1107
- .work-report-content.is-brief .md-h1 {
1108
- font-size: 18px;
1109
- margin-bottom: 12px;
1110
- }
1111
-
1112
- .work-report-content.is-brief .md-h2 {
1113
- font-size: 13px;
1114
- margin-top: 16px;
1115
- margin-bottom: 8px;
1116
- padding-bottom: 6px;
1117
- }
1118
-
1119
- .work-report-content.is-brief .md-h2::before {
1120
- height: 12px;
1121
- }
1122
-
1123
- .work-report-content.is-brief .md-li {
1124
- margin-bottom: 5px;
1125
- }
1126
-
1127
- /* 暗色主题适配 */
1128
- [data-theme="dark"] .work-report-content {
1129
- border-color: var(--hairline);
1130
- }
1131
- [data-theme="dark"] .work-report-content:hover {
1132
- box-shadow: 0 4px 16px rgba(0,0,0,0.25);
1133
- }
1134
- [data-theme="dark"] .work-report-content code {
1135
- background: var(--surface-dark-soft, #1f2937);
1136
- border-color: var(--hairline);
1137
- }
1138
- [data-theme="dark"] .work-report-content .md-table tr:hover td {
1139
- background: var(--surface-dark-soft, #1f2937);
1140
- }
1141
-
1142
- /* Trend chart (standalone fallback) */
1143
- .trend-section { margin-bottom: 20px; }
1144
- .chart-wrap-wide { height: 300px; }
1145
-
1146
- /* Toast */
1147
- .toast {
1148
- position: fixed;
1149
- top: 72px;
1150
- left: 50%;
1151
- transform: translateX(-50%);
1152
- background: var(--surface-dark);
1153
- color: var(--on-dark);
1154
- padding: 10px 20px;
1155
- border-radius: 6px;
1156
- font-size: 13px;
1157
- z-index: 300;
1158
- box-shadow: 0 4px 12px rgba(0,0,0,0.15);
1159
- transition: opacity 0.3s;
1160
- }
1161
-
1162
- /* Skeleton loading */
1163
- .skeleton {
1164
- animation: skeleton-pulse 1.5s ease-in-out infinite;
1165
- background: linear-gradient(90deg, var(--surface-card) 25%, var(--surface-soft) 50%, var(--surface-card) 75%);
1166
- background-size: 200% 100%;
1167
- border-radius: 6px;
1168
- }
1169
-
1170
- @keyframes skeleton-pulse {
1171
- 0% { background-position: 200% 0; }
1172
- 100% { background-position: -200% 0; }
1173
- }
1174
-
1175
- .card-value.skeleton {
1176
- height: 24px;
1177
- width: 72px;
1178
- }
1179
-
1180
- .chart-skeleton {
1181
- position: absolute;
1182
- inset: 0;
1183
- display: flex;
1184
- flex-direction: column;
1185
- justify-content: center;
1186
- padding: 32px;
1187
- z-index: 1;
1188
- background: var(--surface-card);
1189
- overflow: hidden;
1190
- }
1191
-
1192
- .chart-skeleton::before {
1193
- content: '';
1194
- position: absolute;
1195
- top: 0;
1196
- left: -100%;
1197
- width: 200%;
1198
- height: 100%;
1199
- background: linear-gradient(90deg, transparent 25%, var(--surface-soft) 50%, transparent 75%);
1200
- background-size: 200% 100%;
1201
- animation: skeleton-pulse 1.5s ease-in-out infinite;
1202
- }
1203
-
1204
- .chart-skeleton-bar {
1205
- height: 14px;
1206
- border-radius: 4px;
1207
- background: var(--surface-strong);
1208
- margin-bottom: 10px;
1209
- }
1210
-
1211
- .chart-skeleton-bar:nth-child(1) { width: 75%; }
1212
- .chart-skeleton-bar:nth-child(2) { width: 60%; }
1213
- .chart-skeleton-bar:nth-child(3) { width: 45%; }
1214
- .chart-skeleton-bar:nth-child(4) { width: 55%; }
1215
- .chart-skeleton-bar:nth-child(5) { width: 35%; }
1216
-
1217
- /* Welcome page */
1218
- .welcome-page {
1219
- display: flex;
1220
- justify-content: center;
1221
- align-items: flex-start;
1222
- padding: 48px 24px;
1223
- min-height: 70vh;
1224
- }
1225
- .welcome-content {
1226
- max-width: 560px;
1227
- width: 100%;
1228
- }
1229
- .welcome-brand {
1230
- text-align: center;
1231
- margin-bottom: 40px;
1232
- }
1233
- .welcome-title {
1234
- font-size: 28px;
1235
- font-weight: 600;
1236
- color: var(--ink);
1237
- letter-spacing: -0.5px;
1238
- margin-bottom: 8px;
1239
- }
1240
- .welcome-subtitle {
1241
- font-size: 15px;
1242
- color: var(--muted);
1243
- }
1244
-
1245
- .welcome-features {
1246
- display: grid;
1247
- grid-template-columns: repeat(3, 1fr);
1248
- gap: 16px;
1249
- margin-bottom: 40px;
1250
- }
1251
- .feature-item {
1252
- background: var(--surface-card);
1253
- border-radius: 12px;
1254
- padding: 20px 16px;
1255
- text-align: center;
1256
- }
1257
- .feature-icon-svg {
1258
- width: 28px;
1259
- height: 28px;
1260
- color: var(--ink);
1261
- margin-bottom: 10px;
1262
- }
1263
- .feature-text h4 {
1264
- font-size: 13px;
1265
- font-weight: 600;
1266
- color: var(--ink);
1267
- margin-bottom: 4px;
1268
- }
1269
- .feature-text p {
1270
- font-size: 12px;
1271
- color: var(--muted);
1272
- line-height: 1.4;
1273
- }
1274
-
1275
- .welcome-steps {
1276
- display: flex;
1277
- flex-direction: column;
1278
- gap: 16px;
1279
- margin-bottom: 32px;
1280
- }
1281
- .step-card {
1282
- background: var(--canvas);
1283
- border: 1px solid var(--hairline, #e5e7eb);
1284
- border-radius: 12px;
1285
- padding: 20px 24px;
1286
- }
1287
- .step-header {
1288
- display: flex;
1289
- align-items: center;
1290
- gap: 12px;
1291
- margin-bottom: 8px;
1292
- }
1293
- .step-number {
1294
- display: inline-flex;
1295
- align-items: center;
1296
- justify-content: center;
1297
- width: 28px;
1298
- height: 28px;
1299
- border-radius: 50%;
1300
- background: var(--ink);
1301
- color: #fff;
1302
- font-size: 13px;
1303
- font-weight: 600;
1304
- flex-shrink: 0;
1305
- }
1306
- .step-header h3 {
1307
- font-size: 15px;
1308
- font-weight: 600;
1309
- color: var(--ink);
1310
- }
1311
- .step-desc {
1312
- font-size: 13px;
1313
- color: var(--muted);
1314
- margin-bottom: 12px;
1315
- padding-left: 40px;
1316
- }
1317
- .step-desc code {
1318
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1319
- font-size: 12px;
1320
- background: var(--surface-soft, #f8f9fa);
1321
- padding: 2px 6px;
1322
- border-radius: 4px;
1323
- }
1324
- .welcome-input {
1325
- width: 100%;
1326
- margin-left: 40px;
1327
- width: calc(100% - 40px);
1328
- padding: 10px 14px;
1329
- font-size: 14px;
1330
- border: 1px solid var(--hairline, #e5e7eb);
1331
- border-radius: 8px;
1332
- background: var(--canvas);
1333
- color: var(--ink);
1334
- outline: none;
1335
- transition: border-color 0.15s;
1336
- }
1337
- .welcome-input:focus {
1338
- border-color: var(--ink);
1339
- }
1340
- .welcome-input::placeholder {
1341
- color: var(--muted-soft, #898989);
1342
- }
1343
-
1344
- .welcome-actions {
1345
- text-align: center;
1346
- }
1347
- .welcome-start-btn {
1348
- padding: 12px 32px;
1349
- font-size: 15px;
1350
- }
1351
- .welcome-hint {
1352
- font-size: 13px;
1353
- color: var(--muted);
1354
- margin-top: 12px;
1355
- min-height: 20px;
1356
- }
1357
-
1358
- @media (max-width: 640px) {
1359
- .welcome-features {
1360
- grid-template-columns: 1fr;
1361
- }
1362
- .welcome-title {
1363
- font-size: 22px;
1364
- }
1365
- }
1366
-
1367
- /* Card value row for trend arrows */
1368
- .card-value-row {
1369
- display: flex;
1370
- align-items: baseline;
1371
- gap: 6px;
1372
- }
1373
-
1374
- .card-trend {
1375
- font-size: 12px;
1376
- font-weight: 600;
1377
- min-width: 36px;
1378
- }
1379
-
1380
- .card-trend.up { color: #10b981; }
1381
- .card-trend.down { color: #ef4444; }
1382
- .card-trend.flat { color: var(--muted); }
1383
-
1384
- /* ── Dark mode ── */
1385
-
1386
- [data-theme="dark"] {
1387
- --primary: #f5f5f5;
1388
- --primary-active: #e0e0e0;
1389
- --ink: #f5f5f5;
1390
- --body: #d1d5db;
1391
- --muted: #9ca3af;
1392
- --muted-soft: #6b7280;
1393
- --hairline: #374151;
1394
- --hairline-soft: #1f2937;
1395
- --canvas: #101010;
1396
- --surface-soft: #1a1a1a;
1397
- --surface-card: #1a1a1a;
1398
- --surface-strong: #374151;
1399
- --surface-dark: #0a0a0a;
1400
- --on-primary: #111111;
1401
- --on-dark: #ffffff;
1402
- --on-dark-soft: #9ca3af;
1403
- }
1404
-
1405
- [data-theme="dark"] .feature-card:hover,
1406
- [data-theme="dark"] .chart-card:hover {
1407
- box-shadow: 0 4px 12px rgba(0,0,0,0.3);
1408
- }
1409
-
1410
- [data-theme="dark"] .category-tab.active {
1411
- box-shadow: 0 1px 2px rgba(0,0,0,0.3);
1412
- }
1413
-
1414
- [data-theme="dark"] .modal-panel {
1415
- box-shadow: 0 20px 60px rgba(0,0,0,0.5);
1416
- }
1417
-
1418
- [data-theme="dark"] .modal-backdrop {
1419
- background: rgba(0,0,0,0.6);
1420
- }
1421
-
1422
- [data-theme="dark"] .toast {
1423
- background: var(--surface-strong);
1424
- }
1425
-
1426
- [data-theme="dark"] .skeleton {
1427
- background: linear-gradient(90deg, var(--surface-card) 25%, var(--surface-soft) 50%, var(--surface-card) 75%);
1428
- }
1429
-
1430
- /* Responsive */
1431
- @media (max-width: 1280px) {
1432
- .charts-dashboard {
1433
- flex-direction: column;
1434
- }
1435
- .charts-dashboard .charts-section,
1436
- .charts-dashboard .trend-section {
1437
- flex: none;
1438
- }
1439
- .stats-grid { grid-template-columns: repeat(3, 1fr); }
1440
- }
1441
-
1442
- @media (max-width: 1024px) {
1443
- .stats-grid { grid-template-columns: repeat(2, 1fr); }
1444
- .chart-row { grid-template-columns: 1fr; }
1445
- .git-stats { grid-template-columns: repeat(2, 1fr); }
1446
- .ai-metrics-list { grid-template-columns: 1fr; }
1447
- .ai-kv-row:nth-child(odd) { border-right: none; }
1448
- .ai-summary-card { flex-direction: column; gap: 12px; }
1449
- .ai-summary-right { align-items: flex-start; min-width: auto; width: 100%; }
1450
- }
1451
-
1452
- @media (max-width: 768px) {
1453
- .display-lg { font-size: 20px; }
1454
- .stats-grid { grid-template-columns: 1fr; }
1455
- .nav-inner { flex-direction: column; height: auto; padding: 10px 16px; gap: 10px; }
1456
- .top-nav { height: auto; position: relative; }
1457
- .hero-band { padding: 16px 0 10px; }
1458
- .container { padding: 0 16px; }
1459
- .git-stats { grid-template-columns: 1fr; }
1460
- .ai-metrics-list { grid-template-columns: 1fr; }
1461
- .ai-kv-row:nth-child(odd) { border-right: none; }
1462
- .ai-summary-pct { font-size: 24px; }
1463
- .cta-band-light { padding: 14px; }
1464
- .hero-row { flex-direction: column; align-items: flex-start; gap: 10px; }
1465
- }
1466
-
1467
- /* Drill-down table */
1468
- .drill-table {
1469
- width: 100%;
1470
- border-collapse: collapse;
1471
- font-size: 13px;
1472
- }
1473
- .drill-table th,
1474
- .drill-table td {
1475
- padding: 8px 12px;
1476
- text-align: left;
1477
- border-bottom: 1px solid var(--hairline);
1478
- }
1479
- .drill-table th {
1480
- font-weight: 600;
1481
- color: var(--ink);
1482
- background: var(--surface-soft);
1483
- }
1484
- .drill-text {
1485
- max-width: 300px;
1486
- overflow: hidden;
1487
- text-overflow: ellipsis;
1488
- white-space: nowrap;
1489
- color: var(--body);
1490
- }
1491
- .drill-empty {
1492
- text-align: center;
1493
- padding: 32px;
1494
- color: var(--muted);
383
+ color: var(--foreground);
384
+ opacity: 0.65;
1495
385
  }
386
+ .btn-ghost:hover { opacity: 1; }
1496
387
 
1497
- /* Print / PDF */
1498
- @media print {
1499
- .top-nav, .footer, .icon-btn, .btn-outline,
1500
- .btn-primary:not(#openSettingsBtn),
1501
- #settingsModal, #drillModal, #toast, #emptyState,
1502
- .hero-actions { display: none !important; }
1503
- body { background: white; }
1504
- .stats-grid { grid-template-columns: repeat(5, 1fr) !important; }
1505
- .charts-dashboard { flex-direction: column !important; }
1506
- .chart-row { grid-template-columns: 1fr 1fr !important; }
1507
- .feature-card, .chart-card { break-inside: avoid; }
1508
- .container { max-width: 100%; padding: 0; }
1509
- .hero-band { padding: 12px 0; }
388
+ /* ── Card ── */
389
+ .card {
390
+ background: var(--card);
391
+ border: 1px solid var(--border);
392
+ border-radius: var(--radius);
393
+ box-shadow:
394
+ inset 0 1px 0 var(--card-lift-inset),
395
+ 0 1px 0 var(--card-lift-drop-1),
396
+ 0 8px 24px -12px var(--card-lift-drop-2);
1510
397
  }
1511
398
 
1512
- .no-data-hint {
1513
- text-align: center;
1514
- padding: 48px 20px;
1515
- color: var(--muted);
1516
- font-size: 14px;
399
+ /* ── KPI Strip ── */
400
+ .kpi-strip {
401
+ display: grid;
402
+ grid-template-columns: repeat(5, 1fr);
403
+ border: 1px solid var(--border);
404
+ border-radius: var(--radius);
405
+ background: var(--card);
406
+ overflow: hidden;
1517
407
  }
1518
-
1519
- /* ========== 工具侧边栏 ========== */
1520
-
1521
- .tool-sidebar {
1522
- width: 200px;
1523
- min-height: calc(100vh - 56px);
1524
- background: var(--surface-soft);
1525
- border-right: 1px solid var(--hairline);
408
+ .kpi-cell {
409
+ padding: 20px;
1526
410
  display: flex;
1527
411
  flex-direction: column;
1528
- padding: 16px 12px;
1529
- flex-shrink: 0;
1530
- position: sticky;
1531
- top: 56px;
1532
- align-self: flex-start;
412
+ gap: 10px;
1533
413
  }
1534
-
1535
- .tool-sidebar-header {
414
+ .kpi-cell:not(:last-child) { border-right: 1px solid var(--border); }
415
+ .kpi-value {
416
+ font-size: 32px;
417
+ font-weight: 200;
418
+ line-height: 1;
419
+ letter-spacing: -0.02em;
420
+ }
421
+ .kpi-unit {
422
+ font-family: var(--font-mono);
423
+ font-size: 11px;
424
+ opacity: 0.55;
425
+ }
426
+ .kpi-bottom {
1536
427
  display: flex;
1537
428
  align-items: center;
1538
429
  justify-content: space-between;
1539
- padding: 0 8px 12px;
1540
- margin-bottom: 8px;
1541
- border-bottom: 1px solid var(--hairline);
430
+ margin-top: auto;
1542
431
  }
432
+ .kpi-label { font-size: 11px; opacity: 0.65; }
1543
433
 
1544
- .tool-sidebar-title {
434
+ /* ── Period Switcher ── */
435
+ .period-switcher {
436
+ display: inline-flex;
437
+ align-items: stretch;
438
+ border: 1px solid var(--border);
439
+ border-radius: 6px;
440
+ overflow: hidden;
441
+ }
442
+ .period-btn {
443
+ padding: 8px 12px;
1545
444
  font-size: 12px;
1546
- font-weight: 600;
1547
- letter-spacing: 0.05em;
1548
- text-transform: uppercase;
1549
- color: var(--muted);
445
+ transition: background 0.15s, color 0.15s;
446
+ border-left: 1px solid var(--border);
447
+ display: inline-flex;
448
+ align-items: center;
449
+ gap: 6px;
450
+ }
451
+ .period-btn:first-child { border-left: none; }
452
+ .period-btn:hover { background: var(--ink-8); }
453
+ .period-btn.active {
454
+ background: var(--foreground);
455
+ color: var(--background);
1550
456
  }
457
+ .period-btn .en {
458
+ font-family: var(--font-mono);
459
+ font-size: 9px;
460
+ letter-spacing: 0.18em;
461
+ opacity: 0.45;
462
+ }
463
+ .period-btn.active .en { opacity: 0.6; }
1551
464
 
1552
- .tool-sidebar-toggle {
1553
- display: flex;
465
+ .period-nav {
466
+ display: inline-flex;
1554
467
  align-items: center;
1555
- justify-content: center;
1556
- width: 24px;
1557
- height: 24px;
1558
- border: none;
1559
- border-radius: 6px;
1560
- background: transparent;
1561
- color: var(--muted);
1562
- cursor: pointer;
1563
- transition: all 0.15s;
1564
- padding: 0;
468
+ gap: 4px;
469
+ border-left: 1px solid var(--border);
470
+ padding: 0 8px;
1565
471
  }
1566
-
1567
- .tool-sidebar-toggle:hover {
1568
- background: var(--hairline-soft);
1569
- color: var(--ink);
472
+ .period-nav button {
473
+ padding: 4px;
474
+ border-radius: 4px;
475
+ opacity: 0.65;
1570
476
  }
1571
-
1572
- .tool-sidebar.collapsed {
1573
- width: 56px;
1574
- padding: 16px 8px;
477
+ .period-nav button:hover { opacity: 1; background: var(--foreground); background-opacity: 0.05; }
478
+ .period-date {
479
+ font-family: var(--font-mono);
480
+ font-size: 11px;
481
+ min-width: 140px;
482
+ text-align: center;
1575
483
  }
1576
484
 
1577
- .tool-sidebar.collapsed .tool-sidebar-header {
1578
- justify-content: center;
1579
- padding: 0 0 12px;
485
+ .custom-range-picker {
486
+ display: inline-flex;
487
+ align-items: center;
488
+ gap: 8px;
489
+ border-left: 1px solid var(--border);
490
+ padding: 0 12px;
1580
491
  }
1581
-
1582
- .tool-sidebar.collapsed .tool-nav-item,
1583
- .tool-sidebar.collapsed .tool-nav-add {
1584
- justify-content: center;
1585
- padding: 8px;
492
+ .custom-date-input {
493
+ font-family: var(--font-mono);
494
+ font-size: 11px;
495
+ padding: 4px 8px;
496
+ border: 1px solid var(--border);
497
+ border-radius: 4px;
498
+ background: var(--card);
499
+ color: var(--foreground);
500
+ outline: none;
501
+ width: 130px;
1586
502
  }
1587
-
1588
- .tool-sidebar.collapsed .tool-nav-add {
1589
- border: none;
503
+ .custom-date-input:focus {
504
+ border-color: var(--accent);
1590
505
  }
1591
506
 
1592
- .tool-nav {
507
+ .proj-list {
508
+ margin-top: 10px;
509
+ max-height: 210px;
510
+ overflow-y: auto;
1593
511
  display: flex;
1594
512
  flex-direction: column;
1595
- gap: 2px;
1596
- flex: 1;
513
+ gap: 1px;
514
+ border: 1px solid var(--border);
515
+ border-radius: 6px;
516
+ overflow: hidden;
1597
517
  }
518
+ .proj-list::-webkit-scrollbar { width: 3px; }
519
+ .proj-list::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
1598
520
 
1599
- .tool-nav-item {
521
+ .proj-item {
1600
522
  display: flex;
1601
523
  align-items: center;
1602
- gap: 10px;
524
+ gap: 8px;
525
+ width: 100%;
1603
526
  padding: 8px 12px;
1604
- border-radius: 8px;
1605
527
  border: none;
1606
528
  background: transparent;
1607
- color: var(--body);
1608
- font-size: 14px;
1609
- font-weight: 500;
529
+ color: var(--foreground);
1610
530
  cursor: pointer;
1611
- transition: all 0.15s;
1612
- font-family: inherit;
531
+ font-size: 12px;
532
+ font-family: var(--font-mono);
1613
533
  text-align: left;
1614
- width: 100%;
534
+ opacity: 0.55;
535
+ transition: all 0.12s;
536
+ white-space: nowrap;
537
+ overflow: hidden;
538
+ text-overflow: ellipsis;
1615
539
  }
1616
-
1617
- .tool-nav-item:hover {
1618
- background: var(--hairline-soft);
1619
- color: var(--ink);
540
+ .proj-item:hover { opacity: 0.8; background: var(--ink-8); }
541
+ .proj-item.active {
542
+ opacity: 1;
543
+ background: var(--ink-8);
544
+ font-weight: 500;
1620
545
  }
1621
-
1622
- .tool-nav-item.active {
1623
- background: var(--canvas);
1624
- color: var(--ink);
1625
- box-shadow: 0 1px 2px rgba(0,0,0,0.05);
546
+ .proj-item.active::before {
547
+ content: '';
548
+ width: 3px;
549
+ height: 12px;
550
+ border-radius: 2px;
551
+ background: var(--rust);
552
+ flex-shrink: 0;
1626
553
  }
1627
554
 
1628
- .tool-nav-item.disabled {
1629
- opacity: 0.4;
1630
- cursor: not-allowed;
555
+ /* ── AI Contribution Hero ── */
556
+ .ai-hero-grid {
557
+ display: grid;
558
+ grid-template-columns: 7fr 5fr;
559
+ gap: 1px;
560
+ background: var(--border);
561
+ border: 1px solid var(--border);
562
+ border-radius: var(--radius);
563
+ overflow: hidden;
1631
564
  }
1632
-
1633
- .tool-dot {
1634
- width: 8px;
1635
- height: 8px;
1636
- border-radius: 50%;
1637
- flex-shrink: 0;
1638
- background: var(--muted-soft);
565
+ .ai-hero-cell {
566
+ background: var(--card);
567
+ padding: 24px;
1639
568
  }
1640
-
1641
- .tool-dot-claude { background: #d97757; }
1642
- .tool-dot-codex { background: #10a37f; }
1643
- .tool-dot-opencode { background: #6366f1; }
1644
- .tool-dot-all {
1645
- background: conic-gradient(#d97757 0deg 120deg, #10a37f 120deg 240deg, #6366f1 240deg 360deg);
569
+ .ai-hero-pct {
570
+ font-size: 96px;
571
+ font-weight: 200;
572
+ line-height: 0.85;
573
+ letter-spacing: -0.04em;
1646
574
  }
575
+ .ai-hero-desc { font-size: 12px; opacity: 0.55; margin-top: 8px; }
1647
576
 
1648
- .tool-nav-text {
577
+ .attribution-bar {
1649
578
  display: flex;
1650
- flex-direction: column;
1651
- min-width: 0;
1652
- }
1653
- .tool-nav-label {
1654
- white-space: nowrap;
579
+ height: 10px;
1655
580
  overflow: hidden;
1656
- text-overflow: ellipsis;
1657
- }
1658
- .tool-nav-version {
1659
- font-size: 10px;
1660
- color: var(--muted-soft);
1661
- font-weight: 400;
1662
- line-height: 1.2;
1663
581
  }
582
+ .attribution-bar > div { transform-origin: left; animation: bar-fill 1.1s cubic-bezier(0.22, 1, 0.36, 1) both; }
1664
583
 
1665
- .tool-sidebar-footer {
1666
- margin-top: auto;
1667
- padding-top: 12px;
1668
- border-top: 1px solid var(--hairline);
584
+ .source-bar {
585
+ display: flex;
586
+ height: 10px;
1669
587
  }
1670
588
 
1671
- .tool-nav-add {
589
+ /* ── Compact data strip ── */
590
+ .data-strip {
591
+ border: 1px solid var(--border);
592
+ border-top: none;
593
+ background: var(--card);
594
+ }
595
+ .data-strip-row {
596
+ display: grid;
597
+ border-bottom: 1px solid var(--border);
598
+ }
599
+ .data-strip-row:last-child { border-bottom: none; }
600
+ .data-strip-label {
601
+ padding: 10px 20px;
1672
602
  display: flex;
1673
603
  align-items: center;
1674
- gap: 10px;
1675
- padding: 8px 12px;
1676
- border-radius: 8px;
1677
- border: 1px dashed var(--hairline);
1678
- background: transparent;
1679
- color: var(--muted);
1680
- font-size: 14px;
1681
- font-weight: 500;
1682
- cursor: pointer;
1683
- transition: all 0.15s;
1684
- font-family: inherit;
1685
- text-align: left;
1686
- width: 100%;
604
+ border-right: 1px solid var(--border);
605
+ min-width: 140px;
1687
606
  }
1688
-
1689
- .tool-nav-add:hover {
1690
- border-color: var(--ink);
1691
- color: var(--ink);
1692
- background: var(--hairline-soft);
607
+ .data-strip-cell {
608
+ padding: 10px 16px;
609
+ display: flex;
610
+ align-items: baseline;
611
+ justify-content: space-between;
612
+ gap: 12px;
613
+ }
614
+ .data-strip-cell:not(:last-child) { border-right: 1px solid var(--border); }
615
+ .data-strip-en {
616
+ font-family: var(--font-mono);
617
+ font-size: 9px;
618
+ letter-spacing: 0.18em;
619
+ text-transform: uppercase;
620
+ opacity: 0.5;
621
+ }
622
+ .data-strip-cn { font-size: 11px; opacity: 0.65; margin-top: 2px; }
623
+ .data-strip-value {
624
+ font-size: 20px;
625
+ font-weight: 200;
626
+ line-height: 1;
627
+ letter-spacing: -0.02em;
628
+ white-space: nowrap;
1693
629
  }
1694
630
 
1695
- /* 品牌色标识 */
1696
- .tool-badge-claude { border-left: 3px solid #d97757; }
1697
- .tool-badge-codex { border-left: 3px solid #10a37f; }
1698
- .tool-badge-opencode { border-left: 3px solid #6366f1; }
1699
-
1700
- /* ========== 汇总视图 ========== */
631
+ /* ── Edit types bars ── */
632
+ .bar-item { margin-bottom: 14px; }
633
+ .bar-item:last-child { margin-bottom: 0; }
634
+ .bar-top {
635
+ display: flex;
636
+ align-items: baseline;
637
+ justify-content: space-between;
638
+ margin-bottom: 6px;
639
+ }
640
+ .bar-track {
641
+ height: 6px;
642
+ background: var(--ink-8);
643
+ }
644
+ .bar-fill { height: 100%; transition: width 0.5s ease; }
1701
645
 
1702
- .summary-overview {
646
+ /* ── Top Files Table ── */
647
+ .top-files-header {
1703
648
  display: grid;
1704
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
649
+ grid-template-columns: 28px 1fr 72px 90px 90px;
1705
650
  gap: 16px;
1706
- margin-bottom: 24px;
651
+ padding: 10px 24px;
652
+ border-bottom: 1px solid var(--ink-12);
1707
653
  }
1708
-
1709
- .summary-tool-card {
1710
- padding: 16px;
1711
- border-radius: 12px;
1712
- background: var(--card-bg, #fff);
1713
- border: 1px solid var(--border, #e5e7eb);
654
+ .top-files-row {
655
+ display: grid;
656
+ grid-template-columns: 28px 1fr 72px 90px 90px;
657
+ gap: 16px;
658
+ padding: 10px 24px;
659
+ align-items: center;
660
+ transition: background 180ms, transform 180ms;
1714
661
  }
662
+ .top-files-row:hover { background: var(--ink-4); transform: translateX(2px); }
663
+ .top-files-row.with-border { border-bottom: 1px solid var(--ink-8); }
1715
664
 
1716
- .summary-tool-card.claude { border-left: 4px solid #d97757; }
1717
- .summary-tool-card.codex { border-left: 4px solid #10a37f; }
1718
- .summary-tool-card.opencode { border-left: 4px solid #6366f1; }
1719
-
1720
- /* ========== 加载状态 ========== */
1721
-
1722
- .loading-overlay {
1723
- position: fixed;
665
+ /* ── Work Type Pie ── */
666
+ .pie-center {
667
+ position: absolute;
1724
668
  inset: 0;
1725
- background: rgba(255,255,255,0.8);
1726
669
  display: flex;
670
+ flex-direction: column;
1727
671
  align-items: center;
1728
672
  justify-content: center;
1729
- z-index: 100;
673
+ pointer-events: none;
1730
674
  }
1731
675
 
1732
- .loading-spinner {
1733
- width: 40px;
1734
- height: 40px;
1735
- border: 3px solid var(--border, #e5e7eb);
1736
- border-top-color: var(--text-primary, #111);
1737
- border-radius: 50%;
1738
- animation: spin 0.8s linear infinite;
676
+ /* ── Tool Calls ── */
677
+ .tool-rank {
678
+ display: grid;
679
+ grid-template-columns: 24px minmax(0, 1fr) 80px 48px;
680
+ align-items: center;
681
+ gap: 8px;
682
+ margin-bottom: 12px;
1739
683
  }
1740
-
1741
- @keyframes spin {
1742
- to { transform: rotate(360deg); }
684
+ .tool-rank > span:nth-child(2) {
685
+ overflow: hidden;
686
+ text-overflow: ellipsis;
687
+ white-space: nowrap;
1743
688
  }
689
+ .tool-rank:last-child { margin-bottom: 0; }
1744
690
 
1745
- /* ========== 空状态 ========== */
691
+ /* ── Timeline chart ── */
692
+ .timeline-chart { position: relative; height: 280px; }
1746
693
 
1747
- .empty-state {
1748
- text-align: center;
1749
- padding: 48px 24px;
1750
- color: var(--text-muted, #6b7280);
694
+ /* ── Report View ── */
695
+ .report-toolbar {
696
+ display: flex;
697
+ align-items: center;
698
+ gap: 12px;
699
+ margin-bottom: 24px;
700
+ flex-wrap: wrap;
701
+ }
702
+ .report-header {
703
+ margin-bottom: 32px;
704
+ padding-bottom: 24px;
705
+ border-bottom: 1px solid var(--border);
706
+ }
707
+ .report-kpi-grid {
708
+ display: grid;
709
+ grid-template-columns: repeat(4, 1fr);
710
+ border: 1px solid var(--border);
711
+ border-radius: var(--radius);
712
+ background: var(--card);
713
+ overflow: hidden;
714
+ }
715
+ .report-kpi-cell {
716
+ padding: 20px 24px;
1751
717
  }
718
+ .report-kpi-cell:not(:last-child) { border-right: 1px solid var(--border); }
719
+ .kpi-bottom-border { border-bottom: 1px solid var(--border); }
1752
720
 
1753
- .empty-state-icon {
1754
- font-size: 48px;
721
+ .report-section-title {
722
+ display: flex;
723
+ align-items: baseline;
724
+ gap: 16px;
1755
725
  margin-bottom: 16px;
1756
726
  }
1757
727
 
1758
- /* ========== 暗色模式适配 ========== */
728
+ .report-row {
729
+ display: grid;
730
+ grid-template-columns: 1fr 100px 1.4fr;
731
+ gap: 16px;
732
+ padding: 10px 0;
733
+ border-bottom: 1px solid var(--border);
734
+ align-items: baseline;
735
+ }
736
+ .report-row:last-child { border-bottom: none; }
1759
737
 
1760
- [data-theme="dark"] .tool-sidebar {
1761
- background: var(--surface-dark);
1762
- border-color: var(--hairline);
738
+ /* ── Modal ── */
739
+ .modal-overlay {
740
+ position: fixed;
741
+ inset: 0;
742
+ z-index: 200;
743
+ display: flex;
744
+ align-items: center;
745
+ justify-content: center;
746
+ }
747
+ .modal-backdrop {
748
+ position: absolute;
749
+ inset: 0;
750
+ background: rgba(0,0,0,0.4);
751
+ }
752
+ .modal-panel {
753
+ position: relative;
754
+ background: var(--card);
755
+ border-radius: var(--radius);
756
+ width: 100%;
757
+ max-width: 640px;
758
+ max-height: 85vh;
759
+ overflow: hidden;
760
+ display: flex;
761
+ flex-direction: column;
762
+ box-shadow: 0 20px 60px rgba(0,0,0,0.2);
763
+ }
764
+ .modal-header {
765
+ display: flex;
766
+ align-items: center;
767
+ justify-content: space-between;
768
+ padding: 20px 24px 0;
1763
769
  }
770
+ .modal-body { padding: 24px; overflow-y: auto; }
771
+ .modal-footer { padding: 16px 24px 24px; display: flex; justify-content: flex-end; }
1764
772
 
1765
- [data-theme="dark"] .tool-sidebar-header {
1766
- border-color: var(--hairline);
773
+ /* ── Welcome Page ── */
774
+ .welcome-page {
775
+ position: fixed;
776
+ inset: 0;
777
+ z-index: 150;
778
+ display: flex;
779
+ align-items: center;
780
+ justify-content: center;
781
+ background: var(--background);
782
+ min-height: 100vh;
783
+ }
784
+ .welcome-card {
785
+ max-width: 560px;
786
+ width: 100%;
787
+ padding: 48px;
1767
788
  }
789
+ .welcome-brand { text-align: center; margin-bottom: 40px; }
790
+ .welcome-title { font-size: 28px; font-weight: 500; margin-bottom: 8px; }
791
+ .welcome-subtitle { font-size: 14px; opacity: 0.55; }
1768
792
 
1769
- [data-theme="dark"] .tool-nav-item:hover {
1770
- background: rgba(255,255,255,0.05);
793
+ /* ── Form ── */
794
+ .form-group { margin-bottom: 20px; }
795
+ .form-label {
796
+ display: block;
797
+ font-size: 13px;
798
+ font-weight: 500;
799
+ margin-bottom: 6px;
800
+ }
801
+ .form-input, .form-textarea {
802
+ width: 100%;
803
+ padding: 8px 12px;
804
+ font-size: 13px;
805
+ border: 1px solid var(--border);
806
+ border-radius: 6px;
807
+ background: var(--input-background);
808
+ outline: none;
809
+ color: var(--foreground);
1771
810
  }
811
+ .form-input:focus, .form-textarea:focus { border-color: var(--foreground); }
812
+ .form-hint { font-size: 12px; opacity: 0.55; margin-top: 4px; }
1772
813
 
1773
- [data-theme="dark"] .tool-nav-item.active {
1774
- background: var(--surface-card);
1775
- box-shadow: 0 1px 2px rgba(0,0,0,0.2);
814
+ /* ── Work Report Content ── */
815
+ .work-report-content {
816
+ background: var(--card);
817
+ border: 1px solid var(--border);
818
+ border-radius: var(--radius);
819
+ padding: 28px 32px;
820
+ font-size: 14px;
821
+ line-height: 1.75;
822
+ max-height: 82vh;
823
+ overflow-y: auto;
824
+ color: var(--foreground);
825
+ opacity: 0.88;
826
+ min-height: 400px;
827
+ }
828
+ .work-report-content .md-h1 {
829
+ font-size: 20px; font-weight: 600; margin-bottom: 20px; letter-spacing: -0.3px; line-height: 1.3; color: var(--foreground); opacity: 1;
830
+ }
831
+ .work-report-content .md-h2 {
832
+ font-size: 14px; font-weight: 600; margin-top: 28px; margin-bottom: 12px;
833
+ padding-bottom: 8px; border-bottom: 1px solid var(--border);
834
+ display: flex; align-items: center; gap: 6px; color: var(--foreground); opacity: 1;
835
+ text-transform: uppercase; letter-spacing: 0.06em;
836
+ }
837
+ .work-report-content .md-h3 {
838
+ font-size: 15px; font-weight: 500; margin-top: 20px; margin-bottom: 8px;
839
+ padding-left: 10px; border-left: 3px solid var(--rust);
840
+ }
841
+ .work-report-content .md-p { margin-bottom: 10px; }
842
+ .work-report-content .md-ul { margin-bottom: 12px; padding-left: 20px; }
843
+ .work-report-content .md-li { margin-bottom: 4px; }
844
+ .work-report-content .md-table { width: 100%; border-collapse: collapse; margin-bottom: 16px; font-size: 13px; }
845
+ .work-report-content .md-table th, .work-report-content .md-table td { padding: 8px 12px; border-bottom: 1px solid var(--border); text-align: left; }
846
+ .work-report-content .md-table th { font-weight: 600; background: var(--secondary); font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; opacity: 0.75; }
847
+ .work-report-content code {
848
+ font-family: var(--font-mono); font-size: 12px;
849
+ background: var(--secondary);
850
+ padding: 2px 6px; border-radius: 4px;
851
+ opacity: 0.8;
1776
852
  }
1777
853
 
1778
- [data-theme="dark"] .tool-sidebar-footer {
1779
- border-color: var(--hairline);
854
+ /* ── Toast ── */
855
+ .toast {
856
+ position: fixed;
857
+ top: 16px;
858
+ right: 16px;
859
+ z-index: 300;
860
+ background: var(--foreground);
861
+ color: var(--background);
862
+ padding: 10px 16px;
863
+ border-radius: 6px;
864
+ font-size: 13px;
865
+ font-weight: 500;
866
+ box-shadow: 0 4px 12px rgba(0,0,0,0.15);
867
+ transition: opacity 0.3s;
1780
868
  }
1781
869
 
1782
- [data-theme="dark"] .tool-nav-add:hover {
1783
- background: rgba(255,255,255,0.05);
870
+ /* ── Animations ── */
871
+ @keyframes aurora-drift {
872
+ 0%, 100% { background-position: 0% 50%; }
873
+ 50% { background-position: 100% 50%; }
874
+ }
875
+ .text-aurora-shimmer {
876
+ background: linear-gradient(120deg, #7480e8 0%, #5ec2dc 40%, #5ec2a8 60%, #7480e8 100%);
877
+ background-size: 200% 100%;
878
+ -webkit-background-clip: text;
879
+ background-clip: text;
880
+ color: transparent;
881
+ animation: aurora-drift 9s ease-in-out infinite;
882
+ }
883
+ .bg-aurora-shimmer {
884
+ background: linear-gradient(120deg, #7480e8 0%, #5ec2dc 40%, #5ec2a8 60%, #7480e8 100%);
885
+ background-size: 200% 100%;
886
+ animation: aurora-drift 9s ease-in-out infinite;
1784
887
  }
1785
888
 
1786
- [data-theme="dark"] input[type="date"]::-webkit-calendar-picker-indicator {
1787
- filter: invert(1);
1788
- opacity: 0.6;
889
+ @keyframes breath {
890
+ 0%, 100% { opacity: 1; transform: scale(1); }
891
+ 50% { opacity: 0.5; transform: scale(0.85); }
1789
892
  }
893
+ .animate-breath { animation: breath 2.4s ease-in-out infinite; }
1790
894
 
1791
- [data-theme="dark"] .loading-overlay {
1792
- background: rgba(0,0,0,0.7);
895
+ @keyframes bar-fill {
896
+ from { transform: scaleX(0); }
897
+ to { transform: scaleX(1); }
898
+ }
899
+ .animate-bar-fill {
900
+ transform-origin: left center;
901
+ animation: bar-fill 1.1s cubic-bezier(0.22, 1, 0.36, 1) both;
1793
902
  }
1794
903
 
1795
- [data-theme="dark"] .loading-spinner {
1796
- border-color: #374151;
1797
- border-top-color: #fff;
904
+ /* ── Source Mark ── */
905
+ .source-mark { display: inline-block; width: 10px; height: 10px; flex-shrink: 0; }
906
+ .source-mark-stacked {
907
+ display: inline-flex;
908
+ flex-direction: column;
909
+ width: 10px;
910
+ height: 10px;
911
+ flex-shrink: 0;
1798
912
  }
913
+ .source-mark-stacked span { flex: 1; }
1799
914
 
1800
- /* ========== 响应式 ========== */
915
+ /* ── Section grid layouts (extracted from inline styles to avoid Alpine x-show conflicts) ── */
916
+ .grid-5-7 {
917
+ display: grid;
918
+ grid-template-columns: 5fr 7fr;
919
+ gap: 32px;
920
+ margin-top: 56px;
921
+ }
922
+ .grid-3-cols {
923
+ display: grid;
924
+ grid-template-columns: repeat(3, 1fr);
925
+ gap: 32px;
926
+ margin-top: 56px;
927
+ }
928
+ .grid-2-cols {
929
+ display: grid;
930
+ grid-template-columns: 1fr 1fr;
931
+ gap: 32px;
932
+ margin-top: 56px;
933
+ }
1801
934
 
935
+ /* ── Responsive ── */
1802
936
  @media (max-width: 1024px) {
1803
- .tool-sidebar {
1804
- width: 64px;
1805
- padding: 12px 8px;
1806
- }
1807
- .tool-sidebar-header,
1808
- .tool-nav-label {
1809
- display: none;
1810
- }
1811
- .tool-nav-item {
1812
- justify-content: center;
1813
- padding: 10px;
1814
- }
1815
- .tool-nav-add {
1816
- justify-content: center;
1817
- padding: 10px;
1818
- }
1819
- .tool-nav-add .tool-nav-label {
1820
- display: none;
1821
- }
937
+ .app-grid { grid-template-columns: 1fr !important; }
938
+ .rail { display: none; }
939
+ .kpi-strip { grid-template-columns: repeat(2, 1fr); }
940
+ .kpi-cell:nth-child(2) { border-right: none; }
941
+ .kpi-cell:nth-child(1),
942
+ .kpi-cell:nth-child(2) { border-bottom: 1px solid var(--border); }
943
+ .ai-hero-grid { grid-template-columns: 1fr; }
944
+ .grid-5-7 { grid-template-columns: 1fr; }
945
+ .grid-3-cols { grid-template-columns: 1fr; }
946
+ .grid-2-cols { grid-template-columns: 1fr; }
947
+
948
+ .report-kpi-grid { grid-template-columns: repeat(2, 1fr); }
949
+ .report-kpi-cell:nth-child(2) { border-right: none; }
950
+ .report-kpi-cell:nth-child(1),
951
+ .report-kpi-cell:nth-child(2) { border-bottom: 1px solid var(--border); }
952
+ .kpi-bottom-border { border-bottom: none !important; }
1822
953
  }
1823
954
 
1824
955
  @media (max-width: 768px) {
1825
- .app-layout {
1826
- flex-direction: column;
1827
- }
1828
- .tool-sidebar {
1829
- width: 100%;
1830
- min-height: auto;
1831
- position: static;
1832
- flex-direction: row;
1833
- padding: 8px 12px;
1834
- border-right: none;
1835
- border-bottom: 1px solid var(--hairline);
1836
- gap: 8px;
1837
- overflow-x: auto;
1838
- }
1839
- .tool-sidebar-header {
1840
- display: none;
1841
- }
1842
- .tool-nav {
1843
- flex-direction: row;
1844
- gap: 4px;
1845
- flex: 1;
1846
- }
1847
- .tool-nav-item {
1848
- width: auto;
1849
- padding: 6px 12px;
1850
- white-space: nowrap;
1851
- }
1852
- .tool-nav-label {
1853
- display: inline !important;
1854
- }
1855
- .tool-sidebar-footer {
1856
- display: none;
1857
- }
956
+ .kpi-strip { grid-template-columns: 1fr; }
957
+ .kpi-cell { border-right: none !important; border-bottom: 1px solid var(--border); }
958
+ .kpi-cell:last-child { border-bottom: none; }
1858
959
  }
1859
960
 
1860
- @media (prefers-color-scheme: dark) {
1861
- .tool-nav-item:hover {
1862
- background: rgba(255,255,255,0.05);
1863
- }
961
+ /* ── Utility ── */
962
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
963
+ [x-cloak] { display: none !important; }
964
+ .text-right { text-align: right; }
965
+ .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
966
+
967
+ /* ── Chart container overrides ── */
968
+ .chart-wrap { position: relative; height: 200px; }
969
+ .chart-wrap-tall { height: 280px; }
970
+
971
+ /* ── Drill Table ── */
972
+ .drill-table { width: 100%; border-collapse: collapse; font-size: 12px; }
973
+ .drill-table th, .drill-table td { padding: 6px 8px; border-bottom: 1px solid var(--border); text-align: left; }
974
+ .drill-table th { font-weight: 600; opacity: 0.65; font-size: 11px; }
975
+ .drill-text { max-width: 400px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
976
+ .drill-empty { padding: 24px; text-align: center; opacity: 0.55; }
977
+
978
+ /* ── Commit subrows ── */
979
+ .commit-toggle { background: none; border: none; cursor: pointer; font-size: 12px; opacity: 0.5; padding: 0 4px; }
980
+ .commit-toggle:hover { opacity: 1; }
981
+ .commit-subrow > td { background: var(--secondary); padding: 0 !important; }
982
+ .commit-subtable { width: 100%; border-collapse: collapse; font-size: 11px; }
983
+ .commit-subtable th, .commit-subtable td { padding: 4px 8px; border-bottom: 1px solid var(--border); }
984
+ .commit-subtable th { opacity: 0.65; font-weight: 500; }
985
+ .commit-subtable td.num { text-align: right; }
986
+ .commit-type-tag {
987
+ display: inline-block; padding: 1px 8px; border-radius: 9999px;
988
+ font-size: 11px; font-weight: 500; background: var(--secondary); font-family: var(--font-mono);
1864
989
  }
990
+
991
+ /* ── No data hint ── */
992
+ .no-data-hint { padding: 48px; text-align: center; opacity: 0.55; font-size: 14px; }