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: 0;
1201 right: auto;
1202 top: auto;
1203 bottom: calc(100% + var(--space-1));
1204 }
1205 .btn-danger {
1206 background: var(--color-danger);
1207 border-color: transparent;
1208 color: #fff;
1209 }
1210 .btn-danger:hover {
1211 background: color-mix(in srgb, var(--color-danger) 85%, #000);
1212 }
1213
1214 /* --- Release list items --- */
1215 .release-item-header {
1216 display: flex;
1217 gap: var(--space-3);
1218 align-items: flex-start;
1219 }
1220 .release-item-main {
1221 flex: 1;
1222 min-width: 0;
1223 }
1224 .release-item-title {
1225 font-size: var(--text-lg);
1226 font-weight: 700;
1227 text-decoration: none;
1228 color: var(--color-text);
1229 display: block;
1230 margin-bottom: var(--space-1);
1231 }
1232 .release-item-title:hover {
1233 color: var(--color-link);
1234 }
1235 .release-item-meta {
1236 display: flex;
1237 flex-wrap: wrap;
1238 gap: var(--space-3);
1239 align-items: center;
1240 font-size: var(--text-xs);
1241 color: var(--color-text-muted);
1242 }
1243 .release-item-date {
1244 display: flex;
1245 flex-direction: column;
1246 align-items: flex-end;
1247 gap: var(--space-2);
1248 font-size: var(--text-xs);
1249 color: var(--color-text-muted);
1250 white-space: nowrap;
1251 flex-shrink: 0;
1252 }
1253
1254 /* --- Release notes preview in list --- */
1255 .release-notes-section {
1256 margin-top: var(--space-3);
1257 }
1258 .release-notes-label {
1259 font-size: var(--text-xs);
1260 font-weight: 600;
1261 color: var(--color-text-muted);
1262 text-transform: uppercase;
1263 letter-spacing: 0.05em;
1264 margin-bottom: var(--space-2);
1265 }
1266 .notes-expand > summary {
1267 list-style: none;
1268 cursor: pointer;
1269 outline: none;
1270 }
1271
1272 .notes-preview {
1273 max-height: calc(5 * 1.6em);
1274 overflow: hidden;
1275 position: relative;
1276 white-space: pre-wrap;
1277 font-size: var(--text-sm);
1278 color: var(--color-text);
1279 line-height: 1.6;
1280 word-break: break-word;
1281 margin-bottom: var(--space-1);
1282 }
1283 .notes-preview::after {
1284 content: "";
1285 position: absolute;
1286 bottom: 0;
1287 left: 0;
1288 right: 0;
1289 height: 2.5em;
1290 background: linear-gradient(transparent, var(--color-bg));
1291 pointer-events: none;
1292 }
1293 .notes-expand[open] .notes-preview {
1294 display: none;
1295 }
1296 .notes-full {
1297 padding-top: var(--space-3);
1298 padding-bottom: var(--space-1);
1299 }
1300 .notes-expand[open] {
1301 display: flex;
1302 flex-direction: column;
1303 }
1304 .notes-expand[open] > summary {
1305 order: 1;
1306 }
1307 .notes-expand[open] > .notes-full {
1308 order: 0;
1309 }
1310 .notes-toggle-label {
1311 display: inline-block;
1312 font-size: var(--text-xs);
1313 color: var(--color-link);
1314 margin-top: var(--space-1);
1315 }
1316 .notes-toggle-label:hover {
1317 text-decoration: underline;
1318 }
1319 .notes-toggle-label::before {
1320 content: "Show more ↓";
1321 }
1322 .notes-expand[open] .notes-toggle-label::before {
1323 content: "Show less ↑";
1324 }
1325
1326 /* --- Release detail --- */
1327 .release-detail {
1328 padding: var(--space-6) 0;
1329 }
1330 .release-header {
1331 margin-bottom: var(--space-6);
1332 }
1333 .release-notes {
1334 margin-bottom: var(--space-6);
1335 }
1336 .release-assets {
1337 margin-bottom: var(--space-6);
1338 }
1339 .release-assets-heading {
1340 font-size: var(--text-base);
1341 font-weight: 600;
1342 margin-bottom: var(--space-3);
1343 }
1344 .asset-list {
1345 border: 1px solid var(--color-border);
1346 border-radius: var(--radius-lg);
1347 overflow: hidden;
1348 }
1349 .asset-item {
1350 display: flex;
1351 align-items: center;
1352 gap: var(--space-4);
1353 padding: var(--space-3) var(--space-4);
1354 border-bottom: 1px solid var(--color-border-muted);
1355 font-size: var(--text-sm);
1356 }
1357 .asset-item:last-child {
1358 border-bottom: none;
1359 }
1360 .asset-name {
1361 flex: 1;
1362 color: var(--color-link);
1363 text-decoration: none;
1364 font-family: var(--font-mono);
1365 font-size: var(--text-xs);
1366 }
1367 .asset-name:hover {
1368 text-decoration: underline;
1369 }
1370 .asset-name-pending {
1371 color: var(--color-text-muted);
1372 cursor: default;
1373 }
1374 .asset-item-pending {
1375 opacity: 0.6;
1376 }
1377 .asset-size,
1378 .asset-meta {
1379 color: var(--color-text-muted);
1380 font-size: var(--text-xs);
1381 white-space: nowrap;
1382 }
1383 .release-back {
1384 margin-top: var(--space-4);
1385 display: flex;
1386 gap: var(--space-3);
1387 align-items: center;
1388 justify-content: space-between;
1389 }
1390
1391 /* ============================================================
1392 Pagination
1393 ============================================================ */
1394 .commit-verify-hint {
1395 margin-bottom: var(--space-4);
1396 font-size: var(--text-xs);
1397 color: var(--color-text-muted);
1398 }
1399 .commit-verify-hint code {
1400 word-break: break-all;
1401 }
1402 .commit-cursor-nav {
1403 display: flex;
1404 justify-content: space-between;
1405 border-top: 1px solid var(--color-border);
1406 margin-top: var(--space-2);
1407 padding: var(--space-4) 0 var(--space-2);
1408 }
1409
1410 .commit-cursor-prev {
1411 flex: 1;
1412 }
1413 .commit-cursor-next {
1414 flex: 1;
1415 text-align: right;
1416 }
1417
1418 .pagination {
1419 display: grid;
1420 grid-template-columns: 1fr auto 1fr;
1421 align-items: center;
1422 border-top: 1px solid var(--color-border);
1423 margin-top: var(--space-2);
1424 padding: var(--space-4) 0 var(--space-2);
1425 }
1426
1427 .pagination-prev {
1428 justify-self: start;
1429 }
1430 .pagination-next {
1431 justify-self: end;
1432 }
1433
1434 .pagination-info {
1435 justify-self: center;
1436 font-size: var(--text-sm);
1437 color: var(--color-text-muted);
1438 }
1439
1440 .pagination-btn {
1441 display: inline-flex;
1442 align-items: center;
1443 gap: var(--space-1);
1444 padding: var(--space-1) var(--space-3);
1445 border: 1px solid var(--color-border);
1446 border-radius: var(--radius-md);
1447 font-size: var(--text-sm);
1448 font-weight: 500;
1449 text-decoration: none;
1450 color: var(--color-text);
1451 background: var(--color-bg-subtle);
1452 transition:
1453 background 0.1s,
1454 border-color 0.1s;
1455 white-space: nowrap;
1456 }
1457
1458 .pagination-btn:hover {
1459 background: var(--color-bg-inset);
1460 border-color: var(--color-border);
1461 color: var(--color-text);
1462 text-decoration: none;
1463 }
1464
1465 /* Settings */
1466 .theme-options {
1467 display: flex;
1468 gap: var(--space-4);
1469 margin-bottom: var(--space-4);
1470 flex-wrap: wrap;
1471 }
1472 .theme-option {
1473 display: flex;
1474 align-items: center;
1475 gap: var(--space-2);
1476 cursor: pointer;
1477 font-size: var(--text-sm);
1478 }
1479 .settings-form {
1480 display: flex;
1481 flex-direction: column;
1482 gap: var(--space-4);
1483 }
1484 .passkey-list {
1485 display: flex;
1486 flex-direction: column;
1487 gap: var(--space-2);
1488 margin-bottom: var(--space-4);
1489 }
1490 .passkey-item {
1491 display: flex;
1492 align-items: center;
1493 gap: var(--space-3);
1494 padding: var(--space-2) 0;
1495 border-bottom: 1px solid var(--color-border-muted);
1496 font-size: var(--text-sm);
1497 }
1498 .passkey-item:last-child {
1499 border-bottom: none;
1500 }
1501 .passkey-date {
1502 flex: 1;
1503 color: var(--color-text-muted);
1504 }
1505 .queue-bulk-actions {
1506 display: flex;
1507 gap: var(--space-2);
1508 margin-bottom: var(--space-4);
1509 }
1510 .queue-list {
1511 list-style: none;
1512 padding: 0;
1513 margin: 0;
1514 max-height: 32rem;
1515 overflow-y: auto;
1516 }
1517 .queue-item {
1518 display: flex;
1519 align-items: flex-start;
1520 justify-content: space-between;
1521 gap: var(--space-4);
1522 padding: var(--space-3) 0;
1523 border-top: 1px solid var(--color-border-muted);
1524 font-size: var(--text-sm);
1525 }
1526 .queue-item-meta {
1527 display: flex;
1528 flex-direction: column;
1529 gap: var(--space-1);
1530 min-width: 0;
1531 }
1532 .queue-item-header {
1533 display: flex;
1534 align-items: baseline;
1535 gap: var(--space-2);
1536 }
1537 .queue-item-date {
1538 color: var(--color-text-muted);
1539 font-size: var(--text-xs);
1540 }
1541 .queue-item-answer {
1542 margin: 0;
1543 color: var(--color-text-muted);
1544 font-size: var(--text-xs);
1545 white-space: pre-wrap;
1546 word-break: break-word;
1547 }
1548 .queue-item-actions {
1549 display: flex;
1550 gap: var(--space-2);
1551 flex-shrink: 0;
1552 }
1553 .ssh-key-info {
1554 flex: 1;
1555 display: flex;
1556 flex-direction: column;
1557 gap: var(--space-1);
1558 min-width: 0;
1559 }
1560 .ssh-key-name {
1561 font-weight: 500;
1562 }
1563 .ssh-key-fingerprint {
1564 font-family: var(--font-mono);
1565 font-size: var(--text-xs);
1566 overflow: hidden;
1567 text-overflow: ellipsis;
1568 white-space: nowrap;
1569 }
1570 .form-textarea {
1571 resize: vertical;
1572 min-height: 4.5rem;
1573 font-family: var(--font-mono);
1574 font-size: var(--text-sm);
1575 }
1576
1577 /* Clone popup */
1578 .clone-popup-details {
1579 position: relative;
1580 display: inline-block;
1581 }
1582 .clone-popup-details > summary {
1583 list-style: none;
1584 }
1585 .timeline-author-right .inline-edit-details > summary {
1586 list-style: none;
1587 }
1588 .clone-popup {
1589 position: absolute;
1590 right: 1rem;
1591 top: calc(100% + var(--space-2));
1592 background: var(--color-bg);
1593 border: 1px solid var(--color-border);
1594 border-radius: var(--radius-lg);
1595 padding: var(--space-3);
1596 min-width: 22rem;
1597 z-index: 100;
1598 box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
1599 display: flex;
1600 flex-direction: column;
1601 gap: var(--space-2);
1602 }
1603 .clone-url-row {
1604 display: flex;
1605 align-items: center;
1606 gap: var(--space-2);
1607 }
1608 .clone-url-label {
1609 font-size: var(--text-xs);
1610 font-weight: 600;
1611 color: var(--color-text-muted);
1612 text-transform: uppercase;
1613 letter-spacing: 0.05em;
1614 min-width: 2.75rem;
1615 }
1616 .clone-url-input {
1617 flex: 1;
1618 font-family: var(--font-mono);
1619 font-size: var(--text-sm);
1620 background: var(--color-bg-subtle);
1621 border: 1px solid var(--color-border-muted);
1622 border-radius: var(--radius-md);
1623 padding: var(--space-1) var(--space-2);
1624 color: var(--color-text);
1625 cursor: text;
1626 min-width: 0;
1627 }
1628
1629 /* User list */
1630 .user-list {
1631 display: flex;
1632 flex-direction: column;
1633 gap: var(--space-2);
1634 margin-bottom: var(--space-6);
1635 }
1636 .user-item {
1637 display: flex;
1638 align-items: center;
1639 gap: var(--space-3);
1640 padding: var(--space-2) 0;
1641 border-bottom: 1px solid var(--color-border-muted);
1642 font-size: var(--text-sm);
1643 }
1644 .user-item:last-child {
1645 border-bottom: none;
1646 }
1647 .user-name {
1648 font-weight: 500;
1649 flex: 1;
1650 }
1651 .user-date {
1652 color: var(--color-text-muted);
1653 font-size: var(--text-xs);
1654 }
1655
1656 /* Labels */
1657 .label-badge {
1658 display: inline-block;
1659 padding: 0 var(--space-2);
1660 border-radius: 2em;
1661 font-size: var(--text-xs);
1662 font-weight: 500;
1663 line-height: 1.6;
1664 word-break: break-all;
1665 }
1666 .issue-labels {
1667 display: flex;
1668 flex-wrap: wrap;
1669 gap: var(--space-1);
1670 margin-bottom: var(--space-2);
1671 }
1672 .issue-labels-row {
1673 display: flex;
1674 flex-wrap: wrap;
1675 align-items: center;
1676 gap: var(--space-2);
1677 padding: var(--space-2) 0 var(--space-3);
1678 }
1679 .label-badge-wrap {
1680 display: inline-flex;
1681 align-items: center;
1682 gap: var(--space-1);
1683 }
1684 .label-remove-form {
1685 display: inline;
1686 }
1687 .label-remove-btn {
1688 background: none;
1689 border: none;
1690 cursor: pointer;
1691 padding: 0 2px;
1692 font-size: var(--text-sm);
1693 line-height: 1;
1694 color: var(--color-text-muted);
1695 opacity: 0.7;
1696 }
1697 .label-remove-btn:hover {
1698 opacity: 1;
1699 }
1700 .label-add-inline-form {
1701 display: inline-flex;
1702 align-items: center;
1703 gap: var(--space-2);
1704 }
1705 .label-select {
1706 font-size: var(--text-sm);
1707 padding: var(--space-1) var(--space-2);
1708 border: 1px solid var(--color-border);
1709 border-radius: var(--radius-md);
1710 background: var(--color-bg);
1711 color: var(--color-text);
1712 height: 2rem;
1713 }
1714 .label-checkbox-list {
1715 display: flex;
1716 flex-wrap: wrap;
1717 gap: var(--space-2);
1718 margin-top: var(--space-1);
1719 }
1720 .label-checkbox-item {
1721 display: inline-flex;
1722 align-items: center;
1723 gap: var(--space-1);
1724 cursor: pointer;
1725 }
1726 .label-settings-list {
1727 display: flex;
1728 flex-direction: column;
1729 margin-bottom: var(--space-4);
1730 max-height: 24rem;
1731 overflow-y: auto;
1732 }
1733 .label-settings-item {
1734 display: flex;
1735 align-items: center;
1736 gap: var(--space-3);
1737 padding: var(--space-2) 0;
1738 border-bottom: 1px solid var(--color-border-muted);
1739 font-size: var(--text-sm);
1740 }
1741 .label-settings-item:last-child {
1742 border-bottom: none;
1743 }
1744 .label-settings-swatch {
1745 width: 12px;
1746 height: 12px;
1747 border-radius: 50%;
1748 flex-shrink: 0;
1749 border: 1px solid rgba(0, 0, 0, 0.15);
1750 }
1751 .label-settings-name {
1752 flex: 1;
1753 font-weight: 500;
1754 }
1755 .label-add-form {
1756 display: flex;
1757 align-items: center;
1758 gap: var(--space-2);
1759 }
1760 .label-name-input {
1761 flex: 1;
1762 min-width: 0;
1763 padding: var(--space-2) var(--space-3);
1764 border: 1px solid var(--color-border);
1765 border-radius: var(--radius-md);
1766 background: var(--color-bg);
1767 color: var(--color-text);
1768 font-size: var(--text-sm);
1769 height: 2rem;
1770 box-sizing: border-box;
1771 }
1772 .label-name-input:focus {
1773 outline: 2px solid var(--color-accent);
1774 outline-offset: -1px;
1775 border-color: var(--color-accent);
1776 }
1777 .label-color-swatch-label {
1778 flex-shrink: 0;
1779 cursor: pointer;
1780 display: block;
1781 width: 2rem;
1782 height: 2rem;
1783 border-radius: 50%;
1784 overflow: hidden;
1785 line-height: 0;
1786 }
1787 .label-color-input {
1788 display: block;
1789 width: 150%;
1790 height: 150%;
1791 margin: -25%;
1792 cursor: pointer;
1793 appearance: none;
1794 border: none;
1795 padding: 0;
1796 }
1797
1798 /* Label filter (details/summary popup) */
1799 .list-header-actions {
1800 display: flex;
1801 align-items: center;
1802 gap: var(--space-2);
1803 flex-shrink: 0;
1804 }
1805 .label-filter {
1806 position: relative;
1807 }
1808 .label-filter-popup {
1809 position: absolute;
1810 right: 0;
1811 top: calc(100% + var(--space-1));
1812 z-index: 10;
1813 background: var(--color-bg);
1814 border: 1px solid var(--color-border);
1815 border-radius: var(--radius-lg);
1816 padding: var(--space-3);
1817 min-width: 180px;
1818 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
1819 }
1820 .label-filter-list {
1821 display: flex;
1822 flex-direction: column;
1823 gap: var(--space-2);
1824 margin-bottom: var(--space-3);
1825 max-height: 16rem;
1826 overflow-y: auto;
1827 }
1828 .label-filter-item {
1829 display: flex;
1830 align-items: center;
1831 gap: var(--space-2);
1832 cursor: pointer;
1833 font-size: var(--text-sm);
1834 }
1835 .label-filter-actions {
1836 display: flex;
1837 gap: var(--space-2);
1838 }
1839
1840 /* --- list-heading (inside list-header) --- */
1841 .list-heading {
1842 font-size: var(--text-lg);
1843 font-weight: 600;
1844 margin: 0;
1845 }
1846
1847 /* --- Branch / Tag ref list --- */
1848 .ref-list {
1849 border: 1px solid var(--color-border);
1850 border-top: none;
1851 border-radius: 0 0 var(--radius-lg) var(--radius-lg);
1852 }
1853 .ref-item {
1854 padding: var(--space-3) var(--space-4);
1855 border-bottom: 1px solid var(--color-border-muted);
1856 }
1857 .ref-item:last-child {
1858 border-bottom: none;
1859 }
1860 .ref-name-row {
1861 display: flex;
1862 align-items: center;
1863 gap: var(--space-2);
1864 margin-bottom: var(--space-1);
1865 }
1866 .ref-name {
1867 font-size: var(--text-sm);
1868 font-weight: 600;
1869 color: var(--color-text);
1870 text-decoration: none;
1871 }
1872 .ref-name:hover {
1873 color: var(--color-link);
1874 }
1875 .ref-meta-row {
1876 display: flex;
1877 align-items: center;
1878 flex-wrap: wrap;
1879 gap: var(--space-2) var(--space-3);
1880 font-size: var(--text-xs);
1881 color: var(--color-text-muted);
1882 min-width: 0;
1883 }
1884 .ref-author {
1885 white-space: nowrap;
1886 }
1887 .ref-hash {
1888 font-family: var(--font-mono);
1889 font-size: var(--text-xs);
1890 color: var(--color-link);
1891 text-decoration: none;
1892 background: var(--color-bg-inset);
1893 padding: 1px var(--space-2);
1894 border-radius: var(--radius-sm);
1895 white-space: nowrap;
1896 flex-shrink: 0;
1897 }
1898 .ref-hash:hover {
1899 text-decoration: underline;
1900 }
1901 .ref-subject {
1902 flex: 1;
1903 min-width: 60px;
1904 overflow: hidden;
1905 text-overflow: ellipsis;
1906 white-space: nowrap;
1907 }
1908 .ref-date {
1909 white-space: nowrap;
1910 flex-shrink: 0;
1911 }
1912 .ref-actions {
1913 display: flex;
1914 align-items: center;
1915 gap: var(--space-2);
1916 margin-left: auto;
1917 flex-shrink: 0;
1918 }
1919
1920 /* --- Inline confirm-details (for row-level actions) --- */
1921 .confirm-details-inline {
1922 position: relative;
1923 display: inline-block;
1924 }
1925
1926 /* --- Popup form (for new branch / new tag popups) --- */
1927 .confirm-popup-form {
1928 min-width: 260px;
1929 }
1930 .popup-form {
1931 display: flex;
1932 flex-direction: column;
1933 gap: var(--space-3);
1934 }
1935 .popup-form .form-group {
1936 margin-bottom: 0;
1937 }
1938 .popup-form input[type="text"] {
1939 width: 100%;
1940 box-sizing: border-box;
1941 }
1942
1943 /* --- Confirm warning (tag linked to release) --- */
1944 .confirm-warning {
1945 font-size: var(--text-xs);
1946 color: var(--color-warning);
1947 margin: 0 0 var(--space-2);
1948 }
1949
1950 /* --- Tree toolbar actions group --- */
1951 .tree-toolbar-actions {
1952 display: flex;
1953 align-items: center;
1954 gap: var(--space-2);
1955 }
1956
1957 /* --- CI / Pipelines --- */
1958 .ci-status-pill {
1959 display: inline-block;
1960 padding: 2px 8px;
1961 border-radius: 12px;
1962 font-size: var(--text-xs);
1963 font-weight: 600;
1964 text-transform: uppercase;
1965 letter-spacing: 0.03em;
1966 }
1967 .ci-status-pending {
1968 background: var(--color-border);
1969 color: var(--color-text-muted);
1970 }
1971 .ci-status-queued {
1972 background: #6e7781;
1973 color: #fff;
1974 }
1975 .ci-status-running {
1976 background: #0b5cab;
1977 color: #fff;
1978 }
1979 .ci-status-success {
1980 background: #1a7f37;
1981 color: #fff;
1982 }
1983 .ci-status-failure {
1984 background: #cf222e;
1985 color: #fff;
1986 }
1987 .ci-status-cancelled {
1988 background: var(--color-border);
1989 color: var(--color-text-muted);
1990 }
1991 .ci-status-skipped {
1992 background: var(--color-border);
1993 color: var(--color-text-muted);
1994 }
1995
1996 .ci-run-id {
1997 font-weight: 600;
1998 margin-left: var(--space-2);
1999 }
2000 .ci-sha {
2001 font-family: var(--font-mono);
2002 font-size: var(--text-xs);
2003 background: var(--color-code-bg);
2004 padding: 1px 4px;
2005 border-radius: 3px;
2006 }
2007 .ci-run-actions {
2008 display: flex;
2009 align-items: center;
2010 gap: var(--space-2);
2011 }
2012 .ci-steps {
2013 margin-top: var(--space-4);
2014 }
2015 .ci-step {
2016 border: 1px solid var(--color-border);
2017 border-radius: 6px;
2018 margin-bottom: var(--space-2);
2019 overflow: hidden;
2020 }
2021 .ci-step-summary {
2022 display: flex;
2023 align-items: center;
2024 gap: var(--space-2);
2025 padding: var(--space-3);
2026 cursor: pointer;
2027 list-style: none;
2028 background: var(--color-bg-secondary);
2029 }
2030 .ci-step-summary::-webkit-details-marker {
2031 display: none;
2032 }
2033 .ci-step-name {
2034 font-weight: 600;
2035 flex: 1;
2036 }
2037 .ci-step-duration {
2038 font-size: var(--text-xs);
2039 }
2040 .ci-step-log {
2041 margin: 0;
2042 padding: var(--space-3);
2043 font-family: var(--font-mono);
2044 font-size: var(--text-xs);
2045 background: var(--color-code-bg);
2046 overflow-x: auto;
2047 white-space: pre-wrap;
2048 word-break: break-all;
2049 max-height: 500px;
2050 overflow-y: auto;
2051 }
2052 .ci-step-running-indicator {
2053 padding: var(--space-3);
2054 font-size: var(--text-sm);
2055 }
2056 .ci-step-pending {
2057 padding: var(--space-3);
2058 color: var(--color-text-muted);
2059 }
2060 .ci-artifacts {
2061 margin-top: var(--space-4);
2062 }
2063 .ci-artifact-list {
2064 list-style: none;
2065 margin: 0;
2066 padding: 0;
2067 }
2068 .ci-artifact-item {
2069 display: flex;
2070 align-items: center;
2071 justify-content: space-between;
2072 padding: var(--space-2) 0;
2073 border-bottom: 1px solid var(--color-border);
2074 }
2075 .ci-artifact-item:last-child {
2076 border-bottom: none;
2077 }
2078 .ci-artifact-name {
2079 font-weight: 500;
2080 }
2081 .ci-artifact-size {
2082 font-size: var(--text-xs);
2083 font-family: var(--font-mono);
2084 }
2085 .ci-overrides {
2086 margin-top: var(--space-4);
2087 }
2088 .ci-vars-list {
2089 display: grid;
2090 grid-template-columns: max-content 1fr;
2091 gap: var(--space-1) var(--space-4);
2092 margin: 0;
2093 }
2094 .ci-vars-list dt {
2095 color: var(--color-text-muted);
2096 }
2097 .ci-vars-list dd {
2098 margin: 0;
2099 }
2100 .ci-help {
2101 margin-top: var(--space-4);
2102 padding: var(--space-3) var(--space-4);
2103 }
2104 .ci-help-summary {
2105 cursor: pointer;
2106 font-weight: 600;
2107 font-size: var(--text-sm);
2108 padding: var(--space-1) var(--space-2);
2109 list-style: none;
2110 display: flex;
2111 align-items: center;
2112 justify-content: space-between;
2113 gap: var(--space-3);
2114 }
2115 .ci-help-summary::-webkit-details-marker {
2116 display: none;
2117 }
2118 .ci-help-download {
2119 flex-shrink: 0;
2120 }
2121 .ci-help-body {
2122 padding: var(--space-2);
2123 border-top: 1px solid var(--color-border);
2124 margin-top: 0.5rem;
2125 }
2126 .ci-help-desc {
2127 margin: var(--space-1) 0 var(--space-2);
2128 font-size: var(--text-sm);
2129 color: var(--color-text-muted);
2130 }
2131 .ci-help-sections {
2132 display: grid;
2133 grid-template-columns: 1fr 1fr;
2134 gap: var(--space-3);
2135 }
2136 .ci-help-section-title {
2137 font-size: var(--text-xs);
2138 font-weight: 700;
2139 text-transform: uppercase;
2140 letter-spacing: 0.05em;
2141 color: var(--color-text-muted);
2142 margin: 0 0 var(--space-2);
2143 }
2144 .ci-help-vars {
2145 display: grid;
2146 grid-template-columns: max-content 1fr;
2147 gap: 2px var(--space-3);
2148 margin: 0;
2149 font-size: var(--text-xs);
2150 }
2151 .ci-help-vars dt {
2152 margin: 0;
2153 }
2154 .ci-help-vars dd {
2155 margin: 0;
2156 color: var(--color-text-muted);
2157 align-self: center;
2158 }
2159 .ci-help-badge-desc {
2160 font-size: var(--text-xs);
2161 color: var(--color-text-muted);
2162 margin: 0 0 var(--space-1);
2163 }
2164 .ci-help-badge-code {
2165 display: block;
2166 font-size: var(--text-xs);
2167 background: var(--color-code-bg);
2168 padding: var(--space-1) var(--space-2);
2169 border-radius: 3px;
2170 overflow-x: auto;
2171 white-space: nowrap;
2172 user-select: all;
2173 }
2174}
2175