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