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