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