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