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