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 text-decoration: none;
710 }
711 .badge-private {
712 color: var(--color-warning);
713 border-color: var(--color-warning);
714 background: var(--color-warning-bg);
715 }
716 .issue-badge,
717 .patch-badge {
718 display: inline-flex;
719 align-items: center;
720 padding: var(--space-1) var(--space-3);
721 border-radius: var(--radius-full);
722 font-size: var(--text-xs);
723 font-weight: 500;
724 text-transform: capitalize;
725 }
726 .issue-badge.open,
727 .patch-badge.open {
728 background: var(--color-success-bg);
729 color: var(--color-success);
730 }
731 .issue-badge.closed,
732 .patch-badge.closed {
733 background: var(--color-danger-bg);
734 color: var(--color-danger);
735 }
736 .issue-badge.completed {
737 background: var(--color-merged-bg);
738 color: var(--color-merged);
739 }
740 .patch-badge.merged {
741 background: var(--color-merged-bg);
742 color: var(--color-merged);
743 }
744
745 /* --- Empty state --- */
746 .empty-state {
747 text-align: center;
748 padding: var(--space-16) var(--space-4);
749 color: var(--color-text-muted);
750 }
751 .empty-state p {
752 margin-bottom: var(--space-4);
753 font-size: var(--text-lg);
754 }
755
756 /* --- Breadcrumb --- */
757 .breadcrumb {
758 display: flex;
759 align-items: center;
760 flex-wrap: wrap;
761 gap: var(--space-1);
762 font-size: var(--text-sm);
763 margin-bottom: var(--space-4);
764 }
765 .breadcrumb a {
766 color: var(--color-link);
767 text-decoration: none;
768 }
769 .breadcrumb a:hover {
770 text-decoration: underline;
771 }
772 .breadcrumb-sep {
773 color: var(--color-text-muted);
774 }
775 .breadcrumb-current {
776 color: var(--color-text-muted);
777 }
778
779 /* --- File tree --- */
780 .file-tree {
781 width: 100%;
782 border: 1px solid var(--color-border);
783 border-radius: var(--radius-lg);
784 border-collapse: collapse;
785 overflow: hidden;
786 margin-bottom: var(--space-6);
787 }
788 .file-tree-row {
789 border-bottom: 1px solid var(--color-border-muted);
790 }
791 .file-tree-row:last-child {
792 border-bottom: none;
793 }
794 .file-tree-row:hover {
795 background: var(--color-bg-subtle);
796 }
797 .file-icon,
798 .file-name,
799 .file-size {
800 padding: var(--space-2) var(--space-3);
801 font-size: var(--text-sm);
802 vertical-align: middle;
803 }
804 .file-icon {
805 width: 36px;
806 padding-right: var(--space-1);
807 text-align: center;
808 line-height: 0;
809 }
810 .file-name {
811 width: 100%;
812 }
813 .file-name a {
814 color: var(--color-link);
815 text-decoration: none;
816 }
817 .file-name a:hover {
818 text-decoration: underline;
819 }
820 .file-name a.file-name-dir {
821 font-weight: 500;
822 }
823 .file-size {
824 text-align: right;
825 color: var(--color-text-muted);
826 font-size: var(--text-xs);
827 white-space: nowrap;
828 padding-right: var(--space-4);
829 }
830 .file-icon-dir {
831 color: var(--color-link);
832 }
833 .file-icon-file {
834 color: var(--color-text-muted);
835 }
836 .tree-icon {
837 display: inline-block;
838 vertical-align: text-bottom;
839 }
840 .file-tree-row-up .file-name a {
841 color: var(--color-text-muted);
842 }
843 .file-tree-row-up .file-name a:hover {
844 color: var(--color-link);
845 }
846
847 /* --- File blob --- */
848 .file-blob-header {
849 display: flex;
850 align-items: center;
851 justify-content: space-between;
852 padding: var(--space-3) var(--space-4);
853 background: var(--color-bg-subtle);
854 border: 1px solid var(--color-border);
855 border-radius: var(--radius-lg) var(--radius-lg) 0 0;
856 }
857 .file-blob-name {
858 font-size: var(--text-sm);
859 font-weight: 500;
860 }
861 .file-blob-body {
862 border: 1px solid var(--color-border);
863 border-top: none;
864 border-radius: 0 0 var(--radius-lg) var(--radius-lg);
865 overflow: auto;
866 }
867 /* Blob line-number table */
868 .blob-table {
869 min-width: 100%;
870 border-collapse: collapse;
871 font-family: var(--font-mono);
872 font-size: var(--text-sm);
873 line-height: 1.6;
874 background-color: var(--shiki-light-bg, #fff);
875 color: var(--shiki-light, inherit);
876 }
877 .blob-ln {
878 width: 1%;
879 min-width: 48px;
880 text-align: right;
881 padding: 0 var(--space-3);
882 color: var(--color-text-muted);
883 border-right: 1px solid var(--color-border-muted);
884 user-select: none;
885 white-space: nowrap;
886 vertical-align: top;
887 }
888 .blob-ln a {
889 color: inherit;
890 text-decoration: none;
891 }
892 .blob-ln a:hover {
893 color: var(--color-link);
894 }
895 .blob-code {
896 padding: 0 var(--space-4);
897 white-space: pre;
898 overflow: visible;
899 vertical-align: top;
900 }
901 .blob-table tr:target {
902 background: color-mix(in srgb, #ddf4ff 60%, transparent);
903 }
904 .blob-table tr:target .blob-ln {
905 background: color-mix(in srgb, #ddf4ff 80%, transparent);
906 }
907 .file-download-notice {
908 padding: var(--space-8);
909 text-align: center;
910 color: var(--color-text-muted);
911 }
912 .file-download-notice p {
913 margin-bottom: var(--space-4);
914 }
915 .file-media {
916 padding: var(--space-4);
917 display: flex;
918 justify-content: center;
919 background: var(--color-canvas-subtle);
920 }
921 .file-media-img {
922 max-width: 100%;
923 height: auto;
924 display: block;
925 }
926 .file-media-audio {
927 width: 100%;
928 max-width: 600px;
929 }
930 .file-media-video {
931 max-width: 100%;
932 max-height: 80vh;
933 }
934
935 /* --- Commit list --- */
936 .commit-list {
937 display: flex;
938 flex-direction: column;
939 }
940 .commit-item {
941 display: flex;
942 align-items: flex-start;
943 justify-content: space-between;
944 padding: var(--space-3) 0;
945 border-bottom: 1px solid var(--color-border-muted);
946 gap: var(--space-4);
947 flex-wrap: wrap;
948 }
949 .commit-item:last-child {
950 border-bottom: none;
951 }
952 .commit-main {
953 flex: 1;
954 min-width: 0;
955 }
956 .commit-subject {
957 color: var(--color-text);
958 text-decoration: none;
959 font-size: var(--text-sm);
960 font-weight: 500;
961 }
962 .commit-subject:hover {
963 color: var(--color-link);
964 }
965 .commit-meta {
966 display: flex;
967 align-items: center;
968 gap: var(--space-3);
969 font-size: var(--text-xs);
970 color: var(--color-text-muted);
971 white-space: nowrap;
972 }
973 .commit-hash {
974 font-family: var(--font-mono);
975 color: var(--color-link);
976 text-decoration: none;
977 background: var(--color-bg-inset);
978 padding: 1px var(--space-2);
979 border-radius: var(--radius-sm);
980 }
981 .commit-hash:hover {
982 text-decoration: underline;
983 }
984 .mono {
985 font-family: var(--font-mono);
986 }
987
988 /* --- Commit detail viewer --- */
989 .commit-page-top {
990 display: flex;
991 align-items: center;
992 justify-content: space-between;
993 margin-bottom: var(--space-4);
994 }
995 .commit-card {
996 border: 1px solid var(--color-border);
997 border-radius: var(--radius-lg);
998 margin-bottom: var(--space-4);
999 overflow: hidden;
1000 }
1001 .commit-card-subject {
1002 font-size: var(--text-xl);
1003 font-weight: 600;
1004 padding: var(--space-5) var(--space-6);
1005 border-bottom: 1px solid var(--color-border);
1006 line-height: 1.3;
1007 }
1008 .commit-card-body {
1009 padding: var(--space-4) var(--space-6);
1010 font-family: inherit;
1011 font-size: var(--text-sm);
1012 color: var(--color-text-muted);
1013 border-bottom: 1px solid var(--color-border);
1014 overflow-x: auto;
1015 }
1016 .commit-card-meta {
1017 padding: var(--space-4) var(--space-6);
1018 display: flex;
1019 flex-direction: column;
1020 gap: var(--space-2);
1021 background: var(--color-bg-subtle);
1022 }
1023 .commit-card-meta-row {
1024 display: flex;
1025 align-items: baseline;
1026 gap: var(--space-3);
1027 font-size: var(--text-sm);
1028 flex-wrap: wrap;
1029 }
1030 .commit-meta-label {
1031 font-weight: 600;
1032 color: var(--color-text-muted);
1033 min-width: 5rem;
1034 font-size: var(--text-xs);
1035 text-transform: uppercase;
1036 letter-spacing: 0.04em;
1037 }
1038 .commit-sha-full {
1039 font-size: var(--text-xs);
1040 background: var(--color-bg-inset);
1041 padding: 2px var(--space-2);
1042 border-radius: var(--radius-sm);
1043 word-break: break-all;
1044 }
1045 .commit-stats-bar {
1046 font-size: var(--text-sm);
1047 color: var(--color-text-muted);
1048 margin-bottom: var(--space-4);
1049 }
1050
1051 /* --- Commit layout (sidebar + diffs) --- */
1052 .commit-layout {
1053 display: grid;
1054 grid-template-columns: 1fr;
1055 gap: var(--space-5);
1056 align-items: start;
1057 }
1058 .commit-diffs {
1059 min-width: 0;
1060 }
1061 @media (min-width: 900px) {
1062 .commit-layout {
1063 grid-template-columns: 220px 1fr;
1064 }
1065 .commit-layout:has(.file-nav-details:not([open])) {
1066 grid-template-columns: auto 1fr;
1067 }
1068 }
1069
1070 /* --- File nav sidebar --- */
1071 .commit-file-nav {
1072 position: sticky;
1073 top: calc(56px + var(--space-4));
1074 max-height: calc(100vh - 140px);
1075 overflow-y: auto;
1076 }
1077 .file-nav-details {
1078 border: 1px solid var(--color-border);
1079 border-radius: var(--radius-lg);
1080 background: var(--color-bg-subtle);
1081 overflow: hidden;
1082 }
1083 .file-nav-toggle {
1084 display: flex;
1085 align-items: center;
1086 gap: var(--space-2);
1087 padding: var(--space-3) var(--space-4);
1088 font-size: var(--text-sm);
1089 font-weight: 500;
1090 cursor: pointer;
1091 list-style: none;
1092 user-select: none;
1093 border-bottom: 1px solid var(--color-border);
1094 }
1095 .file-nav-toggle::-webkit-details-marker {
1096 display: none;
1097 }
1098 .file-nav-details:not([open]) .file-nav-toggle {
1099 border-bottom: none;
1100 }
1101 .file-nav-toggle-icon {
1102 font-size: 1em;
1103 transition: transform 0.15s;
1104 }
1105 .file-nav-details:not([open]) .file-nav-toggle-icon {
1106 transform: rotate(-90deg);
1107 }
1108 .file-nav-list {
1109 padding: var(--space-1) 0;
1110 list-style: none;
1111 }
1112 .file-nav-item {
1113 display: flex;
1114 align-items: center;
1115 gap: var(--space-2);
1116 padding: var(--space-1) var(--space-3);
1117 font-size: var(--text-xs);
1118 text-decoration: none;
1119 color: var(--color-text);
1120 border-radius: 0;
1121 overflow: hidden;
1122 }
1123 .file-nav-item:hover {
1124 background: var(--color-bg-inset);
1125 }
1126 .file-nav-status {
1127 flex-shrink: 0;
1128 width: 16px;
1129 height: 16px;
1130 display: inline-flex;
1131 align-items: center;
1132 justify-content: center;
1133 border-radius: var(--radius-sm);
1134 font-size: 9px;
1135 font-weight: 700;
1136 font-family: var(--font-mono);
1137 }
1138 .file-status-added {
1139 background: var(--color-success-bg);
1140 color: var(--color-success);
1141 }
1142 .file-status-deleted {
1143 background: var(--color-danger-bg);
1144 color: var(--color-danger);
1145 }
1146 .file-status-modified {
1147 background: var(--color-accent-bg);
1148 color: var(--color-accent);
1149 }
1150 .file-status-renamed {
1151 background: var(--color-merged-bg);
1152 color: var(--color-merged);
1153 }
1154 .file-status-copied {
1155 background: var(--color-merged-bg);
1156 color: var(--color-merged);
1157 }
1158 .file-nav-name {
1159 flex: 1;
1160 overflow: hidden;
1161 text-overflow: ellipsis;
1162 white-space: nowrap;
1163 font-family: var(--font-mono);
1164 }
1165 .file-nav-stat {
1166 flex-shrink: 0;
1167 display: flex;
1168 gap: var(--space-1);
1169 font-size: var(--text-xs);
1170 font-family: var(--font-mono);
1171 }
1172 .nav-add {
1173 color: var(--color-success);
1174 }
1175 .nav-del {
1176 color: var(--color-danger);
1177 }
1178 .nav-binary {
1179 color: var(--color-muted);
1180 font-size: var(--text-xs);
1181 }
1182 .file-nav-dir > details > .file-nav-list {
1183 padding-left: var(--space-4);
1184 }
1185 .file-nav-dir-toggle {
1186 display: flex;
1187 align-items: center;
1188 gap: var(--space-1);
1189 padding: var(--space-1) var(--space-3);
1190 font-size: var(--text-xs);
1191 font-family: var(--font-mono);
1192 color: var(--color-text-muted);
1193 cursor: pointer;
1194 list-style: none;
1195 user-select: none;
1196 }
1197 .file-nav-dir-toggle::-webkit-details-marker {
1198 display: none;
1199 }
1200 .file-nav-dir > details:not([open]) .file-nav-toggle-icon {
1201 transform: rotate(-90deg);
1202 }
1203
1204 /* --- Diff file cards --- */
1205 .diff-file {
1206 border: 1px solid var(--color-border);
1207 border-radius: var(--radius-lg);
1208 margin-bottom: var(--space-4);
1209 overflow: hidden;
1210 }
1211 .diff-file-header {
1212 display: flex;
1213 align-items: center;
1214 justify-content: space-between;
1215 gap: var(--space-3);
1216 padding: var(--space-3) var(--space-4);
1217 background: var(--color-bg-subtle);
1218 cursor: pointer;
1219 list-style: none;
1220 user-select: none;
1221 flex-wrap: wrap;
1222 }
1223 .diff-file-header::-webkit-details-marker {
1224 display: none;
1225 }
1226 .diff-file-header-left {
1227 display: flex;
1228 align-items: center;
1229 gap: var(--space-2);
1230 min-width: 0;
1231 flex: 1;
1232 }
1233 .diff-file-header-right {
1234 display: flex;
1235 align-items: center;
1236 gap: var(--space-2);
1237 flex-shrink: 0;
1238 flex-wrap: wrap;
1239 }
1240 .diff-file-toggle-icon {
1241 font-size: 0.7em;
1242 flex-shrink: 0;
1243 transition: transform 0.15s;
1244 }
1245 .diff-file:not([open]) .diff-file-toggle-icon {
1246 transform: rotate(-90deg);
1247 }
1248 .diff-status-badge {
1249 flex-shrink: 0;
1250 width: 18px;
1251 height: 18px;
1252 display: inline-flex;
1253 align-items: center;
1254 justify-content: center;
1255 border-radius: var(--radius-sm);
1256 font-size: 10px;
1257 font-weight: 700;
1258 font-family: var(--font-mono);
1259 }
1260 .diff-status-added {
1261 background: var(--color-success-bg);
1262 color: var(--color-success);
1263 }
1264 .diff-status-deleted {
1265 background: var(--color-danger-bg);
1266 color: var(--color-danger);
1267 }
1268 .diff-status-modified {
1269 background: var(--color-accent-bg);
1270 color: var(--color-accent);
1271 }
1272 .diff-status-renamed {
1273 background: var(--color-merged-bg);
1274 color: var(--color-merged);
1275 }
1276 .diff-status-copied {
1277 background: var(--color-merged-bg);
1278 color: var(--color-merged);
1279 }
1280 .diff-file-path {
1281 font-size: var(--text-sm);
1282 font-weight: 500;
1283 overflow: hidden;
1284 text-overflow: ellipsis;
1285 white-space: nowrap;
1286 }
1287 .diff-rename-arrow {
1288 font-size: var(--text-xs);
1289 color: var(--color-text-muted);
1290 white-space: nowrap;
1291 overflow: hidden;
1292 text-overflow: ellipsis;
1293 }
1294 .diff-stat-add {
1295 color: var(--color-success);
1296 font-size: var(--text-sm);
1297 font-family: var(--font-mono);
1298 font-weight: 600;
1299 }
1300 .diff-stat-del {
1301 color: var(--color-danger);
1302 font-size: var(--text-sm);
1303 font-family: var(--font-mono);
1304 font-weight: 600;
1305 }
1306 .diff-stat-binary {
1307 color: var(--color-muted);
1308 font-size: var(--text-sm);
1309 font-family: var(--font-mono);
1310 }
1311 .btn-xs {
1312 padding: 1px var(--space-2);
1313 font-size: var(--text-xs);
1314 border: 1px solid var(--color-border);
1315 border-radius: var(--radius-sm);
1316 background: var(--color-bg);
1317 color: var(--color-text);
1318 text-decoration: none;
1319 cursor: pointer;
1320 white-space: nowrap;
1321 font-family: var(--font-mono);
1322 display: inline-flex;
1323 align-items: center;
1324 transition: background 0.1s;
1325 }
1326 .btn-xs:hover {
1327 background: var(--color-bg-inset);
1328 }
1329
1330 /* --- Diff file body --- */
1331 .diff-binary-notice {
1332 padding: var(--space-4) var(--space-6);
1333 font-size: var(--text-sm);
1334 color: var(--color-text-muted);
1335 font-style: italic;
1336 }
1337 .diff-hunk {
1338 border-top: 1px solid var(--color-border-muted);
1339 overflow-x: auto;
1340 }
1341 .diff-hunk:first-child {
1342 border-top: none;
1343 }
1344 .diff-hunk-header {
1345 padding: var(--space-1) var(--space-4);
1346 font-family: var(--font-mono);
1347 font-size: var(--text-xs);
1348 font-weight: normal;
1349 text-align: left;
1350 background: color-mix(
1351 in srgb,
1352 var(--color-merged-bg) 50%,
1353 var(--color-bg)
1354 );
1355 color: var(--color-merged);
1356 border-bottom: 1px solid var(--color-border-muted);
1357 white-space: pre;
1358 }
1359
1360 /* --- Diff table --- */
1361 .diff-table {
1362 min-width: 100%;
1363 border-collapse: collapse;
1364 font-family: var(--font-mono);
1365 font-size: var(--text-xs);
1366 line-height: 1.5;
1367 }
1368 .diff-ln {
1369 width: 44px;
1370 min-width: 44px;
1371 text-align: right;
1372 padding: 0 var(--space-2);
1373 color: var(--color-text-muted);
1374 border-right: 1px solid var(--color-border-muted);
1375 user-select: none;
1376 vertical-align: top;
1377 white-space: nowrap;
1378 }
1379 .diff-sign {
1380 width: 18px;
1381 min-width: 18px;
1382 text-align: center;
1383 padding: 0 var(--space-1);
1384 user-select: none;
1385 vertical-align: top;
1386 }
1387 .diff-code {
1388 padding: 0 var(--space-3);
1389 white-space: pre;
1390 overflow: visible;
1391 vertical-align: top;
1392 word-break: normal;
1393 }
1394 /* Row type backgrounds */
1395 .diff-row-add {
1396 background: color-mix(
1397 in srgb,
1398 var(--color-success-bg) 70%,
1399 transparent
1400 );
1401 }
1402 .diff-row-del {
1403 background: color-mix(in srgb, var(--color-danger-bg) 70%, transparent);
1404 }
1405 .diff-row-add .diff-ln,
1406 .diff-row-add .diff-sign {
1407 background: color-mix(
1408 in srgb,
1409 var(--color-success-bg) 90%,
1410 transparent
1411 );
1412 }
1413 .diff-row-del .diff-ln,
1414 .diff-row-del .diff-sign {
1415 background: color-mix(in srgb, var(--color-danger-bg) 90%, transparent);
1416 }
1417 .diff-row-add .diff-sign {
1418 color: var(--color-success);
1419 font-weight: 700;
1420 }
1421 .diff-row-del .diff-sign {
1422 color: var(--color-danger);
1423 font-weight: 700;
1424 }
1425
1426 /* Shiki dark-mode support in diff code cells */
1427 @media (prefers-color-scheme: dark) {
1428 .diff-code span[style] {
1429 /* biome-ignore lint/complexity/noImportantStyles: required to override shiki inline styles */
1430 color: var(--shiki-dark) !important;
1431 }
1432 }
1433
1434 /* Shiki dark-mode support in file blob view */
1435 @media (prefers-color-scheme: dark) {
1436 .blob-table {
1437 background-color: var(--shiki-dark-bg);
1438 color: var(--shiki-dark);
1439 }
1440 .blob-table span[style] {
1441 /* biome-ignore lint/complexity/noImportantStyles: required to override shiki inline styles */
1442 color: var(--shiki-dark) !important;
1443 }
1444 .blob-table tr:target {
1445 background: color-mix(in srgb, #1c3a52 60%, transparent);
1446 }
1447 .blob-table tr:target .blob-ln {
1448 background: color-mix(in srgb, #1c3a52 80%, transparent);
1449 }
1450 }
1451 :root[data-theme="dark"] .blob-table {
1452 background-color: var(--shiki-dark-bg);
1453 color: var(--shiki-dark);
1454 }
1455 :root[data-theme="dark"] .blob-table span[style] {
1456 /* biome-ignore lint/complexity/noImportantStyles: required to override shiki inline styles */
1457 color: var(--shiki-dark) !important;
1458 }
1459
1460 /* --- Issue / Patch list --- */
1461 .list-header {
1462 display: flex;
1463 align-items: center;
1464 justify-content: space-between;
1465 padding: var(--space-3) var(--space-4);
1466 background: var(--color-bg-subtle);
1467 border: 1px solid var(--color-border);
1468 border-radius: var(--radius-lg) var(--radius-lg) 0 0;
1469 gap: var(--space-4);
1470 }
1471 .list-header-tabs {
1472 display: flex;
1473 gap: var(--space-2);
1474 }
1475 .list-tab {
1476 padding: var(--space-1) var(--space-3);
1477 border-radius: var(--radius-md);
1478 font-size: var(--text-sm);
1479 text-decoration: none;
1480 color: var(--color-text-muted);
1481 }
1482 .list-tab:hover {
1483 background: var(--color-bg-inset);
1484 color: var(--color-text);
1485 }
1486 .list-tab.active {
1487 background: var(--color-bg-inset);
1488 color: var(--color-text);
1489 font-weight: 600;
1490 }
1491 .issue-list {
1492 border: 1px solid var(--color-border);
1493 border-top: none;
1494 border-radius: 0 0 var(--radius-lg) var(--radius-lg);
1495 }
1496 .issue-item {
1497 padding: var(--space-4) var(--space-4);
1498 border-bottom: 1px solid var(--color-border-muted);
1499 }
1500 .issue-item:last-child {
1501 border-bottom: none;
1502 }
1503 .issue-main {
1504 display: flex;
1505 align-items: center;
1506 gap: var(--space-2);
1507 margin-bottom: var(--space-1);
1508 flex-wrap: wrap;
1509 }
1510 .issue-title {
1511 font-weight: 500;
1512 text-decoration: none;
1513 color: var(--color-text);
1514 flex: 1;
1515 }
1516 .issue-title:hover {
1517 color: var(--color-link);
1518 }
1519 .issue-meta {
1520 font-size: var(--text-xs);
1521 color: var(--color-text-muted);
1522 display: flex;
1523 gap: var(--space-3);
1524 }
1525 .issue-status-dot,
1526 .patch-status-dot {
1527 width: 8px;
1528 height: 8px;
1529 border-radius: 50%;
1530 flex-shrink: 0;
1531 }
1532 .issue-status-dot.open,
1533 .patch-status-dot.open {
1534 background: var(--color-success);
1535 }
1536 .issue-status-dot.closed,
1537 .patch-status-dot.closed {
1538 background: var(--color-danger);
1539 }
1540 .issue-status-dot.completed {
1541 background: var(--color-merged);
1542 }
1543 .patch-status-dot.merged {
1544 background: var(--color-merged);
1545 }
1546
1547 /* --- Issue detail / Timeline --- */
1548 .issue-detail-header {
1549 display: flex;
1550 align-items: center;
1551 gap: var(--space-3);
1552 margin-bottom: var(--space-6);
1553 }
1554 .issue-number {
1555 font-size: var(--text-2xl);
1556 font-weight: 600;
1557 color: var(--color-text-muted);
1558 white-space: nowrap;
1559 }
1560 .issue-detail-title {
1561 font-size: var(--text-2xl);
1562 font-weight: 600;
1563 overflow-wrap: anywhere;
1564 }
1565 .issue-detail-meta-actions {
1566 margin-left: auto;
1567 display: flex;
1568 gap: var(--space-2);
1569 }
1570 .patch-author-meta {
1571 display: flex;
1572 align-items: center;
1573 gap: var(--space-2);
1574 font-size: var(--text-xs);
1575 margin-top: calc(-1 * var(--space-4));
1576 margin-bottom: var(--space-6);
1577 }
1578 .patch-author-label {
1579 color: var(--color-text-muted);
1580 }
1581 .patch-author-identity {
1582 font-family: monospace;
1583 }
1584 .timeline-item {
1585 border: 1px solid var(--color-border);
1586 border-radius: var(--radius-lg);
1587 margin-bottom: var(--space-4);
1588 overflow: hidden;
1589 }
1590 .timeline-author {
1591 background: var(--color-bg-subtle);
1592 padding: var(--space-3) var(--space-4);
1593 font-size: var(--text-sm);
1594 display: flex;
1595 align-items: center;
1596 justify-content: space-between;
1597 gap: var(--space-3);
1598 border-bottom: 1px solid var(--color-border);
1599 overflow-wrap: anywhere;
1600 }
1601 .timeline-author time {
1602 color: var(--color-text-muted);
1603 font-size: var(--text-xs);
1604 width: max-content;
1605 }
1606 .timeline-author-right {
1607 margin-left: auto;
1608 display: flex;
1609 align-items: center;
1610 gap: var(--space-2);
1611 }
1612 .edited-indicator {
1613 color: var(--color-text-muted);
1614 font-size: var(--text-xs);
1615 cursor: default;
1616 }
1617
1618 /* --- Avatars --- */
1619 .avatar {
1620 display: inline-flex;
1621 border-radius: 4px;
1622 overflow: hidden;
1623 flex-shrink: 0;
1624 vertical-align: middle;
1625 }
1626 .avatar-img {
1627 width: 100%;
1628 height: 100%;
1629 object-fit: cover;
1630 display: block;
1631 color: transparent;
1632 }
1633 .avatar-placeholder {
1634 display: inline-flex;
1635 align-items: center;
1636 justify-content: center;
1637 border-radius: 4px;
1638 background: var(--color-bg-inset);
1639 color: var(--color-text-muted);
1640 font-weight: 600;
1641 flex-shrink: 0;
1642 vertical-align: middle;
1643 }
1644 .avatar-settings {
1645 display: flex;
1646 align-items: flex-start;
1647 gap: var(--space-5);
1648 }
1649 .avatar-actions {
1650 display: flex;
1651 flex-direction: column;
1652 gap: var(--space-3);
1653 }
1654 .nav-user {
1655 display: inline-flex;
1656 align-items: center;
1657 gap: var(--space-2);
1658 }
1659 .timeline-body {
1660 padding: var(--space-4);
1661 }
1662 .timeline-item-new {
1663 padding: var(--space-4);
1664 }
1665 .timeline-item-new .section-title {
1666 font-size: var(--text-base);
1667 border: none;
1668 padding-bottom: 0;
1669 }
1670 /* Edit <details> (summary only) in .timeline-author; form is a sibling shown via :has() */
1671 .timeline-author-right .inline-edit-details {
1672 border: none;
1673 }
1674 .timeline-author-right .inline-edit-details > summary {
1675 padding: 0;
1676 list-style: none;
1677 }
1678 .timeline-author-right
1679 .inline-edit-details
1680 > summary::-webkit-details-marker {
1681 display: none;
1682 }
1683 .inline-edit-details .when-open {
1684 display: none;
1685 }
1686 .inline-edit-details[open] .when-closed {
1687 display: none;
1688 }
1689 .inline-edit-details[open] .when-open {
1690 display: inline;
1691 }
1692 .inline-edit-form-area {
1693 display: none;
1694 border-top: 1px solid var(--color-border-muted);
1695 }
1696 .timeline-item:has(.inline-edit-details[open]) .inline-edit-form-area {
1697 display: block;
1698 }
1699 .timeline-item:has(.inline-edit-details[open]) .timeline-body {
1700 display: none;
1701 }
1702
1703 /* Title edit in issue/patch header */
1704 .issue-detail-header {
1705 align-items: flex-start;
1706 }
1707 .title-with-edit {
1708 flex: 1;
1709 min-width: 0;
1710 display: flex;
1711 flex-direction: column;
1712 gap: var(--space-1);
1713 }
1714 .title-edit-details {
1715 border: none;
1716 align-self: flex-start;
1717 }
1718 .title-with-edit:has(.title-edit-details[open]) .issue-detail-title {
1719 display: none;
1720 }
1721 .title-with-edit:has(.title-edit-details[open]) > .title-edit-details {
1722 display: none;
1723 }
1724 .title-edit-details > summary {
1725 padding: 0;
1726 list-style: none;
1727 }
1728 .title-edit-details > summary::-webkit-details-marker {
1729 display: none;
1730 }
1731 .title-edit-form-area {
1732 display: none;
1733 }
1734 .title-with-edit:has(.title-edit-details[open]) .title-edit-form-area {
1735 display: flex;
1736 flex: 1;
1737 min-width: 0;
1738 }
1739 .title-edit-form {
1740 display: flex;
1741 flex-direction: column;
1742 gap: var(--space-2);
1743 flex: 1;
1744 min-width: 0;
1745 }
1746 .title-edit-form .form-input {
1747 min-width: 0;
1748 width: 100%;
1749 padding: var(--space-2) var(--space-3);
1750 border: 1px solid var(--color-border);
1751 border-radius: var(--radius-md);
1752 background: var(--color-bg);
1753 color: var(--color-text);
1754 font-size: var(--text-sm);
1755 }
1756 .title-edit-form .form-input:focus {
1757 outline: 2px solid var(--color-accent);
1758 outline-offset: -1px;
1759 border-color: var(--color-accent);
1760 }
1761 .title-edit-actions {
1762 display: flex;
1763 gap: var(--space-2);
1764 }
1765
1766 .inline-edit-form {
1767 padding: var(--space-4);
1768 display: flex;
1769 flex-direction: column;
1770 gap: var(--space-3);
1771 }
1772
1773 /* --- Reactions --- */
1774 .reaction-bar {
1775 display: flex;
1776 flex-wrap: wrap;
1777 gap: var(--space-2);
1778 padding: var(--space-2) var(--space-4);
1779 border-top: 1px solid var(--color-border-muted);
1780 }
1781 .reaction-form {
1782 display: inline;
1783 }
1784 .reaction-btn {
1785 display: inline-flex;
1786 align-items: center;
1787 gap: var(--space-1);
1788 padding: var(--space-1) var(--space-3);
1789 border: 1px solid var(--color-border);
1790 border-radius: var(--radius-full);
1791 background: var(--color-bg-subtle);
1792 color: var(--color-text);
1793 font-size: var(--text-sm);
1794 cursor: pointer;
1795 transition: background 0.1s;
1796 }
1797 .reaction-btn:hover {
1798 background: var(--color-bg-inset);
1799 }
1800 .reaction-btn.reacted {
1801 background: var(--color-accent-bg);
1802 border-color: var(--color-accent);
1803 }
1804 .reaction-picker {
1805 position: relative;
1806 }
1807 .reaction-add-btn {
1808 display: inline-flex;
1809 align-items: center;
1810 justify-content: center;
1811 width: 28px;
1812 height: 28px;
1813 border: 1px dashed var(--color-border);
1814 border-radius: var(--radius-full);
1815 background: transparent;
1816 cursor: pointer;
1817 font-size: var(--text-base);
1818 color: var(--color-text-muted);
1819 list-style: none;
1820 }
1821 .reaction-add-btn::-webkit-details-marker {
1822 display: none;
1823 }
1824 .reaction-picker-dropdown {
1825 position: absolute;
1826 bottom: calc(100% + var(--space-2));
1827 left: 0;
1828 background: var(--color-bg);
1829 border: 1px solid var(--color-border);
1830 border-radius: var(--radius-lg);
1831 padding: var(--space-2);
1832 display: flex;
1833 gap: var(--space-1);
1834 z-index: 10;
1835 }
1836 .reaction-picker-btn {
1837 background: none;
1838 border: none;
1839 font-size: 1.25rem;
1840 cursor: pointer;
1841 padding: var(--space-1);
1842 border-radius: var(--radius-sm);
1843 }
1844 .reaction-picker-btn:hover {
1845 background: var(--color-bg-inset);
1846 }
1847
1848 /* --- Patch subview tabs --- */
1849 .patch-tab-nav {
1850 display: flex;
1851 border-bottom: 1px solid var(--color-border);
1852 margin-bottom: var(--space-6);
1853 }
1854 .tab-count {
1855 display: inline-flex;
1856 align-items: center;
1857 justify-content: center;
1858 min-width: 1.4em;
1859 padding: 0 var(--space-1);
1860 margin-left: var(--space-1);
1861 font-size: var(--text-xs);
1862 font-weight: 500;
1863 background: var(--color-bg-inset);
1864 border-radius: 999px;
1865 color: var(--color-text-muted);
1866 }
1867
1868 /* --- Patch apply status --- */
1869 .apply-status {
1870 margin: var(--space-4) 0;
1871 }
1872 .apply-result {
1873 display: flex;
1874 align-items: flex-start;
1875 gap: var(--space-2);
1876 padding: var(--space-3) var(--space-4);
1877 border-radius: var(--radius-md);
1878 font-size: var(--text-sm);
1879 flex-direction: column;
1880 }
1881 .apply-result > div {
1882 display: flex;
1883 gap: var(--space-2);
1884 align-items: center;
1885 }
1886 .apply-clean {
1887 background: var(--color-success-bg);
1888 color: var(--color-success);
1889 border: 1px solid var(--color-success);
1890 }
1891 .apply-conflict {
1892 background: var(--color-danger-bg);
1893 color: var(--color-danger);
1894 border: 1px solid var(--color-danger);
1895 }
1896 .apply-checking,
1897 .apply-unknown {
1898 color: var(--color-text-muted);
1899 font-style: italic;
1900 font-size: var(--text-sm);
1901 }
1902 .apply-output {
1903 font-family: var(--font-mono);
1904 font-size: var(--text-xs);
1905 white-space: pre-wrap;
1906 margin-top: var(--space-2);
1907 padding: var(--space-2);
1908 background: rgba(0, 0, 0, 0.05);
1909 border-radius: var(--radius-sm);
1910 width: 100%;
1911 }
1912 .patch-actions {
1913 display: flex;
1914 gap: var(--space-3);
1915 margin: var(--space-4) 0;
1916 flex-wrap: wrap;
1917 }
1918 .patch-card-title-row {
1919 display: flex;
1920 align-items: flex-start;
1921 gap: var(--space-3);
1922 justify-content: space-between;
1923 margin-bottom: var(--space-3);
1924 }
1925 .patch-card-title-row .commit-card-subject {
1926 margin-bottom: 0;
1927 }
1928 .patch-card-description {
1929 margin-top: var(--space-4);
1930 padding-top: var(--space-4);
1931 border-top: 1px solid var(--color-border-muted);
1932 }
1933
1934 /* --- Repo home layout --- */
1935 .repo-home-layout {
1936 display: grid;
1937 gap: var(--space-8);
1938 }
1939 @media (min-width: 768px) {
1940 .repo-home-layout {
1941 grid-template-columns: 1fr 1fr;
1942 }
1943 }
1944 .readme-section {
1945 border: 1px solid var(--color-border);
1946 border-radius: var(--radius-lg);
1947 overflow: hidden;
1948 }
1949 .readme-header {
1950 background: var(--color-bg-subtle);
1951 padding: var(--space-3) var(--space-4);
1952 font-size: var(--text-sm);
1953 font-weight: 500;
1954 border-bottom: 1px solid var(--color-border);
1955 }
1956 /* --- Code setup block --- */
1957 .code-setup {
1958 background: var(--color-bg-subtle);
1959 border: 1px solid var(--color-border);
1960 border-radius: var(--radius-lg);
1961 padding: var(--space-4);
1962 font-size: var(--text-sm);
1963 margin-top: var(--space-4);
1964 overflow: auto;
1965 text-align: left;
1966 }
1967 .code-plain {
1968 background: var(--color-bg-subtle);
1969 padding: var(--space-4);
1970 overflow: auto;
1971 font-size: var(--text-sm);
1972 line-height: 1.6;
1973 }
1974
1975 /* --- Markdown body --- */
1976 .markdown-body {
1977 font-size: var(--text-sm);
1978 line-height: 1.6;
1979 color: var(--color-text);
1980 }
1981 .markdown-body h1,
1982 .markdown-body h2,
1983 .markdown-body h3,
1984 .markdown-body h4,
1985 .markdown-body h5,
1986 .markdown-body h6 {
1987 margin-top: var(--space-6);
1988 margin-bottom: var(--space-3);
1989 }
1990 .markdown-body p {
1991 margin-bottom: var(--space-4);
1992 }
1993 .markdown-body a {
1994 color: var(--color-link);
1995 }
1996 .markdown-body code {
1997 background: var(--color-bg-inset);
1998 padding: 0.1em 0.3em;
1999 border-radius: var(--radius-sm);
2000 font-size: 0.9em;
2001 }
2002 .markdown-body pre {
2003 background: var(--color-bg-subtle);
2004 border: 1px solid var(--color-border);
2005 border-radius: var(--radius-md);
2006 padding: var(--space-4);
2007 overflow: auto;
2008 margin-bottom: var(--space-4);
2009 }
2010 .markdown-body pre code {
2011 background: none;
2012 padding: 0;
2013 }
2014 .markdown-body ul,
2015 .markdown-body ol {
2016 padding-left: var(--space-6);
2017 margin-bottom: var(--space-4);
2018 }
2019 .markdown-body ul {
2020 list-style: disc;
2021 }
2022 .markdown-body ol {
2023 list-style: decimal;
2024 }
2025 .markdown-body li {
2026 margin-bottom: var(--space-1);
2027 }
2028 .markdown-body blockquote {
2029 border-left: 3px solid var(--color-border);
2030 padding-left: var(--space-4);
2031 color: var(--color-text-muted);
2032 margin: var(--space-4) 0;
2033 }
2034 .markdown-body table {
2035 width: 100%;
2036 border-collapse: collapse;
2037 margin-bottom: var(--space-4);
2038 }
2039 .markdown-body th,
2040 .markdown-body td {
2041 padding: var(--space-2) var(--space-3);
2042 border: 1px solid var(--color-border);
2043 }
2044 .markdown-body th {
2045 background: var(--color-bg-subtle);
2046 font-weight: 600;
2047 }
2048 .markdown-body hr {
2049 border: none;
2050 border-top: 1px solid var(--color-border);
2051 margin: var(--space-6) 0;
2052 }
2053 .markdown-body img {
2054 max-width: 100%;
2055 border-radius: var(--radius-md);
2056 }
2057 .markdown-body details {
2058 margin-bottom: var(--space-4);
2059 }
2060 .markdown-body summary {
2061 cursor: pointer;
2062 font-weight: 500;
2063 }
2064 .readme-section .markdown-body {
2065 padding: var(--space-4);
2066 }
2067
2068 /* --- Search form --- */
2069 .search-form {
2070 margin-bottom: var(--space-5);
2071 }
2072 .search-input-wrap {
2073 display: flex;
2074 gap: var(--space-2);
2075 max-width: 480px;
2076 }
2077 .search-input {
2078 flex: 1;
2079 padding: var(--space-2) var(--space-3);
2080 border: 1px solid var(--color-border);
2081 border-radius: var(--radius-md);
2082 background: var(--color-bg);
2083 color: var(--color-text);
2084 font-size: var(--text-sm);
2085 }
2086 .search-input:focus {
2087 outline: 2px solid var(--color-accent);
2088 outline-offset: -1px;
2089 border-color: var(--color-accent);
2090 }
2091
2092 /* --- Issue close bar --- */
2093 .issue-close-bar {
2094 display: flex;
2095 justify-content: flex-end;
2096 padding: var(--space-3) 0;
2097 border-top: 1px solid var(--color-border-muted);
2098 margin-top: var(--space-2);
2099 }
2100
2101 /* --- Auth divider --- */
2102 .auth-divider {
2103 display: flex;
2104 align-items: center;
2105 gap: var(--space-3);
2106 margin: var(--space-4) 0;
2107 color: var(--color-text-muted);
2108 font-size: var(--text-sm);
2109 }
2110 .auth-divider::before,
2111 .auth-divider::after {
2112 content: "";
2113 flex: 1;
2114 height: 1px;
2115 background: var(--color-border);
2116 }
2117
2118 /* --- Passkey UI in settings --- */
2119 .passkey-actions {
2120 display: flex;
2121 flex-direction: column;
2122 gap: var(--space-3);
2123 align-items: flex-start;
2124 margin-top: var(--space-3);
2125 }
2126 .passkey-status {
2127 font-size: var(--text-sm);
2128 }
2129
2130 /* --- Danger zone --- */
2131 .danger-zone {
2132 margin-top: var(--space-8);
2133 }
2134 .danger-title {
2135 color: var(--color-danger);
2136 border-bottom-color: var(--color-danger);
2137 }
2138 .danger-card {
2139 border-color: var(--color-danger);
2140 background: var(--color-danger-bg);
2141 }
2142 .danger-item {
2143 display: flex;
2144 align-items: center;
2145 justify-content: space-between;
2146 gap: var(--space-4);
2147 flex-wrap: wrap;
2148 }
2149 .danger-item p {
2150 margin: var(--space-1) 0 0;
2151 }
2152 .btn-danger {
2153 background: var(--color-danger);
2154 border-color: transparent;
2155 color: #fff;
2156 }
2157 .btn-danger:hover {
2158 filter: brightness(0.9);
2159 }
2160
2161 /* --- Release list items --- */
2162 .release-item-header {
2163 display: flex;
2164 gap: var(--space-3);
2165 align-items: flex-start;
2166 }
2167 .release-item-main {
2168 flex: 1;
2169 min-width: 0;
2170 }
2171 .release-item-title {
2172 font-size: var(--text-lg);
2173 font-weight: 700;
2174 text-decoration: none;
2175 color: var(--color-text);
2176 display: block;
2177 margin-bottom: var(--space-1);
2178 }
2179 .release-item-title:hover {
2180 color: var(--color-link);
2181 }
2182 .release-item-meta {
2183 display: flex;
2184 flex-wrap: wrap;
2185 gap: var(--space-3);
2186 align-items: center;
2187 font-size: var(--text-xs);
2188 color: var(--color-text-muted);
2189 }
2190 .release-item-date {
2191 display: flex;
2192 flex-direction: column;
2193 align-items: flex-end;
2194 gap: var(--space-2);
2195 font-size: var(--text-xs);
2196 color: var(--color-text-muted);
2197 white-space: nowrap;
2198 flex-shrink: 0;
2199 }
2200
2201 /* --- Release notes preview in list --- */
2202 .release-notes-section {
2203 margin-top: var(--space-3);
2204 }
2205 .release-notes-label {
2206 font-size: var(--text-xs);
2207 font-weight: 600;
2208 color: var(--color-text-muted);
2209 text-transform: uppercase;
2210 letter-spacing: 0.05em;
2211 margin-bottom: var(--space-2);
2212 }
2213 .notes-expand > summary {
2214 list-style: none;
2215 cursor: pointer;
2216 outline: none;
2217 }
2218 .notes-expand > summary::-webkit-details-marker {
2219 display: none;
2220 }
2221 .notes-preview {
2222 max-height: calc(5 * 1.6em);
2223 overflow: hidden;
2224 position: relative;
2225 white-space: pre-wrap;
2226 font-size: var(--text-sm);
2227 color: var(--color-text);
2228 line-height: 1.6;
2229 word-break: break-word;
2230 margin-bottom: var(--space-1);
2231 }
2232 .notes-preview::after {
2233 content: "";
2234 position: absolute;
2235 bottom: 0;
2236 left: 0;
2237 right: 0;
2238 height: 2.5em;
2239 background: linear-gradient(transparent, var(--color-bg));
2240 pointer-events: none;
2241 }
2242 .notes-expand[open] .notes-preview {
2243 display: none;
2244 }
2245 .notes-full {
2246 padding-top: var(--space-3);
2247 padding-bottom: var(--space-1);
2248 }
2249 .notes-expand[open] {
2250 display: flex;
2251 flex-direction: column;
2252 }
2253 .notes-expand[open] > summary {
2254 order: 1;
2255 }
2256 .notes-expand[open] > .notes-full {
2257 order: 0;
2258 }
2259 .notes-toggle-label {
2260 display: inline-block;
2261 font-size: var(--text-xs);
2262 color: var(--color-link);
2263 margin-top: var(--space-1);
2264 }
2265 .notes-toggle-label:hover {
2266 text-decoration: underline;
2267 }
2268 .notes-toggle-label::before {
2269 content: "Show more ↓";
2270 }
2271 .notes-expand[open] .notes-toggle-label::before {
2272 content: "Show less ↑";
2273 }
2274
2275 /* --- Release detail --- */
2276 .release-detail {
2277 padding: var(--space-6) 0;
2278 }
2279 .release-header {
2280 margin-bottom: var(--space-6);
2281 }
2282 .release-notes {
2283 margin-bottom: var(--space-6);
2284 }
2285 .release-assets {
2286 margin-bottom: var(--space-6);
2287 }
2288 .release-assets-heading {
2289 font-size: var(--text-base);
2290 font-weight: 600;
2291 margin-bottom: var(--space-3);
2292 }
2293 .asset-list {
2294 border: 1px solid var(--color-border);
2295 border-radius: var(--radius-lg);
2296 overflow: hidden;
2297 }
2298 .asset-item {
2299 display: flex;
2300 align-items: center;
2301 gap: var(--space-4);
2302 padding: var(--space-3) var(--space-4);
2303 border-bottom: 1px solid var(--color-border-muted);
2304 font-size: var(--text-sm);
2305 }
2306 .asset-item:last-child {
2307 border-bottom: none;
2308 }
2309 .asset-name {
2310 flex: 1;
2311 color: var(--color-link);
2312 text-decoration: none;
2313 font-family: var(--font-mono);
2314 font-size: var(--text-xs);
2315 }
2316 .asset-name:hover {
2317 text-decoration: underline;
2318 }
2319 .asset-name-pending {
2320 color: var(--color-text-muted);
2321 cursor: default;
2322 }
2323 .asset-item-pending {
2324 opacity: 0.6;
2325 }
2326 .asset-size,
2327 .asset-meta {
2328 color: var(--color-text-muted);
2329 font-size: var(--text-xs);
2330 white-space: nowrap;
2331 }
2332 .release-back {
2333 margin-top: var(--space-4);
2334 display: flex;
2335 gap: var(--space-3);
2336 align-items: center;
2337 justify-content: space-between;
2338 }
2339}
2340
2341/* ============================================================
2342 @layer utilities
2343 ============================================================ */
2344@layer utilities {
2345 .text-muted {
2346 color: var(--color-text-muted);
2347 }
2348 .text-sm {
2349 font-size: var(--text-sm);
2350 }
2351 .text-xs {
2352 font-size: var(--text-xs);
2353 }
2354 .font-mono {
2355 font-family: var(--font-mono);
2356 }
2357 .mt-1 {
2358 margin-top: var(--space-1);
2359 }
2360 .mt-2 {
2361 margin-top: var(--space-2);
2362 }
2363 .mt-4 {
2364 margin-top: var(--space-4);
2365 }
2366 .mt-6 {
2367 margin-top: var(--space-6);
2368 }
2369 .mb-4 {
2370 margin-bottom: var(--space-4);
2371 }
2372 .flex {
2373 display: flex;
2374 }
2375 .gap-2 {
2376 gap: var(--space-2);
2377 }
2378 .gap-4 {
2379 gap: var(--space-4);
2380 }
2381 .items-center {
2382 align-items: center;
2383 }
2384 .justify-between {
2385 justify-content: space-between;
2386 }
2387 .hidden {
2388 display: none;
2389 }
2390}
2391
2392/* ============================================================
2393 Pagination
2394 ============================================================ */
2395.commit-cursor-nav {
2396 display: flex;
2397 justify-content: space-between;
2398 border-top: 1px solid var(--color-border);
2399 margin-top: var(--space-2);
2400 padding: var(--space-4) 0 var(--space-2);
2401}
2402
2403.commit-cursor-prev {
2404 flex: 1;
2405}
2406.commit-cursor-next {
2407 flex: 1;
2408 text-align: right;
2409}
2410
2411.pagination {
2412 display: grid;
2413 grid-template-columns: 1fr auto 1fr;
2414 align-items: center;
2415 border-top: 1px solid var(--color-border);
2416 margin-top: var(--space-2);
2417 padding: var(--space-4) 0 var(--space-2);
2418}
2419
2420.pagination-prev {
2421 justify-self: start;
2422}
2423.pagination-next {
2424 justify-self: end;
2425}
2426
2427.pagination-info {
2428 justify-self: center;
2429 font-size: var(--text-sm);
2430 color: var(--color-text-muted);
2431}
2432
2433.pagination-btn {
2434 display: inline-flex;
2435 align-items: center;
2436 gap: var(--space-1);
2437 padding: var(--space-1) var(--space-3);
2438 border: 1px solid var(--color-border);
2439 border-radius: var(--radius-md);
2440 font-size: var(--text-sm);
2441 font-weight: 500;
2442 text-decoration: none;
2443 color: var(--color-text);
2444 background: var(--color-bg-subtle);
2445 transition:
2446 background 0.1s,
2447 border-color 0.1s;
2448 white-space: nowrap;
2449}
2450
2451.pagination-btn:hover {
2452 background: var(--color-bg-inset);
2453 border-color: var(--color-border);
2454 color: var(--color-text);
2455 text-decoration: none;
2456}
2457
2458/* Settings */
2459.theme-options {
2460 display: flex;
2461 gap: var(--space-4);
2462 margin-bottom: var(--space-4);
2463 flex-wrap: wrap;
2464}
2465.theme-option {
2466 display: flex;
2467 align-items: center;
2468 gap: var(--space-2);
2469 cursor: pointer;
2470 font-size: var(--text-sm);
2471}
2472.settings-form {
2473 display: flex;
2474 flex-direction: column;
2475 gap: var(--space-4);
2476}
2477.passkey-list {
2478 display: flex;
2479 flex-direction: column;
2480 gap: var(--space-2);
2481 margin-bottom: var(--space-4);
2482}
2483.passkey-item {
2484 display: flex;
2485 align-items: center;
2486 gap: var(--space-3);
2487 padding: var(--space-2) 0;
2488 border-bottom: 1px solid var(--color-border-muted);
2489 font-size: var(--text-sm);
2490}
2491.passkey-item:last-child {
2492 border-bottom: none;
2493}
2494.passkey-date {
2495 flex: 1;
2496 color: var(--color-text-muted);
2497}
2498.ssh-key-info {
2499 flex: 1;
2500 display: flex;
2501 flex-direction: column;
2502 gap: var(--space-1);
2503 min-width: 0;
2504}
2505.ssh-key-name {
2506 font-weight: 500;
2507}
2508.ssh-key-fingerprint {
2509 font-family: var(--font-mono);
2510 font-size: var(--text-xs);
2511 overflow: hidden;
2512 text-overflow: ellipsis;
2513 white-space: nowrap;
2514}
2515.form-textarea {
2516 resize: vertical;
2517 min-height: 4.5rem;
2518 font-family: var(--font-mono);
2519 font-size: var(--text-sm);
2520}
2521/* Clone popup */
2522.clone-popup-details {
2523 position: relative;
2524 display: inline-block;
2525}
2526.clone-popup-details > summary {
2527 list-style: none;
2528}
2529.clone-popup-details > summary::-webkit-details-marker {
2530 display: none;
2531}
2532.clone-popup {
2533 position: absolute;
2534 right: 1rem;
2535 top: calc(100% + var(--space-2));
2536 background: var(--color-bg);
2537 border: 1px solid var(--color-border);
2538 border-radius: var(--radius-lg);
2539 padding: var(--space-3);
2540 min-width: 22rem;
2541 z-index: 100;
2542 box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
2543 display: flex;
2544 flex-direction: column;
2545 gap: var(--space-2);
2546}
2547.clone-url-row {
2548 display: flex;
2549 align-items: center;
2550 gap: var(--space-2);
2551}
2552.clone-url-label {
2553 font-size: var(--text-xs);
2554 font-weight: 600;
2555 color: var(--color-text-muted);
2556 text-transform: uppercase;
2557 letter-spacing: 0.05em;
2558 min-width: 2.75rem;
2559}
2560.clone-url-input {
2561 flex: 1;
2562 font-family: var(--font-mono);
2563 font-size: var(--text-sm);
2564 background: var(--color-bg-subtle);
2565 border: 1px solid var(--color-border-muted);
2566 border-radius: var(--radius-md);
2567 padding: var(--space-1) var(--space-2);
2568 color: var(--color-text);
2569 cursor: text;
2570 min-width: 0;
2571}
2572.user-list {
2573 display: flex;
2574 flex-direction: column;
2575 gap: var(--space-2);
2576 margin-bottom: var(--space-6);
2577}
2578.user-item {
2579 display: flex;
2580 align-items: center;
2581 gap: var(--space-3);
2582 padding: var(--space-2) 0;
2583 border-bottom: 1px solid var(--color-border-muted);
2584 font-size: var(--text-sm);
2585}
2586.user-item:last-child {
2587 border-bottom: none;
2588}
2589.user-name {
2590 font-weight: 500;
2591 flex: 1;
2592}
2593.user-date {
2594 color: var(--color-text-muted);
2595 font-size: var(--text-xs);
2596}
2597