codereviewr 1.0.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.
@@ -0,0 +1,1154 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ :root,
8
+ [data-theme="dark"] {
9
+ --bg-primary: #1e1e2e;
10
+ --bg-secondary: #181825;
11
+ --bg-tertiary: #313244;
12
+ --text-primary: #cdd6f4;
13
+ --text-secondary: #a6adc8;
14
+ --text-muted: #6c7086;
15
+ --border-color: #45475a;
16
+ --accent: #89b4fa;
17
+ --accent-hover: #b4befe;
18
+ --success: #a6e3a1;
19
+ --warning: #f9e2af;
20
+ --danger: #f38ba8;
21
+ --added: #a6e3a1;
22
+ --deleted: #f38ba8;
23
+ --modified: #89b4fa;
24
+ --renamed: #f9e2af;
25
+ --added-bg: rgba(166, 227, 161, 0.1);
26
+ --deleted-bg: rgba(243, 139, 168, 0.1);
27
+ --added-badge-bg: rgba(166, 227, 161, 0.15);
28
+ --deleted-badge-bg: rgba(243, 139, 168, 0.15);
29
+ --modified-badge-bg: rgba(137, 180, 250, 0.15);
30
+ --renamed-badge-bg: rgba(249, 226, 175, 0.15);
31
+ --warning-bg: rgba(249, 226, 175, 0.1);
32
+ --warning-bg-hover: rgba(249, 226, 175, 0.2);
33
+ --accent-bg: rgba(137, 180, 250, 0.08);
34
+ --accent-shadow: rgba(137, 180, 250, 0.2);
35
+ --overlay-bg: rgba(0, 0, 0, 0.6);
36
+ --shadow: rgba(0, 0, 0, 0.4);
37
+ --shadow-heavy: rgba(0, 0, 0, 0.5);
38
+ }
39
+
40
+ [data-theme="light"] {
41
+ --bg-primary: #f5f5f9;
42
+ --bg-secondary: #ffffff;
43
+ --bg-tertiary: #e8e8ee;
44
+ --text-primary: #1e1e2e;
45
+ --text-secondary: #4a4a5a;
46
+ --text-muted: #8888a0;
47
+ --border-color: #d4d4de;
48
+ --accent: #2563eb;
49
+ --accent-hover: #3b82f6;
50
+ --success: #16a34a;
51
+ --warning: #b45309;
52
+ --danger: #dc2626;
53
+ --added: #16a34a;
54
+ --deleted: #dc2626;
55
+ --modified: #2563eb;
56
+ --renamed: #b45309;
57
+ --added-bg: rgba(22, 163, 74, 0.08);
58
+ --deleted-bg: rgba(220, 38, 38, 0.08);
59
+ --added-badge-bg: rgba(22, 163, 74, 0.1);
60
+ --deleted-badge-bg: rgba(220, 38, 38, 0.1);
61
+ --modified-badge-bg: rgba(37, 99, 235, 0.1);
62
+ --renamed-badge-bg: rgba(180, 83, 9, 0.1);
63
+ --warning-bg: rgba(180, 83, 9, 0.08);
64
+ --warning-bg-hover: rgba(180, 83, 9, 0.14);
65
+ --accent-bg: rgba(37, 99, 235, 0.06);
66
+ --accent-shadow: rgba(37, 99, 235, 0.2);
67
+ --overlay-bg: rgba(0, 0, 0, 0.3);
68
+ --shadow: rgba(0, 0, 0, 0.1);
69
+ --shadow-heavy: rgba(0, 0, 0, 0.15);
70
+ }
71
+
72
+ body {
73
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
74
+ background: var(--bg-primary);
75
+ color: var(--text-primary);
76
+ height: 100vh;
77
+ overflow: hidden;
78
+ }
79
+
80
+ #root {
81
+ height: 100%;
82
+ display: flex;
83
+ flex-direction: column;
84
+ }
85
+
86
+ .app {
87
+ display: flex;
88
+ flex-direction: column;
89
+ height: 100%;
90
+ }
91
+
92
+ /* --- Toolbar --- */
93
+
94
+ .toolbar {
95
+ display: flex;
96
+ align-items: center;
97
+ gap: 12px;
98
+ padding: 12px 16px;
99
+ background: var(--bg-secondary);
100
+ border-bottom: 1px solid var(--border-color);
101
+ flex-shrink: 0;
102
+ }
103
+
104
+ .toolbar-title {
105
+ display: flex;
106
+ align-items: center;
107
+ gap: 8px;
108
+ font-size: 16px;
109
+ font-weight: 600;
110
+ color: var(--text-primary);
111
+ }
112
+
113
+ .base-selector {
114
+ display: flex;
115
+ align-items: center;
116
+ gap: 0;
117
+ margin-left: 16px;
118
+ }
119
+
120
+ .base-toggle {
121
+ padding: 4px 12px;
122
+ border: 1px solid var(--border-color);
123
+ background: transparent;
124
+ color: var(--text-muted);
125
+ font-size: 12px;
126
+ font-weight: 500;
127
+ font-family: inherit;
128
+ cursor: pointer;
129
+ transition: all 0.15s ease;
130
+ }
131
+
132
+ .base-toggle:first-child {
133
+ border-radius: 6px 0 0 6px;
134
+ border-right: none;
135
+ }
136
+
137
+ .base-toggle:nth-child(2) {
138
+ border-radius: 0 6px 6px 0;
139
+ }
140
+
141
+ .base-toggle.active {
142
+ background: var(--accent);
143
+ border-color: var(--accent);
144
+ color: var(--bg-primary);
145
+ }
146
+
147
+ .base-toggle:not(.active):hover:not(:disabled) {
148
+ background: var(--bg-tertiary);
149
+ color: var(--text-primary);
150
+ }
151
+
152
+ .base-toggle:disabled {
153
+ cursor: default;
154
+ }
155
+
156
+ .loading-spinner-small {
157
+ margin-left: 8px;
158
+ width: 16px;
159
+ height: 16px;
160
+ border: 2px solid var(--border-color);
161
+ border-top-color: var(--accent);
162
+ border-radius: 50%;
163
+ animation: spin 0.8s linear infinite;
164
+ }
165
+
166
+ .toolbar-nav {
167
+ display: flex;
168
+ align-items: center;
169
+ gap: 8px;
170
+ }
171
+
172
+ .toolbar-btn {
173
+ display: flex;
174
+ align-items: center;
175
+ justify-content: center;
176
+ width: 32px;
177
+ height: 32px;
178
+ border: 1px solid var(--border-color);
179
+ border-radius: 6px;
180
+ background: var(--bg-tertiary);
181
+ color: var(--text-primary);
182
+ cursor: pointer;
183
+ transition: all 0.15s ease;
184
+ }
185
+
186
+ .toolbar-btn:hover:not(:disabled) {
187
+ background: var(--accent);
188
+ border-color: var(--accent);
189
+ color: var(--bg-primary);
190
+ }
191
+
192
+ .toolbar-btn:disabled {
193
+ opacity: 0.4;
194
+ cursor: not-allowed;
195
+ }
196
+
197
+ .toolbar-file-info {
198
+ font-size: 14px;
199
+ color: var(--text-secondary);
200
+ margin-left: 8px;
201
+ }
202
+
203
+ .toolbar-spacer {
204
+ flex: 1;
205
+ }
206
+
207
+ .btn-generate {
208
+ display: flex;
209
+ align-items: center;
210
+ gap: 8px;
211
+ padding: 8px 16px;
212
+ border: none;
213
+ border-radius: 6px;
214
+ background: var(--accent);
215
+ color: var(--bg-primary);
216
+ font-size: 14px;
217
+ font-weight: 500;
218
+ cursor: pointer;
219
+ transition: all 0.15s ease;
220
+ }
221
+
222
+ .btn-generate:hover:not(:disabled) {
223
+ background: var(--accent-hover);
224
+ }
225
+
226
+ .btn-generate:disabled {
227
+ opacity: 0.5;
228
+ cursor: not-allowed;
229
+ }
230
+
231
+ /* --- Comments Pill --- */
232
+
233
+ .comments-pill {
234
+ display: inline-flex;
235
+ align-items: center;
236
+ gap: 6px;
237
+ padding: 6px 14px;
238
+ border-radius: 16px;
239
+ border: 1px solid var(--warning);
240
+ background: var(--warning-bg);
241
+ color: var(--warning);
242
+ font-size: 13px;
243
+ font-weight: 500;
244
+ cursor: pointer;
245
+ transition: all 0.15s ease;
246
+ }
247
+
248
+ .comments-pill:hover {
249
+ background: var(--warning-bg-hover);
250
+ }
251
+
252
+ .comments-pill-icon {
253
+ font-size: 10px;
254
+ }
255
+
256
+ /* --- Main Layout --- */
257
+
258
+ .main-content {
259
+ display: flex;
260
+ flex: 1;
261
+ overflow: hidden;
262
+ }
263
+
264
+ .sidebar {
265
+ background: var(--bg-secondary);
266
+ display: flex;
267
+ flex-direction: column;
268
+ flex-shrink: 0;
269
+ }
270
+
271
+ .resize-handle {
272
+ width: 4px;
273
+ cursor: col-resize;
274
+ background: var(--border-color);
275
+ flex-shrink: 0;
276
+ transition: background 0.15s ease;
277
+ }
278
+
279
+ .resize-handle:hover {
280
+ background: var(--accent);
281
+ }
282
+
283
+ .sidebar-header {
284
+ padding: 12px 16px;
285
+ font-size: 12px;
286
+ font-weight: 600;
287
+ text-transform: uppercase;
288
+ letter-spacing: 0.5px;
289
+ color: var(--text-muted);
290
+ border-bottom: 1px solid var(--border-color);
291
+ }
292
+
293
+ .sidebar-footer {
294
+ display: flex;
295
+ align-items: center;
296
+ gap: 8px;
297
+ padding: 10px 12px;
298
+ border-top: 1px solid var(--border-color);
299
+ flex-shrink: 0;
300
+ }
301
+
302
+ .sidebar-footer-info {
303
+ flex: 1;
304
+ display: flex;
305
+ flex-direction: column;
306
+ gap: 1px;
307
+ min-width: 0;
308
+ overflow: hidden;
309
+ }
310
+
311
+ .sidebar-footer-repo {
312
+ font-size: 12px;
313
+ color: var(--text-muted);
314
+ overflow: hidden;
315
+ text-overflow: ellipsis;
316
+ white-space: nowrap;
317
+ }
318
+
319
+ .sidebar-footer-multi {
320
+ position: relative;
321
+ cursor: default;
322
+ }
323
+
324
+ .sidebar-footer-tooltip {
325
+ display: none;
326
+ position: fixed;
327
+ bottom: 48px;
328
+ left: 8px;
329
+ min-width: 220px;
330
+ padding: 8px 0;
331
+ background: var(--bg-tertiary);
332
+ border: 1px solid var(--border-color);
333
+ border-radius: 8px;
334
+ box-shadow: 0 8px 24px var(--shadow);
335
+ z-index: 1000;
336
+ }
337
+
338
+ .sidebar-footer-multi:hover .sidebar-footer-tooltip {
339
+ display: block;
340
+ animation: fadeIn 0.15s ease;
341
+ }
342
+
343
+ @keyframes fadeIn {
344
+ from { opacity: 0; transform: translateY(4px); }
345
+ to { opacity: 1; transform: translateY(0); }
346
+ }
347
+
348
+ .sidebar-footer-tooltip-row {
349
+ display: flex;
350
+ align-items: center;
351
+ justify-content: space-between;
352
+ gap: 12px;
353
+ padding: 4px 12px;
354
+ }
355
+
356
+ .sidebar-footer-tooltip-name {
357
+ font-size: 12px;
358
+ font-weight: 600;
359
+ color: var(--text-primary);
360
+ }
361
+
362
+ .sidebar-footer-tooltip-branch {
363
+ font-size: 11px;
364
+ color: var(--accent);
365
+ font-weight: 500;
366
+ }
367
+
368
+ .sidebar-footer-branch {
369
+ font-size: 12px;
370
+ color: var(--accent);
371
+ font-weight: 500;
372
+ overflow: hidden;
373
+ text-overflow: ellipsis;
374
+ white-space: nowrap;
375
+ }
376
+
377
+ .file-list {
378
+ flex: 1;
379
+ overflow-y: auto;
380
+ padding: 8px;
381
+ }
382
+
383
+ .file-list-repo-header {
384
+ padding: 8px 10px 4px;
385
+ font-size: 11px;
386
+ font-weight: 700;
387
+ text-transform: uppercase;
388
+ letter-spacing: 0.5px;
389
+ color: var(--accent);
390
+ overflow: hidden;
391
+ text-overflow: ellipsis;
392
+ white-space: nowrap;
393
+ margin-top: 8px;
394
+ }
395
+
396
+ .file-list-repo-header:first-child {
397
+ margin-top: 0;
398
+ }
399
+
400
+ .file-item {
401
+ display: flex;
402
+ align-items: center;
403
+ gap: 8px;
404
+ padding: 6px 10px;
405
+ min-height: 40px;
406
+ border-radius: 6px;
407
+ cursor: pointer;
408
+ transition: background 0.15s ease;
409
+ font-size: 13px;
410
+ border: none;
411
+ background: none;
412
+ color: inherit;
413
+ text-align: left;
414
+ width: 100%;
415
+ }
416
+
417
+ .file-list:focus-within {
418
+ box-shadow: inset -2px 0 0 var(--accent);
419
+ }
420
+
421
+ .file-item:focus {
422
+ outline: none;
423
+ }
424
+
425
+ .file-item:hover {
426
+ background: var(--bg-tertiary);
427
+ }
428
+
429
+ .file-item.active {
430
+ background: var(--accent);
431
+ color: var(--bg-primary);
432
+ }
433
+
434
+ .file-item.active .file-status-icon {
435
+ color: var(--bg-primary);
436
+ border-color: var(--bg-primary);
437
+ }
438
+
439
+ .file-item.active .file-dir {
440
+ color: var(--bg-primary);
441
+ opacity: 0.7;
442
+ }
443
+
444
+ .file-status-icon {
445
+ width: 20px;
446
+ height: 20px;
447
+ display: flex;
448
+ align-items: center;
449
+ justify-content: center;
450
+ font-size: 10px;
451
+ font-weight: 700;
452
+ flex-shrink: 0;
453
+ border-radius: 4px;
454
+ border: 1px solid;
455
+ }
456
+
457
+ .file-status-icon.added { color: var(--added); border-color: var(--added); }
458
+ .file-status-icon.deleted { color: var(--deleted); border-color: var(--deleted); }
459
+ .file-status-icon.modified { color: var(--modified); border-color: var(--modified); }
460
+ .file-status-icon.renamed { color: var(--renamed); border-color: var(--renamed); }
461
+
462
+ .file-info {
463
+ flex: 1;
464
+ min-width: 0;
465
+ display: flex;
466
+ flex-direction: column;
467
+ gap: 1px;
468
+ }
469
+
470
+ .file-name {
471
+ font-size: 13px;
472
+ font-weight: 500;
473
+ overflow: hidden;
474
+ text-overflow: ellipsis;
475
+ white-space: nowrap;
476
+ }
477
+
478
+ .file-dir {
479
+ font-size: 11px;
480
+ color: var(--text-muted);
481
+ overflow: hidden;
482
+ text-overflow: ellipsis;
483
+ white-space: nowrap;
484
+ }
485
+
486
+ .comments-badge {
487
+ display: inline-flex;
488
+ align-items: center;
489
+ justify-content: center;
490
+ min-width: 20px;
491
+ height: 20px;
492
+ padding: 0 6px;
493
+ border-radius: 10px;
494
+ background: var(--warning);
495
+ color: var(--bg-primary);
496
+ font-size: 11px;
497
+ font-weight: 600;
498
+ }
499
+
500
+ /* --- Diff Viewer --- */
501
+
502
+ .diff-container {
503
+ flex: 1;
504
+ display: flex;
505
+ flex-direction: column;
506
+ overflow: hidden;
507
+ }
508
+
509
+ .diff-header {
510
+ display: flex;
511
+ align-items: center;
512
+ gap: 12px;
513
+ padding: 12px 16px;
514
+ background: var(--bg-secondary);
515
+ border-bottom: 1px solid var(--border-color);
516
+ }
517
+
518
+ .diff-repo-badge {
519
+ display: inline-flex;
520
+ align-items: center;
521
+ padding: 3px 8px;
522
+ border-radius: 4px;
523
+ font-size: 11px;
524
+ font-weight: 600;
525
+ background: var(--accent-bg);
526
+ color: var(--accent);
527
+ border: 1px solid var(--accent);
528
+ }
529
+
530
+ .diff-path {
531
+ font-size: 14px;
532
+ font-weight: 500;
533
+ color: var(--text-primary);
534
+ }
535
+
536
+ .diff-header-spacer {
537
+ flex: 1;
538
+ }
539
+
540
+ .diff-stats {
541
+ display: flex;
542
+ align-items: center;
543
+ gap: 10px;
544
+ font-size: 13px;
545
+ font-weight: 600;
546
+ font-family: "SF Mono", "Fira Code", "Fira Mono", Menlo, Monaco, Consolas, monospace;
547
+ }
548
+
549
+ .diff-stat-added {
550
+ color: var(--added);
551
+ }
552
+
553
+ .diff-stat-deleted {
554
+ color: var(--deleted);
555
+ }
556
+
557
+ .diff-status-badge {
558
+ display: inline-flex;
559
+ align-items: center;
560
+ padding: 4px 10px;
561
+ border-radius: 12px;
562
+ font-size: 11px;
563
+ font-weight: 600;
564
+ text-transform: uppercase;
565
+ }
566
+
567
+ .diff-status-badge.added { background: var(--added-badge-bg); color: var(--added); }
568
+ .diff-status-badge.deleted { background: var(--deleted-badge-bg); color: var(--deleted); }
569
+ .diff-status-badge.modified { background: var(--modified-badge-bg); color: var(--modified); }
570
+ .diff-status-badge.renamed { background: var(--renamed-badge-bg); color: var(--renamed); }
571
+
572
+ .diff-content {
573
+ flex: 1;
574
+ overflow: auto;
575
+ font-family: "SF Mono", "Fira Code", "Fira Mono", Menlo, Monaco, Consolas, monospace;
576
+ font-size: 13px;
577
+ line-height: 1.6;
578
+ }
579
+
580
+ .diff-content:focus {
581
+ outline: none;
582
+ box-shadow: inset 2px 0 0 var(--accent);
583
+ }
584
+
585
+ .diff-line {
586
+ display: flex;
587
+ align-items: center;
588
+ min-height: 24px;
589
+ }
590
+
591
+ .diff-line:hover {
592
+ background: var(--bg-tertiary);
593
+ }
594
+
595
+ .diff-line-num {
596
+ width: 50px;
597
+ min-width: 50px;
598
+ padding: 0 8px;
599
+ text-align: right;
600
+ color: var(--text-muted);
601
+ background: var(--bg-secondary);
602
+ user-select: none;
603
+ font-size: 12px;
604
+ display: flex;
605
+ align-items: center;
606
+ justify-content: flex-end;
607
+ border-right: 1px solid var(--border-color);
608
+ }
609
+
610
+ .diff-line-removed .diff-line-num { color: var(--deleted); }
611
+ .diff-line-added .diff-line-num { color: var(--added); }
612
+
613
+ .diff-line-content {
614
+ flex: 1;
615
+ padding: 0 12px;
616
+ white-space: pre;
617
+ overflow-x: auto;
618
+ }
619
+
620
+ .diff-line-removed { background: var(--deleted-bg); }
621
+ .diff-line-removed .diff-line-content { color: var(--deleted); }
622
+ .diff-line-added { background: var(--added-bg); }
623
+ .diff-line-added .diff-line-content { color: var(--added); }
624
+ .diff-line-context { color: var(--text-secondary); }
625
+
626
+ .diff-hunk-header {
627
+ display: flex;
628
+ align-items: center;
629
+ padding: 4px 12px;
630
+ background: var(--bg-tertiary);
631
+ color: var(--text-muted);
632
+ font-size: 12px;
633
+ font-style: italic;
634
+ }
635
+
636
+ .diff-collapsed {
637
+ display: flex;
638
+ align-items: center;
639
+ width: 100%;
640
+ border-top: 1px dashed var(--border-color);
641
+ border-bottom: 1px dashed var(--border-color);
642
+ background: var(--bg-secondary);
643
+ font-size: 12px;
644
+ min-height: 28px;
645
+ }
646
+
647
+ .diff-collapsed-gutter {
648
+ width: 100px;
649
+ min-width: 100px;
650
+ height: 100%;
651
+ background: var(--bg-secondary);
652
+ border-right: 1px solid var(--border-color);
653
+ }
654
+
655
+ .diff-collapsed-btn {
656
+ display: inline-flex;
657
+ align-items: center;
658
+ gap: 4px;
659
+ padding: 4px 12px;
660
+ border: none;
661
+ background: transparent;
662
+ color: var(--accent);
663
+ font-family: inherit;
664
+ font-size: 12px;
665
+ cursor: pointer;
666
+ transition: background 0.1s ease, color 0.1s ease;
667
+ white-space: nowrap;
668
+ }
669
+
670
+ .diff-collapsed-btn:hover {
671
+ background: var(--bg-tertiary);
672
+ color: var(--accent-hover);
673
+ }
674
+
675
+ .diff-collapsed-btn-full {
676
+ flex: 1;
677
+ }
678
+
679
+ .diff-collapsed-count {
680
+ color: var(--text-muted);
681
+ font-size: 11px;
682
+ padding: 0 8px;
683
+ white-space: nowrap;
684
+ }
685
+
686
+ /* --- Comment Indicator (+ button) --- */
687
+
688
+ .comment-indicator {
689
+ width: 24px;
690
+ min-width: 24px;
691
+ display: flex;
692
+ align-items: center;
693
+ justify-content: center;
694
+ cursor: pointer;
695
+ color: var(--text-muted);
696
+ font-size: 14px;
697
+ opacity: 0;
698
+ transition: opacity 0.1s ease;
699
+ border: none;
700
+ background: none;
701
+ padding: 0;
702
+ font-family: inherit;
703
+ }
704
+
705
+ .diff-line:hover .comment-indicator {
706
+ opacity: 0.5;
707
+ }
708
+
709
+ .diff-line:hover .comment-indicator:hover {
710
+ opacity: 1;
711
+ color: var(--accent);
712
+ }
713
+
714
+ .comment-indicator.has-comment {
715
+ opacity: 1;
716
+ color: var(--warning);
717
+ }
718
+
719
+ /* --- Inline Editor --- */
720
+
721
+ .inline-editor {
722
+ padding: 8px 12px 8px 124px; /* align with content: 50+50+24 = 124 */
723
+ background: var(--accent-bg);
724
+ border-top: 1px solid var(--border-color);
725
+ border-bottom: 1px solid var(--border-color);
726
+ }
727
+
728
+ .inline-editor-textarea {
729
+ width: 100%;
730
+ padding: 8px 12px;
731
+ border: 1px solid var(--accent);
732
+ border-radius: 6px;
733
+ background: var(--bg-primary);
734
+ color: var(--text-primary);
735
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
736
+ font-size: 13px;
737
+ line-height: 1.5;
738
+ resize: vertical;
739
+ min-height: 48px;
740
+ }
741
+
742
+ .inline-editor-textarea:focus {
743
+ outline: none;
744
+ border-color: var(--accent);
745
+ box-shadow: 0 0 0 2px var(--accent-shadow);
746
+ }
747
+
748
+ .inline-editor-hint {
749
+ font-size: 11px;
750
+ color: var(--text-muted);
751
+ margin-top: 4px;
752
+ text-align: right;
753
+ }
754
+
755
+ /* --- Inline Comment Display --- */
756
+
757
+ .inline-comment {
758
+ display: flex;
759
+ align-items: flex-start;
760
+ gap: 0;
761
+ padding: 6px 12px 6px 124px;
762
+ background: var(--warning-bg);
763
+ border-bottom: 1px solid var(--border-color);
764
+ }
765
+
766
+ .inline-comment-bar {
767
+ width: 3px;
768
+ min-height: 20px;
769
+ background: var(--warning);
770
+ border-radius: 2px;
771
+ flex-shrink: 0;
772
+ align-self: stretch;
773
+ }
774
+
775
+ .inline-comment-body {
776
+ flex: 1;
777
+ padding: 4px 10px;
778
+ font-size: 13px;
779
+ color: var(--text-primary);
780
+ line-height: 1.5;
781
+ cursor: pointer;
782
+ background: none;
783
+ border: none;
784
+ text-align: left;
785
+ font-family: inherit;
786
+ border-radius: 4px;
787
+ transition: background 0.1s ease;
788
+ white-space: pre-wrap;
789
+ }
790
+
791
+ .inline-comment-body:hover {
792
+ background: var(--warning-bg);
793
+ }
794
+
795
+ .comments-pill:hover {
796
+ background: var(--warning-bg-hover);
797
+ }
798
+
799
+ .inline-comment-delete {
800
+ display: flex;
801
+ align-items: center;
802
+ justify-content: center;
803
+ width: 24px;
804
+ height: 24px;
805
+ border: none;
806
+ border-radius: 0;
807
+ background: transparent;
808
+ color: var(--text-muted);
809
+ cursor: pointer;
810
+ flex-shrink: 0;
811
+ padding: 0;
812
+ opacity: 0;
813
+ transition: opacity 0.1s ease, color 0.1s ease;
814
+ }
815
+
816
+ .inline-comment:hover .inline-comment-delete {
817
+ opacity: 1;
818
+ }
819
+
820
+ .inline-comment-delete:hover {
821
+ color: var(--danger);
822
+ }
823
+
824
+ /* --- Comment Slideover --- */
825
+
826
+ .slideover-backdrop {
827
+ position: fixed;
828
+ top: 0;
829
+ left: 0;
830
+ right: 0;
831
+ bottom: 0;
832
+ background: var(--overlay-bg);
833
+ z-index: 1000;
834
+ }
835
+
836
+ .slideover {
837
+ position: fixed;
838
+ top: 0;
839
+ right: 0;
840
+ bottom: 0;
841
+ width: 400px;
842
+ max-width: 90vw;
843
+ background: var(--bg-secondary);
844
+ border-left: 1px solid var(--border-color);
845
+ display: flex;
846
+ flex-direction: column;
847
+ box-shadow: -10px 0 40px var(--shadow);
848
+ animation: slideInRight 0.2s ease;
849
+ }
850
+
851
+ @keyframes slideInRight {
852
+ from { transform: translateX(100%); }
853
+ to { transform: translateX(0); }
854
+ }
855
+
856
+ .slideover-header {
857
+ display: flex;
858
+ align-items: center;
859
+ justify-content: space-between;
860
+ padding: 16px 20px;
861
+ border-bottom: 1px solid var(--border-color);
862
+ }
863
+
864
+ .slideover-title {
865
+ font-size: 16px;
866
+ font-weight: 600;
867
+ }
868
+
869
+ .slideover-body {
870
+ flex: 1;
871
+ overflow-y: auto;
872
+ padding: 12px;
873
+ }
874
+
875
+ .slideover-file-group {
876
+ margin-bottom: 16px;
877
+ }
878
+
879
+ .slideover-file-name {
880
+ font-size: 12px;
881
+ font-weight: 600;
882
+ color: var(--text-muted);
883
+ padding: 4px 8px;
884
+ margin-bottom: 4px;
885
+ text-transform: none;
886
+ overflow: hidden;
887
+ text-overflow: ellipsis;
888
+ white-space: nowrap;
889
+ }
890
+
891
+ .slideover-comment {
892
+ display: flex;
893
+ align-items: flex-start;
894
+ gap: 0;
895
+ border-radius: 6px;
896
+ transition: background 0.1s ease;
897
+ }
898
+
899
+ .slideover-comment:hover {
900
+ background: var(--bg-tertiary);
901
+ }
902
+
903
+ .slideover-comment-body {
904
+ flex: 1;
905
+ padding: 8px 10px;
906
+ display: flex;
907
+ flex-direction: column;
908
+ gap: 2px;
909
+ cursor: pointer;
910
+ border: none;
911
+ background: none;
912
+ color: inherit;
913
+ text-align: left;
914
+ font-family: inherit;
915
+ border-radius: 6px;
916
+ }
917
+
918
+ .slideover-comment-line {
919
+ font-size: 11px;
920
+ font-weight: 600;
921
+ color: var(--accent);
922
+ }
923
+
924
+ .slideover-comment-text {
925
+ font-size: 13px;
926
+ color: var(--text-primary);
927
+ line-height: 1.4;
928
+ display: -webkit-box;
929
+ -webkit-line-clamp: 3;
930
+ -webkit-box-orient: vertical;
931
+ overflow: hidden;
932
+ }
933
+
934
+ .slideover-comment-delete {
935
+ width: 28px;
936
+ height: 28px;
937
+ display: flex;
938
+ align-items: center;
939
+ justify-content: center;
940
+ border: none;
941
+ border-radius: 4px;
942
+ background: transparent;
943
+ color: var(--text-muted);
944
+ cursor: pointer;
945
+ font-size: 16px;
946
+ flex-shrink: 0;
947
+ margin-top: 6px;
948
+ margin-right: 4px;
949
+ opacity: 0;
950
+ transition: opacity 0.1s ease;
951
+ }
952
+
953
+ .slideover-comment:hover .slideover-comment-delete {
954
+ opacity: 1;
955
+ }
956
+
957
+ .slideover-comment-delete:hover {
958
+ color: var(--danger);
959
+ background: var(--deleted-badge-bg);
960
+ }
961
+
962
+ /* --- Generate Modal --- */
963
+
964
+ .comment-modal-overlay {
965
+ position: fixed;
966
+ top: 0;
967
+ left: 0;
968
+ right: 0;
969
+ bottom: 0;
970
+ background: var(--overlay-bg);
971
+ display: flex;
972
+ align-items: center;
973
+ justify-content: center;
974
+ z-index: 1000;
975
+ }
976
+
977
+ .generate-modal {
978
+ background: var(--bg-secondary);
979
+ border: 1px solid var(--border-color);
980
+ border-radius: 12px;
981
+ width: 720px;
982
+ max-width: 90vw;
983
+ max-height: 80vh;
984
+ display: flex;
985
+ flex-direction: column;
986
+ box-shadow: 0 20px 60px var(--shadow-heavy);
987
+ }
988
+
989
+ .generate-modal-body {
990
+ flex: 1;
991
+ padding: 20px;
992
+ overflow: hidden;
993
+ display: flex;
994
+ }
995
+
996
+ .generate-textarea {
997
+ width: 100%;
998
+ flex: 1;
999
+ min-height: 400px;
1000
+ padding: 16px;
1001
+ border: 1px solid var(--border-color);
1002
+ border-radius: 6px;
1003
+ background: var(--bg-primary);
1004
+ color: var(--text-primary);
1005
+ font-family: "SF Mono", "Fira Code", "Fira Mono", Menlo, Monaco, Consolas, monospace;
1006
+ font-size: 13px;
1007
+ line-height: 1.6;
1008
+ resize: none;
1009
+ }
1010
+
1011
+ .generate-textarea:focus {
1012
+ outline: none;
1013
+ border-color: var(--accent);
1014
+ }
1015
+
1016
+ .comment-modal-header {
1017
+ display: flex;
1018
+ align-items: center;
1019
+ justify-content: space-between;
1020
+ padding: 16px 20px;
1021
+ border-bottom: 1px solid var(--border-color);
1022
+ }
1023
+
1024
+ .comment-modal-title {
1025
+ font-size: 16px;
1026
+ font-weight: 600;
1027
+ }
1028
+
1029
+ .comment-modal-close {
1030
+ width: 28px;
1031
+ height: 28px;
1032
+ display: flex;
1033
+ align-items: center;
1034
+ justify-content: center;
1035
+ border: none;
1036
+ border-radius: 6px;
1037
+ background: transparent;
1038
+ color: var(--text-muted);
1039
+ cursor: pointer;
1040
+ font-size: 18px;
1041
+ }
1042
+
1043
+ .comment-modal-close:hover {
1044
+ background: var(--bg-tertiary);
1045
+ color: var(--text-primary);
1046
+ }
1047
+
1048
+ .comment-modal-footer {
1049
+ display: flex;
1050
+ justify-content: flex-end;
1051
+ gap: 12px;
1052
+ padding: 16px 20px;
1053
+ border-top: 1px solid var(--border-color);
1054
+ }
1055
+
1056
+ /* --- Buttons --- */
1057
+
1058
+ .btn {
1059
+ padding: 8px 16px;
1060
+ border-radius: 6px;
1061
+ font-size: 14px;
1062
+ font-weight: 500;
1063
+ cursor: pointer;
1064
+ transition: all 0.15s ease;
1065
+ }
1066
+
1067
+ .btn-secondary {
1068
+ border: 1px solid var(--border-color);
1069
+ background: transparent;
1070
+ color: var(--text-secondary);
1071
+ }
1072
+
1073
+ .btn-secondary:hover {
1074
+ background: var(--bg-tertiary);
1075
+ color: var(--text-primary);
1076
+ }
1077
+
1078
+ .btn-primary {
1079
+ border: none;
1080
+ background: var(--accent);
1081
+ color: var(--bg-primary);
1082
+ }
1083
+
1084
+ .btn-primary:hover {
1085
+ background: var(--accent-hover);
1086
+ }
1087
+
1088
+ /* --- Toast --- */
1089
+
1090
+ .toast {
1091
+ position: fixed;
1092
+ bottom: 24px;
1093
+ right: 24px;
1094
+ padding: 12px 20px;
1095
+ background: var(--bg-secondary);
1096
+ border: 1px solid var(--border-color);
1097
+ border-radius: 8px;
1098
+ color: var(--text-primary);
1099
+ font-size: 14px;
1100
+ box-shadow: 0 10px 40px var(--shadow);
1101
+ z-index: 2000;
1102
+ animation: slideIn 0.2s ease;
1103
+ }
1104
+
1105
+ .toast.success {
1106
+ border-color: var(--success);
1107
+ }
1108
+
1109
+ @keyframes slideIn {
1110
+ from { transform: translateY(20px); opacity: 0; }
1111
+ to { transform: translateY(0); opacity: 1; }
1112
+ }
1113
+
1114
+ /* --- States --- */
1115
+
1116
+ .empty-state {
1117
+ display: flex;
1118
+ flex-direction: column;
1119
+ align-items: center;
1120
+ justify-content: center;
1121
+ height: 100%;
1122
+ color: var(--text-muted);
1123
+ gap: 12px;
1124
+ }
1125
+
1126
+ .empty-state-icon {
1127
+ font-size: 48px;
1128
+ opacity: 0.5;
1129
+ }
1130
+
1131
+ .empty-state-text {
1132
+ font-size: 16px;
1133
+ }
1134
+
1135
+ .loading {
1136
+ display: flex;
1137
+ align-items: center;
1138
+ justify-content: center;
1139
+ height: 100%;
1140
+ color: var(--text-muted);
1141
+ }
1142
+
1143
+ .loading-spinner {
1144
+ width: 32px;
1145
+ height: 32px;
1146
+ border: 3px solid var(--border-color);
1147
+ border-top-color: var(--accent);
1148
+ border-radius: 50%;
1149
+ animation: spin 0.8s linear infinite;
1150
+ }
1151
+
1152
+ @keyframes spin {
1153
+ to { transform: rotate(360deg); }
1154
+ }