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