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