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-sm {
364 padding: var(--space-1) var(--space-3);
365 font-size: var(--text-xs);
366 }
367 .btn-block {
368 width: 100%;
369 justify-content: center;
370 }
371
372 /* --- Forms --- */
373 .form-group {
374 display: flex;
375 flex-direction: column;
376 gap: var(--space-2);
377 margin-bottom: var(--space-4);
378 }
379 .form-group label,
380 .form-group .form-group-label {
381 font-size: var(--text-sm);
382 font-weight: 500;
383 color: var(--color-text);
384 }
385 .form-group input:not([type="file"]):not([type="checkbox"]),
386 .form-group textarea,
387 .form-group select {
388 padding: var(--space-2) var(--space-3);
389 border: 1px solid var(--color-border);
390 border-radius: var(--radius-md);
391 background: var(--color-bg);
392 color: var(--color-text);
393 font-size: var(--text-sm);
394 }
395 .form-group input:not([type="file"]):not([type="checkbox"]):focus,
396 .form-group textarea:focus {
397 outline: 2px solid var(--color-accent);
398 outline-offset: -1px;
399 border-color: var(--color-accent);
400 }
401 .form-group input[type="file"] {
402 font-size: var(--text-sm);
403 color: var(--color-text);
404 padding: 0;
405 border: none;
406 background: none;
407 }
408 .form-group textarea {
409 resize: vertical;
410 min-height: 120px;
411 }
412 .form-success {
413 background: var(--color-success-bg);
414 color: var(--color-success);
415 border: 1px solid var(--color-success);
416 border-radius: var(--radius-md);
417 padding: var(--space-3) var(--space-4);
418 font-size: var(--text-sm);
419 margin-bottom: var(--space-4);
420 }
421 .form-hint {
422 font-size: var(--text-sm);
423 color: var(--color-text-muted);
424 margin: 0;
425 }
426 .form-error {
427 background: var(--color-danger-bg);
428 color: var(--color-danger);
429 border: 1px solid var(--color-danger);
430 border-radius: var(--radius-md);
431 padding: var(--space-3) var(--space-4);
432 font-size: var(--text-sm);
433 margin-bottom: var(--space-4);
434 }
435 .form-actions {
436 display: flex;
437 gap: var(--space-3);
438 align-items: center;
439 flex-wrap: wrap;
440 }
441 .form-card {
442 background: var(--color-bg-subtle);
443 border: 1px solid var(--color-border);
444 border-radius: var(--radius-lg);
445 padding: var(--space-6);
446 margin-top: var(--space-4);
447 }
448 .checkbox-label {
449 display: flex;
450 align-items: center;
451 gap: var(--space-2);
452 cursor: pointer;
453 }
454
455 /* --- Page header --- */
456 .page-header {
457 display: flex;
458 align-items: center;
459 justify-content: space-between;
460 margin-bottom: var(--space-6);
461 gap: var(--space-4);
462 }
463 .page-title {
464 font-size: var(--text-2xl);
465 color: var(--color-text);
466 margin-bottom: var(--space-4);
467 }
468 .page-title a {
469 text-decoration: none;
470 color: var(--color-link);
471 }
472 .page-title a:hover {
473 text-decoration: underline;
474 }
475 .section-title {
476 font-size: var(--text-lg);
477 margin-bottom: var(--space-4);
478 padding-bottom: var(--space-2);
479 border-bottom: 1px solid var(--color-border);
480 }
481
482 /* --- Auth --- */
483 .auth-container {
484 max-width: 400px;
485 margin: var(--space-12) auto;
486 }
487 .auth-container .page-title {
488 margin-bottom: var(--space-6);
489 }
490 .auth-form {
491 margin-bottom: var(--space-4);
492 }
493 .auth-footer {
494 text-align: center;
495 font-size: var(--text-sm);
496 color: var(--color-text-muted);
497 margin-top: var(--space-4);
498 }
499 .passkey-btn {
500 display: none;
501 margin-top: var(--space-3);
502 }
503
504 /* --- Repo header --- */
505 .repo-header {
506 margin-bottom: var(--space-2);
507 }
508 .repo-title-row {
509 display: flex;
510 align-items: center;
511 gap: var(--space-3);
512 flex-wrap: wrap;
513 }
514 .repo-title-row .page-title {
515 margin-bottom: 0;
516 }
517 .repo-header-title {
518 display: flex;
519 align-items: center;
520 gap: var(--space-3);
521 flex-wrap: wrap;
522 }
523 .repo-description {
524 color: var(--color-text-muted);
525 margin-top: var(--space-2);
526 }
527 .repo-header-meta {
528 display: flex;
529 align-items: center;
530 gap: var(--space-4);
531 margin-bottom: var(--space-3);
532 font-size: var(--text-sm);
533 color: var(--color-text-muted);
534 }
535 .icon {
536 font-style: normal;
537 }
538
539 /* --- Branch selector --- */
540 .branch-selector {
541 display: inline-flex;
542 align-items: center;
543 gap: var(--space-2);
544 }
545 .branch-selector-icon {
546 color: var(--color-text-muted);
547 font-size: var(--text-sm);
548 user-select: none;
549 }
550 .branch-select {
551 padding: var(--space-1) var(--space-2);
552 padding-right: var(--space-5);
553 border: 1px solid var(--color-border);
554 border-radius: var(--radius-md);
555 background: var(--color-bg-subtle);
556 font-size: var(--text-sm);
557 font-family: var(--font-mono);
558 color: var(--color-text);
559 cursor: pointer;
560 appearance: auto;
561 max-width: 180px;
562 }
563 .branch-select:hover {
564 border-color: var(--color-text-muted);
565 }
566 .branch-select:focus {
567 outline: 2px solid var(--color-accent);
568 outline-offset: -1px;
569 }
570
571 /* toolbar row above file tree */
572 .tree-toolbar {
573 display: flex;
574 align-items: center;
575 justify-content: space-between;
576 margin-bottom: var(--space-3);
577 }
578
579 /* commits-header flex row */
580 .commits-header {
581 display: flex;
582 align-items: center;
583 gap: var(--space-4);
584 margin-bottom: var(--space-4);
585 flex-wrap: wrap;
586 }
587 .commits-header .section-title {
588 margin-bottom: 0;
589 }
590
591 /* --- Repo nav bar (tabs + private badge) --- */
592 .repo-nav-bar {
593 display: flex;
594 align-items: center;
595 justify-content: space-between;
596 border-bottom: 1px solid var(--color-border);
597 margin-bottom: var(--space-6);
598 gap: var(--space-4);
599 }
600
601 /* --- Repo tabs --- */
602 .repo-tabs {
603 display: flex;
604 gap: 0;
605 flex: 1;
606 overflow-x: auto;
607 overflow-y: hidden;
608 }
609 .repo-tab {
610 padding: var(--space-3) var(--space-4);
611 font-size: var(--text-sm);
612 text-decoration: none;
613 color: var(--color-text-muted);
614 border-bottom: 2px solid transparent;
615 margin-bottom: -1px;
616 transition: color 0.1s;
617 }
618 .repo-tab:hover {
619 color: var(--color-text);
620 }
621 .repo-tab.active {
622 color: var(--color-text);
623 font-weight: 600;
624 border-bottom-color: var(--color-accent);
625 }
626 /* Align active indicator with nav-bar border */
627 .repo-tab {
628 margin-bottom: -1px;
629 }
630
631 /* --- Repo list --- */
632 .repo-list {
633 display: flex;
634 flex-direction: column;
635 gap: var(--space-2);
636 }
637 .repo-card {
638 display: flex;
639 align-items: flex-start;
640 justify-content: space-between;
641 padding: var(--space-4) var(--space-5);
642 border: 1px solid var(--color-border);
643 border-radius: var(--radius-lg);
644 background: var(--color-bg);
645 gap: var(--space-4);
646 transition: border-color 0.15s;
647 }
648 .repo-card:hover {
649 border-color: var(--color-accent);
650 }
651 .repo-card-main {
652 flex: 1;
653 min-width: 0;
654 }
655 .repo-card-title {
656 display: flex;
657 align-items: center;
658 gap: var(--space-2);
659 margin-bottom: var(--space-1);
660 }
661 .repo-name {
662 font-size: var(--text-lg);
663 font-weight: 600;
664 color: var(--color-link);
665 text-decoration: none;
666 word-break: break-all;
667 }
668 .repo-name:hover {
669 text-decoration: underline;
670 }
671 .repo-card-meta {
672 display: flex;
673 flex-direction: column;
674 align-items: flex-end;
675 gap: var(--space-1);
676 font-size: var(--text-xs);
677 color: var(--color-text-muted);
678 white-space: nowrap;
679 }
680 .repo-date {
681 color: var(--color-text-muted);
682 }
683
684 /* --- Badges --- */
685 .badge {
686 display: inline-flex;
687 align-items: center;
688 padding: 1px var(--space-2);
689 border-radius: var(--radius-full);
690 font-size: var(--text-xs);
691 font-weight: 500;
692 border: 1px solid;
693 text-decoration: none;
694 }
695 .badge-private {
696 color: var(--color-warning);
697 border-color: var(--color-warning);
698 background: var(--color-warning-bg);
699 }
700 .badge-pinned {
701 color: var(--color-accent);
702 border-color: var(--color-accent);
703 background: var(--color-accent-bg);
704 }
705 .issue-badge,
706 .patch-badge {
707 display: inline-flex;
708 align-items: center;
709 padding: var(--space-1) var(--space-3);
710 border-radius: var(--radius-full);
711 font-size: var(--text-xs);
712 font-weight: 500;
713 text-transform: capitalize;
714 }
715 .issue-badge.open,
716 .patch-badge.open {
717 background: var(--color-success-bg);
718 color: var(--color-success);
719 }
720 .issue-badge.closed,
721 .patch-badge.closed {
722 background: var(--color-danger-bg);
723 color: var(--color-danger);
724 }
725 .issue-badge.completed {
726 background: var(--color-merged-bg);
727 color: var(--color-merged);
728 }
729 .patch-badge.merged {
730 background: var(--color-merged-bg);
731 color: var(--color-merged);
732 }
733 .sig-badge {
734 display: inline-flex;
735 align-items: center;
736 padding: var(--space-1) var(--space-3);
737 border-radius: var(--radius-full);
738 font-size: var(--text-xs);
739 font-weight: 500;
740 }
741 .sig-badge.verified {
742 background: var(--color-success-bg);
743 color: var(--color-success);
744 }
745 .sig-badge.unverified {
746 background: var(--color-danger-bg);
747 color: var(--color-danger);
748 }
749
750 /* --- Empty state --- */
751 .empty-state {
752 text-align: center;
753 padding: var(--space-16) var(--space-4);
754 color: var(--color-text-muted);
755 }
756 .empty-state p {
757 margin-bottom: var(--space-4);
758 font-size: var(--text-lg);
759 }
760
761 /* --- Breadcrumb --- */
762 .breadcrumb {
763 display: flex;
764 align-items: center;
765 flex-wrap: wrap;
766 gap: var(--space-1);
767 font-size: var(--text-sm);
768 margin-bottom: var(--space-4);
769 }
770 .breadcrumb a {
771 color: var(--color-link);
772 text-decoration: none;
773 }
774 .breadcrumb a:hover {
775 text-decoration: underline;
776 }
777 .breadcrumb-sep {
778 color: var(--color-text-muted);
779 }
780 .breadcrumb-current {
781 color: var(--color-text-muted);
782 }
783
784 /* --- File tree --- */
785 .file-tree {
786 width: 100%;
787 border: 1px solid var(--color-border);
788 border-radius: var(--radius-lg);
789 border-collapse: collapse;
790 overflow: hidden;
791 margin-bottom: var(--space-6);
792 }
793 .file-tree-row {
794 border-bottom: 1px solid var(--color-border-muted);
795 }
796 .file-tree-row:last-child {
797 border-bottom: none;
798 }
799 .file-tree-row:hover {
800 background: var(--color-bg-subtle);
801 }
802 .file-icon,
803 .file-name,
804 .file-size {
805 padding: var(--space-2) var(--space-3);
806 font-size: var(--text-sm);
807 vertical-align: middle;
808 }
809 .file-icon {
810 width: 36px;
811 padding-right: var(--space-1);
812 text-align: center;
813 line-height: 0;
814 }
815 .file-name {
816 width: 100%;
817 }
818 .file-name a {
819 color: var(--color-link);
820 text-decoration: none;
821 }
822 .file-name a:hover {
823 text-decoration: underline;
824 }
825 .file-name a.file-name-dir {
826 font-weight: 500;
827 }
828 .file-size {
829 text-align: right;
830 color: var(--color-text-muted);
831 font-size: var(--text-xs);
832 white-space: nowrap;
833 padding-right: var(--space-4);
834 }
835 .file-icon-dir {
836 color: var(--color-link);
837 }
838 .file-icon-file {
839 color: var(--color-text-muted);
840 }
841 .tree-icon {
842 display: inline-block;
843 vertical-align: text-bottom;
844 }
845 .file-tree-row-up .file-name a {
846 color: var(--color-text-muted);
847 }
848 .file-tree-row-up .file-name a:hover {
849 color: var(--color-link);
850 }
851
852 /* --- File blob --- */
853 .file-blob-header {
854 display: flex;
855 align-items: center;
856 justify-content: space-between;
857 padding: var(--space-3) var(--space-4);
858 background: var(--color-bg-subtle);
859 border: 1px solid var(--color-border);
860 border-radius: var(--radius-lg) var(--radius-lg) 0 0;
861 margin-top: var(--space-4);
862 }
863 .file-blob-name {
864 font-size: var(--text-sm);
865 font-weight: 500;
866 }
867 .file-blob-actions {
868 display: flex;
869 align-items: center;
870 gap: var(--space-2);
871 }
872 .file-blob-body {
873 border: 1px solid var(--color-border);
874 border-top: none;
875 border-radius: 0 0 var(--radius-lg) var(--radius-lg);
876 overflow: auto;
877 }
878 .file-edit-textarea {
879 display: block;
880 width: 100%;
881 box-sizing: border-box;
882 font-family: var(--font-mono);
883 font-size: var(--text-sm);
884 line-height: 1.6;
885 padding: var(--space-4);
886 background: var(--color-bg);
887 color: var(--color-text);
888 border: none;
889 resize: vertical;
890 min-height: 400px;
891 }
892 .file-edit-textarea:focus {
893 outline: 2px solid var(--color-accent);
894 outline-offset: -2px;
895 }
896 /* Blob line-number table */
897 .blob-table {
898 min-width: 100%;
899 border-collapse: collapse;
900 font-family: var(--font-mono);
901 font-size: var(--text-sm);
902 line-height: 1.6;
903 background-color: var(--shiki-light-bg, #fff);
904 color: var(--shiki-light, inherit);
905 }
906 .blob-ln {
907 width: 1%;
908 min-width: 48px;
909 text-align: right;
910 padding: 0 var(--space-3);
911 color: var(--color-text-muted);
912 border-right: 1px solid var(--color-border-muted);
913 user-select: none;
914 white-space: nowrap;
915 vertical-align: top;
916 }
917 .blob-ln a {
918 color: inherit;
919 text-decoration: none;
920 }
921 .blob-ln a:hover {
922 color: var(--color-link);
923 }
924 .blob-code {
925 padding: 0 var(--space-4);
926 white-space: pre;
927 overflow: visible;
928 vertical-align: top;
929 }
930 .blob-table tr:target {
931 background: color-mix(in srgb, #ddf4ff 60%, transparent);
932 }
933 .blob-table tr:target .blob-ln {
934 background: color-mix(in srgb, #ddf4ff 80%, transparent);
935 }
936 .file-download-notice {
937 padding: var(--space-8);
938 text-align: center;
939 color: var(--color-text-muted);
940 }
941 .file-download-notice p {
942 margin-bottom: var(--space-4);
943 }
944 .file-media {
945 padding: var(--space-4);
946 display: flex;
947 justify-content: center;
948 background: var(--color-canvas-subtle);
949 }
950 .file-media-img {
951 max-width: 100%;
952 height: auto;
953 display: block;
954 }
955 .file-media-audio {
956 width: 100%;
957 max-width: 600px;
958 }
959 .file-media-video {
960 max-width: 100%;
961 max-height: 80vh;
962 }
963
964 /* --- Commit list --- */
965 .commit-list {
966 display: flex;
967 flex-direction: column;
968 }
969 .commit-item {
970 display: flex;
971 flex-direction: column;
972 padding: var(--space-3) 0;
973 border-bottom: 1px solid var(--color-border-muted);
974 gap: var(--space-2);
975 }
976 .commit-item:last-child {
977 border-bottom: none;
978 }
979 .commit-subject {
980 color: var(--color-text);
981 text-decoration: none;
982 font-size: var(--text-sm);
983 font-weight: 500;
984 }
985 .commit-subject:hover {
986 color: var(--color-link);
987 }
988 .commit-meta {
989 display: flex;
990 align-items: center;
991 justify-content: space-between;
992 gap: var(--space-3);
993 font-size: var(--text-xs);
994 color: var(--color-text-muted);
995 }
996 .commit-meta-right {
997 display: flex;
998 align-items: center;
999 gap: var(--space-3);
1000 white-space: nowrap;
1001 }
1002 .commit-hash {
1003 font-family: var(--font-mono);
1004 color: var(--color-link);
1005 text-decoration: none;
1006 background: var(--color-bg-inset);
1007 padding: 1px var(--space-2);
1008 border-radius: var(--radius-sm);
1009 }
1010 .commit-hash:hover {
1011 text-decoration: underline;
1012 }
1013 .mono {
1014 font-family: var(--font-mono);
1015 }
1016
1017 /* --- Commit detail viewer --- */
1018 .commit-page-top {
1019 display: flex;
1020 align-items: center;
1021 justify-content: space-between;
1022 margin-bottom: var(--space-4);
1023 }
1024 .commit-card {
1025 border: 1px solid var(--color-border);
1026 border-radius: var(--radius-lg);
1027 margin-bottom: var(--space-4);
1028 overflow: hidden;
1029 }
1030 .commit-card-subject {
1031 font-size: var(--text-xl);
1032 font-weight: 600;
1033 padding: var(--space-5) var(--space-6);
1034 border-bottom: 1px solid var(--color-border);
1035 line-height: 1.3;
1036 }
1037 .commit-card-subject-empty {
1038 color: var(--color-text-muted);
1039 font-style: italic;
1040 font-weight: 400;
1041 font-size: var(--text-sm);
1042 }
1043 .commit-card-body {
1044 padding: var(--space-4) var(--space-6);
1045 font-family: inherit;
1046 font-size: var(--text-sm);
1047 color: var(--color-text-muted);
1048 border-bottom: 1px solid var(--color-border);
1049 overflow-x: auto;
1050 }
1051 .commit-card-meta {
1052 padding: var(--space-4) var(--space-6);
1053 display: flex;
1054 flex-direction: column;
1055 gap: var(--space-2);
1056 background: var(--color-bg-subtle);
1057 }
1058 .commit-card-meta-row {
1059 display: flex;
1060 align-items: baseline;
1061 gap: var(--space-3);
1062 font-size: var(--text-sm);
1063 flex-wrap: wrap;
1064 }
1065 .commit-meta-label {
1066 font-weight: 600;
1067 color: var(--color-text-muted);
1068 min-width: 5rem;
1069 font-size: var(--text-xs);
1070 text-transform: uppercase;
1071 letter-spacing: 0.04em;
1072 }
1073 .commit-sha-full {
1074 font-size: var(--text-xs);
1075 background: var(--color-bg-inset);
1076 padding: 2px var(--space-2);
1077 border-radius: var(--radius-sm);
1078 word-break: break-all;
1079 }
1080 .commit-stats-bar {
1081 font-size: var(--text-sm);
1082 color: var(--color-text-muted);
1083 margin-bottom: var(--space-4);
1084 }
1085
1086 /* --- Commit layout (sidebar + diffs) --- */
1087 .commit-layout {
1088 display: grid;
1089 grid-template-columns: 1fr;
1090 gap: var(--space-5);
1091 align-items: start;
1092 }
1093 .commit-diffs {
1094 min-width: 0;
1095 }
1096 @media (min-width: 900px) {
1097 .commit-layout {
1098 grid-template-columns: 220px 1fr;
1099 }
1100 .commit-layout:has(.file-nav-details:not([open])) {
1101 grid-template-columns: auto 1fr;
1102 }
1103 }
1104
1105 /* --- File nav sidebar --- */
1106 .commit-file-nav {
1107 position: sticky;
1108 top: calc(56px + var(--space-4));
1109 max-height: calc(100vh - 140px);
1110 overflow-y: auto;
1111 }
1112 .file-nav-details {
1113 border: 1px solid var(--color-border);
1114 border-radius: var(--radius-lg);
1115 background: var(--color-bg-subtle);
1116 overflow: hidden;
1117 }
1118 .file-nav-toggle {
1119 display: flex;
1120 align-items: center;
1121 gap: var(--space-2);
1122 padding: var(--space-3) var(--space-4);
1123 font-size: var(--text-sm);
1124 font-weight: 500;
1125 cursor: pointer;
1126 list-style: none;
1127 user-select: none;
1128 border-bottom: 1px solid var(--color-border);
1129 }
1130 .file-nav-toggle::-webkit-details-marker {
1131 display: none;
1132 }
1133 .file-nav-details:not([open]) .file-nav-toggle {
1134 border-bottom: none;
1135 }
1136 .file-nav-toggle-icon {
1137 font-size: 1em;
1138 transition: transform 0.15s;
1139 }
1140 .file-nav-details:not([open]) .file-nav-toggle-icon {
1141 transform: rotate(-90deg);
1142 }
1143 .file-nav-list {
1144 padding: var(--space-1) 0;
1145 list-style: none;
1146 }
1147 .file-nav-item {
1148 display: flex;
1149 align-items: center;
1150 gap: var(--space-2);
1151 padding: var(--space-1) var(--space-3);
1152 font-size: var(--text-xs);
1153 text-decoration: none;
1154 color: var(--color-text);
1155 border-radius: 0;
1156 overflow: hidden;
1157 }
1158 .file-nav-item:hover {
1159 background: var(--color-bg-inset);
1160 }
1161 .file-nav-status {
1162 flex-shrink: 0;
1163 width: 16px;
1164 height: 16px;
1165 display: inline-flex;
1166 align-items: center;
1167 justify-content: center;
1168 border-radius: var(--radius-sm);
1169 font-size: 9px;
1170 font-weight: 700;
1171 font-family: var(--font-mono);
1172 }
1173 .file-status-added {
1174 background: var(--color-success-bg);
1175 color: var(--color-success);
1176 }
1177 .file-status-deleted {
1178 background: var(--color-danger-bg);
1179 color: var(--color-danger);
1180 }
1181 .file-status-modified {
1182 background: var(--color-accent-bg);
1183 color: var(--color-accent);
1184 }
1185 .file-status-renamed {
1186 background: var(--color-merged-bg);
1187 color: var(--color-merged);
1188 }
1189 .file-status-copied {
1190 background: var(--color-merged-bg);
1191 color: var(--color-merged);
1192 }
1193 .file-nav-name {
1194 flex: 1;
1195 overflow: hidden;
1196 text-overflow: ellipsis;
1197 white-space: nowrap;
1198 font-family: var(--font-mono);
1199 }
1200 .file-nav-stat {
1201 flex-shrink: 0;
1202 display: flex;
1203 gap: var(--space-1);
1204 font-size: var(--text-xs);
1205 font-family: var(--font-mono);
1206 }
1207 .nav-add {
1208 color: var(--color-success);
1209 }
1210 .nav-del {
1211 color: var(--color-danger);
1212 }
1213 .nav-binary {
1214 color: var(--color-muted);
1215 font-size: var(--text-xs);
1216 }
1217 .file-nav-dir > details > .file-nav-list {
1218 padding-left: var(--space-4);
1219 }
1220 .file-nav-dir-toggle {
1221 display: flex;
1222 align-items: center;
1223 gap: var(--space-1);
1224 padding: var(--space-1) var(--space-3);
1225 font-size: var(--text-xs);
1226 font-family: var(--font-mono);
1227 color: var(--color-text-muted);
1228 cursor: pointer;
1229 list-style: none;
1230 user-select: none;
1231 }
1232 .file-nav-dir-toggle::-webkit-details-marker {
1233 display: none;
1234 }
1235 .file-nav-dir > details:not([open]) .file-nav-toggle-icon {
1236 transform: rotate(-90deg);
1237 }
1238
1239 /* --- Diff file cards --- */
1240 .diff-file {
1241 border: 1px solid var(--color-border);
1242 border-radius: var(--radius-lg);
1243 margin-bottom: var(--space-4);
1244 overflow: hidden;
1245 }
1246 .diff-file-header {
1247 display: flex;
1248 align-items: center;
1249 justify-content: space-between;
1250 gap: var(--space-3);
1251 padding: var(--space-3) var(--space-4);
1252 background: var(--color-bg-subtle);
1253 cursor: pointer;
1254 list-style: none;
1255 user-select: none;
1256 flex-wrap: wrap;
1257 }
1258 .diff-file-header::-webkit-details-marker {
1259 display: none;
1260 }
1261 .diff-file-header-left {
1262 display: flex;
1263 align-items: center;
1264 gap: var(--space-2);
1265 min-width: 0;
1266 flex: 1;
1267 }
1268 .diff-file-header-right {
1269 display: flex;
1270 align-items: center;
1271 gap: var(--space-2);
1272 flex-shrink: 0;
1273 flex-wrap: wrap;
1274 }
1275 .diff-file-toggle-icon {
1276 font-size: 0.7em;
1277 flex-shrink: 0;
1278 transition: transform 0.15s;
1279 }
1280 .diff-file:not([open]) .diff-file-toggle-icon {
1281 transform: rotate(-90deg);
1282 }
1283 .diff-status-badge {
1284 flex-shrink: 0;
1285 width: 18px;
1286 height: 18px;
1287 display: inline-flex;
1288 align-items: center;
1289 justify-content: center;
1290 border-radius: var(--radius-sm);
1291 font-size: 10px;
1292 font-weight: 700;
1293 font-family: var(--font-mono);
1294 }
1295 .diff-status-added {
1296 background: var(--color-success-bg);
1297 color: var(--color-success);
1298 }
1299 .diff-status-deleted {
1300 background: var(--color-danger-bg);
1301 color: var(--color-danger);
1302 }
1303 .diff-status-modified {
1304 background: var(--color-accent-bg);
1305 color: var(--color-accent);
1306 }
1307 .diff-status-renamed {
1308 background: var(--color-merged-bg);
1309 color: var(--color-merged);
1310 }
1311 .diff-status-copied {
1312 background: var(--color-merged-bg);
1313 color: var(--color-merged);
1314 }
1315 .diff-file-path {
1316 font-size: var(--text-sm);
1317 font-weight: 500;
1318 overflow: hidden;
1319 text-overflow: ellipsis;
1320 white-space: nowrap;
1321 }
1322 .diff-rename-arrow {
1323 font-size: var(--text-xs);
1324 color: var(--color-text-muted);
1325 white-space: nowrap;
1326 overflow: hidden;
1327 text-overflow: ellipsis;
1328 }
1329 .diff-stat-add {
1330 color: var(--color-success);
1331 font-size: var(--text-sm);
1332 font-family: var(--font-mono);
1333 font-weight: 600;
1334 }
1335 .diff-stat-del {
1336 color: var(--color-danger);
1337 font-size: var(--text-sm);
1338 font-family: var(--font-mono);
1339 font-weight: 600;
1340 }
1341 .diff-stat-binary {
1342 color: var(--color-muted);
1343 font-size: var(--text-sm);
1344 font-family: var(--font-mono);
1345 }
1346 .btn-xs {
1347 padding: 1px var(--space-2);
1348 font-size: var(--text-xs);
1349 border: 1px solid var(--color-border);
1350 border-radius: var(--radius-sm);
1351 background: var(--color-bg);
1352 color: var(--color-text);
1353 text-decoration: none;
1354 cursor: pointer;
1355 white-space: nowrap;
1356 font-family: var(--font-mono);
1357 display: inline-flex;
1358 align-items: center;
1359 transition: background 0.1s;
1360 }
1361 .btn-xs:hover {
1362 background: var(--color-bg-inset);
1363 }
1364
1365 /* --- Diff file body --- */
1366 .diff-binary-notice {
1367 padding: var(--space-4) var(--space-6);
1368 font-size: var(--text-sm);
1369 color: var(--color-text-muted);
1370 font-style: italic;
1371 }
1372 .diff-hunk {
1373 border-top: 1px solid var(--color-border-muted);
1374 overflow-x: auto;
1375 }
1376 .diff-hunk:first-child {
1377 border-top: none;
1378 }
1379 .diff-hunk-header {
1380 padding: var(--space-1) var(--space-4);
1381 font-family: var(--font-mono);
1382 font-size: var(--text-xs);
1383 font-weight: normal;
1384 text-align: left;
1385 background: color-mix(
1386 in srgb,
1387 var(--color-merged-bg) 50%,
1388 var(--color-bg)
1389 );
1390 color: var(--color-merged);
1391 border-bottom: 1px solid var(--color-border-muted);
1392 white-space: pre;
1393 }
1394
1395 /* --- Diff table --- */
1396 .diff-table {
1397 min-width: 100%;
1398 border-collapse: collapse;
1399 font-family: var(--font-mono);
1400 font-size: var(--text-xs);
1401 line-height: 1.5;
1402 }
1403 .diff-ln {
1404 width: 44px;
1405 min-width: 44px;
1406 text-align: right;
1407 padding: 0 var(--space-2);
1408 color: var(--color-text-muted);
1409 border-right: 1px solid var(--color-border-muted);
1410 user-select: none;
1411 vertical-align: top;
1412 white-space: nowrap;
1413 }
1414 .diff-sign {
1415 width: 18px;
1416 min-width: 18px;
1417 text-align: center;
1418 padding: 0 var(--space-1);
1419 user-select: none;
1420 vertical-align: top;
1421 }
1422 .diff-code {
1423 padding: 0 var(--space-3);
1424 white-space: pre;
1425 overflow: visible;
1426 vertical-align: top;
1427 word-break: normal;
1428 }
1429 /* Row type backgrounds */
1430 .diff-row-add {
1431 background: color-mix(
1432 in srgb,
1433 var(--color-success-bg) 70%,
1434 transparent
1435 );
1436 }
1437 .diff-row-del {
1438 background: color-mix(in srgb, var(--color-danger-bg) 70%, transparent);
1439 }
1440 .diff-row-add .diff-ln,
1441 .diff-row-add .diff-sign {
1442 background: color-mix(
1443 in srgb,
1444 var(--color-success-bg) 90%,
1445 transparent
1446 );
1447 }
1448 .diff-row-del .diff-ln,
1449 .diff-row-del .diff-sign {
1450 background: color-mix(in srgb, var(--color-danger-bg) 90%, transparent);
1451 }
1452 .diff-row-add .diff-sign {
1453 color: var(--color-success);
1454 font-weight: 700;
1455 }
1456 .diff-row-del .diff-sign {
1457 color: var(--color-danger);
1458 font-weight: 700;
1459 }
1460
1461 .diff-ctrl {
1462 color: #f0f0f0;
1463 background: #c0392b;
1464 border-radius: 2px;
1465 font-weight: bold;
1466 padding: 0 1px;
1467 }
1468
1469 /* Shiki dark-mode support in diff code cells */
1470 @media (prefers-color-scheme: dark) {
1471 .diff-code span[style] {
1472 /* biome-ignore lint/complexity/noImportantStyles: required to override shiki inline styles */
1473 color: var(--shiki-dark) !important;
1474 }
1475 }
1476
1477 /* Shiki dark-mode support in file blob view */
1478 @media (prefers-color-scheme: dark) {
1479 .blob-table {
1480 background-color: var(--shiki-dark-bg);
1481 color: var(--shiki-dark);
1482 }
1483 .blob-table span[style] {
1484 /* biome-ignore lint/complexity/noImportantStyles: required to override shiki inline styles */
1485 color: var(--shiki-dark) !important;
1486 }
1487 .blob-table tr:target {
1488 background: color-mix(in srgb, #1c3a52 60%, transparent);
1489 }
1490 .blob-table tr:target .blob-ln {
1491 background: color-mix(in srgb, #1c3a52 80%, transparent);
1492 }
1493 }
1494 :root[data-theme="dark"] .blob-table {
1495 background-color: var(--shiki-dark-bg);
1496 color: var(--shiki-dark);
1497 }
1498 :root[data-theme="dark"] .blob-table span[style] {
1499 /* biome-ignore lint/complexity/noImportantStyles: required to override shiki inline styles */
1500 color: var(--shiki-dark) !important;
1501 }
1502
1503 /* --- Issue / Patch list --- */
1504 .list-header {
1505 display: flex;
1506 align-items: center;
1507 justify-content: space-between;
1508 padding: var(--space-3) var(--space-4);
1509 background: var(--color-bg-subtle);
1510 border: 1px solid var(--color-border);
1511 border-radius: var(--radius-lg) var(--radius-lg) 0 0;
1512 gap: var(--space-4);
1513 }
1514 .list-header-tabs {
1515 display: flex;
1516 gap: var(--space-2);
1517 }
1518 .list-tab {
1519 padding: var(--space-1) var(--space-3);
1520 border-radius: var(--radius-md);
1521 font-size: var(--text-sm);
1522 text-decoration: none;
1523 color: var(--color-text-muted);
1524 }
1525 .list-tab:hover {
1526 background: var(--color-bg-inset);
1527 color: var(--color-text);
1528 }
1529 .list-tab.active {
1530 background: var(--color-bg-inset);
1531 color: var(--color-text);
1532 font-weight: 600;
1533 }
1534 .issue-list {
1535 border: 1px solid var(--color-border);
1536 border-top: none;
1537 border-radius: 0 0 var(--radius-lg) var(--radius-lg);
1538 }
1539 .issue-item {
1540 padding: var(--space-4) var(--space-4);
1541 border-bottom: 1px solid var(--color-border-muted);
1542 }
1543 .issue-item:last-child {
1544 border-bottom: none;
1545 }
1546 .issue-main {
1547 display: flex;
1548 align-items: center;
1549 gap: var(--space-2);
1550 margin-bottom: var(--space-1);
1551 flex-wrap: wrap;
1552 }
1553 .issue-title {
1554 font-weight: 500;
1555 text-decoration: none;
1556 color: var(--color-text);
1557 flex: 1;
1558 }
1559 .issue-title:hover {
1560 color: var(--color-link);
1561 }
1562 .issue-meta {
1563 font-size: var(--text-xs);
1564 color: var(--color-text-muted);
1565 display: flex;
1566 gap: var(--space-3);
1567 }
1568 .issue-status-dot,
1569 .patch-status-dot {
1570 width: 8px;
1571 height: 8px;
1572 border-radius: 50%;
1573 flex-shrink: 0;
1574 }
1575 .issue-status-dot.open,
1576 .patch-status-dot.open {
1577 background: var(--color-success);
1578 }
1579 .issue-status-dot.closed,
1580 .patch-status-dot.closed {
1581 background: var(--color-danger);
1582 }
1583 .issue-status-dot.completed {
1584 background: var(--color-merged);
1585 }
1586 .patch-status-dot.merged {
1587 background: var(--color-merged);
1588 }
1589
1590 /* --- Issue detail / Timeline --- */
1591 .issue-detail-header {
1592 display: flex;
1593 align-items: center;
1594 flex-wrap: wrap;
1595 gap: var(--space-3);
1596 margin-bottom: var(--space-4);
1597 }
1598 .issue-number {
1599 font-size: var(--text-2xl);
1600 font-weight: 600;
1601 color: var(--color-text-muted);
1602 white-space: nowrap;
1603 }
1604 .issue-detail-title {
1605 font-size: var(--text-2xl);
1606 font-weight: 600;
1607 overflow-wrap: anywhere;
1608 }
1609 .issue-detail-meta-actions {
1610 margin-left: auto;
1611 display: flex;
1612 gap: var(--space-2);
1613 flex-shrink: 0;
1614 }
1615 .patch-author-meta {
1616 display: flex;
1617 align-items: center;
1618 gap: var(--space-2);
1619 font-size: var(--text-xs);
1620 margin-top: calc(-1 * var(--space-4));
1621 margin-bottom: var(--space-6);
1622 }
1623 .patch-author-label {
1624 color: var(--color-text-muted);
1625 }
1626 .patch-author-identity {
1627 font-family: monospace;
1628 }
1629 .timeline-item {
1630 border: 1px solid var(--color-border);
1631 border-radius: var(--radius-lg);
1632 margin-bottom: var(--space-4);
1633 overflow: hidden;
1634 }
1635 .timeline-author {
1636 background: var(--color-bg-subtle);
1637 padding: var(--space-3) var(--space-4);
1638 font-size: var(--text-sm);
1639 display: flex;
1640 align-items: center;
1641 justify-content: space-between;
1642 gap: var(--space-3);
1643 border-bottom: 1px solid var(--color-border);
1644 overflow-wrap: anywhere;
1645 }
1646 .timeline-author time {
1647 color: var(--color-text-muted);
1648 font-size: var(--text-xs);
1649 width: max-content;
1650 }
1651 .timeline-author-right {
1652 margin-left: auto;
1653 display: flex;
1654 align-items: center;
1655 gap: var(--space-2);
1656 }
1657 .edited-indicator {
1658 color: var(--color-text-muted);
1659 font-size: var(--text-xs);
1660 cursor: default;
1661 }
1662
1663 /* --- Avatars --- */
1664 .avatar {
1665 display: inline-flex;
1666 border-radius: 4px;
1667 overflow: hidden;
1668 flex-shrink: 0;
1669 vertical-align: middle;
1670 }
1671 .avatar-img {
1672 width: 100%;
1673 height: 100%;
1674 object-fit: cover;
1675 display: block;
1676 color: transparent;
1677 }
1678 .avatar-placeholder {
1679 display: inline-flex;
1680 align-items: center;
1681 justify-content: center;
1682 border-radius: 4px;
1683 background: var(--color-bg-inset);
1684 color: var(--color-text-muted);
1685 font-weight: 600;
1686 flex-shrink: 0;
1687 vertical-align: middle;
1688 }
1689 .avatar-settings {
1690 display: flex;
1691 align-items: flex-start;
1692 gap: var(--space-5);
1693 }
1694 .avatar-actions {
1695 display: flex;
1696 flex-direction: column;
1697 gap: var(--space-3);
1698 }
1699 .nav-user {
1700 display: inline-flex;
1701 align-items: center;
1702 gap: var(--space-2);
1703 }
1704 .timeline-body {
1705 padding: var(--space-4);
1706 }
1707 .timeline-item-new {
1708 padding: var(--space-4);
1709 }
1710 .timeline-item-new .section-title {
1711 font-size: var(--text-base);
1712 border: none;
1713 padding-bottom: 0;
1714 }
1715 /* Edit <details> (summary only) in .timeline-author; form is a sibling shown via :has() */
1716 .timeline-author-right .inline-edit-details {
1717 border: none;
1718 }
1719 .timeline-author-right .inline-edit-details > summary {
1720 list-style: none;
1721 }
1722 .timeline-author-right
1723 .inline-edit-details
1724 > summary::-webkit-details-marker {
1725 display: none;
1726 }
1727 .inline-edit-details .when-open {
1728 display: none;
1729 }
1730 .inline-edit-details[open] .when-closed {
1731 display: none;
1732 }
1733 .inline-edit-details[open] .when-open {
1734 display: inline;
1735 }
1736 .inline-edit-form-area {
1737 display: none;
1738 border-top: 1px solid var(--color-border-muted);
1739 }
1740 .timeline-item:has(.inline-edit-details[open]) .inline-edit-form-area {
1741 display: block;
1742 }
1743 .timeline-item:has(.inline-edit-details[open]) .timeline-body {
1744 display: none;
1745 }
1746
1747 /* Title edit in issue/patch header */
1748 .issue-detail-header {
1749 align-items: flex-start;
1750 }
1751 .title-with-edit {
1752 flex: 1;
1753 min-width: 16rem;
1754 display: flex;
1755 flex-direction: column;
1756 gap: var(--space-1);
1757 }
1758 .title-edit-details {
1759 border: none;
1760 align-self: flex-start;
1761 }
1762 .title-with-edit:has(.title-edit-details[open]) .issue-detail-title {
1763 display: none;
1764 }
1765 .title-with-edit:has(.title-edit-details[open]) > .title-edit-details {
1766 display: none;
1767 }
1768 .title-edit-details > summary {
1769 list-style: none;
1770 }
1771 .title-edit-details > summary::-webkit-details-marker {
1772 display: none;
1773 }
1774 .title-edit-form-area {
1775 display: none;
1776 }
1777 .title-with-edit:has(.title-edit-details[open]) .title-edit-form-area {
1778 display: flex;
1779 flex: 1;
1780 min-width: 0;
1781 }
1782 .title-edit-form {
1783 display: flex;
1784 flex-direction: column;
1785 gap: var(--space-2);
1786 flex: 1;
1787 min-width: 0;
1788 }
1789 .title-edit-form .form-input {
1790 min-width: 0;
1791 width: 100%;
1792 padding: var(--space-2) var(--space-3);
1793 border: 1px solid var(--color-border);
1794 border-radius: var(--radius-md);
1795 background: var(--color-bg);
1796 color: var(--color-text);
1797 font-size: var(--text-sm);
1798 }
1799 .title-edit-form .form-input:focus {
1800 outline: 2px solid var(--color-accent);
1801 outline-offset: -1px;
1802 border-color: var(--color-accent);
1803 }
1804 .title-edit-actions {
1805 display: flex;
1806 gap: var(--space-2);
1807 }
1808
1809 .inline-edit-form {
1810 padding: var(--space-4);
1811 display: flex;
1812 flex-direction: column;
1813 gap: var(--space-3);
1814 }
1815
1816 /* --- Reactions --- */
1817 .reaction-bar {
1818 display: flex;
1819 flex-wrap: wrap;
1820 gap: var(--space-2);
1821 padding: var(--space-2) var(--space-4);
1822 border-top: 1px solid var(--color-border-muted);
1823 }
1824 .reaction-form {
1825 display: inline;
1826 }
1827 .reaction-btn {
1828 display: inline-flex;
1829 align-items: center;
1830 gap: var(--space-1);
1831 padding: var(--space-1) var(--space-3);
1832 border: 1px solid var(--color-border);
1833 border-radius: var(--radius-full);
1834 background: var(--color-bg-subtle);
1835 color: var(--color-text);
1836 font-size: var(--text-sm);
1837 cursor: pointer;
1838 transition: background 0.1s;
1839 }
1840 .reaction-btn:hover {
1841 background: var(--color-bg-inset);
1842 }
1843 .reaction-btn.reacted {
1844 background: var(--color-accent-bg);
1845 border-color: var(--color-accent);
1846 }
1847 .reaction-picker {
1848 position: relative;
1849 }
1850 .reaction-add-btn {
1851 display: inline-flex;
1852 align-items: center;
1853 justify-content: center;
1854 width: 28px;
1855 height: 28px;
1856 border: 1px dashed var(--color-border);
1857 border-radius: var(--radius-full);
1858 background: transparent;
1859 cursor: pointer;
1860 font-size: var(--text-base);
1861 color: var(--color-text-muted);
1862 list-style: none;
1863 }
1864 .reaction-add-btn::-webkit-details-marker {
1865 display: none;
1866 }
1867 .reaction-picker-dropdown {
1868 position: absolute;
1869 bottom: calc(100% + var(--space-2));
1870 left: 0;
1871 background: var(--color-bg);
1872 border: 1px solid var(--color-border);
1873 border-radius: var(--radius-lg);
1874 padding: var(--space-2);
1875 display: flex;
1876 gap: var(--space-1);
1877 z-index: 10;
1878 }
1879 .reaction-picker-btn {
1880 background: none;
1881 border: none;
1882 font-size: 1.25rem;
1883 cursor: pointer;
1884 padding: var(--space-1);
1885 border-radius: var(--radius-sm);
1886 }
1887 .reaction-picker-btn:hover {
1888 background: var(--color-bg-inset);
1889 }
1890
1891 /* --- Patch subview tabs --- */
1892 .patch-tab-nav {
1893 display: flex;
1894 border-bottom: 1px solid var(--color-border);
1895 margin-bottom: var(--space-6);
1896 }
1897 .tab-count {
1898 display: inline-flex;
1899 align-items: center;
1900 justify-content: center;
1901 min-width: 1.4em;
1902 padding: 0 var(--space-1);
1903 margin-left: var(--space-1);
1904 font-size: var(--text-xs);
1905 font-weight: 500;
1906 background: var(--color-bg-inset);
1907 border-radius: 999px;
1908 color: var(--color-text-muted);
1909 }
1910
1911 /* --- Patch apply status --- */
1912 .apply-status {
1913 margin: var(--space-4) 0;
1914 }
1915 .apply-result {
1916 display: flex;
1917 align-items: flex-start;
1918 gap: var(--space-2);
1919 padding: var(--space-3) var(--space-4);
1920 border-radius: var(--radius-md);
1921 font-size: var(--text-sm);
1922 flex-direction: column;
1923 }
1924 .apply-result > div {
1925 display: flex;
1926 gap: var(--space-2);
1927 align-items: center;
1928 }
1929 .apply-clean {
1930 background: var(--color-success-bg);
1931 color: var(--color-success);
1932 border: 1px solid var(--color-success);
1933 }
1934 .apply-conflict {
1935 background: var(--color-danger-bg);
1936 color: var(--color-danger);
1937 border: 1px solid var(--color-danger);
1938 }
1939 .apply-checking,
1940 .apply-unknown {
1941 color: var(--color-text-muted);
1942 font-style: italic;
1943 font-size: var(--text-sm);
1944 }
1945 .apply-output {
1946 font-family: var(--font-mono);
1947 font-size: var(--text-xs);
1948 white-space: pre-wrap;
1949 margin-top: var(--space-2);
1950 padding: var(--space-2);
1951 background: rgba(0, 0, 0, 0.05);
1952 border-radius: var(--radius-sm);
1953 width: 100%;
1954 }
1955 .patch-actions {
1956 display: flex;
1957 gap: var(--space-3);
1958 margin: var(--space-4) 0;
1959 flex-wrap: wrap;
1960 }
1961 .patch-card-title-row {
1962 display: flex;
1963 align-items: flex-start;
1964 gap: var(--space-3);
1965 justify-content: space-between;
1966 margin-bottom: var(--space-3);
1967 }
1968 .patch-card-title-row .commit-card-subject {
1969 margin-bottom: 0;
1970 }
1971 .patch-card-description {
1972 margin-top: var(--space-4);
1973 padding-top: var(--space-4);
1974 border-top: 1px solid var(--color-border-muted);
1975 }
1976
1977 /* --- Repo home layout --- */
1978 .repo-home-layout {
1979 display: grid;
1980 gap: var(--space-8);
1981 }
1982 @media (min-width: 768px) {
1983 .repo-home-layout {
1984 grid-template-columns: 1fr 1fr;
1985 }
1986 }
1987 .readme-section {
1988 border: 1px solid var(--color-border);
1989 border-radius: var(--radius-lg);
1990 overflow: hidden;
1991 }
1992 .readme-header {
1993 background: var(--color-bg-subtle);
1994 padding: var(--space-3) var(--space-4);
1995 font-size: var(--text-sm);
1996 font-weight: 500;
1997 border-bottom: 1px solid var(--color-border);
1998 display: flex;
1999 align-items: center;
2000 justify-content: space-between;
2001 }
2002 /* --- Code setup block --- */
2003 .code-setup {
2004 background: var(--color-bg-subtle);
2005 border: 1px solid var(--color-border);
2006 border-radius: var(--radius-lg);
2007 padding: var(--space-4);
2008 font-size: var(--text-sm);
2009 margin-top: var(--space-4);
2010 overflow: auto;
2011 text-align: left;
2012 }
2013 .code-plain {
2014 background: var(--color-bg-subtle);
2015 padding: var(--space-4);
2016 overflow: auto;
2017 font-size: var(--text-sm);
2018 line-height: 1.6;
2019 }
2020
2021 /* --- Markdown body --- */
2022 .markdown-body {
2023 font-size: var(--text-sm);
2024 line-height: 1.6;
2025 color: var(--color-text);
2026 }
2027 .markdown-body h1,
2028 .markdown-body h2,
2029 .markdown-body h3,
2030 .markdown-body h4,
2031 .markdown-body h5,
2032 .markdown-body h6 {
2033 margin-top: var(--space-6);
2034 margin-bottom: var(--space-3);
2035 }
2036 .markdown-body p {
2037 margin-bottom: var(--space-4);
2038 }
2039 .markdown-body a {
2040 color: var(--color-link);
2041 }
2042 .markdown-body code {
2043 background: var(--color-bg-inset);
2044 padding: 0.1em 0.3em;
2045 border-radius: var(--radius-sm);
2046 font-size: 0.9em;
2047 }
2048 .markdown-body pre {
2049 background: var(--color-bg-subtle);
2050 border: 1px solid var(--color-border);
2051 border-radius: var(--radius-md);
2052 padding: var(--space-4);
2053 overflow: auto;
2054 margin-bottom: var(--space-4);
2055 }
2056 .markdown-body pre code {
2057 background: none;
2058 padding: 0;
2059 }
2060 .markdown-body ul,
2061 .markdown-body ol {
2062 padding-left: var(--space-6);
2063 margin-bottom: var(--space-4);
2064 }
2065 .markdown-body ul {
2066 list-style: disc;
2067 }
2068 .markdown-body ol {
2069 list-style: decimal;
2070 }
2071 .markdown-body li {
2072 margin-bottom: var(--space-1);
2073 }
2074 .markdown-body blockquote {
2075 border-left: 3px solid var(--color-border);
2076 padding-left: var(--space-4);
2077 color: var(--color-text-muted);
2078 margin: var(--space-4) 0;
2079 }
2080 .markdown-body table {
2081 width: 100%;
2082 border-collapse: collapse;
2083 margin-bottom: var(--space-4);
2084 }
2085 .markdown-body th,
2086 .markdown-body td {
2087 padding: var(--space-2) var(--space-3);
2088 border: 1px solid var(--color-border);
2089 }
2090 .markdown-body th {
2091 background: var(--color-bg-subtle);
2092 font-weight: 600;
2093 }
2094 .markdown-body hr {
2095 border: none;
2096 border-top: 1px solid var(--color-border);
2097 margin: var(--space-6) 0;
2098 }
2099 .markdown-body img {
2100 max-width: 100%;
2101 border-radius: var(--radius-md);
2102 }
2103 .markdown-body details {
2104 margin-bottom: var(--space-4);
2105 }
2106 .markdown-body summary {
2107 cursor: pointer;
2108 font-weight: 500;
2109 }
2110 .readme-section .markdown-body,
2111 .file-blob-body .markdown-body {
2112 padding: var(--space-4);
2113 }
2114
2115 /* --- Search row (search form + sort select) --- */
2116 .search-row {
2117 display: flex;
2118 align-items: center;
2119 gap: var(--space-3);
2120 margin-bottom: var(--space-5);
2121 }
2122 .search-form {
2123 flex: 1;
2124 }
2125 .repo-sort-select {
2126 padding: var(--space-1) var(--space-2);
2127 padding-right: var(--space-5);
2128 border: 1px solid var(--color-border);
2129 border-radius: var(--radius-md);
2130 background: var(--color-bg-subtle);
2131 font-size: var(--text-sm);
2132 color: var(--color-text);
2133 cursor: pointer;
2134 appearance: auto;
2135 }
2136 .repo-sort-select:hover {
2137 border-color: var(--color-text-muted);
2138 }
2139 .repo-sort-select:focus {
2140 outline: 2px solid var(--color-accent);
2141 outline-offset: -1px;
2142 }
2143 .search-input-wrap {
2144 display: flex;
2145 gap: var(--space-2);
2146 }
2147 .search-input {
2148 flex: 1;
2149 padding: var(--space-2) var(--space-3);
2150 border: 1px solid var(--color-border);
2151 border-radius: var(--radius-md);
2152 background: var(--color-bg);
2153 color: var(--color-text);
2154 font-size: var(--text-sm);
2155 }
2156 .search-input:focus {
2157 outline: 2px solid var(--color-accent);
2158 outline-offset: -1px;
2159 border-color: var(--color-accent);
2160 }
2161
2162 /* --- Issue close bar --- */
2163 .issue-close-bar {
2164 display: flex;
2165 justify-content: flex-end;
2166 padding: var(--space-3) 0;
2167 border-top: 1px solid var(--color-border-muted);
2168 margin-top: var(--space-2);
2169 }
2170
2171 /* --- Auth divider --- */
2172 .auth-divider {
2173 display: flex;
2174 align-items: center;
2175 gap: var(--space-3);
2176 margin: var(--space-4) 0;
2177 color: var(--color-text-muted);
2178 font-size: var(--text-sm);
2179 }
2180 .auth-divider::before,
2181 .auth-divider::after {
2182 content: "";
2183 flex: 1;
2184 height: 1px;
2185 background: var(--color-border);
2186 }
2187
2188 /* --- Passkey UI in settings --- */
2189 .passkey-actions {
2190 display: flex;
2191 flex-direction: column;
2192 gap: var(--space-3);
2193 align-items: flex-start;
2194 margin-top: var(--space-3);
2195 }
2196 .passkey-status {
2197 font-size: var(--text-sm);
2198 }
2199
2200 /* --- Danger zone --- */
2201 .danger-zone {
2202 margin-top: var(--space-8);
2203 }
2204 .danger-title {
2205 color: var(--color-danger);
2206 border-bottom-color: var(--color-danger);
2207 }
2208 .danger-card {
2209 border-color: var(--color-danger);
2210 background: var(--color-danger-bg);
2211 }
2212 .danger-item {
2213 display: flex;
2214 align-items: center;
2215 justify-content: space-between;
2216 gap: var(--space-4);
2217 flex-wrap: wrap;
2218 }
2219 .danger-item p {
2220 margin: var(--space-1) 0 0;
2221 }
2222 .btn-danger {
2223 background: var(--color-danger);
2224 border-color: transparent;
2225 color: #fff;
2226 }
2227 .btn-danger:hover {
2228 background: color-mix(in srgb, var(--color-danger) 85%, #000);
2229 }
2230
2231 /* --- Release list items --- */
2232 .release-item-header {
2233 display: flex;
2234 gap: var(--space-3);
2235 align-items: flex-start;
2236 }
2237 .release-item-main {
2238 flex: 1;
2239 min-width: 0;
2240 }
2241 .release-item-title {
2242 font-size: var(--text-lg);
2243 font-weight: 700;
2244 text-decoration: none;
2245 color: var(--color-text);
2246 display: block;
2247 margin-bottom: var(--space-1);
2248 }
2249 .release-item-title:hover {
2250 color: var(--color-link);
2251 }
2252 .release-item-meta {
2253 display: flex;
2254 flex-wrap: wrap;
2255 gap: var(--space-3);
2256 align-items: center;
2257 font-size: var(--text-xs);
2258 color: var(--color-text-muted);
2259 }
2260 .release-item-date {
2261 display: flex;
2262 flex-direction: column;
2263 align-items: flex-end;
2264 gap: var(--space-2);
2265 font-size: var(--text-xs);
2266 color: var(--color-text-muted);
2267 white-space: nowrap;
2268 flex-shrink: 0;
2269 }
2270
2271 /* --- Release notes preview in list --- */
2272 .release-notes-section {
2273 margin-top: var(--space-3);
2274 }
2275 .release-notes-label {
2276 font-size: var(--text-xs);
2277 font-weight: 600;
2278 color: var(--color-text-muted);
2279 text-transform: uppercase;
2280 letter-spacing: 0.05em;
2281 margin-bottom: var(--space-2);
2282 }
2283 .notes-expand > summary {
2284 list-style: none;
2285 cursor: pointer;
2286 outline: none;
2287 }
2288 .notes-expand > summary::-webkit-details-marker {
2289 display: none;
2290 }
2291 .notes-preview {
2292 max-height: calc(5 * 1.6em);
2293 overflow: hidden;
2294 position: relative;
2295 white-space: pre-wrap;
2296 font-size: var(--text-sm);
2297 color: var(--color-text);
2298 line-height: 1.6;
2299 word-break: break-word;
2300 margin-bottom: var(--space-1);
2301 }
2302 .notes-preview::after {
2303 content: "";
2304 position: absolute;
2305 bottom: 0;
2306 left: 0;
2307 right: 0;
2308 height: 2.5em;
2309 background: linear-gradient(transparent, var(--color-bg));
2310 pointer-events: none;
2311 }
2312 .notes-expand[open] .notes-preview {
2313 display: none;
2314 }
2315 .notes-full {
2316 padding-top: var(--space-3);
2317 padding-bottom: var(--space-1);
2318 }
2319 .notes-expand[open] {
2320 display: flex;
2321 flex-direction: column;
2322 }
2323 .notes-expand[open] > summary {
2324 order: 1;
2325 }
2326 .notes-expand[open] > .notes-full {
2327 order: 0;
2328 }
2329 .notes-toggle-label {
2330 display: inline-block;
2331 font-size: var(--text-xs);
2332 color: var(--color-link);
2333 margin-top: var(--space-1);
2334 }
2335 .notes-toggle-label:hover {
2336 text-decoration: underline;
2337 }
2338 .notes-toggle-label::before {
2339 content: "Show more ↓";
2340 }
2341 .notes-expand[open] .notes-toggle-label::before {
2342 content: "Show less ↑";
2343 }
2344
2345 /* --- Release detail --- */
2346 .release-detail {
2347 padding: var(--space-6) 0;
2348 }
2349 .release-header {
2350 margin-bottom: var(--space-6);
2351 }
2352 .release-notes {
2353 margin-bottom: var(--space-6);
2354 }
2355 .release-assets {
2356 margin-bottom: var(--space-6);
2357 }
2358 .release-assets-heading {
2359 font-size: var(--text-base);
2360 font-weight: 600;
2361 margin-bottom: var(--space-3);
2362 }
2363 .asset-list {
2364 border: 1px solid var(--color-border);
2365 border-radius: var(--radius-lg);
2366 overflow: hidden;
2367 }
2368 .asset-item {
2369 display: flex;
2370 align-items: center;
2371 gap: var(--space-4);
2372 padding: var(--space-3) var(--space-4);
2373 border-bottom: 1px solid var(--color-border-muted);
2374 font-size: var(--text-sm);
2375 }
2376 .asset-item:last-child {
2377 border-bottom: none;
2378 }
2379 .asset-name {
2380 flex: 1;
2381 color: var(--color-link);
2382 text-decoration: none;
2383 font-family: var(--font-mono);
2384 font-size: var(--text-xs);
2385 }
2386 .asset-name:hover {
2387 text-decoration: underline;
2388 }
2389 .asset-name-pending {
2390 color: var(--color-text-muted);
2391 cursor: default;
2392 }
2393 .asset-item-pending {
2394 opacity: 0.6;
2395 }
2396 .asset-size,
2397 .asset-meta {
2398 color: var(--color-text-muted);
2399 font-size: var(--text-xs);
2400 white-space: nowrap;
2401 }
2402 .release-back {
2403 margin-top: var(--space-4);
2404 display: flex;
2405 gap: var(--space-3);
2406 align-items: center;
2407 justify-content: space-between;
2408 }
2409}
2410
2411/* ============================================================
2412 @layer utilities
2413 ============================================================ */
2414@layer utilities {
2415 .text-muted {
2416 color: var(--color-text-muted);
2417 }
2418 .text-sm {
2419 font-size: var(--text-sm);
2420 }
2421 .text-xs {
2422 font-size: var(--text-xs);
2423 }
2424 .font-mono {
2425 font-family: var(--font-mono);
2426 }
2427 .mt-1 {
2428 margin-top: var(--space-1);
2429 }
2430 .mt-2 {
2431 margin-top: var(--space-2);
2432 }
2433 .mt-4 {
2434 margin-top: var(--space-4);
2435 }
2436 .mt-6 {
2437 margin-top: var(--space-6);
2438 }
2439 .mb-4 {
2440 margin-bottom: var(--space-4);
2441 }
2442 .flex {
2443 display: flex;
2444 }
2445 .gap-2 {
2446 gap: var(--space-2);
2447 }
2448 .gap-4 {
2449 gap: var(--space-4);
2450 }
2451 .items-center {
2452 align-items: center;
2453 }
2454 .justify-between {
2455 justify-content: space-between;
2456 }
2457 .hidden {
2458 display: none;
2459 }
2460}
2461
2462/* ============================================================
2463 Pagination
2464 ============================================================ */
2465.commit-verify-hint {
2466 margin-bottom: var(--space-4);
2467 font-size: var(--text-xs);
2468 color: var(--color-text-muted);
2469}
2470.commit-verify-hint code {
2471 word-break: break-all;
2472}
2473.commit-cursor-nav {
2474 display: flex;
2475 justify-content: space-between;
2476 border-top: 1px solid var(--color-border);
2477 margin-top: var(--space-2);
2478 padding: var(--space-4) 0 var(--space-2);
2479}
2480
2481.commit-cursor-prev {
2482 flex: 1;
2483}
2484.commit-cursor-next {
2485 flex: 1;
2486 text-align: right;
2487}
2488
2489.pagination {
2490 display: grid;
2491 grid-template-columns: 1fr auto 1fr;
2492 align-items: center;
2493 border-top: 1px solid var(--color-border);
2494 margin-top: var(--space-2);
2495 padding: var(--space-4) 0 var(--space-2);
2496}
2497
2498.pagination-prev {
2499 justify-self: start;
2500}
2501.pagination-next {
2502 justify-self: end;
2503}
2504
2505.pagination-info {
2506 justify-self: center;
2507 font-size: var(--text-sm);
2508 color: var(--color-text-muted);
2509}
2510
2511.pagination-btn {
2512 display: inline-flex;
2513 align-items: center;
2514 gap: var(--space-1);
2515 padding: var(--space-1) var(--space-3);
2516 border: 1px solid var(--color-border);
2517 border-radius: var(--radius-md);
2518 font-size: var(--text-sm);
2519 font-weight: 500;
2520 text-decoration: none;
2521 color: var(--color-text);
2522 background: var(--color-bg-subtle);
2523 transition:
2524 background 0.1s,
2525 border-color 0.1s;
2526 white-space: nowrap;
2527}
2528
2529.pagination-btn:hover {
2530 background: var(--color-bg-inset);
2531 border-color: var(--color-border);
2532 color: var(--color-text);
2533 text-decoration: none;
2534}
2535
2536/* Settings */
2537.theme-options {
2538 display: flex;
2539 gap: var(--space-4);
2540 margin-bottom: var(--space-4);
2541 flex-wrap: wrap;
2542}
2543.theme-option {
2544 display: flex;
2545 align-items: center;
2546 gap: var(--space-2);
2547 cursor: pointer;
2548 font-size: var(--text-sm);
2549}
2550.settings-form {
2551 display: flex;
2552 flex-direction: column;
2553 gap: var(--space-4);
2554}
2555.passkey-list {
2556 display: flex;
2557 flex-direction: column;
2558 gap: var(--space-2);
2559 margin-bottom: var(--space-4);
2560}
2561.passkey-item {
2562 display: flex;
2563 align-items: center;
2564 gap: var(--space-3);
2565 padding: var(--space-2) 0;
2566 border-bottom: 1px solid var(--color-border-muted);
2567 font-size: var(--text-sm);
2568}
2569.passkey-item:last-child {
2570 border-bottom: none;
2571}
2572.passkey-date {
2573 flex: 1;
2574 color: var(--color-text-muted);
2575}
2576.queue-bulk-actions {
2577 display: flex;
2578 gap: var(--space-2);
2579 margin-bottom: var(--space-4);
2580}
2581.queue-list {
2582 list-style: none;
2583 padding: 0;
2584 margin: 0;
2585 max-height: 32rem;
2586 overflow-y: auto;
2587}
2588.queue-item {
2589 display: flex;
2590 align-items: flex-start;
2591 justify-content: space-between;
2592 gap: var(--space-4);
2593 padding: var(--space-3) 0;
2594 border-top: 1px solid var(--color-border-muted);
2595 font-size: var(--text-sm);
2596}
2597.queue-item-meta {
2598 display: flex;
2599 flex-direction: column;
2600 gap: var(--space-1);
2601 min-width: 0;
2602}
2603.queue-item-header {
2604 display: flex;
2605 align-items: baseline;
2606 gap: var(--space-2);
2607}
2608.queue-item-date {
2609 color: var(--color-text-muted);
2610 font-size: var(--text-xs);
2611}
2612.queue-item-answer {
2613 margin: 0;
2614 color: var(--color-text-muted);
2615 font-size: var(--text-xs);
2616 white-space: pre-wrap;
2617 word-break: break-word;
2618}
2619.queue-item-actions {
2620 display: flex;
2621 gap: var(--space-2);
2622 flex-shrink: 0;
2623}
2624.ssh-key-info {
2625 flex: 1;
2626 display: flex;
2627 flex-direction: column;
2628 gap: var(--space-1);
2629 min-width: 0;
2630}
2631.ssh-key-name {
2632 font-weight: 500;
2633}
2634.ssh-key-fingerprint {
2635 font-family: var(--font-mono);
2636 font-size: var(--text-xs);
2637 overflow: hidden;
2638 text-overflow: ellipsis;
2639 white-space: nowrap;
2640}
2641.form-textarea {
2642 resize: vertical;
2643 min-height: 4.5rem;
2644 font-family: var(--font-mono);
2645 font-size: var(--text-sm);
2646}
2647/* Clone popup */
2648.clone-popup-details {
2649 position: relative;
2650 display: inline-block;
2651}
2652.clone-popup-details > summary {
2653 list-style: none;
2654}
2655.clone-popup-details > summary::-webkit-details-marker {
2656 display: none;
2657}
2658.clone-popup {
2659 position: absolute;
2660 right: 1rem;
2661 top: calc(100% + var(--space-2));
2662 background: var(--color-bg);
2663 border: 1px solid var(--color-border);
2664 border-radius: var(--radius-lg);
2665 padding: var(--space-3);
2666 min-width: 22rem;
2667 z-index: 100;
2668 box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
2669 display: flex;
2670 flex-direction: column;
2671 gap: var(--space-2);
2672}
2673.clone-url-row {
2674 display: flex;
2675 align-items: center;
2676 gap: var(--space-2);
2677}
2678.clone-url-label {
2679 font-size: var(--text-xs);
2680 font-weight: 600;
2681 color: var(--color-text-muted);
2682 text-transform: uppercase;
2683 letter-spacing: 0.05em;
2684 min-width: 2.75rem;
2685}
2686.clone-url-input {
2687 flex: 1;
2688 font-family: var(--font-mono);
2689 font-size: var(--text-sm);
2690 background: var(--color-bg-subtle);
2691 border: 1px solid var(--color-border-muted);
2692 border-radius: var(--radius-md);
2693 padding: var(--space-1) var(--space-2);
2694 color: var(--color-text);
2695 cursor: text;
2696 min-width: 0;
2697}
2698.user-list {
2699 display: flex;
2700 flex-direction: column;
2701 gap: var(--space-2);
2702 margin-bottom: var(--space-6);
2703}
2704.user-item {
2705 display: flex;
2706 align-items: center;
2707 gap: var(--space-3);
2708 padding: var(--space-2) 0;
2709 border-bottom: 1px solid var(--color-border-muted);
2710 font-size: var(--text-sm);
2711}
2712.user-item:last-child {
2713 border-bottom: none;
2714}
2715.user-name {
2716 font-weight: 500;
2717 flex: 1;
2718}
2719.user-date {
2720 color: var(--color-text-muted);
2721 font-size: var(--text-xs);
2722}
2723
2724/* Labels */
2725.label-badge {
2726 display: inline-block;
2727 padding: 0 var(--space-2);
2728 border-radius: 2em;
2729 font-size: var(--text-xs);
2730 font-weight: 500;
2731 line-height: 1.6;
2732 word-break: break-all;
2733}
2734.issue-labels {
2735 display: flex;
2736 flex-wrap: wrap;
2737 gap: var(--space-1);
2738 margin-bottom: var(--space-2);
2739}
2740.issue-labels-row {
2741 display: flex;
2742 flex-wrap: wrap;
2743 align-items: center;
2744 gap: var(--space-2);
2745 padding: var(--space-2) 0 var(--space-3);
2746}
2747.label-badge-wrap {
2748 display: inline-flex;
2749 align-items: center;
2750 gap: var(--space-1);
2751}
2752.label-remove-form {
2753 display: inline;
2754}
2755.label-remove-btn {
2756 background: none;
2757 border: none;
2758 cursor: pointer;
2759 padding: 0 2px;
2760 font-size: var(--text-sm);
2761 line-height: 1;
2762 color: var(--color-text-muted);
2763 opacity: 0.7;
2764}
2765.label-remove-btn:hover {
2766 opacity: 1;
2767}
2768.label-add-inline-form {
2769 display: inline-flex;
2770 align-items: center;
2771 gap: var(--space-2);
2772}
2773.label-select {
2774 font-size: var(--text-sm);
2775 padding: var(--space-1) var(--space-2);
2776 border: 1px solid var(--color-border);
2777 border-radius: var(--radius-md);
2778 background: var(--color-bg);
2779 color: var(--color-text);
2780 height: 2rem;
2781}
2782.label-checkbox-list {
2783 display: flex;
2784 flex-wrap: wrap;
2785 gap: var(--space-2);
2786 margin-top: var(--space-1);
2787}
2788.label-checkbox-item {
2789 display: inline-flex;
2790 align-items: center;
2791 gap: var(--space-1);
2792 cursor: pointer;
2793}
2794.label-settings-list {
2795 display: flex;
2796 flex-direction: column;
2797 margin-bottom: var(--space-4);
2798 max-height: 24rem;
2799 overflow-y: auto;
2800}
2801.label-settings-item {
2802 display: flex;
2803 align-items: center;
2804 gap: var(--space-3);
2805 padding: var(--space-2) 0;
2806 border-bottom: 1px solid var(--color-border-muted);
2807 font-size: var(--text-sm);
2808}
2809.label-settings-item:last-child {
2810 border-bottom: none;
2811}
2812.label-settings-swatch {
2813 width: 12px;
2814 height: 12px;
2815 border-radius: 50%;
2816 flex-shrink: 0;
2817 border: 1px solid rgba(0, 0, 0, 0.15);
2818}
2819.label-settings-name {
2820 flex: 1;
2821 font-weight: 500;
2822}
2823.label-add-form {
2824 display: flex;
2825 align-items: center;
2826 gap: var(--space-2);
2827}
2828.label-name-input {
2829 flex: 1;
2830 min-width: 0;
2831 padding: var(--space-2) var(--space-3);
2832 border: 1px solid var(--color-border);
2833 border-radius: var(--radius-md);
2834 background: var(--color-bg);
2835 color: var(--color-text);
2836 font-size: var(--text-sm);
2837 height: 2rem;
2838 box-sizing: border-box;
2839}
2840.label-name-input:focus {
2841 outline: 2px solid var(--color-accent);
2842 outline-offset: -1px;
2843 border-color: var(--color-accent);
2844}
2845.label-color-swatch-label {
2846 flex-shrink: 0;
2847 cursor: pointer;
2848 display: block;
2849 line-height: 0;
2850}
2851.label-color-input {
2852 display: block;
2853 width: 2rem;
2854 height: 2rem;
2855 padding: 2px;
2856 border: 1px solid var(--color-border);
2857 border-radius: var(--radius-md);
2858 background: var(--color-bg);
2859 cursor: pointer;
2860 -webkit-appearance: none;
2861 appearance: none;
2862 box-sizing: border-box;
2863}
2864
2865/* Label filter (details/summary popup) */
2866.list-header-actions {
2867 display: flex;
2868 align-items: center;
2869 gap: var(--space-2);
2870 flex-shrink: 0;
2871}
2872.label-filter {
2873 position: relative;
2874}
2875.label-filter-popup {
2876 position: absolute;
2877 right: 0;
2878 top: calc(100% + var(--space-1));
2879 z-index: 10;
2880 background: var(--color-bg);
2881 border: 1px solid var(--color-border);
2882 border-radius: var(--radius-lg);
2883 padding: var(--space-3);
2884 min-width: 180px;
2885 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
2886}
2887.label-filter-list {
2888 display: flex;
2889 flex-direction: column;
2890 gap: var(--space-2);
2891 margin-bottom: var(--space-3);
2892 max-height: 16rem;
2893 overflow-y: auto;
2894}
2895.label-filter-item {
2896 display: flex;
2897 align-items: center;
2898 gap: var(--space-2);
2899 cursor: pointer;
2900 font-size: var(--text-sm);
2901}
2902.label-filter-actions {
2903 display: flex;
2904 gap: var(--space-2);
2905}
2906