main.css
Raw
1/* View Transitions */
2@view-transition {
3 navigation: auto;
4}
5
6.site-nav {
7 view-transition-name: site-nav;
8}
9.repo-header {
10 view-transition-name: repo-header;
11}
12.breadcrumb {
13 view-transition-name: breadcrumb;
14}
15
16/* ============================================================
17 @layer reset
18 ============================================================ */
19@layer reset {
20 *,
21 *::before,
22 *::after {
23 box-sizing: border-box;
24 margin: 0;
25 padding: 0;
26 }
27 html {
28 -webkit-text-size-adjust: 100%;
29 }
30 body {
31 min-height: 100dvh;
32 min-width: 500px;
33 }
34 img,
35 video {
36 max-width: 100%;
37 height: auto;
38 }
39 button,
40 input,
41 textarea,
42 select {
43 font: inherit;
44 }
45 a {
46 color: inherit;
47 }
48 ul,
49 ol {
50 list-style: none;
51 }
52 h1,
53 h2,
54 h3,
55 h4,
56 h5,
57 h6 {
58 font-weight: 600;
59 line-height: 1.2;
60 }
61 pre,
62 code {
63 font-family: var(--font-mono);
64 }
65}
66
67/* ============================================================
68 @layer tokens
69 ============================================================ */
70@layer tokens {
71 :root {
72 /* Colors — light */
73 --color-bg: #ffffff;
74 --color-bg-subtle: #f6f8fa;
75 --color-bg-inset: #eef0f2;
76 --color-border: #d0d7de;
77 --color-border-muted: #e4e7eb;
78 --color-text: #1f2328;
79 --color-text-muted: #656d76;
80 --color-link: #0969da;
81 --color-link-hover: #0550ae;
82
83 --color-accent: #fd7e14;
84 --color-accent-bg: #fff3cd;
85
86 --color-success: #1a7f37;
87 --color-success-bg: #dafbe1;
88 --color-danger: #cf222e;
89 --color-danger-bg: #ffebe9;
90 --color-warning: #9a6700;
91 --color-warning-bg: #fff8c5;
92 --color-merged: #8250df;
93 --color-merged-bg: #fbefff;
94
95 /* Typography */
96 --font-sans:
97 system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
98 --font-mono:
99 ui-monospace, "Cascadia Code", "Source Code Pro", monospace;
100
101 --text-xs: 0.75rem;
102 --text-sm: 0.875rem;
103 --text-base: 1rem;
104 --text-lg: 1.125rem;
105 --text-xl: 1.25rem;
106 --text-2xl: 1.5rem;
107 --text-3xl: 1.875rem;
108
109 /* Spacing */
110 --space-1: 0.25rem;
111 --space-2: 0.5rem;
112 --space-3: 0.75rem;
113 --space-4: 1rem;
114 --space-5: 1.25rem;
115 --space-6: 1.5rem;
116 --space-8: 2rem;
117 --space-10: 2.5rem;
118 --space-12: 3rem;
119 --space-16: 4rem;
120
121 /* Border radius */
122 --radius-sm: 4px;
123 --radius-md: 6px;
124 --radius-lg: 8px;
125 --radius-full: 9999px;
126
127 /* Shadows */
128 --shadow-sm: 0 1px 0 rgba(27, 31, 36, 0.04);
129 --shadow-md: 0 3px 6px rgba(140, 149, 159, 0.15);
130 --shadow-lg: 0 8px 24px rgba(140, 149, 159, 0.2);
131 }
132
133 @media (prefers-color-scheme: dark) {
134 :root {
135 --color-bg: #0d1117;
136 --color-bg-subtle: #161b22;
137 --color-bg-inset: #1c2128;
138 --color-border: #30363d;
139 --color-border-muted: #21262d;
140 --color-text: #e6edf3;
141 --color-text-muted: #7d8590;
142 --color-link: #58a6ff;
143 --color-link-hover: #79c0ff;
144
145 --color-accent: #f0883e;
146 --color-accent-bg: #3d2f00;
147
148 --color-success: #3fb950;
149 --color-success-bg: #0d2b19;
150 --color-danger: #f85149;
151 --color-danger-bg: #2d1419;
152 --color-warning: #d29922;
153 --color-warning-bg: #2c2000;
154 --color-merged: #bc8cff;
155 --color-merged-bg: #1e0b3e;
156 }
157 }
158
159 /* Explicit theme overrides — applied via data-theme attribute set by cookie */
160 :root[data-theme="dark"] {
161 --color-bg: #0d1117;
162 --color-bg-subtle: #161b22;
163 --color-bg-inset: #1c2128;
164 --color-border: #30363d;
165 --color-border-muted: #21262d;
166 --color-text: #e6edf3;
167 --color-text-muted: #7d8590;
168 --color-link: #58a6ff;
169 --color-link-hover: #79c0ff;
170 --color-accent: #f0883e;
171 --color-accent-bg: #3d2f00;
172 --color-success: #3fb950;
173 --color-success-bg: #0d2b19;
174 --color-danger: #f85149;
175 --color-danger-bg: #2d1419;
176 --color-warning: #d29922;
177 --color-warning-bg: #2c2000;
178 --color-merged: #bc8cff;
179 --color-merged-bg: #1e0b3e;
180 }
181 :root[data-theme="light"] {
182 --color-bg: #ffffff;
183 --color-bg-subtle: #f6f8fa;
184 --color-bg-inset: #eef0f2;
185 --color-border: #d0d7de;
186 --color-border-muted: #e4e7eb;
187 --color-text: #1f2328;
188 --color-text-muted: #656d76;
189 --color-link: #0969da;
190 --color-link-hover: #0550ae;
191 --color-accent: #fd7e14;
192 --color-accent-bg: #fff3cd;
193 --color-success: #1a7f37;
194 --color-success-bg: #dafbe1;
195 --color-danger: #cf222e;
196 --color-danger-bg: #ffebe9;
197 --color-warning: #9a6700;
198 --color-warning-bg: #fff8c5;
199 --color-merged: #8250df;
200 --color-merged-bg: #fbefff;
201 }
202}
203
204/* ============================================================
205 @layer layout
206 ============================================================ */
207@layer layout {
208 body {
209 font-family: var(--font-sans);
210 font-size: var(--text-base);
211 color: var(--color-text);
212 background: var(--color-bg);
213 display: grid;
214 grid-template-rows: auto 1fr auto;
215 min-height: 100dvh;
216 }
217
218 .site-header {
219 background: var(--color-bg-subtle);
220 border-bottom: 1px solid var(--color-border);
221 position: sticky;
222 top: 0;
223 z-index: 100;
224 }
225
226 .site-nav {
227 max-width: 1200px;
228 margin: 0 auto;
229 padding: var(--space-3) var(--space-4);
230 display: flex;
231 align-items: center;
232 gap: var(--space-4);
233 }
234
235 .site-logo {
236 display: flex;
237 align-items: center;
238 gap: var(--space-2);
239 text-decoration: none;
240 font-weight: 700;
241 font-size: var(--text-lg);
242 color: var(--color-text);
243 }
244
245 .logo-icon {
246 width: 1.6em;
247 height: 1.6em;
248 display: block;
249 flex-shrink: 0;
250 }
251
252 .nav-links {
253 margin-left: auto;
254 display: flex;
255 align-items: center;
256 gap: var(--space-3);
257 }
258
259 .nav-user {
260 font-size: var(--text-sm);
261 color: var(--color-text-muted);
262 }
263
264 .site-main {
265 padding: var(--space-8) var(--space-4);
266 min-width: 0;
267 }
268
269 .site-footer {
270 text-align: center;
271 padding: var(--space-6) var(--space-4);
272 font-size: var(--text-sm);
273 color: var(--color-text-muted);
274 border-top: 1px solid var(--color-border);
275 }
276
277 .container {
278 max-width: 1000px;
279 margin: 0 auto;
280 overflow-x: clip;
281 }
282
283 .container-narrow {
284 max-width: 680px;
285 }
286
287 .inline-form {
288 display: inline;
289 }
290
291 /* --- Two-step delete confirmation --- */
292 .confirm-details {
293 position: relative;
294 display: inline-block;
295 }
296 .confirm-details > summary {
297 list-style: none;
298 }
299 .confirm-details > summary::-webkit-details-marker {
300 display: none;
301 }
302 .confirm-popup {
303 position: absolute;
304 right: 0;
305 top: calc(100% + var(--space-1));
306 background: var(--color-bg);
307 border: 1px solid var(--color-border);
308 border-radius: var(--radius-md);
309 padding: var(--space-3) var(--space-4);
310 display: flex;
311 align-items: center;
312 gap: var(--space-3);
313 white-space: nowrap;
314 z-index: 100;
315 font-size: var(--text-sm);
316 color: var(--color-text-muted);
317 }
318}
319
320/* ============================================================
321 @layer components
322 ============================================================ */
323@layer components {
324 /* --- Buttons --- */
325 .btn {
326 display: inline-flex;
327 align-items: center;
328 gap: var(--space-2);
329 padding: var(--space-2) var(--space-4);
330 border: 1px solid var(--color-border);
331 border-radius: var(--radius-md);
332 font-size: var(--text-sm);
333 font-weight: 500;
334 text-decoration: none;
335 cursor: pointer;
336 background: var(--color-bg-subtle);
337 color: var(--color-text);
338 transition:
339 background 0.1s,
340 border-color 0.1s;
341 white-space: nowrap;
342 }
343 .btn:hover {
344 background: var(--color-bg-inset);
345 border-color: var(--color-border);
346 }
347 .btn:disabled {
348 opacity: 0.5;
349 cursor: not-allowed;
350 }
351 .btn-primary {
352 background: var(--color-accent);
353 border-color: transparent;
354 color: #fff;
355 }
356 .btn-primary:hover {
357 background: color-mix(in srgb, var(--color-accent) 82%, #000);
358 }
359 .btn-secondary {
360 background: var(--color-bg-subtle);
361 border-color: var(--color-border);
362 }
363 .btn-ghost {
364 background: transparent;
365 border-color: transparent;
366 }
367 .btn-ghost:hover {
368 background: var(--color-bg-inset);
369 }
370 /* Keep ghost transparent even when combined with size variants */
371 .btn-ghost.btn-xs,
372 .btn-ghost.btn-sm {
373 background: transparent;
374 border-color: transparent;
375 }
376 .btn-ghost.btn-xs:hover,
377 .btn-ghost.btn-sm:hover {
378 background: var(--color-bg-inset);
379 }
380 .btn-sm {
381 padding: var(--space-1) var(--space-3);
382 font-size: var(--text-xs);
383 }
384 .btn-block {
385 width: 100%;
386 justify-content: center;
387 }
388
389 /* --- Forms --- */
390 .form-group {
391 display: flex;
392 flex-direction: column;
393 gap: var(--space-2);
394 margin-bottom: var(--space-4);
395 }
396 .form-group label {
397 font-size: var(--text-sm);
398 font-weight: 500;
399 color: var(--color-text);
400 }
401 .form-group input:not([type="file"]):not([type="checkbox"]),
402 .form-group textarea,
403 .form-group select {
404 padding: var(--space-2) var(--space-3);
405 border: 1px solid var(--color-border);
406 border-radius: var(--radius-md);
407 background: var(--color-bg);
408 color: var(--color-text);
409 font-size: var(--text-sm);
410 }
411 .form-group input:not([type="file"]):not([type="checkbox"]):focus,
412 .form-group textarea:focus {
413 outline: 2px solid var(--color-accent);
414 outline-offset: -1px;
415 border-color: var(--color-accent);
416 }
417 .form-group input[type="file"] {
418 font-size: var(--text-sm);
419 color: var(--color-text);
420 padding: 0;
421 border: none;
422 background: none;
423 }
424 .form-group textarea {
425 resize: vertical;
426 min-height: 120px;
427 }
428 .form-success {
429 background: var(--color-success-bg);
430 color: var(--color-success);
431 border: 1px solid var(--color-success);
432 border-radius: var(--radius-md);
433 padding: var(--space-3) var(--space-4);
434 font-size: var(--text-sm);
435 margin-bottom: var(--space-4);
436 }
437 .form-hint {
438 font-size: var(--text-sm);
439 color: var(--color-text-muted);
440 margin: 0;
441 }
442 .form-error {
443 background: var(--color-danger-bg);
444 color: var(--color-danger);
445 border: 1px solid var(--color-danger);
446 border-radius: var(--radius-md);
447 padding: var(--space-3) var(--space-4);
448 font-size: var(--text-sm);
449 margin-bottom: var(--space-4);
450 }
451 .form-actions {
452 display: flex;
453 gap: var(--space-3);
454 align-items: center;
455 flex-wrap: wrap;
456 }
457 .form-card {
458 background: var(--color-bg-subtle);
459 border: 1px solid var(--color-border);
460 border-radius: var(--radius-lg);
461 padding: var(--space-6);
462 margin-top: var(--space-4);
463 }
464 .checkbox-label {
465 display: flex;
466 align-items: center;
467 gap: var(--space-2);
468 cursor: pointer;
469 }
470
471 /* --- Page header --- */
472 .page-header {
473 display: flex;
474 align-items: center;
475 justify-content: space-between;
476 margin-bottom: var(--space-6);
477 gap: var(--space-4);
478 }
479 .page-title {
480 font-size: var(--text-2xl);
481 color: var(--color-text);
482 margin-bottom: var(--space-4);
483 }
484 .page-title a {
485 text-decoration: none;
486 color: var(--color-link);
487 }
488 .page-title a:hover {
489 text-decoration: underline;
490 }
491 .section-title {
492 font-size: var(--text-lg);
493 margin-bottom: var(--space-4);
494 padding-bottom: var(--space-2);
495 border-bottom: 1px solid var(--color-border);
496 }
497
498 /* --- Auth --- */
499 .auth-container {
500 max-width: 400px;
501 margin: var(--space-12) auto;
502 }
503 .auth-container .page-title {
504 margin-bottom: var(--space-6);
505 }
506 .auth-form {
507 margin-bottom: var(--space-4);
508 }
509 .auth-footer {
510 text-align: center;
511 font-size: var(--text-sm);
512 color: var(--color-text-muted);
513 margin-top: var(--space-4);
514 }
515 .passkey-btn {
516 display: none;
517 margin-top: var(--space-3);
518 }
519
520 /* --- Repo header --- */
521 .repo-header {
522 margin-bottom: var(--space-2);
523 }
524 .repo-title-row {
525 display: flex;
526 align-items: center;
527 gap: var(--space-3);
528 flex-wrap: wrap;
529 }
530 .repo-title-row .page-title {
531 margin-bottom: 0;
532 }
533 .repo-header-title {
534 display: flex;
535 align-items: center;
536 gap: var(--space-3);
537 flex-wrap: wrap;
538 }
539 .repo-description {
540 color: var(--color-text-muted);
541 margin-top: var(--space-2);
542 }
543 .repo-header-meta {
544 display: flex;
545 align-items: center;
546 gap: var(--space-4);
547 margin-bottom: var(--space-3);
548 font-size: var(--text-sm);
549 color: var(--color-text-muted);
550 }
551 .icon {
552 font-style: normal;
553 }
554
555 /* --- Branch selector --- */
556 .branch-selector {
557 display: inline-flex;
558 align-items: center;
559 gap: var(--space-2);
560 }
561 .branch-selector-icon {
562 color: var(--color-text-muted);
563 font-size: var(--text-sm);
564 user-select: none;
565 }
566 .branch-select {
567 padding: var(--space-1) var(--space-2);
568 padding-right: var(--space-5);
569 border: 1px solid var(--color-border);
570 border-radius: var(--radius-md);
571 background: var(--color-bg-subtle);
572 font-size: var(--text-sm);
573 font-family: var(--font-mono);
574 color: var(--color-text);
575 cursor: pointer;
576 appearance: auto;
577 max-width: 180px;
578 }
579 .branch-select:hover {
580 border-color: var(--color-text-muted);
581 }
582 .branch-select:focus {
583 outline: 2px solid var(--color-accent);
584 outline-offset: -1px;
585 }
586
587 /* toolbar row above file tree */
588 .tree-toolbar {
589 display: flex;
590 align-items: center;
591 justify-content: space-between;
592 margin-bottom: var(--space-3);
593 }
594
595 /* commits-header flex row */
596 .commits-header {
597 display: flex;
598 align-items: center;
599 gap: var(--space-4);
600 margin-bottom: var(--space-4);
601 flex-wrap: wrap;
602 }
603 .commits-header .section-title {
604 margin-bottom: 0;
605 }
606
607 /* --- Repo nav bar (tabs + private badge) --- */
608 .repo-nav-bar {
609 display: flex;
610 align-items: center;
611 justify-content: space-between;
612 border-bottom: 1px solid var(--color-border);
613 margin-bottom: var(--space-6);
614 gap: var(--space-4);
615 }
616
617 /* --- Repo tabs --- */
618 .repo-tabs {
619 display: flex;
620 gap: 0;
621 flex: 1;
622 overflow-x: auto;
623 overflow-y: hidden;
624 }
625 .repo-tab {
626 padding: var(--space-3) var(--space-4);
627 font-size: var(--text-sm);
628 text-decoration: none;
629 color: var(--color-text-muted);
630 border-bottom: 2px solid transparent;
631 margin-bottom: -1px;
632 transition: color 0.1s;
633 }
634 .repo-tab:hover {
635 color: var(--color-text);
636 }
637 .repo-tab.active {
638 color: var(--color-text);
639 font-weight: 600;
640 border-bottom-color: var(--color-accent);
641 }
642 /* Align active indicator with nav-bar border */
643 .repo-tab {
644 margin-bottom: -1px;
645 }
646
647 /* --- Repo list --- */
648 .repo-list {
649 display: flex;
650 flex-direction: column;
651 gap: var(--space-2);
652 }
653 .repo-card {
654 display: flex;
655 align-items: flex-start;
656 justify-content: space-between;
657 padding: var(--space-4) var(--space-5);
658 border: 1px solid var(--color-border);
659 border-radius: var(--radius-lg);
660 background: var(--color-bg);
661 gap: var(--space-4);
662 transition: border-color 0.15s;
663 }
664 .repo-card:hover {
665 border-color: var(--color-accent);
666 }
667 .repo-card-main {
668 flex: 1;
669 min-width: 0;
670 }
671 .repo-card-title {
672 display: flex;
673 align-items: center;
674 gap: var(--space-2);
675 flex-wrap: wrap;
676 margin-bottom: var(--space-1);
677 }
678 .repo-name {
679 font-size: var(--text-lg);
680 font-weight: 600;
681 color: var(--color-link);
682 text-decoration: none;
683 }
684 .repo-name:hover {
685 text-decoration: underline;
686 }
687 .repo-card-meta {
688 display: flex;
689 flex-direction: column;
690 align-items: flex-end;
691 gap: var(--space-1);
692 font-size: var(--text-xs);
693 color: var(--color-text-muted);
694 white-space: nowrap;
695 }
696 .repo-date {
697 color: var(--color-text-muted);
698 }
699
700 /* --- Badges --- */
701 .badge {
702 display: inline-flex;
703 align-items: center;
704 padding: 1px var(--space-2);
705 border-radius: var(--radius-full);
706 font-size: var(--text-xs);
707 font-weight: 500;
708 border: 1px solid;
709 }
710 .badge-private {
711 color: var(--color-warning);
712 border-color: var(--color-warning);
713 background: var(--color-warning-bg);
714 }
715 .issue-badge,
716 .patch-badge {
717 display: inline-flex;
718 align-items: center;
719 padding: var(--space-1) var(--space-3);
720 border-radius: var(--radius-full);
721 font-size: var(--text-xs);
722 font-weight: 500;
723 text-transform: capitalize;
724 }
725 .issue-badge.open,
726 .patch-badge.open {
727 background: var(--color-success-bg);
728 color: var(--color-success);
729 }
730 .issue-badge.closed,
731 .patch-badge.closed {
732 background: var(--color-danger-bg);
733 color: var(--color-danger);
734 }
735 .issue-badge.completed {
736 background: var(--color-merged-bg);
737 color: var(--color-merged);
738 }
739 .patch-badge.merged {
740 background: var(--color-merged-bg);
741 color: var(--color-merged);
742 }
743
744 /* --- Empty state --- */
745 .empty-state {
746 text-align: center;
747 padding: var(--space-16) var(--space-4);
748 color: var(--color-text-muted);
749 }
750 .empty-state p {
751 margin-bottom: var(--space-4);
752 font-size: var(--text-lg);
753 }
754
755 /* --- Breadcrumb --- */
756 .breadcrumb {
757 display: flex;
758 align-items: center;
759 flex-wrap: wrap;
760 gap: var(--space-1);
761 font-size: var(--text-sm);
762 margin-bottom: var(--space-4);
763 }
764 .breadcrumb a {
765 color: var(--color-link);
766 text-decoration: none;
767 }
768 .breadcrumb a:hover {
769 text-decoration: underline;
770 }
771 .breadcrumb-sep {
772 color: var(--color-text-muted);
773 }
774 .breadcrumb-current {
775 color: var(--color-text-muted);
776 }
777
778 /* --- File tree --- */
779 .file-tree {
780 width: 100%;
781 border: 1px solid var(--color-border);
782 border-radius: var(--radius-lg);
783 border-collapse: collapse;
784 overflow: hidden;
785 margin-bottom: var(--space-6);
786 }
787 .file-tree-row {
788 border-bottom: 1px solid var(--color-border-muted);
789 }
790 .file-tree-row:last-child {
791 border-bottom: none;
792 }
793 .file-tree-row:hover {
794 background: var(--color-bg-subtle);
795 }
796 .file-icon,
797 .file-name,
798 .file-size {
799 padding: var(--space-2) var(--space-3);
800 font-size: var(--text-sm);
801 vertical-align: middle;
802 }
803 .file-icon {
804 width: 36px;
805 padding-right: var(--space-1);
806 text-align: center;
807 line-height: 0;
808 }
809 .file-name {
810 width: 100%;
811 }
812 .file-name a {
813 color: var(--color-link);
814 text-decoration: none;
815 }
816 .file-name a:hover {
817 text-decoration: underline;
818 }
819 .file-name a.file-name-dir {
820 font-weight: 500;
821 }
822 .file-size {
823 text-align: right;
824 color: var(--color-text-muted);
825 font-size: var(--text-xs);
826 white-space: nowrap;
827 padding-right: var(--space-4);
828 }
829 .file-icon-dir {
830 color: var(--color-link);
831 }
832 .file-icon-file {
833 color: var(--color-text-muted);
834 }
835 .tree-icon {
836 display: inline-block;
837 vertical-align: text-bottom;
838 }
839 .file-tree-row-up .file-name a {
840 color: var(--color-text-muted);
841 }
842 .file-tree-row-up .file-name a:hover {
843 color: var(--color-link);
844 }
845
846 /* --- File blob --- */
847 .file-blob-header {
848 display: flex;
849 align-items: center;
850 justify-content: space-between;
851 padding: var(--space-3) var(--space-4);
852 background: var(--color-bg-subtle);
853 border: 1px solid var(--color-border);
854 border-radius: var(--radius-lg) var(--radius-lg) 0 0;
855 }
856 .file-blob-name {
857 font-size: var(--text-sm);
858 font-weight: 500;
859 }
860 .file-blob-body {
861 border: 1px solid var(--color-border);
862 border-top: none;
863 border-radius: 0 0 var(--radius-lg) var(--radius-lg);
864 overflow: auto;
865 }
866 /* Blob line-number table */
867 .blob-table {
868 min-width: 100%;
869 border-collapse: collapse;
870 font-family: var(--font-mono);
871 font-size: var(--text-sm);
872 line-height: 1.6;
873 background-color: var(--shiki-light-bg, #fff);
874 color: var(--shiki-light, inherit);
875 }
876 .blob-ln {
877 width: 1%;
878 min-width: 48px;
879 text-align: right;
880 padding: 0 var(--space-3);
881 color: var(--color-text-muted);
882 border-right: 1px solid var(--color-border-muted);
883 user-select: none;
884 white-space: nowrap;
885 vertical-align: top;
886 }
887 .blob-ln a {
888 color: inherit;
889 text-decoration: none;
890 }
891 .blob-ln a:hover {
892 color: var(--color-link);
893 }
894 .blob-code {
895 padding: 0 var(--space-4);
896 white-space: pre;
897 overflow: visible;
898 vertical-align: top;
899 }
900 .blob-table tr:target {
901 background: color-mix(in srgb, #ddf4ff 60%, transparent);
902 }
903 .blob-table tr:target .blob-ln {
904 background: color-mix(in srgb, #ddf4ff 80%, transparent);
905 }
906 .file-download-notice {
907 padding: var(--space-8);
908 text-align: center;
909 color: var(--color-text-muted);
910 }
911 .file-download-notice p {
912 margin-bottom: var(--space-4);
913 }
914
915 /* --- Commit list --- */
916 .commit-list {
917 display: flex;
918 flex-direction: column;
919 }
920 .commit-item {
921 display: flex;
922 align-items: flex-start;
923 justify-content: space-between;
924 padding: var(--space-3) 0;
925 border-bottom: 1px solid var(--color-border-muted);
926 gap: var(--space-4);
927 flex-wrap: wrap;
928 }
929 .commit-item:last-child {
930 border-bottom: none;
931 }
932 .commit-main {
933 flex: 1;
934 min-width: 0;
935 }
936 .commit-subject {
937 color: var(--color-text);
938 text-decoration: none;
939 font-size: var(--text-sm);
940 font-weight: 500;
941 }
942 .commit-subject:hover {
943 color: var(--color-link);
944 }
945 .commit-meta {
946 display: flex;
947 align-items: center;
948 gap: var(--space-3);
949 font-size: var(--text-xs);
950 color: var(--color-text-muted);
951 white-space: nowrap;
952 }
953 .commit-hash {
954 font-family: var(--font-mono);
955 color: var(--color-link);
956 text-decoration: none;
957 background: var(--color-bg-inset);
958 padding: 1px var(--space-2);
959 border-radius: var(--radius-sm);
960 }
961 .commit-hash:hover {
962 text-decoration: underline;
963 }
964 .mono {
965 font-family: var(--font-mono);
966 }
967
968 /* --- Commit detail viewer --- */
969 .commit-page-top {
970 display: flex;
971 align-items: center;
972 justify-content: space-between;
973 margin-bottom: var(--space-4);
974 }
975 .commit-card {
976 border: 1px solid var(--color-border);
977 border-radius: var(--radius-lg);
978 margin-bottom: var(--space-4);
979 overflow: hidden;
980 }
981 .commit-card-subject {
982 font-size: var(--text-xl);
983 font-weight: 600;
984 padding: var(--space-5) var(--space-6);
985 border-bottom: 1px solid var(--color-border);
986 line-height: 1.3;
987 }
988 .commit-card-body {
989 padding: var(--space-4) var(--space-6);
990 font-family: inherit;
991 font-size: var(--text-sm);
992 color: var(--color-text-muted);
993 border-bottom: 1px solid var(--color-border);
994 overflow-x: auto;
995 }
996 .commit-card-meta {
997 padding: var(--space-4) var(--space-6);
998 display: flex;
999 flex-direction: column;
1000 gap: var(--space-2);
1001 background: var(--color-bg-subtle);
1002 }
1003 .commit-card-meta-row {
1004 display: flex;
1005 align-items: baseline;
1006 gap: var(--space-3);
1007 font-size: var(--text-sm);
1008 flex-wrap: wrap;
1009 }
1010 .commit-meta-label {
1011 font-weight: 600;
1012 color: var(--color-text-muted);
1013 min-width: 5rem;
1014 font-size: var(--text-xs);
1015 text-transform: uppercase;
1016 letter-spacing: 0.04em;
1017 }
1018 .commit-sha-full {
1019 font-size: var(--text-xs);
1020 background: var(--color-bg-inset);
1021 padding: 2px var(--space-2);
1022 border-radius: var(--radius-sm);
1023 word-break: break-all;
1024 }
1025 .commit-stats-bar {
1026 font-size: var(--text-sm);
1027 color: var(--color-text-muted);
1028 margin-bottom: var(--space-4);
1029 }
1030
1031 /* --- Commit layout (sidebar + diffs) --- */
1032 .commit-layout {
1033 display: grid;
1034 grid-template-columns: 1fr;
1035 gap: var(--space-5);
1036 align-items: start;
1037 }
1038 .commit-diffs {
1039 min-width: 0;
1040 }
1041 @media (min-width: 900px) {
1042 .commit-layout {
1043 grid-template-columns: 220px 1fr;
1044 }
1045 .commit-layout:has(.file-nav-details:not([open])) {
1046 grid-template-columns: auto 1fr;
1047 }
1048 }
1049
1050 /* --- File nav sidebar --- */
1051 .commit-file-nav {
1052 position: sticky;
1053 top: calc(56px + var(--space-4));
1054 max-height: calc(100vh - 140px);
1055 overflow-y: auto;
1056 }
1057 .file-nav-details {
1058 border: 1px solid var(--color-border);
1059 border-radius: var(--radius-lg);
1060 background: var(--color-bg-subtle);
1061 overflow: hidden;
1062 }
1063 .file-nav-toggle {
1064 display: flex;
1065 align-items: center;
1066 gap: var(--space-2);
1067 padding: var(--space-3) var(--space-4);
1068 font-size: var(--text-sm);
1069 font-weight: 500;
1070 cursor: pointer;
1071 list-style: none;
1072 user-select: none;
1073 border-bottom: 1px solid var(--color-border);
1074 }
1075 .file-nav-toggle::-webkit-details-marker {
1076 display: none;
1077 }
1078 .file-nav-details:not([open]) .file-nav-toggle {
1079 border-bottom: none;
1080 }
1081 .file-nav-toggle-icon {
1082 font-size: 1em;
1083 transition: transform 0.15s;
1084 }
1085 .file-nav-details:not([open]) .file-nav-toggle-icon {
1086 transform: rotate(-90deg);
1087 }
1088 .file-nav-list {
1089 padding: var(--space-1) 0;
1090 list-style: none;
1091 }
1092 .file-nav-item {
1093 display: flex;
1094 align-items: center;
1095 gap: var(--space-2);
1096 padding: var(--space-1) var(--space-3);
1097 font-size: var(--text-xs);
1098 text-decoration: none;
1099 color: var(--color-text);
1100 border-radius: 0;
1101 overflow: hidden;
1102 }
1103 .file-nav-item:hover {
1104 background: var(--color-bg-inset);
1105 }
1106 .file-nav-status {
1107 flex-shrink: 0;
1108 width: 16px;
1109 height: 16px;
1110 display: inline-flex;
1111 align-items: center;
1112 justify-content: center;
1113 border-radius: var(--radius-sm);
1114 font-size: 9px;
1115 font-weight: 700;
1116 font-family: var(--font-mono);
1117 }
1118 .file-status-added {
1119 background: var(--color-success-bg);
1120 color: var(--color-success);
1121 }
1122 .file-status-deleted {
1123 background: var(--color-danger-bg);
1124 color: var(--color-danger);
1125 }
1126 .file-status-modified {
1127 background: var(--color-accent-bg);
1128 color: var(--color-accent);
1129 }
1130 .file-status-renamed {
1131 background: var(--color-merged-bg);
1132 color: var(--color-merged);
1133 }
1134 .file-status-copied {
1135 background: var(--color-merged-bg);
1136 color: var(--color-merged);
1137 }
1138 .file-nav-name {
1139 flex: 1;
1140 overflow: hidden;
1141 text-overflow: ellipsis;
1142 white-space: nowrap;
1143 font-family: var(--font-mono);
1144 }
1145 .file-nav-stat {
1146 flex-shrink: 0;
1147 display: flex;
1148 gap: var(--space-1);
1149 font-size: var(--text-xs);
1150 font-family: var(--font-mono);
1151 }
1152 .nav-add {
1153 color: var(--color-success);
1154 }
1155 .nav-del {
1156 color: var(--color-danger);
1157 }
1158 .file-nav-dir > details > .file-nav-list {
1159 padding-left: var(--space-4);
1160 }
1161 .file-nav-dir-toggle {
1162 display: flex;
1163 align-items: center;
1164 gap: var(--space-1);
1165 padding: var(--space-1) var(--space-3);
1166 font-size: var(--text-xs);
1167 font-family: var(--font-mono);
1168 color: var(--color-text-muted);
1169 cursor: pointer;
1170 list-style: none;
1171 user-select: none;
1172 }
1173 .file-nav-dir-toggle::-webkit-details-marker {
1174 display: none;
1175 }
1176 .file-nav-dir > details:not([open]) .file-nav-toggle-icon {
1177 transform: rotate(-90deg);
1178 }
1179
1180 /* --- Diff file cards --- */
1181 .diff-file {
1182 border: 1px solid var(--color-border);
1183 border-radius: var(--radius-lg);
1184 margin-bottom: var(--space-4);
1185 overflow: hidden;
1186 }
1187 .diff-file-header {
1188 display: flex;
1189 align-items: center;
1190 justify-content: space-between;
1191 gap: var(--space-3);
1192 padding: var(--space-3) var(--space-4);
1193 background: var(--color-bg-subtle);
1194 cursor: pointer;
1195 list-style: none;
1196 user-select: none;
1197 flex-wrap: wrap;
1198 }
1199 .diff-file-header::-webkit-details-marker {
1200 display: none;
1201 }
1202 .diff-file-header-left {
1203 display: flex;
1204 align-items: center;
1205 gap: var(--space-2);
1206 min-width: 0;
1207 flex: 1;
1208 }
1209 .diff-file-header-right {
1210 display: flex;
1211 align-items: center;
1212 gap: var(--space-2);
1213 flex-shrink: 0;
1214 flex-wrap: wrap;
1215 }
1216 .diff-file-toggle-icon {
1217 font-size: 0.7em;
1218 flex-shrink: 0;
1219 transition: transform 0.15s;
1220 }
1221 .diff-file:not([open]) .diff-file-toggle-icon {
1222 transform: rotate(-90deg);
1223 }
1224 .diff-status-badge {
1225 flex-shrink: 0;
1226 width: 18px;
1227 height: 18px;
1228 display: inline-flex;
1229 align-items: center;
1230 justify-content: center;
1231 border-radius: var(--radius-sm);
1232 font-size: 10px;
1233 font-weight: 700;
1234 font-family: var(--font-mono);
1235 }
1236 .diff-status-added {
1237 background: var(--color-success-bg);
1238 color: var(--color-success);
1239 }
1240 .diff-status-deleted {
1241 background: var(--color-danger-bg);
1242 color: var(--color-danger);
1243 }
1244 .diff-status-modified {
1245 background: var(--color-accent-bg);
1246 color: var(--color-accent);
1247 }
1248 .diff-status-renamed {
1249 background: var(--color-merged-bg);
1250 color: var(--color-merged);
1251 }
1252 .diff-status-copied {
1253 background: var(--color-merged-bg);
1254 color: var(--color-merged);
1255 }
1256 .diff-file-path {
1257 font-size: var(--text-sm);
1258 font-weight: 500;
1259 overflow: hidden;
1260 text-overflow: ellipsis;
1261 white-space: nowrap;
1262 }
1263 .diff-rename-arrow {
1264 font-size: var(--text-xs);
1265 color: var(--color-text-muted);
1266 white-space: nowrap;
1267 overflow: hidden;
1268 text-overflow: ellipsis;
1269 }
1270 .diff-stat-add {
1271 color: var(--color-success);
1272 font-size: var(--text-sm);
1273 font-family: var(--font-mono);
1274 font-weight: 600;
1275 }
1276 .diff-stat-del {
1277 color: var(--color-danger);
1278 font-size: var(--text-sm);
1279 font-family: var(--font-mono);
1280 font-weight: 600;
1281 }
1282 .btn-xs {
1283 padding: 1px var(--space-2);
1284 font-size: var(--text-xs);
1285 border: 1px solid var(--color-border);
1286 border-radius: var(--radius-sm);
1287 background: var(--color-bg);
1288 color: var(--color-text);
1289 text-decoration: none;
1290 cursor: pointer;
1291 white-space: nowrap;
1292 font-family: var(--font-mono);
1293 display: inline-flex;
1294 align-items: center;
1295 transition: background 0.1s;
1296 }
1297 .btn-xs:hover {
1298 background: var(--color-bg-inset);
1299 }
1300
1301 /* --- Diff file body --- */
1302 .diff-binary-notice {
1303 padding: var(--space-4) var(--space-6);
1304 font-size: var(--text-sm);
1305 color: var(--color-text-muted);
1306 font-style: italic;
1307 }
1308 .diff-hunk {
1309 border-top: 1px solid var(--color-border-muted);
1310 overflow-x: auto;
1311 }
1312 .diff-hunk:first-child {
1313 border-top: none;
1314 }
1315 .diff-hunk-header {
1316 padding: var(--space-1) var(--space-4);
1317 font-family: var(--font-mono);
1318 font-size: var(--text-xs);
1319 font-weight: normal;
1320 text-align: left;
1321 background: color-mix(
1322 in srgb,
1323 var(--color-merged-bg) 50%,
1324 var(--color-bg)
1325 );
1326 color: var(--color-merged);
1327 border-bottom: 1px solid var(--color-border-muted);
1328 white-space: pre;
1329 }
1330
1331 /* --- Diff table --- */
1332 .diff-table {
1333 min-width: 100%;
1334 border-collapse: collapse;
1335 font-family: var(--font-mono);
1336 font-size: var(--text-xs);
1337 line-height: 1.5;
1338 }
1339 .diff-ln {
1340 width: 44px;
1341 min-width: 44px;
1342 text-align: right;
1343 padding: 0 var(--space-2);
1344 color: var(--color-text-muted);
1345 border-right: 1px solid var(--color-border-muted);
1346 user-select: none;
1347 vertical-align: top;
1348 white-space: nowrap;
1349 }
1350 .diff-sign {
1351 width: 18px;
1352 min-width: 18px;
1353 text-align: center;
1354 padding: 0 var(--space-1);
1355 user-select: none;
1356 vertical-align: top;
1357 }
1358 .diff-code {
1359 padding: 0 var(--space-3);
1360 white-space: pre;
1361 overflow: visible;
1362 vertical-align: top;
1363 word-break: normal;
1364 }
1365 /* Row type backgrounds */
1366 .diff-row-add {
1367 background: color-mix(
1368 in srgb,
1369 var(--color-success-bg) 70%,
1370 transparent
1371 );
1372 }
1373 .diff-row-del {
1374 background: color-mix(in srgb, var(--color-danger-bg) 70%, transparent);
1375 }
1376 .diff-row-add .diff-ln,
1377 .diff-row-add .diff-sign {
1378 background: color-mix(
1379 in srgb,
1380 var(--color-success-bg) 90%,
1381 transparent
1382 );
1383 }
1384 .diff-row-del .diff-ln,
1385 .diff-row-del .diff-sign {
1386 background: color-mix(in srgb, var(--color-danger-bg) 90%, transparent);
1387 }
1388 .diff-row-add .diff-sign {
1389 color: var(--color-success);
1390 font-weight: 700;
1391 }
1392 .diff-row-del .diff-sign {
1393 color: var(--color-danger);
1394 font-weight: 700;
1395 }
1396
1397 /* Shiki dark-mode support in diff code cells */
1398 @media (prefers-color-scheme: dark) {
1399 .diff-code span[style] {
1400 /* biome-ignore lint/complexity/noImportantStyles: required to override shiki inline styles */
1401 color: var(--shiki-dark) !important;
1402 }
1403 }
1404
1405 /* Shiki dark-mode support in file blob view */
1406 @media (prefers-color-scheme: dark) {
1407 .blob-table {
1408 background-color: var(--shiki-dark-bg);
1409 color: var(--shiki-dark);
1410 }
1411 .blob-table span[style] {
1412 /* biome-ignore lint/complexity/noImportantStyles: required to override shiki inline styles */
1413 color: var(--shiki-dark) !important;
1414 }
1415 .blob-table tr:target {
1416 background: color-mix(in srgb, #1c3a52 60%, transparent);
1417 }
1418 .blob-table tr:target .blob-ln {
1419 background: color-mix(in srgb, #1c3a52 80%, transparent);
1420 }
1421 }
1422 :root[data-theme="dark"] .blob-table {
1423 background-color: var(--shiki-dark-bg);
1424 color: var(--shiki-dark);
1425 }
1426 :root[data-theme="dark"] .blob-table span[style] {
1427 /* biome-ignore lint/complexity/noImportantStyles: required to override shiki inline styles */
1428 color: var(--shiki-dark) !important;
1429 }
1430
1431 /* --- Issue / Patch list --- */
1432 .list-header {
1433 display: flex;
1434 align-items: center;
1435 justify-content: space-between;
1436 padding: var(--space-3) var(--space-4);
1437 background: var(--color-bg-subtle);
1438 border: 1px solid var(--color-border);
1439 border-radius: var(--radius-lg) var(--radius-lg) 0 0;
1440 gap: var(--space-4);
1441 }
1442 .list-header-tabs {
1443 display: flex;
1444 gap: var(--space-2);
1445 }
1446 .list-tab {
1447 padding: var(--space-1) var(--space-3);
1448 border-radius: var(--radius-md);
1449 font-size: var(--text-sm);
1450 text-decoration: none;
1451 color: var(--color-text-muted);
1452 }
1453 .list-tab:hover {
1454 background: var(--color-bg-inset);
1455 color: var(--color-text);
1456 }
1457 .list-tab.active {
1458 background: var(--color-bg-inset);
1459 color: var(--color-text);
1460 font-weight: 600;
1461 }
1462 .issue-list {
1463 border: 1px solid var(--color-border);
1464 border-top: none;
1465 border-radius: 0 0 var(--radius-lg) var(--radius-lg);
1466 }
1467 .issue-item {
1468 padding: var(--space-4) var(--space-4);
1469 border-bottom: 1px solid var(--color-border-muted);
1470 }
1471 .issue-item:last-child {
1472 border-bottom: none;
1473 }
1474 .issue-main {
1475 display: flex;
1476 align-items: center;
1477 gap: var(--space-2);
1478 margin-bottom: var(--space-1);
1479 flex-wrap: wrap;
1480 }
1481 .issue-title {
1482 font-weight: 500;
1483 text-decoration: none;
1484 color: var(--color-text);
1485 flex: 1;
1486 }
1487 .issue-title:hover {
1488 color: var(--color-link);
1489 }
1490 .issue-meta {
1491 font-size: var(--text-xs);
1492 color: var(--color-text-muted);
1493 display: flex;
1494 gap: var(--space-3);
1495 }
1496 .issue-status-dot,
1497 .patch-status-dot {
1498 width: 8px;
1499 height: 8px;
1500 border-radius: 50%;
1501 flex-shrink: 0;
1502 }
1503 .issue-status-dot.open,
1504 .patch-status-dot.open {
1505 background: var(--color-success);
1506 }
1507 .issue-status-dot.closed,
1508 .patch-status-dot.closed {
1509 background: var(--color-danger);
1510 }
1511 .issue-status-dot.completed {
1512 background: var(--color-merged);
1513 }
1514 .patch-status-dot.merged {
1515 background: var(--color-merged);
1516 }
1517
1518 /* --- Issue detail / Timeline --- */
1519 .issue-detail-header {
1520 display: flex;
1521 align-items: center;
1522 gap: var(--space-3);
1523 margin-bottom: var(--space-6);
1524 flex-wrap: wrap;
1525 }
1526 .issue-number {
1527 font-size: var(--text-2xl);
1528 font-weight: 600;
1529 color: var(--color-text-muted);
1530 white-space: nowrap;
1531 }
1532 .issue-detail-title {
1533 font-size: var(--text-2xl);
1534 font-weight: 600;
1535 flex: 1;
1536 }
1537 .issue-detail-meta-actions {
1538 margin-left: auto;
1539 display: flex;
1540 gap: var(--space-2);
1541 }
1542 .timeline-item {
1543 border: 1px solid var(--color-border);
1544 border-radius: var(--radius-lg);
1545 margin-bottom: var(--space-4);
1546 overflow: hidden;
1547 }
1548 .timeline-author {
1549 background: var(--color-bg-subtle);
1550 padding: var(--space-3) var(--space-4);
1551 font-size: var(--text-sm);
1552 display: flex;
1553 align-items: center;
1554 justify-content: space-between;
1555 flex-wrap: wrap;
1556 gap: var(--space-3);
1557 border-bottom: 1px solid var(--color-border);
1558 }
1559 .timeline-author time {
1560 color: var(--color-text-muted);
1561 font-size: var(--text-xs);
1562 }
1563 .timeline-author-right {
1564 margin-left: auto;
1565 display: flex;
1566 align-items: center;
1567 gap: var(--space-2);
1568 }
1569 .edited-indicator {
1570 color: var(--color-text-muted);
1571 font-size: var(--text-xs);
1572 cursor: default;
1573 }
1574
1575 /* --- Avatars --- */
1576 .avatar {
1577 display: inline-flex;
1578 border-radius: 4px;
1579 overflow: hidden;
1580 flex-shrink: 0;
1581 vertical-align: middle;
1582 }
1583 .avatar-img {
1584 width: 100%;
1585 height: 100%;
1586 object-fit: cover;
1587 display: block;
1588 color: transparent;
1589 }
1590 .avatar-placeholder {
1591 display: inline-flex;
1592 align-items: center;
1593 justify-content: center;
1594 border-radius: 4px;
1595 background: var(--color-bg-inset);
1596 color: var(--color-text-muted);
1597 font-weight: 600;
1598 flex-shrink: 0;
1599 vertical-align: middle;
1600 }
1601 .avatar-settings {
1602 display: flex;
1603 align-items: flex-start;
1604 gap: var(--space-5);
1605 }
1606 .avatar-actions {
1607 display: flex;
1608 flex-direction: column;
1609 gap: var(--space-3);
1610 }
1611 .nav-user {
1612 display: inline-flex;
1613 align-items: center;
1614 gap: var(--space-2);
1615 }
1616 .timeline-body {
1617 padding: var(--space-4);
1618 }
1619 .timeline-item-new {
1620 padding: var(--space-4);
1621 }
1622 .timeline-item-new .section-title {
1623 font-size: var(--text-base);
1624 border: none;
1625 padding-bottom: 0;
1626 }
1627 /* Edit <details> (summary only) in .timeline-author; form is a sibling shown via :has() */
1628 .timeline-author-right .inline-edit-details {
1629 border: none;
1630 }
1631 .timeline-author-right .inline-edit-details > summary {
1632 padding: 0;
1633 list-style: none;
1634 }
1635 .timeline-author-right
1636 .inline-edit-details
1637 > summary::-webkit-details-marker {
1638 display: none;
1639 }
1640 .inline-edit-details .when-open {
1641 display: none;
1642 }
1643 .inline-edit-details[open] .when-closed {
1644 display: none;
1645 }
1646 .inline-edit-details[open] .when-open {
1647 display: inline;
1648 }
1649 .inline-edit-form-area {
1650 display: none;
1651 border-top: 1px solid var(--color-border-muted);
1652 }
1653 .timeline-item:has(.inline-edit-details[open]) .inline-edit-form-area {
1654 display: block;
1655 }
1656 .inline-edit-form {
1657 padding: var(--space-4);
1658 display: flex;
1659 flex-direction: column;
1660 gap: var(--space-3);
1661 }
1662
1663 /* --- Reactions --- */
1664 .reaction-bar {
1665 display: flex;
1666 flex-wrap: wrap;
1667 gap: var(--space-2);
1668 padding: var(--space-2) var(--space-4);
1669 border-top: 1px solid var(--color-border-muted);
1670 }
1671 .reaction-form {
1672 display: inline;
1673 }
1674 .reaction-btn {
1675 display: inline-flex;
1676 align-items: center;
1677 gap: var(--space-1);
1678 padding: var(--space-1) var(--space-3);
1679 border: 1px solid var(--color-border);
1680 border-radius: var(--radius-full);
1681 background: var(--color-bg-subtle);
1682 color: var(--color-text);
1683 font-size: var(--text-sm);
1684 cursor: pointer;
1685 transition: background 0.1s;
1686 }
1687 .reaction-btn:hover {
1688 background: var(--color-bg-inset);
1689 }
1690 .reaction-btn.reacted {
1691 background: var(--color-accent-bg);
1692 border-color: var(--color-accent);
1693 }
1694 .reaction-picker {
1695 position: relative;
1696 }
1697 .reaction-add-btn {
1698 display: inline-flex;
1699 align-items: center;
1700 justify-content: center;
1701 width: 28px;
1702 height: 28px;
1703 border: 1px dashed var(--color-border);
1704 border-radius: var(--radius-full);
1705 background: transparent;
1706 cursor: pointer;
1707 font-size: var(--text-base);
1708 color: var(--color-text-muted);
1709 list-style: none;
1710 }
1711 .reaction-add-btn::-webkit-details-marker {
1712 display: none;
1713 }
1714 .reaction-picker-dropdown {
1715 position: absolute;
1716 bottom: calc(100% + var(--space-2));
1717 left: 0;
1718 background: var(--color-bg);
1719 border: 1px solid var(--color-border);
1720 border-radius: var(--radius-lg);
1721 padding: var(--space-2);
1722 display: flex;
1723 gap: var(--space-1);
1724 z-index: 10;
1725 }
1726 .reaction-picker-btn {
1727 background: none;
1728 border: none;
1729 font-size: 1.25rem;
1730 cursor: pointer;
1731 padding: var(--space-1);
1732 border-radius: var(--radius-sm);
1733 }
1734 .reaction-picker-btn:hover {
1735 background: var(--color-bg-inset);
1736 }
1737
1738 /* --- Patch subview tabs --- */
1739 .patch-tab-nav {
1740 display: flex;
1741 border-bottom: 1px solid var(--color-border);
1742 margin-bottom: var(--space-6);
1743 }
1744 .tab-count {
1745 display: inline-flex;
1746 align-items: center;
1747 justify-content: center;
1748 min-width: 1.4em;
1749 padding: 0 var(--space-1);
1750 margin-left: var(--space-1);
1751 font-size: var(--text-xs);
1752 font-weight: 500;
1753 background: var(--color-bg-inset);
1754 border-radius: 999px;
1755 color: var(--color-text-muted);
1756 }
1757
1758 /* --- Patch apply status --- */
1759 .apply-status {
1760 margin: var(--space-4) 0;
1761 }
1762 .apply-result {
1763 display: flex;
1764 align-items: flex-start;
1765 gap: var(--space-2);
1766 padding: var(--space-3) var(--space-4);
1767 border-radius: var(--radius-md);
1768 font-size: var(--text-sm);
1769 flex-direction: column;
1770 }
1771 .apply-result > div {
1772 display: flex;
1773 gap: var(--space-2);
1774 align-items: center;
1775 }
1776 .apply-clean {
1777 background: var(--color-success-bg);
1778 color: var(--color-success);
1779 border: 1px solid var(--color-success);
1780 }
1781 .apply-conflict {
1782 background: var(--color-danger-bg);
1783 color: var(--color-danger);
1784 border: 1px solid var(--color-danger);
1785 }
1786 .apply-checking,
1787 .apply-unknown {
1788 color: var(--color-text-muted);
1789 font-style: italic;
1790 font-size: var(--text-sm);
1791 }
1792 .apply-output {
1793 font-family: var(--font-mono);
1794 font-size: var(--text-xs);
1795 white-space: pre-wrap;
1796 margin-top: var(--space-2);
1797 padding: var(--space-2);
1798 background: rgba(0, 0, 0, 0.05);
1799 border-radius: var(--radius-sm);
1800 width: 100%;
1801 }
1802 .patch-actions {
1803 display: flex;
1804 gap: var(--space-3);
1805 margin: var(--space-4) 0;
1806 flex-wrap: wrap;
1807 }
1808 .patch-card-title-row {
1809 display: flex;
1810 align-items: flex-start;
1811 gap: var(--space-3);
1812 justify-content: space-between;
1813 margin-bottom: var(--space-3);
1814 }
1815 .patch-card-title-row .commit-card-subject {
1816 margin-bottom: 0;
1817 }
1818 .patch-card-description {
1819 margin-top: var(--space-4);
1820 padding-top: var(--space-4);
1821 border-top: 1px solid var(--color-border-muted);
1822 }
1823
1824 /* --- Repo home layout --- */
1825 .repo-home-layout {
1826 display: grid;
1827 gap: var(--space-8);
1828 }
1829 @media (min-width: 768px) {
1830 .repo-home-layout {
1831 grid-template-columns: 1fr 1fr;
1832 }
1833 }
1834 .readme-section {
1835 border: 1px solid var(--color-border);
1836 border-radius: var(--radius-lg);
1837 overflow: hidden;
1838 }
1839 .readme-header {
1840 background: var(--color-bg-subtle);
1841 padding: var(--space-3) var(--space-4);
1842 font-size: var(--text-sm);
1843 font-weight: 500;
1844 border-bottom: 1px solid var(--color-border);
1845 }
1846 /* --- Code setup block --- */
1847 .code-setup {
1848 background: var(--color-bg-subtle);
1849 border: 1px solid var(--color-border);
1850 border-radius: var(--radius-lg);
1851 padding: var(--space-4);
1852 font-size: var(--text-sm);
1853 margin-top: var(--space-4);
1854 overflow: auto;
1855 text-align: left;
1856 }
1857 .code-plain {
1858 background: var(--color-bg-subtle);
1859 padding: var(--space-4);
1860 overflow: auto;
1861 font-size: var(--text-sm);
1862 line-height: 1.6;
1863 }
1864
1865 /* --- Markdown body --- */
1866 .markdown-body {
1867 font-size: var(--text-sm);
1868 line-height: 1.6;
1869 color: var(--color-text);
1870 }
1871 .markdown-body h1,
1872 .markdown-body h2,
1873 .markdown-body h3,
1874 .markdown-body h4,
1875 .markdown-body h5,
1876 .markdown-body h6 {
1877 margin-top: var(--space-6);
1878 margin-bottom: var(--space-3);
1879 }
1880 .markdown-body p {
1881 margin-bottom: var(--space-4);
1882 }
1883 .markdown-body a {
1884 color: var(--color-link);
1885 }
1886 .markdown-body code {
1887 background: var(--color-bg-inset);
1888 padding: 0.1em 0.3em;
1889 border-radius: var(--radius-sm);
1890 font-size: 0.9em;
1891 }
1892 .markdown-body pre {
1893 background: var(--color-bg-subtle);
1894 border: 1px solid var(--color-border);
1895 border-radius: var(--radius-md);
1896 padding: var(--space-4);
1897 overflow: auto;
1898 margin-bottom: var(--space-4);
1899 }
1900 .markdown-body pre code {
1901 background: none;
1902 padding: 0;
1903 }
1904 .markdown-body ul,
1905 .markdown-body ol {
1906 padding-left: var(--space-6);
1907 margin-bottom: var(--space-4);
1908 }
1909 .markdown-body ul {
1910 list-style: disc;
1911 }
1912 .markdown-body ol {
1913 list-style: decimal;
1914 }
1915 .markdown-body li {
1916 margin-bottom: var(--space-1);
1917 }
1918 .markdown-body blockquote {
1919 border-left: 3px solid var(--color-border);
1920 padding-left: var(--space-4);
1921 color: var(--color-text-muted);
1922 margin: var(--space-4) 0;
1923 }
1924 .markdown-body table {
1925 width: 100%;
1926 border-collapse: collapse;
1927 margin-bottom: var(--space-4);
1928 }
1929 .markdown-body th,
1930 .markdown-body td {
1931 padding: var(--space-2) var(--space-3);
1932 border: 1px solid var(--color-border);
1933 }
1934 .markdown-body th {
1935 background: var(--color-bg-subtle);
1936 font-weight: 600;
1937 }
1938 .markdown-body hr {
1939 border: none;
1940 border-top: 1px solid var(--color-border);
1941 margin: var(--space-6) 0;
1942 }
1943 .markdown-body img {
1944 max-width: 100%;
1945 border-radius: var(--radius-md);
1946 }
1947 .markdown-body details {
1948 margin-bottom: var(--space-4);
1949 }
1950 .markdown-body summary {
1951 cursor: pointer;
1952 font-weight: 500;
1953 }
1954 .readme-section .markdown-body {
1955 padding: var(--space-4);
1956 }
1957
1958 /* --- Search form --- */
1959 .search-form {
1960 margin-bottom: var(--space-5);
1961 }
1962 .search-input-wrap {
1963 display: flex;
1964 gap: var(--space-2);
1965 max-width: 480px;
1966 }
1967 .search-input {
1968 flex: 1;
1969 padding: var(--space-2) var(--space-3);
1970 border: 1px solid var(--color-border);
1971 border-radius: var(--radius-md);
1972 background: var(--color-bg);
1973 color: var(--color-text);
1974 font-size: var(--text-sm);
1975 }
1976 .search-input:focus {
1977 outline: 2px solid var(--color-accent);
1978 outline-offset: -1px;
1979 border-color: var(--color-accent);
1980 }
1981
1982 /* --- Issue close bar --- */
1983 .issue-close-bar {
1984 display: flex;
1985 justify-content: flex-end;
1986 padding: var(--space-3) 0;
1987 border-top: 1px solid var(--color-border-muted);
1988 margin-top: var(--space-2);
1989 }
1990
1991 /* --- Auth divider --- */
1992 .auth-divider {
1993 display: flex;
1994 align-items: center;
1995 gap: var(--space-3);
1996 margin: var(--space-4) 0;
1997 color: var(--color-text-muted);
1998 font-size: var(--text-sm);
1999 }
2000 .auth-divider::before,
2001 .auth-divider::after {
2002 content: "";
2003 flex: 1;
2004 height: 1px;
2005 background: var(--color-border);
2006 }
2007
2008 /* --- Passkey UI in settings --- */
2009 .passkey-actions {
2010 display: flex;
2011 flex-direction: column;
2012 gap: var(--space-3);
2013 align-items: flex-start;
2014 margin-top: var(--space-3);
2015 }
2016 .passkey-status {
2017 font-size: var(--text-sm);
2018 }
2019
2020 /* --- Danger zone --- */
2021 .danger-zone {
2022 margin-top: var(--space-8);
2023 }
2024 .danger-title {
2025 color: var(--color-danger);
2026 border-bottom-color: var(--color-danger);
2027 }
2028 .danger-card {
2029 border-color: var(--color-danger);
2030 background: var(--color-danger-bg);
2031 }
2032 .danger-item {
2033 display: flex;
2034 align-items: center;
2035 justify-content: space-between;
2036 gap: var(--space-4);
2037 flex-wrap: wrap;
2038 }
2039 .danger-item p {
2040 margin: var(--space-1) 0 0;
2041 }
2042 .btn-danger {
2043 background: var(--color-danger);
2044 border-color: transparent;
2045 color: #fff;
2046 }
2047 .btn-danger:hover {
2048 filter: brightness(0.9);
2049 }
2050
2051 /* --- Release list items --- */
2052 .release-item-header {
2053 display: flex;
2054 gap: var(--space-3);
2055 align-items: flex-start;
2056 }
2057 .release-item-main {
2058 flex: 1;
2059 min-width: 0;
2060 }
2061 .release-item-title {
2062 font-size: var(--text-lg);
2063 font-weight: 700;
2064 text-decoration: none;
2065 color: var(--color-text);
2066 display: block;
2067 margin-bottom: var(--space-1);
2068 }
2069 .release-item-title:hover {
2070 color: var(--color-link);
2071 }
2072 .release-item-meta {
2073 display: flex;
2074 flex-wrap: wrap;
2075 gap: var(--space-3);
2076 align-items: center;
2077 font-size: var(--text-xs);
2078 color: var(--color-text-muted);
2079 }
2080 .release-item-date {
2081 display: flex;
2082 flex-direction: column;
2083 align-items: flex-end;
2084 gap: var(--space-2);
2085 font-size: var(--text-xs);
2086 color: var(--color-text-muted);
2087 white-space: nowrap;
2088 flex-shrink: 0;
2089 }
2090
2091 /* --- Release notes preview in list --- */
2092 .release-notes-section {
2093 margin-top: var(--space-3);
2094 }
2095 .release-notes-label {
2096 font-size: var(--text-xs);
2097 font-weight: 600;
2098 color: var(--color-text-muted);
2099 text-transform: uppercase;
2100 letter-spacing: 0.05em;
2101 margin-bottom: var(--space-2);
2102 }
2103 .notes-expand > summary {
2104 list-style: none;
2105 cursor: pointer;
2106 outline: none;
2107 }
2108 .notes-expand > summary::-webkit-details-marker {
2109 display: none;
2110 }
2111 .notes-preview {
2112 max-height: calc(5 * 1.6em);
2113 overflow: hidden;
2114 position: relative;
2115 white-space: pre-wrap;
2116 font-size: var(--text-sm);
2117 color: var(--color-text);
2118 line-height: 1.6;
2119 word-break: break-word;
2120 margin-bottom: var(--space-1);
2121 }
2122 .notes-preview::after {
2123 content: "";
2124 position: absolute;
2125 bottom: 0;
2126 left: 0;
2127 right: 0;
2128 height: 2.5em;
2129 background: linear-gradient(transparent, var(--color-bg));
2130 pointer-events: none;
2131 }
2132 .notes-expand[open] .notes-preview {
2133 display: none;
2134 }
2135 .notes-full {
2136 padding-top: var(--space-3);
2137 padding-bottom: var(--space-1);
2138 }
2139 .notes-expand[open] {
2140 display: flex;
2141 flex-direction: column;
2142 }
2143 .notes-expand[open] > summary {
2144 order: 1;
2145 }
2146 .notes-expand[open] > .notes-full {
2147 order: 0;
2148 }
2149 .notes-toggle-label {
2150 display: inline-block;
2151 font-size: var(--text-xs);
2152 color: var(--color-link);
2153 margin-top: var(--space-1);
2154 }
2155 .notes-toggle-label:hover {
2156 text-decoration: underline;
2157 }
2158 .notes-toggle-label::before {
2159 content: "Show more ↓";
2160 }
2161 .notes-expand[open] .notes-toggle-label::before {
2162 content: "Show less ↑";
2163 }
2164
2165 /* --- Release detail --- */
2166 .release-detail {
2167 padding: var(--space-6) 0;
2168 }
2169 .release-header {
2170 margin-bottom: var(--space-6);
2171 }
2172 .release-notes {
2173 margin-bottom: var(--space-6);
2174 }
2175 .release-assets {
2176 margin-bottom: var(--space-6);
2177 }
2178 .release-assets-heading {
2179 font-size: var(--text-base);
2180 font-weight: 600;
2181 margin-bottom: var(--space-3);
2182 }
2183 .asset-list {
2184 border: 1px solid var(--color-border);
2185 border-radius: var(--radius-lg);
2186 overflow: hidden;
2187 }
2188 .asset-item {
2189 display: flex;
2190 align-items: center;
2191 gap: var(--space-4);
2192 padding: var(--space-3) var(--space-4);
2193 border-bottom: 1px solid var(--color-border-muted);
2194 font-size: var(--text-sm);
2195 }
2196 .asset-item:last-child {
2197 border-bottom: none;
2198 }
2199 .asset-name {
2200 flex: 1;
2201 color: var(--color-link);
2202 text-decoration: none;
2203 font-family: var(--font-mono);
2204 font-size: var(--text-xs);
2205 }
2206 .asset-name:hover {
2207 text-decoration: underline;
2208 }
2209 .asset-name-pending {
2210 color: var(--color-text-muted);
2211 cursor: default;
2212 }
2213 .asset-item-pending {
2214 opacity: 0.6;
2215 }
2216 .asset-size,
2217 .asset-meta {
2218 color: var(--color-text-muted);
2219 font-size: var(--text-xs);
2220 white-space: nowrap;
2221 }
2222 .release-back {
2223 margin-top: var(--space-4);
2224 display: flex;
2225 gap: var(--space-3);
2226 align-items: center;
2227 justify-content: space-between;
2228 }
2229}
2230
2231/* ============================================================
2232 @layer utilities
2233 ============================================================ */
2234@layer utilities {
2235 .text-muted {
2236 color: var(--color-text-muted);
2237 }
2238 .text-sm {
2239 font-size: var(--text-sm);
2240 }
2241 .text-xs {
2242 font-size: var(--text-xs);
2243 }
2244 .font-mono {
2245 font-family: var(--font-mono);
2246 }
2247 .mt-1 {
2248 margin-top: var(--space-1);
2249 }
2250 .mt-2 {
2251 margin-top: var(--space-2);
2252 }
2253 .mt-4 {
2254 margin-top: var(--space-4);
2255 }
2256 .mt-6 {
2257 margin-top: var(--space-6);
2258 }
2259 .mb-4 {
2260 margin-bottom: var(--space-4);
2261 }
2262 .flex {
2263 display: flex;
2264 }
2265 .gap-2 {
2266 gap: var(--space-2);
2267 }
2268 .gap-4 {
2269 gap: var(--space-4);
2270 }
2271 .items-center {
2272 align-items: center;
2273 }
2274 .justify-between {
2275 justify-content: space-between;
2276 }
2277 .hidden {
2278 display: none;
2279 }
2280}
2281
2282/* ============================================================
2283 Pagination
2284 ============================================================ */
2285.commit-cursor-nav {
2286 display: flex;
2287 justify-content: space-between;
2288 border-top: 1px solid var(--color-border);
2289 margin-top: var(--space-2);
2290 padding: var(--space-4) 0 var(--space-2);
2291}
2292
2293.commit-cursor-prev {
2294 flex: 1;
2295}
2296.commit-cursor-next {
2297 flex: 1;
2298 text-align: right;
2299}
2300
2301.pagination {
2302 display: grid;
2303 grid-template-columns: 1fr auto 1fr;
2304 align-items: center;
2305 border-top: 1px solid var(--color-border);
2306 margin-top: var(--space-2);
2307 padding: var(--space-4) 0 var(--space-2);
2308}
2309
2310.pagination-prev {
2311 justify-self: start;
2312}
2313.pagination-next {
2314 justify-self: end;
2315}
2316
2317.pagination-info {
2318 justify-self: center;
2319 font-size: var(--text-sm);
2320 color: var(--color-text-muted);
2321}
2322
2323.pagination-btn {
2324 display: inline-flex;
2325 align-items: center;
2326 gap: var(--space-1);
2327 padding: var(--space-1) var(--space-3);
2328 border: 1px solid var(--color-border);
2329 border-radius: var(--radius-md);
2330 font-size: var(--text-sm);
2331 font-weight: 500;
2332 text-decoration: none;
2333 color: var(--color-text);
2334 background: var(--color-bg-subtle);
2335 transition:
2336 background 0.1s,
2337 border-color 0.1s;
2338 white-space: nowrap;
2339}
2340
2341.pagination-btn:hover {
2342 background: var(--color-bg-inset);
2343 border-color: var(--color-border);
2344 color: var(--color-text);
2345 text-decoration: none;
2346}
2347
2348/* Settings */
2349.theme-options {
2350 display: flex;
2351 gap: var(--space-4);
2352 margin-bottom: var(--space-4);
2353 flex-wrap: wrap;
2354}
2355.theme-option {
2356 display: flex;
2357 align-items: center;
2358 gap: var(--space-2);
2359 cursor: pointer;
2360 font-size: var(--text-sm);
2361}
2362.settings-form {
2363 display: flex;
2364 flex-direction: column;
2365 gap: var(--space-4);
2366}
2367.passkey-list {
2368 display: flex;
2369 flex-direction: column;
2370 gap: var(--space-2);
2371 margin-bottom: var(--space-4);
2372}
2373.passkey-item {
2374 display: flex;
2375 align-items: center;
2376 gap: var(--space-3);
2377 padding: var(--space-2) 0;
2378 border-bottom: 1px solid var(--color-border-muted);
2379 font-size: var(--text-sm);
2380}
2381.passkey-item:last-child {
2382 border-bottom: none;
2383}
2384.passkey-date {
2385 flex: 1;
2386 color: var(--color-text-muted);
2387}
2388.ssh-key-info {
2389 flex: 1;
2390 display: flex;
2391 flex-direction: column;
2392 gap: var(--space-1);
2393 min-width: 0;
2394}
2395.ssh-key-name {
2396 font-weight: 500;
2397}
2398.ssh-key-fingerprint {
2399 font-family: var(--font-mono);
2400 font-size: var(--text-xs);
2401 overflow: hidden;
2402 text-overflow: ellipsis;
2403 white-space: nowrap;
2404}
2405.form-textarea {
2406 resize: vertical;
2407 min-height: 4.5rem;
2408 font-family: var(--font-mono);
2409 font-size: var(--text-sm);
2410}
2411/* Clone popup */
2412.clone-popup-details {
2413 position: relative;
2414 display: inline-block;
2415}
2416.clone-popup-details > summary {
2417 list-style: none;
2418}
2419.clone-popup-details > summary::-webkit-details-marker {
2420 display: none;
2421}
2422.clone-popup {
2423 position: absolute;
2424 right: 1rem;
2425 top: calc(100% + var(--space-2));
2426 background: var(--color-bg);
2427 border: 1px solid var(--color-border);
2428 border-radius: var(--radius-lg);
2429 padding: var(--space-3);
2430 min-width: 22rem;
2431 z-index: 100;
2432 box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
2433 display: flex;
2434 flex-direction: column;
2435 gap: var(--space-2);
2436}
2437.clone-url-row {
2438 display: flex;
2439 align-items: center;
2440 gap: var(--space-2);
2441}
2442.clone-url-label {
2443 font-size: var(--text-xs);
2444 font-weight: 600;
2445 color: var(--color-text-muted);
2446 text-transform: uppercase;
2447 letter-spacing: 0.05em;
2448 min-width: 2.75rem;
2449}
2450.clone-url-input {
2451 flex: 1;
2452 font-family: var(--font-mono);
2453 font-size: var(--text-sm);
2454 background: var(--color-bg-subtle);
2455 border: 1px solid var(--color-border-muted);
2456 border-radius: var(--radius-md);
2457 padding: var(--space-1) var(--space-2);
2458 color: var(--color-text);
2459 cursor: text;
2460 min-width: 0;
2461}
2462.user-list {
2463 display: flex;
2464 flex-direction: column;
2465 gap: var(--space-2);
2466 margin-bottom: var(--space-6);
2467}
2468.user-item {
2469 display: flex;
2470 align-items: center;
2471 gap: var(--space-3);
2472 padding: var(--space-2) 0;
2473 border-bottom: 1px solid var(--color-border-muted);
2474 font-size: var(--text-sm);
2475}
2476.user-item:last-child {
2477 border-bottom: none;
2478}
2479.user-name {
2480 font-weight: 500;
2481 flex: 1;
2482}
2483.user-date {
2484 color: var(--color-text-muted);
2485 font-size: var(--text-xs);
2486}
2487