@chrysb/alphaclaw 0.3.2 → 0.3.3

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