gh-here 3.0.3 → 3.2.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 (47) hide show
  1. package/.env +0 -0
  2. package/lib/constants.js +21 -16
  3. package/lib/content-search.js +212 -0
  4. package/lib/error-handler.js +39 -28
  5. package/lib/file-utils.js +438 -287
  6. package/lib/git.js +11 -55
  7. package/lib/gitignore.js +70 -41
  8. package/lib/renderers.js +17 -33
  9. package/lib/server.js +73 -196
  10. package/lib/symbol-parser.js +600 -0
  11. package/package.json +1 -1
  12. package/public/app.js +135 -68
  13. package/public/css/components/buttons.css +423 -0
  14. package/public/css/components/forms.css +171 -0
  15. package/public/css/components/modals.css +286 -0
  16. package/public/css/components/notifications.css +36 -0
  17. package/public/css/file-table.css +318 -0
  18. package/public/css/file-tree.css +269 -0
  19. package/public/css/file-viewer.css +1259 -0
  20. package/public/css/layout.css +372 -0
  21. package/public/css/main.css +35 -0
  22. package/public/css/reset.css +64 -0
  23. package/public/css/search.css +694 -0
  24. package/public/css/symbol-outline.css +279 -0
  25. package/public/css/variables.css +135 -0
  26. package/public/js/constants.js +50 -34
  27. package/public/js/content-search-handler.js +551 -0
  28. package/public/js/file-viewer.js +437 -0
  29. package/public/js/focus-mode.js +280 -0
  30. package/public/js/inline-search.js +659 -0
  31. package/public/js/modal-manager.js +14 -28
  32. package/public/js/symbol-outline.js +454 -0
  33. package/public/js/utils.js +152 -94
  34. package/.claude/settings.local.json +0 -30
  35. package/SAMPLE.md +0 -287
  36. package/lib/validation.js +0 -77
  37. package/public/app.js.backup +0 -1902
  38. package/public/highlight.css +0 -121
  39. package/public/js/draft-manager.js +0 -36
  40. package/public/js/editor-manager.js +0 -159
  41. package/public/styles.css +0 -2727
  42. package/test.js +0 -138
  43. package/tests/draftManager.test.js +0 -241
  44. package/tests/fileTypeDetection.test.js +0 -111
  45. package/tests/httpService.test.js +0 -268
  46. package/tests/languageDetection.test.js +0 -145
  47. package/tests/pathUtils.test.js +0 -136
package/public/styles.css DELETED
@@ -1,2727 +0,0 @@
1
- :root {
2
- /* GitHub Dark */
3
- --bg-primary: #0d1117;
4
- --bg-secondary: #161b22;
5
- --bg-tertiary: #21262d;
6
- --border-primary: #30363d;
7
- --border-secondary: #21262d;
8
- --text-primary: #e6edf3;
9
- --text-secondary: #8b949e;
10
- --text-accent: #f0f6fc;
11
- --link-color: #58a6ff;
12
- --hover-bg: #161b22;
13
- }
14
-
15
- [data-theme="light"] {
16
- /* GitHub Light */
17
- --bg-primary: #ffffff;
18
- --bg-secondary: #f6f8fa;
19
- --bg-tertiary: #f1f3f4;
20
- --border-primary: #d1d9e0;
21
- --border-secondary: #d8dee4;
22
- --text-primary: #1f2328;
23
- --text-secondary: #656d76;
24
- --text-accent: #1f2328;
25
- --link-color: #0969da;
26
- --hover-bg: #f6f8fa;
27
- }
28
-
29
- * {
30
- margin: 0;
31
- padding: 0;
32
- box-sizing: border-box;
33
- }
34
-
35
- html {
36
- /* Set background on html to prevent flash during navigation */
37
- background-color: #0d1117; /* Default dark theme background */
38
- color-scheme: dark;
39
- }
40
-
41
- html[data-theme="light"] {
42
- background-color: #ffffff; /* Light theme background */
43
- color-scheme: light;
44
- }
45
-
46
- /* View Transitions API animations */
47
- ::view-transition-old(root),
48
- ::view-transition-new(root) {
49
- animation-duration: 0.2s;
50
- }
51
-
52
- ::view-transition-old(root) {
53
- animation-name: fade-out;
54
- }
55
-
56
- ::view-transition-new(root) {
57
- animation-name: fade-in;
58
- }
59
-
60
- @keyframes fade-out {
61
- to {
62
- opacity: 0;
63
- }
64
- }
65
-
66
- @keyframes fade-in {
67
- from {
68
- opacity: 0;
69
- }
70
- }
71
-
72
- body {
73
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
74
- background-color: var(--bg-primary);
75
- color: var(--text-primary);
76
- line-height: 1.5;
77
- min-height: 100vh;
78
- }
79
-
80
- /* Smooth content fades for navigation */
81
- .main-content-wrapper {
82
- transition: opacity 160ms ease;
83
- will-change: opacity;
84
- }
85
-
86
- /* During navigation transition: fade out and disable clicks to prevent race conditions */
87
- .main-content-wrapper.navigating {
88
- opacity: 0.5;
89
- pointer-events: none; /* Prevents clicks during transition - will be removed when navigation completes */
90
- }
91
-
92
- @media (prefers-reduced-motion: reduce) {
93
- .main-content-wrapper {
94
- transition: none;
95
- }
96
- }
97
-
98
- header {
99
- background-color: var(--bg-secondary);
100
- border-bottom: 1px solid var(--border-primary);
101
- position: sticky;
102
- top: 0;
103
- z-index: 100;
104
- }
105
-
106
- .header-content {
107
- display: flex;
108
- justify-content: space-between;
109
- align-items: center;
110
- padding: 12px 32px;
111
- max-width: 100%;
112
- }
113
-
114
- .header-left {
115
- flex: 0 0 auto;
116
- }
117
-
118
- .header-left h1 {
119
- font-size: 20px;
120
- font-weight: 600;
121
- margin: 0;
122
- color: var(--text-primary);
123
- letter-spacing: 0.02em;
124
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
125
- }
126
-
127
- .header-left h1::before {
128
- content: '$';
129
- color: var(--link-color);
130
- margin-right: 8px;
131
- opacity: 0.8;
132
- font-weight: 400;
133
- }
134
-
135
- .header-path {
136
- display: flex;
137
- align-items: center;
138
- gap: 8px;
139
- }
140
-
141
- .header-right {
142
- display: flex;
143
- align-items: center;
144
- gap: 8px;
145
- margin-left: auto;
146
- }
147
-
148
- /* GitHub-style White Canvas Section */
149
- .repo-canvas {
150
- background-color: var(--bg-primary);
151
- flex: 1;
152
- min-width: 0;
153
- }
154
-
155
- .repo-canvas-content {
156
- padding: 16px 24px;
157
- max-width: 1280px;
158
- margin: 0 auto;
159
- }
160
-
161
- .breadcrumb-section {
162
- font-size: 20px;
163
- font-weight: 600;
164
- color: var(--text-primary);
165
- margin: 0 0 12px 0;
166
- display: flex;
167
- align-items: center;
168
- flex-wrap: wrap;
169
- }
170
-
171
- .repo-name {
172
- font-size: 20px;
173
- font-weight: 600;
174
- color: var(--text-primary);
175
- margin: 0 0 12px 0;
176
- }
177
-
178
- .repo-divider {
179
- border: none;
180
- border-top: 1px solid var(--border-primary);
181
- margin: 0 0 12px 0;
182
- }
183
-
184
- .repo-controls {
185
- display: flex;
186
- align-items: center;
187
- justify-content: space-between;
188
- min-height: 40px;
189
- }
190
-
191
- .repo-controls-left {
192
- display: flex;
193
- align-items: center;
194
- gap: 12px;
195
- }
196
-
197
- .repo-controls-left:empty {
198
- display: none;
199
- }
200
-
201
- .repo-controls-right {
202
- display: flex;
203
- align-items: center;
204
- gap: 12px;
205
- margin-left: auto;
206
- }
207
-
208
- .branch-button {
209
- display: flex;
210
- align-items: center;
211
- gap: 6px;
212
- padding: 5px 12px;
213
- background: var(--bg-primary);
214
- border: 1px solid var(--border-primary);
215
- border-radius: 6px;
216
- color: var(--text-primary);
217
- font-size: 12px;
218
- font-weight: 500;
219
- cursor: pointer;
220
- transition: all 0.2s ease;
221
- }
222
-
223
- .branch-button:hover {
224
- background: var(--bg-secondary);
225
- border-color: var(--text-secondary);
226
- }
227
-
228
- .branch-count,
229
- .tag-count {
230
- color: var(--text-secondary);
231
- font-size: 14px;
232
- display: flex;
233
- align-items: center;
234
- gap: 6px;
235
- }
236
-
237
- .octicon-branch {
238
- width: 16px;
239
- height: 16px;
240
- fill: var(--text-secondary);
241
- }
242
-
243
- .octicon-small {
244
- width: 14px;
245
- height: 14px;
246
- fill: var(--text-secondary);
247
- }
248
-
249
- .branch-name {
250
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
251
- font-weight: 600;
252
- font-size: 12px;
253
- }
254
-
255
- .octicon-chevron {
256
- width: 12px;
257
- height: 12px;
258
- fill: var(--text-secondary);
259
- }
260
-
261
- .search-container {
262
- position: relative;
263
- display: flex;
264
- align-items: center;
265
- }
266
-
267
- .search-input {
268
- background: var(--bg-primary);
269
- border: 1px solid var(--border-primary);
270
- border-radius: 6px;
271
- padding: 6px 40px 6px 32px;
272
- color: var(--text-primary);
273
- font-size: 14px;
274
- width: 300px;
275
- }
276
-
277
- .search-input:focus {
278
- outline: none;
279
- border-color: #0969da;
280
- box-shadow: 0 0 0 3px rgba(9, 105, 218, 0.3);
281
- }
282
-
283
- /* Search results overlay */
284
- .search-results-overlay {
285
- position: absolute;
286
- top: calc(100% + 8px);
287
- left: 0;
288
- right: 0;
289
- z-index: 1000;
290
- min-width: 400px;
291
- }
292
-
293
- .search-results-container {
294
- background: var(--bg-primary);
295
- border: 1px solid var(--border-primary);
296
- border-radius: 6px;
297
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
298
- max-height: 400px;
299
- overflow: hidden;
300
- display: flex;
301
- flex-direction: column;
302
- }
303
-
304
- .search-results-header {
305
- padding: 8px 12px;
306
- border-bottom: 1px solid var(--border-primary);
307
- background: var(--bg-secondary);
308
- font-size: 12px;
309
- font-weight: 600;
310
- color: var(--text-secondary);
311
- }
312
-
313
- .search-results-count {
314
- color: var(--text-secondary);
315
- }
316
-
317
- .search-results-list {
318
- overflow-y: auto;
319
- max-height: 350px;
320
- }
321
-
322
- .search-result-item {
323
- display: flex;
324
- align-items: center;
325
- gap: 10px;
326
- padding: 8px 12px;
327
- border-bottom: 1px solid var(--border-secondary);
328
- text-decoration: none;
329
- color: var(--text-primary);
330
- transition: background-color 0.15s ease;
331
- cursor: pointer;
332
- }
333
-
334
- .search-result-item:last-child {
335
- border-bottom: none;
336
- }
337
-
338
- .search-result-item:hover {
339
- background-color: var(--hover-bg);
340
- }
341
-
342
- .search-result-item .result-icon {
343
- flex-shrink: 0;
344
- fill: var(--text-secondary);
345
- }
346
-
347
- .search-result-item .result-icon.file-icon {
348
- opacity: 0.7;
349
- }
350
-
351
- .search-result-content {
352
- flex: 1;
353
- min-width: 0;
354
- display: flex;
355
- flex-direction: column;
356
- gap: 2px;
357
- }
358
-
359
- .search-result-path {
360
- font-size: 13px;
361
- color: var(--text-primary);
362
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
363
- overflow: hidden;
364
- text-overflow: ellipsis;
365
- white-space: nowrap;
366
- }
367
-
368
- .search-highlight {
369
- background-color: rgba(255, 200, 50, 0.3);
370
- color: var(--text-accent);
371
- border-radius: 2px;
372
- padding: 0 2px;
373
- font-weight: 600;
374
- }
375
-
376
- [data-theme="light"] .search-highlight {
377
- background-color: rgba(255, 200, 50, 0.4);
378
- }
379
-
380
- .search-icon {
381
- position: absolute;
382
- left: 8px;
383
- width: 16px;
384
- height: 16px;
385
- fill: var(--text-secondary);
386
- pointer-events: none;
387
- }
388
-
389
- .search-hotkey {
390
- position: absolute;
391
- right: 8px;
392
- background: var(--bg-tertiary);
393
- border: 1px solid var(--border-primary);
394
- border-radius: 3px;
395
- padding: 2px 6px;
396
- font-size: 12px;
397
- color: var(--text-secondary);
398
- font-family: ui-monospace, SFMono-Regular, monospace;
399
- }
400
-
401
- /* GitHub-style Buttons */
402
- .btn {
403
- display: flex;
404
- align-items: center;
405
- gap: 6px;
406
- padding: 5px 12px;
407
- border-radius: 6px;
408
- font-size: 12px;
409
- font-weight: 500;
410
- cursor: pointer;
411
- transition: all 0.2s ease;
412
- border: 1px solid;
413
- }
414
-
415
- .btn-primary {
416
- background: var(--bg-primary);
417
- border-color: var(--border-primary);
418
- color: var(--text-primary);
419
- }
420
-
421
- .btn-primary:hover {
422
- background: var(--bg-secondary);
423
- }
424
-
425
- .btn-outline {
426
- background: var(--bg-primary);
427
- border-color: var(--border-primary);
428
- color: var(--text-primary);
429
- }
430
-
431
- .btn-outline:hover {
432
- background: var(--bg-secondary);
433
- }
434
-
435
- .btn-success {
436
- background: #238636;
437
- border-color: rgba(240, 246, 252, 0.1);
438
- color: #ffffff;
439
- }
440
-
441
- .btn-success:hover {
442
- background: #2ea043;
443
- }
444
-
445
- .btn-icon,
446
- .btn-chevron {
447
- width: 16px;
448
- height: 16px;
449
- fill: currentColor;
450
- }
451
-
452
- .theme-toggle,
453
- .gitignore-toggle,
454
- .edit-btn {
455
- background: var(--bg-primary);
456
- border: 1px solid var(--border-primary);
457
- border-radius: 6px;
458
- padding: 5px 12px;
459
- cursor: pointer;
460
- color: var(--text-primary);
461
- transition: all 0.15s ease;
462
- display: flex;
463
- align-items: center;
464
- justify-content: center;
465
- height: 32px;
466
- min-width: 32px;
467
- margin: 0;
468
- font-size: 14px;
469
- }
470
-
471
- .theme-toggle:hover,
472
- .gitignore-toggle:hover,
473
- .edit-btn:hover {
474
- background-color: var(--bg-tertiary);
475
- border-color: var(--text-secondary);
476
- }
477
-
478
- .theme-toggle:active,
479
- .gitignore-toggle:active,
480
- .edit-btn:active {
481
- background-color: var(--hover-bg);
482
- transform: scale(0.97);
483
- }
484
-
485
- .gitignore-toggle.showing-ignored {
486
- color: var(--link-color);
487
- border-color: var(--link-color);
488
- background: rgba(88, 166, 255, 0.1);
489
- }
490
-
491
- .gitignore-toggle.showing-ignored:hover {
492
- background-color: rgba(88, 166, 255, 0.15);
493
- }
494
-
495
- .theme-icon,
496
- .gitignore-icon,
497
- .edit-icon {
498
- width: 16px;
499
- height: 16px;
500
- fill: currentColor;
501
- }
502
-
503
- .view-toggle {
504
- display: inline-flex;
505
- border: 1px solid var(--border-primary);
506
- border-radius: 6px;
507
- overflow: hidden;
508
- background: var(--bg-primary);
509
- }
510
-
511
- .view-btn {
512
- display: inline-flex;
513
- align-items: center;
514
- gap: 6px;
515
- padding: 6px 12px;
516
- background: transparent;
517
- border: none;
518
- color: var(--text-secondary);
519
- text-decoration: none;
520
- font-size: 13px;
521
- font-weight: 500;
522
- transition: all 0.15s ease;
523
- white-space: nowrap;
524
- cursor: pointer;
525
- }
526
-
527
- .view-btn:hover {
528
- background-color: var(--hover-bg);
529
- color: var(--text-primary);
530
- }
531
-
532
- .view-btn.active {
533
- background-color: var(--link-color);
534
- color: white;
535
- }
536
-
537
- .view-btn.active:hover {
538
- background-color: var(--link-color);
539
- opacity: 0.9;
540
- }
541
-
542
- .view-btn + .view-btn {
543
- border-left: 1px solid var(--border-primary);
544
- }
545
-
546
- .view-icon {
547
- width: 16px;
548
- height: 16px;
549
- fill: currentColor;
550
- flex-shrink: 0;
551
- }
552
-
553
- .breadcrumb-item {
554
- display: inline-flex;
555
- align-items: center;
556
- }
557
-
558
- .breadcrumb-item a {
559
- color: var(--link-color);
560
- text-decoration: none;
561
- font-weight: 500;
562
- padding: 2px 6px;
563
- border-radius: 4px;
564
- transition: all 0.15s ease;
565
- }
566
-
567
- .breadcrumb-item a:hover {
568
- text-decoration: none;
569
- color: var(--text-accent);
570
- background-color: var(--hover-bg);
571
- }
572
-
573
- .breadcrumb-separator {
574
- color: var(--text-secondary);
575
- margin: 0 4px;
576
- opacity: 0.7;
577
- }
578
-
579
- /* File Header */
580
- .file-header {
581
- display: flex;
582
- justify-content: space-between;
583
- align-items: center;
584
- padding: 12px 16px;
585
- margin-bottom: 12px;
586
- background-color: var(--bg-secondary);
587
- border: 1px solid var(--border-primary);
588
- border-radius: 6px;
589
- gap: 16px;
590
- flex-wrap: wrap;
591
- }
592
-
593
- .file-header-main {
594
- flex: 1;
595
- min-width: 0;
596
- display: flex;
597
- flex-direction: column;
598
- gap: 8px;
599
- }
600
-
601
- .file-path-info {
602
- display: flex;
603
- align-items: center;
604
- gap: 8px;
605
- font-size: 14px;
606
- }
607
-
608
- .file-path-text {
609
- color: var(--link-color);
610
- font-weight: 500;
611
- word-break: break-all;
612
- }
613
-
614
- .file-path-copy-btn {
615
- display: inline-flex;
616
- align-items: center;
617
- justify-content: center;
618
- padding: 4px;
619
- background: transparent;
620
- border: none;
621
- border-radius: 4px;
622
- cursor: pointer;
623
- color: var(--text-secondary);
624
- transition: all 0.15s ease;
625
- flex-shrink: 0;
626
- }
627
-
628
- .file-path-copy-btn:hover {
629
- background-color: var(--hover-bg);
630
- color: var(--text-primary);
631
- }
632
-
633
- .octicon-copy {
634
- fill: currentColor;
635
- }
636
-
637
- .file-stats {
638
- display: flex;
639
- align-items: center;
640
- gap: 4px;
641
- font-size: 12px;
642
- color: var(--text-secondary);
643
- }
644
-
645
- .file-stat {
646
- color: var(--text-secondary);
647
- }
648
-
649
- .file-stat-separator {
650
- color: var(--text-secondary);
651
- opacity: 0.5;
652
- }
653
-
654
- .file-header-actions {
655
- flex-shrink: 0;
656
- display: flex;
657
- gap: 8px;
658
- align-items: center;
659
- flex-wrap: wrap;
660
- }
661
-
662
- .file-action-group {
663
- display: inline-flex;
664
- background-color: var(--bg-primary);
665
- border: 1px solid var(--border-primary);
666
- border-radius: 6px;
667
- overflow: hidden;
668
- }
669
-
670
- .file-action-btn {
671
- display: inline-flex;
672
- align-items: center;
673
- justify-content: center;
674
- padding: 6px 12px;
675
- background: transparent;
676
- border: none;
677
- color: var(--text-secondary);
678
- text-decoration: none;
679
- font-size: 12px;
680
- font-weight: 500;
681
- cursor: pointer;
682
- transition: all 0.15s ease;
683
- white-space: nowrap;
684
- gap: 6px;
685
- border-right: 1px solid var(--border-primary);
686
- }
687
-
688
- .file-action-btn:last-child {
689
- border-right: none;
690
- }
691
-
692
- .file-action-btn:hover {
693
- background-color: var(--hover-bg);
694
- color: var(--text-primary);
695
- }
696
-
697
- .file-action-btn .file-action-label {
698
- color: inherit;
699
- }
700
-
701
- .file-action-icon {
702
- fill: currentColor;
703
- flex-shrink: 0;
704
- }
705
-
706
- .copy-raw-btn {
707
- padding: 6px;
708
- }
709
-
710
- .file-action-btn:first-child {
711
- border-radius: 6px 0 0 6px;
712
- }
713
-
714
- .file-action-btn:last-child {
715
- border-radius: 0 6px 6px 0;
716
- }
717
-
718
- /* Single button case */
719
- .file-action-group:has(.file-action-btn:only-child) .file-action-btn {
720
- border-radius: 6px;
721
- border-right: none;
722
- }
723
-
724
- main {
725
- padding: 0;
726
- display: flex;
727
- min-height: calc(100vh - 57px);
728
- background: var(--bg-primary);
729
- }
730
-
731
- /* File Tree Sidebar */
732
- .file-tree-sidebar {
733
- width: 280px;
734
- min-width: 280px;
735
- max-width: 280px;
736
- flex-shrink: 0;
737
- border-right: 1px solid var(--border-primary);
738
- overflow-y: auto;
739
- overflow-x: hidden;
740
- background: var(--bg-secondary);
741
- position: sticky;
742
- top: 0;
743
- height: 100vh;
744
- max-height: 100vh;
745
- align-self: stretch;
746
- transition: opacity 0.2s ease, visibility 0.2s ease;
747
- display: flex;
748
- flex-direction: column;
749
- }
750
-
751
- .file-tree-sidebar.hidden {
752
- display: none;
753
- }
754
-
755
- .file-tree-header {
756
- display: flex;
757
- align-items: center;
758
- gap: 8px;
759
- padding: 12px 16px;
760
- border-bottom: 1px solid var(--border-primary);
761
- background: var(--bg-secondary);
762
- position: sticky;
763
- top: 0;
764
- z-index: 1;
765
- font-size: 14px;
766
- font-weight: 600;
767
- color: var(--text-primary);
768
- }
769
-
770
- .files-icon {
771
- fill: var(--text-secondary);
772
- flex-shrink: 0;
773
- }
774
-
775
- .sidebar-controls {
776
- padding: 12px 12px 8px;
777
- border-bottom: 1px solid var(--border-primary);
778
- background: var(--bg-secondary);
779
- display: flex;
780
- flex-direction: column;
781
- gap: 8px;
782
- }
783
-
784
- .sidebar-branch {
785
- width: 100%;
786
- justify-content: flex-start;
787
- font-size: 12px;
788
- }
789
-
790
- .btn-sidebar {
791
- width: 100%;
792
- padding: 5px 12px;
793
- background: var(--bg-primary);
794
- border: 1px solid var(--border-primary);
795
- border-radius: 6px;
796
- cursor: pointer;
797
- color: var(--text-primary);
798
- transition: all 0.15s ease;
799
- display: flex;
800
- align-items: center;
801
- justify-content: center;
802
- height: 28px;
803
- font-size: 14px;
804
- }
805
-
806
- .btn-sidebar:hover {
807
- background-color: var(--bg-tertiary);
808
- border-color: var(--text-secondary);
809
- }
810
-
811
- .sidebar-search {
812
- width: 100%;
813
- }
814
-
815
- .sidebar-search .search-input {
816
- width: 100%;
817
- font-size: 12px;
818
- padding: 5px 32px 5px 28px;
819
- height: 28px;
820
- }
821
-
822
- .sidebar-search .search-hotkey {
823
- font-size: 10px;
824
- padding: 2px 4px;
825
- }
826
-
827
- .file-tree-container {
828
- padding: 8px 0;
829
- background: var(--bg-secondary);
830
- }
831
-
832
- .tree-item {
833
- display: flex;
834
- align-items: center;
835
- gap: 6px;
836
- padding: 4px 8px;
837
- cursor: pointer;
838
- font-size: 14px;
839
- line-height: 20px;
840
- color: var(--text-primary);
841
- transition: background-color 0.1s ease;
842
- user-select: none;
843
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif;
844
- }
845
-
846
- .tree-item:hover {
847
- background-color: var(--hover-bg);
848
- }
849
-
850
- .tree-item.active {
851
- background-color: var(--bg-tertiary);
852
- font-weight: 600;
853
- }
854
-
855
- .tree-toggle {
856
- font-size: 10px;
857
- color: var(--text-secondary);
858
- width: 12px;
859
- display: inline-block;
860
- text-align: center;
861
- flex-shrink: 0;
862
- }
863
-
864
- .tree-spacer {
865
- width: 12px;
866
- flex-shrink: 0;
867
- }
868
-
869
- .tree-icon {
870
- flex-shrink: 0;
871
- fill: var(--text-secondary);
872
- }
873
-
874
- .tree-icon.file-icon {
875
- fill: var(--text-secondary);
876
- opacity: 0.7;
877
- }
878
-
879
- .tree-item .tree-icon:not(.file-icon) {
880
- fill: #7dd3fc;
881
- }
882
-
883
- [data-theme="light"] .tree-item .tree-icon:not(.file-icon) {
884
- fill: #54adf5;
885
- }
886
-
887
- .tree-label {
888
- flex: 1;
889
- overflow: hidden;
890
- text-overflow: ellipsis;
891
- white-space: nowrap;
892
- font-weight: 400;
893
- letter-spacing: normal;
894
- }
895
-
896
- .tree-children {
897
- transition: none;
898
- }
899
-
900
- /* File tree loading skeleton */
901
- .tree-skeleton {
902
- padding: 8px;
903
- }
904
-
905
- .skeleton-item {
906
- height: 28px;
907
- background: linear-gradient(
908
- 90deg,
909
- var(--bg-secondary) 0%,
910
- var(--hover-bg) 50%,
911
- var(--bg-secondary) 100%
912
- );
913
- background-size: 200% 100%;
914
- animation: skeleton-loading 1.5s ease-in-out infinite;
915
- border-radius: 4px;
916
- margin-bottom: 4px;
917
- }
918
-
919
- .skeleton-indent {
920
- margin-left: 20px;
921
- width: calc(100% - 20px);
922
- }
923
-
924
- @keyframes skeleton-loading {
925
- 0% {
926
- background-position: 200% 0;
927
- }
928
- 100% {
929
- background-position: -200% 0;
930
- }
931
- }
932
-
933
- .main-content-wrapper {
934
- flex: 1;
935
- min-width: 0;
936
- display: flex;
937
- flex-direction: column;
938
- transition: opacity 0.15s ease;
939
- }
940
-
941
- .main-content-wrapper.no-sidebar {
942
- width: 100%;
943
- max-width: 1280px;
944
- margin: 0 auto;
945
- }
946
-
947
- .main-content-wrapper.no-sidebar .repo-canvas-content {
948
- max-width: 980px;
949
- }
950
-
951
- .main-content {
952
- max-width: 1200px;
953
- margin: 0 auto;
954
- padding: 16px 24px;
955
- width: 100%;
956
- }
957
-
958
- .directory-actions {
959
- display: flex;
960
- gap: 8px;
961
- margin-bottom: 16px;
962
- }
963
-
964
- .btn-icon {
965
- width: 14px;
966
- height: 14px;
967
- fill: currentColor;
968
- margin-right: 6px;
969
- vertical-align: text-bottom;
970
- }
971
-
972
- .file-table {
973
- width: 100%;
974
- border-collapse: collapse;
975
- background-color: var(--bg-primary);
976
- border: 1px solid var(--border-primary);
977
- border-radius: 6px;
978
- overflow: hidden;
979
- }
980
-
981
- .file-table thead {
982
- background-color: var(--bg-secondary);
983
- }
984
-
985
- .file-table th {
986
- padding: 8px 16px;
987
- text-align: left;
988
- font-weight: 600;
989
- font-size: 12px;
990
- color: var(--text-accent);
991
- border-bottom: 1px solid var(--border-primary);
992
- text-transform: uppercase;
993
- letter-spacing: 0.5px;
994
- }
995
-
996
- .file-table tbody tr {
997
- border-bottom: 1px solid var(--border-secondary);
998
- }
999
-
1000
- .file-table tbody tr:hover {
1001
- background-color: var(--hover-bg);
1002
- }
1003
-
1004
- .file-table td {
1005
- padding: 6px 16px;
1006
- font-size: 14px;
1007
- vertical-align: middle;
1008
- }
1009
-
1010
- .file-table .icon {
1011
- width: 24px;
1012
- text-align: center;
1013
- font-size: 16px;
1014
- }
1015
-
1016
- .octicon-file,
1017
- .octicon-directory,
1018
- .octicon-breadcrumb,
1019
- .octicon-separator,
1020
- .octicon-home,
1021
- .theme-icon,
1022
- .view-icon,
1023
- .edit-icon {
1024
- width: 16px;
1025
- height: 16px;
1026
- fill: currentColor;
1027
- vertical-align: text-bottom;
1028
- }
1029
-
1030
- /* Brighter, meaningful colors */
1031
- /* Folders: GitHub-style baby blue */
1032
- .octicon-directory {
1033
- fill: #7dd3fc;
1034
- color: #7dd3fc;
1035
- }
1036
- [data-theme="dark"] .file-row--added .icon .octicon-directory,
1037
- [data-theme="dark"] .file-row--added .icon .octicon-file { color: #2ea043; fill: #2ea043; }
1038
- [data-theme="dark"] .file-row--deleted .icon .octicon-directory,
1039
- [data-theme="dark"] .file-row--deleted .icon .octicon-file { color: #f85149; fill: #f85149; }
1040
- [data-theme="dark"] .file-row--modified .icon .octicon-directory,
1041
- [data-theme="dark"] .file-row--modified .icon .octicon-file { color: #d29922; fill: #d29922; }
1042
- [data-theme="dark"] .file-row--renamed .icon .octicon-directory,
1043
- [data-theme="dark"] .file-row--renamed .icon .octicon-file { color: #1f6feb; fill: #1f6feb; }
1044
- [data-theme="dark"] .file-row--untracked .icon .octicon-directory,
1045
- [data-theme="dark"] .file-row--untracked .icon .octicon-file { color: #a371f7; fill: #a371f7; }
1046
- [data-theme="dark"] .file-row--mixed .icon .octicon-directory,
1047
- [data-theme="dark"] .file-row--mixed .icon .octicon-file { color: #db6d28; fill: #db6d28; }
1048
-
1049
- [data-theme="light"] .file-row--added .icon .octicon-directory,
1050
- [data-theme="light"] .file-row--added .icon .octicon-file { color: #1a7f37; fill: #1a7f37; }
1051
- [data-theme="light"] .file-row--deleted .icon .octicon-directory,
1052
- [data-theme="light"] .file-row--deleted .icon .octicon-file { color: #cf222e; fill: #cf222e; }
1053
- [data-theme="light"] .file-row--modified .icon .octicon-directory,
1054
- [data-theme="light"] .file-row--modified .icon .octicon-file { color: #bf8700; fill: #bf8700; }
1055
- [data-theme="light"] .file-row--renamed .icon .octicon-directory,
1056
- [data-theme="light"] .file-row--renamed .icon .octicon-file { color: #0969da; fill: #0969da; }
1057
- [data-theme="light"] .file-row--untracked .icon .octicon-directory,
1058
- [data-theme="light"] .file-row--untracked .icon .octicon-file { color: #8250df; fill: #8250df; }
1059
- [data-theme="light"] .file-row--mixed .icon .octicon-directory,
1060
- [data-theme="light"] .file-row--mixed .icon .octicon-file { color: #9a6700; fill: #9a6700; }
1061
-
1062
- [data-theme="light"] .octicon-directory {
1063
- fill: #54adf5;
1064
- color: #54adf5;
1065
- }
1066
-
1067
- .octicon-home {
1068
- margin-right: 8px;
1069
- }
1070
-
1071
- .octicon-separator {
1072
- width: 12px;
1073
- height: 12px;
1074
- margin: 0 4px;
1075
- opacity: 0.7;
1076
- }
1077
-
1078
- .text-yellow { color: #f9c513; }
1079
- .text-blue { color: #0969da; }
1080
- .text-green { color: #1a7f37; }
1081
- .text-red { color: #cf222e; }
1082
- .text-orange { color: #fb8500; }
1083
- .text-purple { color: #8250df; }
1084
- .text-gray { color: var(--text-secondary); }
1085
-
1086
- [data-theme="light"] .text-yellow { color: #dbab09; }
1087
- [data-theme="light"] .text-blue { color: #0550ae; }
1088
- [data-theme="light"] .text-green { color: #116329; }
1089
- [data-theme="light"] .text-red { color: #82071e; }
1090
- [data-theme="light"] .text-orange { color: #bc4c00; }
1091
- [data-theme="light"] .text-purple { color: #6f42c1; }
1092
-
1093
- /* Old search styles removed - using new GitHub-style search */
1094
-
1095
- /* Language stats in control bar */
1096
- .language-stats {
1097
- display: flex;
1098
- align-items: center;
1099
- gap: 8px;
1100
- margin-left: 16px;
1101
- max-width: none; /* allow full content */
1102
- overflow: visible; /* avoid clipping at edges */
1103
- position: relative;
1104
- white-space: nowrap; /* keep in a single row like GitHub */
1105
- }
1106
-
1107
- .language-stats:hover {
1108
- overflow: visible;
1109
- z-index: 10;
1110
- }
1111
-
1112
- .language-stats:hover::before {
1113
- content: '';
1114
- position: absolute;
1115
- top: -4px;
1116
- left: -8px;
1117
- right: -8px;
1118
- bottom: -4px;
1119
- background: var(--bg-secondary);
1120
- border: 1px solid var(--border-primary);
1121
- border-radius: 6px;
1122
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
1123
- z-index: -1;
1124
- pointer-events: none;
1125
- }
1126
-
1127
- .lang-stat {
1128
- display: flex;
1129
- align-items: center;
1130
- gap: 4px;
1131
- font-size: 11px;
1132
- color: var(--text-secondary);
1133
- white-space: nowrap;
1134
- flex-shrink: 0;
1135
- padding: 2px 0;
1136
- }
1137
-
1138
- .lang-dot {
1139
- width: 8px;
1140
- height: 8px;
1141
- border-radius: 50%;
1142
- display: inline-block;
1143
- flex-shrink: 0;
1144
- }
1145
-
1146
- .lang-name {
1147
- font-weight: 500;
1148
- color: var(--text-primary);
1149
- }
1150
-
1151
- .lang-percent {
1152
- color: var(--text-secondary);
1153
- }
1154
-
1155
- /* File table improvements */
1156
- .file-table-container {
1157
- margin-bottom: 24px;
1158
- }
1159
-
1160
- .file-row {
1161
- transition: all 0.15s ease;
1162
- cursor: pointer;
1163
- }
1164
-
1165
- .file-row:hover {
1166
- background-color: var(--hover-bg);
1167
- transform: translateX(2px);
1168
- }
1169
-
1170
- .file-row.focused {
1171
- background-color: var(--link-color);
1172
- color: white;
1173
- }
1174
-
1175
- .file-row.focused a {
1176
- color: white;
1177
- }
1178
-
1179
- .file-row.focused .text-yellow,
1180
- .file-row.focused .text-blue,
1181
- .file-row.focused .text-green,
1182
- .file-row.focused .text-red,
1183
- .file-row.focused .text-orange,
1184
- .file-row.focused .text-purple,
1185
- .file-row.focused .text-gray {
1186
- color: rgba(255, 255, 255, 0.9);
1187
- }
1188
-
1189
- .file-row.hidden,
1190
- .tree-item.hidden,
1191
- .tree-children.hidden {
1192
- display: none;
1193
- }
1194
-
1195
- /* README preview - GitHub style */
1196
- .readme-section {
1197
- margin-top: 32px;
1198
- border: 1px solid var(--border-primary);
1199
- border-radius: 8px;
1200
- overflow: hidden;
1201
- background: var(--bg-primary);
1202
- }
1203
-
1204
- .readme-header {
1205
- background: var(--bg-secondary);
1206
- border-bottom: 1px solid var(--border-primary);
1207
- padding: 12px 16px;
1208
- }
1209
-
1210
- .readme-header h2 {
1211
- font-size: 14px;
1212
- font-weight: 600;
1213
- color: var(--text-accent);
1214
- display: flex;
1215
- align-items: center;
1216
- margin: 0;
1217
- }
1218
-
1219
- .readme-icon {
1220
- width: 16px;
1221
- height: 16px;
1222
- fill: currentColor;
1223
- margin-right: 8px;
1224
- }
1225
-
1226
- .readme-content {
1227
- padding: 32px;
1228
- max-height: none;
1229
- overflow-y: visible;
1230
- }
1231
-
1232
- .readme-content .markdown {
1233
- padding: 0;
1234
- }
1235
-
1236
- /* Enhanced animations */
1237
-
1238
-
1239
- /* Loading states */
1240
-
1241
- /* Quick actions */
1242
- .name {
1243
- position: relative;
1244
- display: flex;
1245
- align-items: center;
1246
- gap: 4px;
1247
- flex-wrap: nowrap;
1248
- }
1249
-
1250
- .quick-actions {
1251
- opacity: 0;
1252
- display: flex;
1253
- gap: 4px;
1254
- position: absolute;
1255
- right: 8px;
1256
- top: 50%;
1257
- transform: translateY(-50%);
1258
- transition: opacity 0.2s ease;
1259
- z-index: 10;
1260
- }
1261
-
1262
- .file-row:hover .quick-actions {
1263
- opacity: 1;
1264
- }
1265
-
1266
- .quick-btn {
1267
- background: var(--bg-secondary);
1268
- border: 1px solid var(--border-primary);
1269
- border-radius: 4px;
1270
- padding: 4px 6px;
1271
- cursor: pointer;
1272
- color: var(--text-secondary);
1273
- transition: all 0.15s ease;
1274
- display: flex;
1275
- align-items: center;
1276
- justify-content: center;
1277
- text-decoration: none;
1278
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
1279
- }
1280
-
1281
- .quick-btn:hover {
1282
- background: var(--hover-bg);
1283
- color: var(--text-primary);
1284
- border-color: var(--text-secondary);
1285
- transform: translateY(-1px);
1286
- box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
1287
- }
1288
-
1289
- .quick-icon {
1290
- width: 12px;
1291
- height: 12px;
1292
- fill: currentColor;
1293
- }
1294
-
1295
- /* Improve name column to accommodate quick actions */
1296
- .file-table .name {
1297
- padding-right: 80px;
1298
- min-width: 200px;
1299
- }
1300
-
1301
- .file-table .name a {
1302
- display: block;
1303
- overflow: hidden;
1304
- text-overflow: ellipsis;
1305
- white-space: nowrap;
1306
- padding-right: 8px;
1307
- }
1308
-
1309
- .file-table .name a {
1310
- color: var(--link-color);
1311
- text-decoration: none;
1312
- font-weight: 600;
1313
- }
1314
-
1315
- .file-table .name a:hover {
1316
- text-decoration: underline;
1317
- }
1318
-
1319
- .file-table .size,
1320
- .file-table .modified {
1321
- color: var(--text-secondary);
1322
- font-size: 12px;
1323
- white-space: nowrap;
1324
- }
1325
-
1326
- .file-content {
1327
- background-color: var(--bg-primary);
1328
- border: 1px solid var(--border-primary);
1329
- border-radius: 6px;
1330
- overflow: auto;
1331
- }
1332
-
1333
- .file-content pre {
1334
- margin: 0;
1335
- padding: 0;
1336
- overflow-x: auto;
1337
- font-size: 12px;
1338
- line-height: 20px;
1339
- background-color: var(--bg-primary);
1340
- }
1341
-
1342
- .file-content code {
1343
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
1344
- font-size: 12px;
1345
- font-weight: 400;
1346
- }
1347
-
1348
- /* Image viewing styles */
1349
- .image-container {
1350
- padding: 20px;
1351
- text-align: center;
1352
- background-color: var(--bg-primary);
1353
- border-radius: 6px;
1354
- }
1355
-
1356
- .image-display {
1357
- max-width: 100%;
1358
- max-height: 80vh;
1359
- height: auto;
1360
- border-radius: 6px;
1361
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);
1362
- background: var(--bg-secondary);
1363
- }
1364
-
1365
- [data-theme="light"] .image-display {
1366
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06);
1367
- }
1368
-
1369
- .image-info {
1370
- margin-top: 16px;
1371
- padding-top: 16px;
1372
- border-top: 1px solid var(--border-primary);
1373
- }
1374
-
1375
- .image-filename {
1376
- font-size: 14px;
1377
- font-weight: 600;
1378
- color: var(--text-primary);
1379
- }
1380
-
1381
- /* Binary file viewing styles */
1382
- .binary-file-container {
1383
- padding: 40px 20px;
1384
- text-align: center;
1385
- background-color: var(--bg-primary);
1386
- border-radius: 6px;
1387
- border: 1px solid var(--border-primary);
1388
- }
1389
-
1390
- .binary-file-info h3 {
1391
- font-size: 18px;
1392
- font-weight: 600;
1393
- color: var(--text-primary);
1394
- margin-bottom: 12px;
1395
- }
1396
-
1397
- .binary-file-info p {
1398
- font-size: 14px;
1399
- color: var(--text-secondary);
1400
- margin-bottom: 20px;
1401
- }
1402
-
1403
- .binary-file-info .btn {
1404
- display: inline-flex;
1405
- align-items: center;
1406
- gap: 8px;
1407
- padding: 8px 16px;
1408
- border-radius: 6px;
1409
- font-size: 14px;
1410
- font-weight: 500;
1411
- text-decoration: none;
1412
- border: 1px solid transparent;
1413
- cursor: pointer;
1414
- }
1415
-
1416
- .binary-file-info .btn-primary {
1417
- background-color: var(--link-color);
1418
- color: white;
1419
- }
1420
-
1421
- .binary-file-info .btn-primary:hover {
1422
- opacity: 0.9;
1423
- }
1424
-
1425
- /* Line numbers for code viewing */
1426
- .with-line-numbers {
1427
- counter-reset: line;
1428
- display: block;
1429
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
1430
- font-weight: 400;
1431
- }
1432
-
1433
- .line-container {
1434
- display: block;
1435
- position: relative;
1436
- transition: background-color 0.12s ease;
1437
- padding: 0;
1438
- line-height: 20px;
1439
- min-height: 20px;
1440
- }
1441
-
1442
- /* Remove pseudo-newline that created extra blank lines */
1443
-
1444
- .line-container:hover {
1445
- background-color: rgba(110, 118, 129, 0.1); /* subtle hover like GH */
1446
- }
1447
-
1448
- .line-container.selected {
1449
- background-color: #fffbdd; /* GH light selection */
1450
- }
1451
-
1452
- [data-theme="dark"] .line-container.selected {
1453
- background-color: rgba(187, 128, 9, 0.18); /* GH-ish dark yellow */
1454
- }
1455
-
1456
- /* Editor */
1457
- .editor-container {
1458
- border: 1px solid var(--border-primary);
1459
- border-radius: 6px;
1460
- margin: 0;
1461
- background: var(--bg-primary);
1462
- box-shadow: 0 1px 3px rgba(27, 31, 36, 0.12);
1463
- }
1464
-
1465
- .editor-header {
1466
- padding: 12px 16px;
1467
- border-bottom: 1px solid var(--border-primary);
1468
- background: var(--bg-secondary);
1469
- border-radius: 6px 6px 0 0;
1470
- display: flex;
1471
- justify-content: space-between;
1472
- align-items: center;
1473
- }
1474
-
1475
- .editor-title {
1476
- font-size: 14px;
1477
- font-weight: 600;
1478
- color: var(--text-accent);
1479
- display: flex;
1480
- align-items: center;
1481
- margin: 0;
1482
- }
1483
-
1484
- .editor-actions {
1485
- display: flex;
1486
- gap: 6px;
1487
- }
1488
-
1489
- .btn {
1490
- padding: 6px 12px;
1491
- border-radius: 6px;
1492
- font-size: 12px;
1493
- font-weight: 500;
1494
- cursor: pointer;
1495
- border: 1px solid var(--border-primary);
1496
- transition: all 0.15s ease;
1497
- white-space: nowrap;
1498
- }
1499
-
1500
- .btn-primary {
1501
- background: #2da44e;
1502
- color: white;
1503
- border-color: #1b6b32;
1504
- box-shadow: 0 1px 0 rgba(27, 31, 36, 0.04);
1505
- }
1506
-
1507
- .btn-primary:hover {
1508
- background: #2c974b;
1509
- border-color: #1a5d2e;
1510
- }
1511
-
1512
- .btn-secondary {
1513
- background: var(--bg-primary);
1514
- color: var(--text-primary);
1515
- border-color: var(--border-primary);
1516
- box-shadow: 0 1px 0 rgba(27, 31, 36, 0.04);
1517
- }
1518
-
1519
- .btn-secondary:hover {
1520
- background: var(--hover-bg);
1521
- border-color: var(--text-secondary);
1522
- }
1523
-
1524
-
1525
-
1526
-
1527
- /* Monaco editor container (current) */
1528
- #file-editor.monaco-editor {
1529
- height: 100% !important;
1530
- width: 100% !important;
1531
- padding: 0 !important;
1532
- border: none !important;
1533
- background: transparent !important;
1534
- flex: none !important;
1535
- }
1536
-
1537
- .editor-with-line-numbers:focus-within {
1538
- border-color: #0969da;
1539
- box-shadow: 0 0 0 0.2em rgba(9, 105, 218, 0.3);
1540
- }
1541
-
1542
- [data-theme="dark"] .editor-with-line-numbers:focus-within {
1543
- border-color: #58a6ff;
1544
- box-shadow: 0 0 0 0.2em rgba(88, 166, 255, 0.3);
1545
- }
1546
-
1547
- /* New file interface */
1548
- .new-file-container {
1549
- border: 1px solid var(--border-primary);
1550
- border-radius: 6px;
1551
- background: var(--bg-primary);
1552
- box-shadow: 0 1px 3px rgba(27, 31, 36, 0.12);
1553
- }
1554
-
1555
- .new-file-header {
1556
- padding: 16px;
1557
- border-bottom: 1px solid var(--border-primary);
1558
- background: var(--bg-secondary);
1559
- border-radius: 6px 6px 0 0;
1560
- display: flex;
1561
- justify-content: space-between;
1562
- align-items: center;
1563
- gap: 16px;
1564
- }
1565
-
1566
- .filename-section {
1567
- display: flex;
1568
- align-items: center;
1569
- gap: 12px;
1570
- flex: 1;
1571
- }
1572
-
1573
- .filename-label {
1574
- font-size: 14px;
1575
- font-weight: 600;
1576
- color: var(--text-primary);
1577
- white-space: nowrap;
1578
- }
1579
-
1580
- .new-filename-input {
1581
- flex: 1;
1582
- padding: 8px 12px;
1583
- font-size: 14px;
1584
- border: 1px solid var(--border-primary);
1585
- border-radius: 6px;
1586
- background: var(--bg-primary);
1587
- color: var(--text-primary);
1588
- outline: none;
1589
- transition: border-color 0.15s ease;
1590
- }
1591
-
1592
- .new-filename-input:focus {
1593
- border-color: #0969da;
1594
- box-shadow: 0 0 0 0.2em rgba(9, 105, 218, 0.3);
1595
- }
1596
-
1597
- [data-theme="dark"] .new-filename-input:focus {
1598
- border-color: #58a6ff;
1599
- box-shadow: 0 0 0 0.2em rgba(88, 166, 255, 0.3);
1600
- }
1601
-
1602
- .new-file-actions {
1603
- display: flex;
1604
- gap: 8px;
1605
- }
1606
-
1607
-
1608
-
1609
- .line-number {
1610
- display: inline-block;
1611
- width: 56px;
1612
- text-align: right;
1613
- margin-right: 0;
1614
- padding: 0 10px;
1615
- color: var(--text-secondary);
1616
- background: transparent;
1617
- border-right: 1px solid var(--border-primary);
1618
- font-size: 12px;
1619
- line-height: 20px;
1620
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
1621
- font-weight: 400;
1622
- user-select: none;
1623
- -webkit-user-select: none;
1624
- text-decoration: none;
1625
- cursor: pointer;
1626
- }
1627
-
1628
- .line-number:hover {
1629
- color: var(--link-color);
1630
- text-decoration: none;
1631
- }
1632
-
1633
- .line-content {
1634
- white-space: pre;
1635
- display: inline;
1636
- padding: 0 10px;
1637
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
1638
- font-size: 12px;
1639
- line-height: 20px;
1640
- font-weight: 400;
1641
- letter-spacing: normal;
1642
- }
1643
-
1644
- /* Keep gutter simple: only border-right, no per-line background */
1645
-
1646
- /* GitHub syntax highlighting - Dark theme */
1647
- .hljs-comment,
1648
- .hljs-quote {
1649
- font-style: normal !important;
1650
- color: #8b949e;
1651
- }
1652
-
1653
- .hljs-keyword,
1654
- .hljs-selector-tag,
1655
- .hljs-literal,
1656
- .hljs-doctag {
1657
- color: #ff7b72;
1658
- }
1659
-
1660
- .hljs-number {
1661
- color: #79c0ff;
1662
- }
1663
-
1664
- .hljs-string,
1665
- .hljs-regexp {
1666
- color: #a5d6ff;
1667
- }
1668
-
1669
- .hljs-title,
1670
- .hljs-section {
1671
- color: #d2a8ff;
1672
- }
1673
-
1674
- .hljs-name,
1675
- .hljs-attribute {
1676
- color: #ffa657;
1677
- }
1678
-
1679
- .hljs-variable,
1680
- .hljs-template-variable {
1681
- color: #ffa657;
1682
- }
1683
-
1684
- .hljs-type,
1685
- .hljs-class .hljs-title {
1686
- color: #ffa657;
1687
- }
1688
-
1689
- .hljs-symbol,
1690
- .hljs-bullet,
1691
- .hljs-built_in,
1692
- .hljs-builtin-name {
1693
- color: #ff7b72;
1694
- }
1695
-
1696
- .hljs-function {
1697
- color: #d2a8ff;
1698
- }
1699
-
1700
- .hljs-tag {
1701
- color: #7ee787;
1702
- }
1703
-
1704
- .hljs-meta {
1705
- color: #79c0ff;
1706
- }
1707
-
1708
- .hljs-deletion {
1709
- color: #ffa198;
1710
- background-color: #490202;
1711
- }
1712
-
1713
- .hljs-addition {
1714
- color: #aff5b4;
1715
- background-color: #033a16;
1716
- }
1717
-
1718
- .hljs-emphasis {
1719
- font-style: italic;
1720
- }
1721
-
1722
- .hljs-strong {
1723
- font-weight: bold;
1724
- }
1725
-
1726
- /* GitHub syntax highlighting - Light theme */
1727
- [data-theme="light"] .hljs-comment,
1728
- [data-theme="light"] .hljs-quote {
1729
- color: #656d76;
1730
- }
1731
-
1732
- [data-theme="light"] .hljs-keyword,
1733
- [data-theme="light"] .hljs-selector-tag,
1734
- [data-theme="light"] .hljs-literal,
1735
- [data-theme="light"] .hljs-doctag {
1736
- color: #cf222e;
1737
- }
1738
-
1739
- [data-theme="light"] .hljs-number {
1740
- color: #0550ae;
1741
- }
1742
-
1743
- [data-theme="light"] .hljs-string,
1744
- [data-theme="light"] .hljs-regexp {
1745
- color: #0a3069;
1746
- }
1747
-
1748
- [data-theme="light"] .hljs-title,
1749
- [data-theme="light"] .hljs-section {
1750
- color: #8250df;
1751
- }
1752
-
1753
- [data-theme="light"] .hljs-name,
1754
- [data-theme="light"] .hljs-attribute {
1755
- color: #953800;
1756
- }
1757
-
1758
- [data-theme="light"] .hljs-variable,
1759
- [data-theme="light"] .hljs-template-variable {
1760
- color: #953800;
1761
- }
1762
-
1763
- [data-theme="light"] .hljs-type,
1764
- [data-theme="light"] .hljs-class .hljs-title {
1765
- color: #953800;
1766
- }
1767
-
1768
- [data-theme="light"] .hljs-symbol,
1769
- [data-theme="light"] .hljs-bullet,
1770
- [data-theme="light"] .hljs-built_in,
1771
- [data-theme="light"] .hljs-builtin-name {
1772
- color: #cf222e;
1773
- }
1774
-
1775
- [data-theme="light"] .hljs-function {
1776
- color: #8250df;
1777
- }
1778
-
1779
- [data-theme="light"] .hljs-tag {
1780
- color: #116329;
1781
- }
1782
-
1783
- [data-theme="light"] .hljs-meta {
1784
- color: #0550ae;
1785
- }
1786
-
1787
- [data-theme="light"] .hljs-deletion {
1788
- color: #82071e;
1789
- background-color: #ffebe9;
1790
- }
1791
-
1792
- [data-theme="light"] .hljs-addition {
1793
- color: #116329;
1794
- background-color: #dafbe1;
1795
- }
1796
-
1797
- /* Beautiful markdown rendering for all contexts */
1798
- .markdown {
1799
- padding: 32px;
1800
- max-width: 100%;
1801
- font-size: 16px;
1802
- line-height: 1.6;
1803
- }
1804
-
1805
- /* Headings with proper hierarchy */
1806
- .markdown h1 {
1807
- font-size: 2rem;
1808
- font-weight: 600;
1809
- margin: 0 0 24px 0;
1810
- padding-bottom: 12px;
1811
- border-bottom: 1px solid var(--border-primary);
1812
- color: var(--text-accent);
1813
- line-height: 1.25;
1814
- }
1815
-
1816
- .markdown h2 {
1817
- font-size: 1.5rem;
1818
- font-weight: 600;
1819
- margin: 32px 0 16px 0;
1820
- color: var(--text-accent);
1821
- border-bottom: 1px solid var(--border-secondary);
1822
- padding-bottom: 8px;
1823
- line-height: 1.25;
1824
- }
1825
-
1826
- .markdown h3 {
1827
- font-size: 1.25rem;
1828
- font-weight: 600;
1829
- margin: 24px 0 16px 0;
1830
- color: var(--text-accent);
1831
- border: none;
1832
- line-height: 1.25;
1833
- }
1834
-
1835
- .markdown h4 {
1836
- font-size: 1rem;
1837
- font-weight: 600;
1838
- margin: 24px 0 16px 0;
1839
- color: var(--text-accent);
1840
- border: none;
1841
- line-height: 1.25;
1842
- }
1843
-
1844
- .markdown h5,
1845
- .markdown h6 {
1846
- font-size: 0.875rem;
1847
- font-weight: 600;
1848
- margin: 20px 0 12px 0;
1849
- color: var(--text-accent);
1850
- border: none;
1851
- line-height: 1.25;
1852
- }
1853
-
1854
- /* Paragraphs and text */
1855
- .markdown p {
1856
- margin-bottom: 16px;
1857
- color: var(--text-primary);
1858
- line-height: 1.6;
1859
- font-size: 16px;
1860
- }
1861
-
1862
- /* Lists with custom styling */
1863
- .markdown ul,
1864
- .markdown ol {
1865
- margin-bottom: 16px;
1866
- padding-left: 0;
1867
- list-style: none;
1868
- }
1869
-
1870
- .markdown li {
1871
- margin-bottom: 8px;
1872
- color: var(--text-primary);
1873
- line-height: 1.6;
1874
- font-size: 16px;
1875
- position: relative;
1876
- padding-left: 24px;
1877
- }
1878
-
1879
- .markdown ul li:before {
1880
- content: "•";
1881
- color: var(--text-secondary);
1882
- font-size: 18px;
1883
- position: absolute;
1884
- left: 0;
1885
- top: 0;
1886
- }
1887
-
1888
- .markdown ol {
1889
- counter-reset: item;
1890
- }
1891
-
1892
- .markdown ol li {
1893
- counter-increment: item;
1894
- padding-left: 32px;
1895
- }
1896
-
1897
- .markdown ol li:before {
1898
- content: counter(item) ".";
1899
- color: var(--text-secondary);
1900
- font-weight: 600;
1901
- position: absolute;
1902
- left: 0;
1903
- top: 0;
1904
- }
1905
-
1906
- .markdown li strong {
1907
- color: var(--text-accent);
1908
- font-weight: 600;
1909
- }
1910
-
1911
- /* Code styling */
1912
- .markdown code {
1913
- background-color: var(--bg-secondary);
1914
- padding: 3px 6px;
1915
- border-radius: 6px;
1916
- font-size: 85%;
1917
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
1918
- color: var(--text-accent);
1919
- border: 1px solid var(--border-primary);
1920
- }
1921
-
1922
- .markdown pre {
1923
- background-color: var(--bg-secondary);
1924
- padding: 16px;
1925
- border-radius: 8px;
1926
- overflow-x: auto;
1927
- margin: 16px 0;
1928
- border: 1px solid var(--border-primary);
1929
- }
1930
-
1931
- .markdown pre code {
1932
- background: none;
1933
- padding: 0;
1934
- border: none;
1935
- font-size: 14px;
1936
- color: var(--text-primary);
1937
- }
1938
-
1939
- /* Other elements */
1940
- .markdown blockquote {
1941
- border-left: 4px solid var(--border-primary);
1942
- padding-left: 16px;
1943
- margin: 16px 0;
1944
- color: var(--text-secondary);
1945
- font-style: italic;
1946
- }
1947
-
1948
- .markdown a {
1949
- color: var(--link-color);
1950
- text-decoration: none;
1951
- }
1952
-
1953
- .markdown a:hover {
1954
- text-decoration: underline;
1955
- }
1956
-
1957
- .markdown table {
1958
- border-collapse: collapse;
1959
- margin-bottom: 16px;
1960
- width: 100%;
1961
- }
1962
-
1963
- .markdown table th,
1964
- .markdown table td {
1965
- border: 1px solid var(--border-primary);
1966
- padding: 8px 12px;
1967
- text-align: left;
1968
- }
1969
-
1970
- .markdown table th {
1971
- background-color: var(--bg-secondary);
1972
- font-weight: 600;
1973
- color: var(--text-accent);
1974
- }
1975
-
1976
- .markdown hr {
1977
- border: none;
1978
- border-top: 1px solid var(--border-primary);
1979
- margin: 24px 0;
1980
- }
1981
-
1982
-
1983
- @media (max-width: 768px) {
1984
- .main-content {
1985
- padding: 12px 16px;
1986
- }
1987
-
1988
- .repo-canvas-content {
1989
- padding: 12px 16px;
1990
- }
1991
-
1992
- .header-content {
1993
- padding: 8px 16px;
1994
- }
1995
-
1996
- .header-left h1 {
1997
- font-size: 14px;
1998
- }
1999
-
2000
- .file-table .size,
2001
- .file-table .modified {
2002
- display: none;
2003
- }
2004
-
2005
- .repo-controls {
2006
- flex-direction: column;
2007
- gap: 12px;
2008
- align-items: stretch;
2009
- }
2010
-
2011
- .repo-controls-right {
2012
- flex-direction: column;
2013
- gap: 8px;
2014
- }
2015
-
2016
- .keyboard-help-content {
2017
- margin: 20px;
2018
- max-width: calc(100% - 40px);
2019
- }
2020
-
2021
- .keyboard-shortcuts-grid {
2022
- grid-template-columns: 1fr;
2023
- gap: 24px;
2024
- }
2025
-
2026
- .keyboard-help-body {
2027
- padding: 20px;
2028
- }
2029
- }
2030
-
2031
- /* Notification System */
2032
- .notification {
2033
- position: fixed;
2034
- top: 20px;
2035
- right: 20px;
2036
- padding: 12px 16px;
2037
- border-radius: 6px;
2038
- color: white;
2039
- font-size: 14px;
2040
- font-weight: 500;
2041
- z-index: 10000;
2042
- max-width: 400px;
2043
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
2044
- backdrop-filter: blur(10px);
2045
- border: 1px solid rgba(255, 255, 255, 0.1);
2046
- transition: opacity 0.3s ease;
2047
- }
2048
-
2049
- .notification-success {
2050
- background: rgba(46, 160, 67, 0.9);
2051
- border-color: rgba(46, 160, 67, 0.5);
2052
- }
2053
-
2054
- .notification-error {
2055
- background: rgba(248, 81, 73, 0.9);
2056
- border-color: rgba(248, 81, 73, 0.5);
2057
- }
2058
-
2059
- .notification-info {
2060
- background: rgba(88, 166, 255, 0.9);
2061
- border-color: rgba(88, 166, 255, 0.5);
2062
- }
2063
-
2064
-
2065
-
2066
- /* Keyboard Help Overlay */
2067
- .keyboard-help-overlay {
2068
- position: fixed;
2069
- top: 0;
2070
- left: 0;
2071
- width: 100%;
2072
- height: 100%;
2073
- background: rgba(0, 0, 0, 0.8);
2074
- backdrop-filter: blur(4px);
2075
- z-index: 99999;
2076
- display: flex;
2077
- align-items: center;
2078
- justify-content: center;
2079
- animation: fadeIn 0.2s ease-out;
2080
- }
2081
-
2082
- .keyboard-help-content {
2083
- background: var(--bg-primary);
2084
- border: 1px solid var(--border-primary);
2085
- border-radius: 8px;
2086
- box-shadow: 0 16px 48px rgba(0, 0, 0, 0.5);
2087
- max-width: 800px;
2088
- max-height: 80vh;
2089
- overflow-y: auto;
2090
- margin: 20px;
2091
- animation: slideUp 0.3s ease-out;
2092
- }
2093
-
2094
- .keyboard-help-header {
2095
- display: flex;
2096
- justify-content: space-between;
2097
- align-items: center;
2098
- padding: 24px 30px 16px;
2099
- border-bottom: 1px solid var(--border-primary);
2100
- background: var(--bg-secondary);
2101
- border-radius: 8px 8px 0 0;
2102
- }
2103
-
2104
- .keyboard-help-header h2 {
2105
- color: var(--text-primary);
2106
- font-size: 24px;
2107
- font-weight: 600;
2108
- margin: 0;
2109
- }
2110
-
2111
- .keyboard-help-close {
2112
- background: none;
2113
- border: none;
2114
- color: var(--text-secondary);
2115
- font-size: 24px;
2116
- cursor: pointer;
2117
- padding: 4px;
2118
- border-radius: 4px;
2119
- transition: color 0.2s ease;
2120
- }
2121
-
2122
- .keyboard-help-close:hover {
2123
- color: var(--text-primary);
2124
- background: var(--hover-bg);
2125
- }
2126
-
2127
- .keyboard-help-body {
2128
- padding: 0;
2129
- }
2130
-
2131
- .shortcuts-container {
2132
- display: grid;
2133
- grid-template-columns: 1fr 1fr;
2134
- gap: 0;
2135
- }
2136
-
2137
- .shortcut-section {
2138
- border-right: 1px solid var(--border-primary);
2139
- padding: 40px 50px;
2140
- }
2141
-
2142
- .shortcut-section:last-child {
2143
- border-right: none;
2144
- }
2145
-
2146
-
2147
- .shortcut-section h3 {
2148
- color: var(--text-primary);
2149
- font-size: 16px;
2150
- font-weight: 600;
2151
- margin: 0 0 24px 0;
2152
- }
2153
-
2154
- .shortcut-list {
2155
- display: flex;
2156
- flex-direction: column;
2157
- gap: 20px;
2158
- }
2159
-
2160
- .shortcut-item {
2161
- display: flex;
2162
- justify-content: space-between;
2163
- align-items: center;
2164
- padding: 0;
2165
- border-radius: 0;
2166
- transition: none;
2167
- }
2168
-
2169
-
2170
- .shortcut-keys {
2171
- display: flex;
2172
- gap: 6px;
2173
- align-items: center;
2174
- }
2175
-
2176
- .shortcut-keys kbd {
2177
- background: var(--bg-tertiary);
2178
- border: 1px solid var(--border-secondary);
2179
- border-radius: 4px;
2180
- padding: 4px 8px;
2181
- font-size: 11px;
2182
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
2183
- color: var(--text-primary);
2184
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
2185
- white-space: nowrap;
2186
- min-width: 20px;
2187
- text-align: center;
2188
- }
2189
-
2190
- .shortcut-desc {
2191
- color: var(--text-primary);
2192
- flex: 1;
2193
- text-align: left;
2194
- font-size: 14px;
2195
- }
2196
-
2197
- @keyframes fadeIn {
2198
- from {
2199
- opacity: 0;
2200
- }
2201
- to {
2202
- opacity: 1;
2203
- }
2204
- }
2205
-
2206
- @keyframes slideUp {
2207
- from {
2208
- opacity: 0;
2209
- transform: translateY(30px);
2210
- }
2211
- to {
2212
- opacity: 1;
2213
- transform: translateY(0);
2214
- }
2215
- }
2216
-
2217
- /* Git Integration */
2218
-
2219
- .git-status {
2220
- display: inline;
2221
- margin-left: 8px;
2222
- padding: 0;
2223
- border-radius: 4px;
2224
- opacity: 0.8;
2225
- vertical-align: middle;
2226
- line-height: inherit;
2227
- }
2228
-
2229
- .git-status-icon {
2230
- width: 10px;
2231
- height: 10px;
2232
- fill: currentColor;
2233
- display: inline;
2234
- vertical-align: middle;
2235
- }
2236
-
2237
- /* Git status colors - brighter palette */
2238
- .git-status-M {
2239
- color: #d29922; /* modified - amber */
2240
- }
2241
-
2242
- .git-status-A {
2243
- color: #2ea043; /* added - green */
2244
- }
2245
-
2246
- .git-status-D {
2247
- color: #f85149; /* deleted - red */
2248
- }
2249
-
2250
- .git-status-R {
2251
- color: #1f6feb; /* renamed - blue */
2252
- }
2253
-
2254
- .git-status-\?\? {
2255
- color: #a371f7; /* untracked - purple */
2256
- }
2257
-
2258
- .git-status-MM,
2259
- .git-status-AM,
2260
- .git-status-AD {
2261
- color: #db6d28; /* mixed - orange */
2262
- }
2263
-
2264
- [data-theme="light"] .git-status-M {
2265
- color: #bf8700;
2266
- }
2267
-
2268
- [data-theme="light"] .git-status-A {
2269
- color: #1a7f37;
2270
- }
2271
-
2272
- [data-theme="light"] .git-status-D {
2273
- color: #cf222e;
2274
- }
2275
-
2276
- [data-theme="light"] .git-status-R {
2277
- color: #0969da;
2278
- }
2279
-
2280
- [data-theme="light"] .git-status-MM,
2281
- [data-theme="light"] .git-status-AM,
2282
- [data-theme="light"] .git-status-AD {
2283
- color: #9a6700;
2284
- }
2285
-
2286
- /* Git Diff Viewer */
2287
- .diff-viewer-overlay {
2288
- position: fixed;
2289
- top: 0;
2290
- left: 0;
2291
- width: 100%;
2292
- height: 100%;
2293
- background: rgba(0, 0, 0, 0.8);
2294
- backdrop-filter: blur(4px);
2295
- z-index: 99999;
2296
- display: flex;
2297
- align-items: center;
2298
- justify-content: center;
2299
- animation: fadeIn 0.2s ease-out;
2300
- }
2301
-
2302
- .diff-viewer-modal {
2303
- background: var(--bg-primary);
2304
- border: 1px solid var(--border-primary);
2305
- border-radius: 8px;
2306
- box-shadow: 0 16px 48px rgba(0, 0, 0, 0.5);
2307
- width: 90vw;
2308
- max-width: 1200px;
2309
- height: 80vh;
2310
- display: flex;
2311
- flex-direction: column;
2312
- animation: slideUp 0.3s ease-out;
2313
- }
2314
-
2315
- .diff-viewer-header {
2316
- display: flex;
2317
- justify-content: space-between;
2318
- align-items: center;
2319
- padding: 16px 20px;
2320
- border-bottom: 1px solid var(--border-primary);
2321
- background: var(--bg-secondary);
2322
- border-radius: 8px 8px 0 0;
2323
- }
2324
-
2325
- .diff-viewer-title {
2326
- color: var(--text-primary);
2327
- font-size: 16px;
2328
- font-weight: 600;
2329
- margin: 0;
2330
- display: flex;
2331
- align-items: center;
2332
- gap: 8px;
2333
- }
2334
-
2335
- .diff-close-btn {
2336
- background: none;
2337
- border: none;
2338
- color: var(--text-secondary);
2339
- font-size: 24px;
2340
- cursor: pointer;
2341
- padding: 4px;
2342
- border-radius: 4px;
2343
- transition: color 0.2s ease;
2344
- }
2345
-
2346
- .diff-close-btn:hover {
2347
- color: var(--text-primary);
2348
- background: var(--hover-bg);
2349
- }
2350
-
2351
- .diff-viewer-content {
2352
- flex: 1;
2353
- overflow: auto;
2354
- padding: 0;
2355
- }
2356
-
2357
- .diff-container {
2358
- display: flex;
2359
- height: 100%;
2360
- }
2361
-
2362
- .diff-side {
2363
- flex: 1;
2364
- border-right: 1px solid var(--border-primary);
2365
- display: flex;
2366
- flex-direction: column;
2367
- }
2368
-
2369
- .diff-side:last-child {
2370
- border-right: none;
2371
- }
2372
-
2373
- .diff-side-header {
2374
- background: var(--bg-secondary);
2375
- padding: 8px 16px;
2376
- border-bottom: 1px solid var(--border-primary);
2377
- font-size: 12px;
2378
- font-weight: 600;
2379
- color: var(--text-secondary);
2380
- }
2381
-
2382
- .diff-side-content {
2383
- flex: 1;
2384
- overflow: auto;
2385
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
2386
- font-size: 12px;
2387
- line-height: 20px;
2388
- font-weight: 400;
2389
- }
2390
-
2391
- .diff-line {
2392
- display: flex;
2393
- white-space: pre;
2394
- min-height: 1.4em;
2395
- }
2396
-
2397
- .diff-line-number {
2398
- background: var(--bg-secondary);
2399
- color: var(--text-secondary);
2400
- text-align: right;
2401
- padding: 0 8px;
2402
- border-right: 1px solid var(--border-primary);
2403
- min-width: 50px;
2404
- user-select: none;
2405
- flex-shrink: 0;
2406
- }
2407
-
2408
- .diff-line-content {
2409
- padding: 0 8px;
2410
- flex: 1;
2411
- overflow-x: auto;
2412
- }
2413
-
2414
- .diff-line-added {
2415
- background: #0f5132;
2416
- color: #75b798;
2417
- }
2418
-
2419
- .diff-line-added .diff-line-number {
2420
- background: #0a4027;
2421
- }
2422
-
2423
- .diff-line-removed {
2424
- background: #67060c;
2425
- color: #f8d7da;
2426
- }
2427
-
2428
- .diff-line-removed .diff-line-number {
2429
- background: #4a0409;
2430
- }
2431
-
2432
- .diff-line-context {
2433
- background: var(--bg-primary);
2434
- color: var(--text-primary);
2435
- }
2436
-
2437
- [data-theme="light"] .diff-line-added {
2438
- background: #d1e7dd;
2439
- color: #055160;
2440
- }
2441
-
2442
- [data-theme="light"] .diff-line-added .diff-line-number {
2443
- background: #badbcc;
2444
- }
2445
-
2446
- [data-theme="light"] .diff-line-removed {
2447
- background: #f8d7da;
2448
- color: #721c24;
2449
- }
2450
-
2451
- [data-theme="light"] .diff-line-removed .diff-line-number {
2452
- background: #f1aeb5;
2453
- }
2454
-
2455
- .diff-stats {
2456
- display: flex;
2457
- gap: 16px;
2458
- align-items: center;
2459
- font-size: 12px;
2460
- }
2461
-
2462
- .diff-stat {
2463
- display: flex;
2464
- align-items: center;
2465
- gap: 4px;
2466
- }
2467
-
2468
- .diff-stat-added {
2469
- color: #28a745;
2470
- }
2471
-
2472
- .diff-stat-removed {
2473
- color: #dc3545;
2474
- }
2475
-
2476
- /* Clean GitHub-style diff */
2477
- .diff-container {
2478
- width: 100%;
2479
- margin: 0;
2480
- padding: 0;
2481
- background: var(--bg-primary);
2482
- overflow-x: auto;
2483
- overflow-y: visible;
2484
- }
2485
-
2486
- .diff-content {
2487
- padding: 0;
2488
- min-width: 100%;
2489
- display: block;
2490
- }
2491
-
2492
- .raw-diff-container {
2493
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
2494
- font-size: 12px;
2495
- line-height: 20px;
2496
- font-weight: 400;
2497
- min-width: max-content;
2498
- }
2499
-
2500
- /* Diff line with two line number columns + content */
2501
- .diff-line {
2502
- display: flex;
2503
- min-height: 20px;
2504
- line-height: 20px;
2505
- color: var(--text-primary);
2506
- transition: background-color 0.1s ease;
2507
- align-items: stretch;
2508
- }
2509
-
2510
- .diff-line:hover {
2511
- background-color: var(--hover-bg);
2512
- }
2513
-
2514
- /* Line number columns - two side by side */
2515
- .diff-line-number {
2516
- display: inline-block;
2517
- min-width: 50px;
2518
- max-width: 50px;
2519
- padding: 0 8px;
2520
- text-align: right;
2521
- color: var(--text-secondary);
2522
- background: var(--bg-secondary);
2523
- user-select: none;
2524
- flex-shrink: 0;
2525
- font-variant-numeric: tabular-nums;
2526
- border-right: 1px solid var(--border-primary);
2527
- }
2528
-
2529
- .diff-line-number.old {
2530
- border-right: none;
2531
- }
2532
-
2533
- .diff-line-number.new {
2534
- border-right: 1px solid var(--border-primary);
2535
- }
2536
-
2537
- /* Empty line numbers for headers/hunks */
2538
- .diff-line-number:empty::before {
2539
- content: '\00a0'; /* Non-breaking space to maintain height */
2540
- }
2541
-
2542
- /* Content area - takes remaining space */
2543
- .diff-line-content {
2544
- padding: 0 10px;
2545
- white-space: pre;
2546
- overflow-x: auto;
2547
- flex: 1;
2548
- min-width: 0;
2549
- }
2550
-
2551
- /* Different line types - GitHub-style subtle backgrounds */
2552
- .diff-line-added {
2553
- background: rgba(46, 160, 67, 0.15);
2554
- }
2555
-
2556
- .diff-line-added .diff-line-number {
2557
- background: rgba(46, 160, 67, 0.1);
2558
- }
2559
-
2560
- .diff-line-removed {
2561
- background: rgba(248, 81, 73, 0.15);
2562
- }
2563
-
2564
- .diff-line-removed .diff-line-number {
2565
- background: rgba(248, 81, 73, 0.1);
2566
- }
2567
-
2568
- .diff-line-context {
2569
- background: var(--bg-primary);
2570
- }
2571
-
2572
- .diff-line-hunk {
2573
- background: rgba(88, 166, 255, 0.1);
2574
- font-weight: 600;
2575
- color: #58a6ff;
2576
- }
2577
-
2578
- .diff-line-hunk .diff-line-number {
2579
- background: rgba(88, 166, 255, 0.05);
2580
- }
2581
-
2582
- .diff-line-header {
2583
- background: var(--bg-secondary);
2584
- color: var(--text-secondary);
2585
- font-weight: 500;
2586
- opacity: 0.9;
2587
- }
2588
-
2589
- .diff-line-header .diff-line-number {
2590
- background: var(--bg-secondary);
2591
- }
2592
-
2593
- /* Light theme adjustments */
2594
- [data-theme="light"] .diff-line-added {
2595
- background: rgba(46, 160, 67, 0.1);
2596
- }
2597
-
2598
- [data-theme="light"] .diff-line-added .diff-line-number {
2599
- background: rgba(46, 160, 67, 0.08);
2600
- }
2601
-
2602
- [data-theme="light"] .diff-line-removed {
2603
- background: rgba(248, 81, 73, 0.1);
2604
- }
2605
-
2606
- [data-theme="light"] .diff-line-removed .diff-line-number {
2607
- background: rgba(248, 81, 73, 0.08);
2608
- }
2609
-
2610
- [data-theme="light"] .diff-line-hunk {
2611
- background: rgba(9, 105, 218, 0.1);
2612
- color: #0969da;
2613
- }
2614
-
2615
- [data-theme="light"] .diff-line-hunk .diff-line-number {
2616
- background: rgba(9, 105, 218, 0.05);
2617
- }
2618
-
2619
- .no-changes {
2620
- padding: 40px;
2621
- text-align: center;
2622
- color: var(--text-secondary);
2623
- font-style: italic;
2624
- }
2625
-
2626
- /* Git status column - minimal spacing */
2627
- .file-table .git-status-col {
2628
- width: 10px;
2629
- text-align: center;
2630
- padding: 0;
2631
- font-size: 16px;
2632
- vertical-align: middle;
2633
- }
2634
-
2635
- /* Untracked file status styling */
2636
- .git-status-untracked {
2637
- color: #7c3aed !important;
2638
- }
2639
-
2640
- [data-theme="light"] .git-status-untracked {
2641
- color: #8b5cf6 !important;
2642
- }
2643
-
2644
- /* Monaco Editor styling - inner container only */
2645
- .monaco-editor-container {
2646
- height: 600px !important;
2647
- width: 100% !important;
2648
- min-width: 400px !important;
2649
- overflow: hidden !important;
2650
- background: var(--bg-primary);
2651
- position: relative !important;
2652
- display: block !important;
2653
- border-radius: 0 0 6px 6px;
2654
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
2655
- }
2656
-
2657
- .monaco-editor-container .monaco-editor {
2658
- height: 600px !important;
2659
- width: 100% !important;
2660
- min-width: 400px !important;
2661
- position: relative !important;
2662
- }
2663
-
2664
- /* Monaco theme integration - match view/browse UI */
2665
- .monaco-editor .monaco-editor-background {
2666
- background-color: var(--bg-primary) !important;
2667
- }
2668
-
2669
- .monaco-editor .monaco-editor .margin {
2670
- background-color: var(--bg-primary) !important;
2671
- }
2672
-
2673
- .monaco-editor .monaco-scrollable-element .scrollbar {
2674
- background: var(--bg-secondary) !important;
2675
- }
2676
-
2677
- .monaco-editor .monaco-scrollable-element .slider {
2678
- background: var(--border-primary) !important;
2679
- }
2680
-
2681
- .monaco-editor .monaco-scrollable-element .slider:hover {
2682
- background: var(--text-secondary) !important;
2683
- }
2684
-
2685
- /* Ensure Monaco editor integrates seamlessly with container */
2686
- .monaco-editor-container .monaco-editor .monaco-editor-background,
2687
- .monaco-editor-container .monaco-editor .margin-view-overlays .current-line {
2688
- background-color: var(--bg-primary) !important;
2689
- }
2690
-
2691
- /* Line number styling to match our theme */
2692
- .monaco-editor .margin-view-overlays .line-numbers {
2693
- color: var(--text-secondary) !important;
2694
- }
2695
-
2696
- .monaco-editor .margin-view-overlays .line-numbers.active-line-number {
2697
- color: var(--text-primary) !important;
2698
- }
2699
-
2700
- /* Draft dialog styling */
2701
- .draft-modal {
2702
- max-width: 400px;
2703
- text-align: center;
2704
- }
2705
-
2706
- .draft-modal h3 {
2707
- margin: 0 0 12px 0;
2708
- color: var(--text-accent);
2709
- font-size: 18px;
2710
- }
2711
-
2712
- .draft-modal p {
2713
- margin: 0 0 20px 0;
2714
- color: var(--text-secondary);
2715
- line-height: 1.5;
2716
- }
2717
-
2718
- .draft-actions {
2719
- display: flex;
2720
- gap: 8px;
2721
- justify-content: center;
2722
- }
2723
-
2724
- .draft-actions .btn {
2725
- flex: 1;
2726
- max-width: 120px;
2727
- }