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