@chrysb/alphaclaw 0.3.2 → 0.3.4-beta.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.
Files changed (54) hide show
  1. package/bin/alphaclaw.js +47 -2
  2. package/lib/cli/git-sync.js +25 -0
  3. package/lib/plugin/usage-tracker/index.js +308 -0
  4. package/lib/plugin/usage-tracker/openclaw.plugin.json +8 -0
  5. package/lib/public/css/explorer.css +1033 -0
  6. package/lib/public/css/shell.css +50 -4
  7. package/lib/public/css/theme.css +41 -1
  8. package/lib/public/icons/folder-line.svg +1 -0
  9. package/lib/public/icons/hashtag.svg +3 -0
  10. package/lib/public/icons/home-5-line.svg +1 -0
  11. package/lib/public/icons/save-fill.svg +3 -0
  12. package/lib/public/js/app.js +310 -160
  13. package/lib/public/js/components/action-button.js +12 -1
  14. package/lib/public/js/components/file-tree.js +497 -0
  15. package/lib/public/js/components/file-viewer.js +714 -0
  16. package/lib/public/js/components/icons.js +182 -0
  17. package/lib/public/js/components/segmented-control.js +33 -0
  18. package/lib/public/js/components/sidebar-git-panel.js +149 -0
  19. package/lib/public/js/components/sidebar.js +254 -0
  20. package/lib/public/js/components/telegram-workspace/index.js +353 -0
  21. package/lib/public/js/components/telegram-workspace/manage.js +397 -0
  22. package/lib/public/js/components/telegram-workspace/onboarding.js +616 -0
  23. package/lib/public/js/components/usage-tab.js +528 -0
  24. package/lib/public/js/components/watchdog-tab.js +1 -1
  25. package/lib/public/js/lib/api.js +51 -1
  26. package/lib/public/js/lib/browse-draft-state.js +109 -0
  27. package/lib/public/js/lib/file-highlighting.js +6 -0
  28. package/lib/public/js/lib/file-tree-utils.js +12 -0
  29. package/lib/public/js/lib/syntax-highlighters/css.js +124 -0
  30. package/lib/public/js/lib/syntax-highlighters/frontmatter.js +49 -0
  31. package/lib/public/js/lib/syntax-highlighters/html.js +209 -0
  32. package/lib/public/js/lib/syntax-highlighters/index.js +28 -0
  33. package/lib/public/js/lib/syntax-highlighters/javascript.js +134 -0
  34. package/lib/public/js/lib/syntax-highlighters/json.js +61 -0
  35. package/lib/public/js/lib/syntax-highlighters/markdown.js +37 -0
  36. package/lib/public/js/lib/syntax-highlighters/utils.js +13 -0
  37. package/lib/public/js/lib/telegram-api.js +78 -0
  38. package/lib/public/js/lib/ui-settings.js +38 -0
  39. package/lib/public/setup.html +34 -29
  40. package/lib/server/alphaclaw-version.js +3 -3
  41. package/lib/server/constants.js +2 -0
  42. package/lib/server/onboarding/openclaw.js +15 -0
  43. package/lib/server/onboarding/workspace.js +3 -2
  44. package/lib/server/routes/auth.js +5 -1
  45. package/lib/server/routes/browse.js +295 -0
  46. package/lib/server/routes/telegram.js +185 -60
  47. package/lib/server/routes/usage.js +133 -0
  48. package/lib/server/usage-db.js +570 -0
  49. package/lib/server.js +45 -4
  50. package/lib/setup/core-prompts/AGENTS.md +0 -101
  51. package/lib/setup/core-prompts/TOOLS.md +3 -1
  52. package/lib/setup/skills/control-ui/SKILL.md +12 -20
  53. package/package.json +1 -1
  54. package/lib/public/js/components/telegram-workspace.js +0 -1365
@@ -0,0 +1,1033 @@
1
+ /* ── Browse/Explorer mode ─────────────────────── */
2
+
3
+ .app-content.browse-mode {
4
+ padding: 0;
5
+ }
6
+
7
+ .sidebar-tabs {
8
+ display: flex;
9
+ align-items: center;
10
+ gap: 8px;
11
+ padding: 0px 12px 6px;
12
+ background: transparent;
13
+ }
14
+
15
+ .sidebar-tab {
16
+ width: 30px;
17
+ height: 30px;
18
+ padding: 0;
19
+ color: var(--text-muted);
20
+ border: 0;
21
+ border-radius: 6px;
22
+ background: transparent;
23
+ cursor: pointer;
24
+ display: inline-flex;
25
+ align-items: center;
26
+ justify-content: center;
27
+ transition: color 0.12s, background 0.12s, box-shadow 0.12s, transform 0.12s;
28
+ }
29
+
30
+ .sidebar-tab:hover {
31
+ color: #a9eefb;
32
+ }
33
+
34
+ .sidebar-tab.active {
35
+ color: #b9f5ff;
36
+ background: rgba(99, 235, 255, 0.05);
37
+ /* box-shadow: 0 0 8px rgba(99, 235, 255, 0.16); */
38
+ }
39
+
40
+ .sidebar-tab-icon {
41
+ width: 17px;
42
+ height: 17px;
43
+ display: block;
44
+ opacity: 0.92;
45
+ }
46
+
47
+ .sidebar-tab:hover .sidebar-tab-icon,
48
+ .sidebar-tab.active .sidebar-tab-icon {
49
+ opacity: 1;
50
+ }
51
+
52
+ .sidebar-browse-layout {
53
+ display: flex;
54
+ flex-direction: column;
55
+ flex: 1;
56
+ min-height: 0;
57
+ }
58
+
59
+ .sidebar-browse-panel {
60
+ display: flex;
61
+ flex: 1 1 auto;
62
+ min-height: 0;
63
+ overflow: hidden;
64
+ }
65
+
66
+ .sidebar-browse-resizer {
67
+ height: 6px;
68
+ cursor: row-resize;
69
+ position: relative;
70
+ }
71
+
72
+ .sidebar-browse-resizer::before {
73
+ content: "";
74
+ position: absolute;
75
+ left: 0;
76
+ right: 0;
77
+ top: 2px;
78
+ height: 2px;
79
+ background: transparent;
80
+ transition: background 0.12s;
81
+ }
82
+
83
+ .sidebar-browse-resizer:hover::before,
84
+ .sidebar-browse-resizer.is-resizing::before {
85
+ background: rgba(99, 235, 255, 0.55);
86
+ }
87
+
88
+ .sidebar-browse-bottom {
89
+ flex: 0 0 auto;
90
+ min-height: 0;
91
+ overflow: hidden;
92
+ padding-top: 0;
93
+ }
94
+
95
+ .sidebar-browse-bottom-inner {
96
+ min-height: 120px;
97
+ display: flex;
98
+ flex-direction: column;
99
+ overflow: hidden;
100
+ }
101
+
102
+ .file-tree-wrap {
103
+ width: 100%;
104
+ overflow-y: auto;
105
+ padding: 6px 0 8px;
106
+ }
107
+
108
+ .file-tree-search {
109
+ padding: 0 8px 6px;
110
+ }
111
+
112
+ .file-tree-search-input {
113
+ width: 100%;
114
+ height: 28px;
115
+ border-radius: 7px;
116
+ border: 1px solid var(--border);
117
+ background: rgba(255, 255, 255, 0.02);
118
+ color: var(--text);
119
+ font-size: 12px;
120
+ padding: 0 9px;
121
+ outline: none;
122
+ font-family: inherit;
123
+ }
124
+
125
+ .file-tree-search-input::placeholder {
126
+ color: var(--text-dim);
127
+ }
128
+
129
+ .file-tree-search-input:focus {
130
+ border-color: rgba(99, 235, 255, 0.45);
131
+ box-shadow: 0 0 0 1px rgba(99, 235, 255, 0.18);
132
+ }
133
+
134
+ .file-tree-wrap::-webkit-scrollbar {
135
+ width: 6px;
136
+ }
137
+
138
+ .file-tree-wrap::-webkit-scrollbar-track {
139
+ background: transparent;
140
+ }
141
+
142
+ .file-tree-wrap::-webkit-scrollbar-thumb {
143
+ background: var(--border);
144
+ border-radius: 3px;
145
+ }
146
+
147
+ .file-tree {
148
+ list-style: none;
149
+ }
150
+
151
+ .tree-item {
152
+ position: relative;
153
+ }
154
+
155
+ .tree-item > a {
156
+ display: flex;
157
+ align-items: center;
158
+ gap: 6px;
159
+ padding: 2px 10px 2px 18px;
160
+ color: var(--text-muted);
161
+ text-decoration: none;
162
+ font-size: 13px;
163
+ font-weight: 400;
164
+ transition: background 0.1s, color 0.1s;
165
+ cursor: pointer;
166
+ white-space: nowrap;
167
+ overflow: hidden;
168
+ text-overflow: ellipsis;
169
+ user-select: none;
170
+ }
171
+
172
+ .tree-item > a:hover {
173
+ background: var(--bg-hover);
174
+ color: var(--text);
175
+ }
176
+
177
+ .tree-item > a.active {
178
+ background: var(--bg-active);
179
+ color: var(--accent);
180
+ }
181
+
182
+ .tree-item > a.soft-active:not(.active) {
183
+ background: rgba(99, 235, 255, 0.06);
184
+ color: var(--text);
185
+ }
186
+
187
+ .tree-item > a.active::before {
188
+ content: '';
189
+ position: absolute;
190
+ left: 0;
191
+ top: 0;
192
+ bottom: 0;
193
+ width: 2px;
194
+ background: var(--accent);
195
+ }
196
+
197
+ .tree-folder {
198
+ padding: 2px 10px 2px 12px;
199
+ display: flex;
200
+ align-items: center;
201
+ gap: 6px;
202
+ color: var(--text);
203
+ font-weight: 400;
204
+ cursor: pointer;
205
+ user-select: none;
206
+ white-space: nowrap;
207
+ overflow: hidden;
208
+ }
209
+
210
+ .tree-folder:hover {
211
+ background: var(--bg-hover);
212
+ }
213
+
214
+ .arrow {
215
+ font-size: 10px;
216
+ transition: transform 0.15s;
217
+ color: var(--text-dim);
218
+ flex-shrink: 0;
219
+ }
220
+
221
+ .tree-folder.collapsed .arrow {
222
+ transform: rotate(-90deg);
223
+ }
224
+
225
+ .file-icon {
226
+ flex-shrink: 0;
227
+ width: 15px;
228
+ height: 15px;
229
+ display: block;
230
+ color: var(--text-dim);
231
+ }
232
+
233
+ .file-icon-md {
234
+ color: var(--accent);
235
+ }
236
+
237
+ .file-icon-js {
238
+ color: #f4d03f;
239
+ }
240
+
241
+ .file-icon-json {
242
+ color: #9b7bff;
243
+ }
244
+
245
+ .file-icon-css {
246
+ color: #7ec8ff;
247
+ }
248
+
249
+ .file-icon-html {
250
+ color: #ff9d57;
251
+ }
252
+
253
+ .file-icon-image {
254
+ color: #ff7ac6;
255
+ }
256
+
257
+ .file-icon-shell {
258
+ color: #71f8a7;
259
+ }
260
+
261
+ .file-icon-db {
262
+ color: #67b3ff;
263
+ }
264
+
265
+ .file-icon-generic {
266
+ color: var(--text-muted);
267
+ }
268
+
269
+ .tree-label {
270
+ overflow: hidden;
271
+ text-overflow: ellipsis;
272
+ }
273
+
274
+ .tree-draft-dot {
275
+ flex: 0 0 auto;
276
+ margin-left: auto;
277
+ width: 6px;
278
+ height: 6px;
279
+ border-radius: 50%;
280
+ background: #2de2ff;
281
+ box-shadow: 0 0 6px rgba(45, 226, 255, 0.75);
282
+ }
283
+
284
+ .tree-children {
285
+ list-style: none;
286
+ }
287
+
288
+ .tree-children.hidden {
289
+ display: none;
290
+ }
291
+
292
+ .file-tree-state {
293
+ padding: 10px 14px;
294
+ font-size: 12px;
295
+ color: var(--text-muted);
296
+ }
297
+
298
+ .file-tree-state-error {
299
+ color: #f87171;
300
+ }
301
+
302
+ .file-viewer {
303
+ width: 100%;
304
+ min-height: 100%;
305
+ height: calc(100vh - 24px);
306
+ display: flex;
307
+ flex-direction: column;
308
+ background: transparent;
309
+ }
310
+
311
+ .file-viewer-tabbar {
312
+ position: sticky;
313
+ top: 0;
314
+ z-index: 10;
315
+ display: flex;
316
+ align-items: center;
317
+ background: var(--bg-sidebar);
318
+ border-bottom: 1px solid var(--border);
319
+ height: 40px;
320
+ }
321
+
322
+ .file-viewer-protected-banner {
323
+ display: flex;
324
+ align-items: center;
325
+ justify-content: center;
326
+ flex-wrap: wrap;
327
+ gap: 10px;
328
+ min-height: 36px;
329
+ padding: 4px 0;
330
+ height: 42px;
331
+ background: rgba(234, 179, 8, 0.08);
332
+ }
333
+
334
+ .file-viewer-protected-banner-text {
335
+ font-size: 12px;
336
+ color: #f7cc5e;
337
+ text-align: center;
338
+ }
339
+
340
+ .file-viewer-protected-banner-unlocked {
341
+ font-size: 11px;
342
+ color: #fde68a;
343
+ opacity: 0.95;
344
+ letter-spacing: 0.01em;
345
+ }
346
+
347
+ .file-viewer-tabbar-spacer {
348
+ flex: 1;
349
+ }
350
+
351
+ .file-viewer-preview-pill {
352
+ margin-right: 8px;
353
+ font-size: 11px;
354
+ color: var(--text-muted);
355
+ border: 1px solid var(--border);
356
+ border-radius: 999px;
357
+ padding: 3px 8px;
358
+ line-height: 1;
359
+ }
360
+
361
+ .file-viewer-tab {
362
+ display: flex;
363
+ align-items: center;
364
+ gap: 6px;
365
+ height: 40px;
366
+ padding: 0 16px;
367
+ font-size: 12px;
368
+ line-height: 1;
369
+ color: var(--text-muted);
370
+ border-right: 1px solid var(--border);
371
+ white-space: nowrap;
372
+ }
373
+
374
+ .file-viewer-dirty-dot {
375
+ width: 7px;
376
+ height: 7px;
377
+ border-radius: 999px;
378
+ background: var(--accent);
379
+ box-shadow: 0 0 10px rgba(99, 235, 255, 0.55);
380
+ margin-left: 2px;
381
+ flex-shrink: 0;
382
+ }
383
+
384
+ .file-viewer-tab.active {
385
+ color: var(--text);
386
+ background: var(--bg);
387
+ border-bottom: 1px solid var(--accent);
388
+ margin-bottom: -1px;
389
+ }
390
+
391
+ .file-viewer-breadcrumb {
392
+ display: inline-flex;
393
+ align-items: center;
394
+ gap: 4px;
395
+ }
396
+
397
+ .file-viewer-breadcrumb-item {
398
+ display: inline-flex;
399
+ align-items: center;
400
+ gap: 4px;
401
+ color: var(--text-muted);
402
+ }
403
+
404
+ .file-viewer-breadcrumb-item .is-current {
405
+ color: var(--text);
406
+ }
407
+
408
+ .file-viewer-sep {
409
+ color: var(--text-dim);
410
+ }
411
+
412
+ .frontmatter-box {
413
+ margin-top: 16px;
414
+ margin-bottom: 4px;
415
+ margin-right: 20px;
416
+ margin-left: 36px;
417
+ border: 1px solid var(--border);
418
+ border-radius: 8px;
419
+ overflow: hidden;
420
+ background: rgba(99, 235, 255, 0.025);
421
+ }
422
+
423
+ .frontmatter-title {
424
+ width: 100%;
425
+ border: 0;
426
+ text-align: left;
427
+ display: flex;
428
+ align-items: center;
429
+ gap: 8px;
430
+ cursor: pointer;
431
+ font-size: 11px;
432
+ letter-spacing: 0.08em;
433
+ text-transform: uppercase;
434
+ color: var(--text-muted);
435
+ background: rgba(13, 17, 23, 0.55);
436
+ border-bottom: 1px solid rgba(255, 255, 255, 0.04);
437
+ padding: 4px 10px;
438
+ }
439
+
440
+ .frontmatter-title:hover {
441
+ background: rgba(13, 17, 23, 0.75);
442
+ }
443
+
444
+ .frontmatter-chevron {
445
+ width: 12px;
446
+ height: 12px;
447
+ display: inline-flex;
448
+ align-items: center;
449
+ justify-content: center;
450
+ color: var(--accent);
451
+ transition: transform 0.15s ease;
452
+ }
453
+
454
+ .frontmatter-chevron.open {
455
+ transform: rotate(90deg);
456
+ }
457
+
458
+ .frontmatter-chevron svg {
459
+ width: 12px;
460
+ height: 12px;
461
+ display: block;
462
+ }
463
+
464
+ .frontmatter-chevron path {
465
+ fill: none;
466
+ stroke: currentColor;
467
+ stroke-width: 2;
468
+ stroke-linecap: round;
469
+ stroke-linejoin: round;
470
+ }
471
+
472
+ .frontmatter-grid {
473
+ display: grid;
474
+ }
475
+
476
+ .frontmatter-row {
477
+ display: grid;
478
+ grid-template-columns: 160px 1fr;
479
+ border-top: 1px solid rgba(255, 255, 255, 0.05);
480
+ }
481
+
482
+ .frontmatter-row:first-child {
483
+ border-top: 0;
484
+ }
485
+
486
+ .frontmatter-key {
487
+ padding: 6px 10px;
488
+ color: var(--keyword);
489
+ border-right: 1px solid rgba(255, 255, 255, 0.05);
490
+ word-break: break-word;
491
+ opacity: 0.85;
492
+ }
493
+
494
+ .frontmatter-value {
495
+ padding: 6px 10px;
496
+ color: var(--string);
497
+ white-space: pre-wrap;
498
+ word-break: break-word;
499
+ opacity: 0.88;
500
+ }
501
+
502
+ .frontmatter-value-pre {
503
+ margin: 0;
504
+ font-family: inherit;
505
+ font-size: 12px;
506
+ }
507
+
508
+ .file-viewer-save-action {
509
+ margin-right: 10px;
510
+ }
511
+
512
+ .file-viewer-save-icon {
513
+ width: 13px;
514
+ height: 13px;
515
+ flex-shrink: 0;
516
+ }
517
+
518
+ .file-viewer-view-toggle {
519
+ display: flex;
520
+ align-items: center;
521
+ margin-right: 10px;
522
+ border: 1px solid var(--border);
523
+ border-radius: 8px;
524
+ overflow: hidden;
525
+ background: rgba(255, 255, 255, 0.02);
526
+ height: 28px;
527
+ }
528
+
529
+ .file-viewer-view-toggle-button {
530
+ border: 0;
531
+ background: transparent;
532
+ color: var(--text-muted);
533
+ font-family: inherit;
534
+ font-size: 12px;
535
+ text-transform: lowercase;
536
+ letter-spacing: 0.03em;
537
+ height: 100%;
538
+ line-height: 1;
539
+ padding: 0 10px;
540
+ cursor: pointer;
541
+ }
542
+
543
+ .file-viewer-view-toggle-button:hover {
544
+ color: var(--text);
545
+ background: rgba(255, 255, 255, 0.03);
546
+ }
547
+
548
+ .file-viewer-view-toggle-button.active {
549
+ color: var(--accent);
550
+ background: var(--bg-active);
551
+ }
552
+
553
+ .file-viewer-editor-shell {
554
+ width: 100%;
555
+ min-height: 0;
556
+ height: 100%;
557
+ flex: 1;
558
+ display: flex;
559
+ align-items: stretch;
560
+ }
561
+
562
+ .file-viewer-editor-line-num-col {
563
+ width: 56px;
564
+ flex-shrink: 0;
565
+ overflow: hidden;
566
+ padding: 16px 16px 112px 0;
567
+ text-align: right;
568
+ }
569
+
570
+ .file-viewer-editor-line-num {
571
+ min-height: 22px;
572
+ line-height: 22px;
573
+ color: var(--text-dim);
574
+ font-size: 12px;
575
+ user-select: none;
576
+ display: flex;
577
+ justify-content: flex-end;
578
+ align-items: flex-start;
579
+ }
580
+
581
+ .file-viewer-editor {
582
+ width: 100%;
583
+ min-height: 0;
584
+ height: 100%;
585
+ flex: 1;
586
+ border: 0;
587
+ outline: none;
588
+ resize: none;
589
+ overflow-y: auto;
590
+ background: transparent;
591
+ color: var(--text);
592
+ font-family: 'JetBrains Mono', monospace;
593
+ font-size: 13px;
594
+ line-height: 22px;
595
+ padding: 16px 20px 112px 0;
596
+ white-space: pre-wrap;
597
+ overflow-wrap: anywhere;
598
+ word-break: break-word;
599
+ }
600
+
601
+ .file-viewer-editor-stack {
602
+ position: relative;
603
+ flex: 1;
604
+ min-height: 0;
605
+ }
606
+
607
+ .file-viewer-editor-highlight {
608
+ position: absolute;
609
+ inset: 0;
610
+ overflow: hidden;
611
+ pointer-events: none;
612
+ background: transparent;
613
+ font-family: 'JetBrains Mono', monospace;
614
+ font-size: 13px;
615
+ line-height: 22px;
616
+ color: var(--text);
617
+ padding: 16px 20px 112px 0;
618
+ white-space: pre-wrap;
619
+ overflow-wrap: anywhere;
620
+ word-break: break-word;
621
+ }
622
+
623
+ .file-viewer-editor-highlight-line {
624
+ min-height: 22px;
625
+ }
626
+
627
+ .file-viewer-editor-highlight-line-content {
628
+ white-space: pre-wrap;
629
+ overflow-wrap: anywhere;
630
+ word-break: break-word;
631
+ }
632
+
633
+ .file-viewer-editor-overlay {
634
+ position: absolute;
635
+ inset: 0;
636
+ color: transparent;
637
+ caret-color: var(--text);
638
+ -webkit-text-fill-color: transparent;
639
+ }
640
+
641
+ .file-viewer-editor-overlay::selection {
642
+ background: rgba(99, 235, 255, 0.25);
643
+ }
644
+
645
+ .file-viewer-preview {
646
+ flex: 1;
647
+ overflow-y: auto;
648
+ padding: 0 20px 112px 36px;
649
+ line-height: 1.75;
650
+ background: transparent;
651
+ }
652
+
653
+ .file-viewer-pane-hidden {
654
+ display: none;
655
+ }
656
+
657
+ .file-viewer-preview h1,
658
+ .file-viewer-preview h2,
659
+ .file-viewer-preview h3,
660
+ .file-viewer-preview h4,
661
+ .file-viewer-preview h5,
662
+ .file-viewer-preview h6 {
663
+ color: var(--accent);
664
+ margin: 18px 0 10px;
665
+ font-weight: 600;
666
+ }
667
+
668
+ .file-viewer-preview h1 {
669
+ font-size: 2em;
670
+ }
671
+
672
+ .file-viewer-preview h2 {
673
+ font-size: 1.5em;
674
+ }
675
+
676
+ .file-viewer-preview h3 {
677
+ font-size: 1.25em;
678
+ }
679
+
680
+ .file-viewer-preview h4 {
681
+ font-size: 1.1em;
682
+ }
683
+
684
+ .file-viewer-preview h5 {
685
+ font-size: 1em;
686
+ }
687
+
688
+ .file-viewer-preview h6 {
689
+ font-size: 0.9em;
690
+ }
691
+
692
+ .file-viewer-preview p,
693
+ .file-viewer-preview ul,
694
+ .file-viewer-preview ol,
695
+ .file-viewer-preview blockquote,
696
+ .file-viewer-preview pre,
697
+ .file-viewer-preview table {
698
+ margin: 10px 0;
699
+ }
700
+
701
+ .file-viewer-preview ul,
702
+ .file-viewer-preview ol {
703
+ padding-left: 20px;
704
+ }
705
+
706
+ .file-viewer-preview ul {
707
+ list-style: disc;
708
+ }
709
+
710
+ .file-viewer-preview ol {
711
+ list-style: decimal;
712
+ }
713
+
714
+ .file-viewer-preview a {
715
+ color: var(--accent);
716
+ }
717
+
718
+ .file-viewer-preview code {
719
+ color: var(--string);
720
+ background: rgba(255, 255, 255, 0.05);
721
+ border: 1px solid var(--border);
722
+ border-radius: 4px;
723
+ padding: 1px 6px;
724
+ }
725
+
726
+ .file-viewer-preview pre {
727
+ background: rgba(255, 255, 255, 0.04);
728
+ border: 1px solid var(--border);
729
+ border-radius: 6px;
730
+ padding: 12px;
731
+ overflow-x: auto;
732
+ }
733
+
734
+ .file-viewer-preview pre code {
735
+ background: transparent;
736
+ border: 0;
737
+ padding: 0;
738
+ }
739
+
740
+ .file-viewer-preview blockquote {
741
+ border-left: 2px solid var(--accent-dim);
742
+ padding-left: 12px;
743
+ color: var(--comment);
744
+ }
745
+
746
+ .file-viewer-preview table {
747
+ width: 100%;
748
+ border-collapse: collapse;
749
+ }
750
+
751
+ .file-viewer-preview th,
752
+ .file-viewer-preview td {
753
+ border: 1px solid var(--border);
754
+ padding: 6px 8px;
755
+ text-align: left;
756
+ }
757
+
758
+ .file-viewer-preview th {
759
+ color: var(--text);
760
+ background: rgba(255, 255, 255, 0.04);
761
+ }
762
+
763
+ .file-viewer-editor-highlight-line-content .hl-comment {
764
+ color: var(--comment);
765
+ font-style: italic;
766
+ }
767
+
768
+ .file-viewer-editor-highlight-line-content .hl-heading {
769
+ color: var(--accent);
770
+ font-weight: 700;
771
+ }
772
+
773
+ .file-viewer-editor-highlight-line-content .hl-string {
774
+ color: var(--string);
775
+ }
776
+
777
+ .file-viewer-editor-highlight-line-content .hl-bullet {
778
+ color: var(--orange);
779
+ }
780
+
781
+ .file-viewer-editor-highlight-line-content .hl-bold {
782
+ color: var(--text);
783
+ font-weight: 700;
784
+ }
785
+
786
+ .file-viewer-editor-highlight-line-content .hl-link {
787
+ color: var(--accent);
788
+ text-decoration: underline;
789
+ text-decoration-style: dotted;
790
+ }
791
+
792
+ .file-viewer-editor-highlight-line-content .hl-meta {
793
+ color: var(--text-dim);
794
+ }
795
+
796
+ .file-viewer-editor-highlight-line-content .hl-key {
797
+ color: var(--keyword);
798
+ }
799
+
800
+ .file-viewer-editor-highlight-line-content .hl-keyword {
801
+ color: var(--keyword);
802
+ }
803
+
804
+ .file-viewer-editor-highlight-line-content .hl-tag {
805
+ color: var(--accent);
806
+ }
807
+
808
+ .file-viewer-editor-highlight-line-content .hl-attr {
809
+ color: var(--keyword);
810
+ }
811
+
812
+ .file-viewer-editor-highlight-line-content .hl-entity {
813
+ color: var(--number);
814
+ }
815
+
816
+ .file-viewer-editor-highlight-line-content .hl-number {
817
+ color: var(--number);
818
+ }
819
+
820
+ .file-viewer-editor-highlight-line-content .hl-boolean,
821
+ .file-viewer-editor-highlight-line-content .hl-null {
822
+ color: var(--orange);
823
+ }
824
+
825
+ .file-viewer-editor-highlight-line-content .hl-punc {
826
+ color: #5f6674;
827
+ }
828
+
829
+ .file-viewer-state {
830
+ padding: 20px;
831
+ color: var(--text-muted);
832
+ font-size: 12px;
833
+ }
834
+
835
+ .file-viewer-loading-shell {
836
+ flex: 1 1 auto;
837
+ min-height: 140px;
838
+ display: flex;
839
+ align-items: center;
840
+ justify-content: center;
841
+ color: var(--text-muted);
842
+ }
843
+
844
+ .file-viewer-state-error {
845
+ color: #f87171;
846
+ }
847
+
848
+ .file-viewer-empty {
849
+ display: flex;
850
+ flex-direction: column;
851
+ align-items: center;
852
+ justify-content: center;
853
+ height: calc(100vh - 120px);
854
+ color: var(--text-dim);
855
+ text-align: center;
856
+ padding: 48px;
857
+ gap: 10px;
858
+ }
859
+
860
+ .file-viewer-empty-mark {
861
+ font-size: 26px;
862
+ font-weight: 500;
863
+ letter-spacing: 0.08em;
864
+ color: var(--accent);
865
+ text-shadow:
866
+ 0 0 12px rgba(99, 235, 255, 0.38),
867
+ 0 0 22px rgba(99, 235, 255, 0.2);
868
+ }
869
+
870
+ .file-viewer-empty-title {
871
+ font-size: 13px;
872
+ font-weight: 400;
873
+ color: var(--text);
874
+ letter-spacing: 0.01em;
875
+ }
876
+
877
+ .sidebar-git-panel {
878
+ padding: 0;
879
+ margin: 0;
880
+ font-size: 11px;
881
+ display: flex;
882
+ flex-direction: column;
883
+ gap: 0;
884
+ flex: 1 1 auto;
885
+ min-height: 0;
886
+ }
887
+
888
+ .sidebar-git-loading {
889
+ min-height: 58px;
890
+ display: flex;
891
+ align-items: center;
892
+ justify-content: center;
893
+ }
894
+
895
+ .sidebar-git-panel-error {
896
+ color: #f87171;
897
+ }
898
+
899
+ .sidebar-git-bar {
900
+ display: flex;
901
+ align-items: center;
902
+ justify-content: space-between;
903
+ flex-shrink: 0;
904
+ min-height: 28px;
905
+ padding: 0 12px;
906
+ border-top: 1px solid var(--border);
907
+ background: rgba(255, 255, 255, 0.018);
908
+ }
909
+
910
+ .sidebar-git-bar:first-child {
911
+ border-bottom: 1px double var(--border);
912
+ }
913
+
914
+ .sidebar-git-bar-secondary {
915
+ margin-top: 0;
916
+ border-top: 0;
917
+ border-bottom: 0;
918
+ background: rgba(255, 255, 255, 0.012);
919
+ }
920
+
921
+ .sidebar-git-bar-main {
922
+ display: inline-flex;
923
+ align-items: center;
924
+ gap: 6px;
925
+ min-width: 0;
926
+ }
927
+
928
+ .sidebar-git-link {
929
+ color: inherit;
930
+ text-decoration: none;
931
+ }
932
+
933
+ .sidebar-git-link:hover .sidebar-git-repo-name {
934
+ color: var(--accent);
935
+ }
936
+
937
+ .sidebar-git-bar-icon {
938
+ width: 14px;
939
+ height: 14px;
940
+ color: var(--text-muted);
941
+ flex-shrink: 0;
942
+ }
943
+
944
+ .sidebar-git-repo-name {
945
+ color: var(--text);
946
+ font-size: 11px;
947
+ letter-spacing: 0.03em;
948
+ white-space: nowrap;
949
+ overflow: hidden;
950
+ text-overflow: ellipsis;
951
+ }
952
+
953
+ .sidebar-git-branch {
954
+ color: var(--text-muted);
955
+ white-space: nowrap;
956
+ overflow: hidden;
957
+ text-overflow: ellipsis;
958
+ }
959
+
960
+ .sidebar-git-dirty {
961
+ font-size: 10px;
962
+ text-transform: uppercase;
963
+ letter-spacing: 0.06em;
964
+ }
965
+
966
+ .sidebar-git-dirty.is-clean {
967
+ color: #71f8a7;
968
+ }
969
+
970
+ .sidebar-git-dirty.is-dirty {
971
+ color: #f3a86a;
972
+ }
973
+
974
+ .sidebar-git-meta {
975
+ color: var(--text-muted);
976
+ }
977
+
978
+ .sidebar-git-list {
979
+ list-style: none;
980
+ display: flex;
981
+ flex-direction: column;
982
+ gap: 3px;
983
+ padding: 6px 10px 0;
984
+ overflow-y: auto;
985
+ min-height: 0;
986
+ flex: 1 1 auto;
987
+ }
988
+
989
+ .sidebar-git-list li {
990
+ display: flex;
991
+ align-items: baseline;
992
+ flex: 0 0 auto;
993
+ gap: 6px;
994
+ color: var(--text-muted);
995
+ line-height: 1.4;
996
+ white-space: nowrap;
997
+ overflow: hidden;
998
+ text-overflow: ellipsis;
999
+ }
1000
+
1001
+ .sidebar-git-commit-link {
1002
+ display: flex;
1003
+ align-items: center;
1004
+ gap: 6px;
1005
+ flex: 0 0 auto;
1006
+ color: inherit;
1007
+ text-decoration: none;
1008
+ min-width: 0;
1009
+ line-height: 1.4;
1010
+ }
1011
+
1012
+ .sidebar-git-commit-link:hover {
1013
+ color: var(--text);
1014
+ }
1015
+
1016
+ .sidebar-git-commit-link:hover .sidebar-git-hash {
1017
+ color: var(--accent);
1018
+ }
1019
+
1020
+ .sidebar-git-hash {
1021
+ color: var(--accent);
1022
+ flex-shrink: 0;
1023
+ }
1024
+
1025
+ @media (max-width: 768px) {
1026
+ .sidebar-browse-resizer {
1027
+ display: none;
1028
+ }
1029
+
1030
+ .app-content.browse-mode {
1031
+ padding: 0;
1032
+ }
1033
+ }