forked from
evan.jarrett.net/at-container-registry
A container registry that uses the AT Protocol for manifest storage and S3 for blob storage.
1:root {
2 --primary: #0066cc;
3 --button-primary: #0066cc;
4 --primary-dark: #0052a3;
5 --secondary: #6c757d;
6 --success: #28a745;
7 --success-bg: #d4edda;
8 --warning: #ffc107;
9 --warning-bg: #fff3cd;
10 --danger: #dc3545;
11 --danger-bg: #f8d7da;
12 --bg: #ffffff;
13 --fg: #1a1a1a;
14 --border-dark: #666;
15 --border: #e0e0e0;
16 --code-bg: #f5f5f5;
17 --hover-bg: #f9f9f9;
18 --star: #fbbf24;
19
20 /* Navbar colors - stay consistent in dark mode */
21 --navbar-bg: #1a1a1a;
22 --navbar-fg: #ffffff;
23
24 /* Button text color */
25 --btn-text: #ffffff;
26
27 /* Shadows */
28 --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.05);
29 --shadow-md: 0 2px 4px rgba(0, 0, 0, 0.1);
30 --shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.15);
31
32 /* Metadata badge */
33 --metadata-badge-bg: #f0f0f0;
34 --metadata-badge-text: var(--fg);
35
36 /* Version badge */
37 --version-badge-bg: #f3e5f5;
38 --version-badge-text: #7b1fa2;
39 --version-badge-border: #ba68c8;
40
41 /* Attestation badge */
42 --attestation-badge-bg: #d1fae5;
43 --attestation-badge-text: #065f46;
44
45 /* Hero section colors */
46 --hero-bg-start: #f8f9fa;
47 --hero-bg-end: #e9ecef;
48
49 /* Terminal colors */
50 --terminal-bg: var(--fg);
51 --terminal-header-bg: #2d2d2d;
52 --terminal-text: var(--border);
53 --terminal-prompt: #4ec9b0;
54 --terminal-comment: #6a9955;
55}
56
57[data-theme="dark"] {
58 --primary: #60a5fa;
59 --button-primary: #1d4ed8;
60 --primary-dark: #1e40af;
61 --secondary: #9ca3af;
62 --success: #34d399;
63 --success-bg: #064e3b;
64 --warning: #fbbf24;
65 --warning-bg: #422006;
66 --danger: #dc3545;
67 --danger-bg: #7f1d1d;
68 --bg: #2a2a2a;
69 --fg: #e0e0e0;
70 --border-dark: #9ca3af;
71 --border: #404040;
72 --code-bg: #1e1e1e;
73 --hover-bg: #333333;
74 --star: #fbbf24;
75
76 /* Navbar colors - stay consistent (always black) */
77 --navbar-bg: #1a1a1a;
78 --navbar-fg: #ffffff;
79
80 /* Button text color */
81 --btn-text: #ffffff;
82
83 /* Shadows - lighter for dark backgrounds */
84 --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.3);
85 --shadow-md: 0 2px 4px rgba(0, 0, 0, 0.4);
86 --shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.5);
87
88 /* Metadata badge - darker in dark mode */
89 --metadata-badge-bg: #1e1e1e;
90 --metadata-badge-text: #ffffff;
91
92 /* Version badge - swapped colors with softer purple background */
93 --version-badge-bg: #9b59b6;
94 --version-badge-text: #ffffff;
95 --version-badge-border: #ba68c8;
96
97 /* Attestation badge */
98 --attestation-badge-bg: #065f46;
99 --attestation-badge-text: #6ee7b7;
100
101 /* Hero section colors */
102 --hero-bg-start: #2d2d2d;
103 --hero-bg-end: #1a1a1a;
104
105 /* Terminal colors - keep similar since already dark */
106 --terminal-bg: #0d0d0d;
107 --terminal-header-bg: #1a1a1a;
108 --terminal-text: #d0d0d0;
109 --terminal-prompt: #4ec9b0;
110 --terminal-comment: #6a9955;
111}
112
113* {
114 margin: 0;
115 padding: 0;
116 box-sizing: border-box;
117}
118
119body {
120 font-family:
121 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
122 Arial, sans-serif;
123 background: var(--bg);
124 color: var(--fg);
125 line-height: 1.6;
126}
127
128.container {
129 max-width: 1920px;
130 margin: 0 auto;
131 padding: 20px;
132}
133
134/* Navigation */
135.navbar {
136 background: var(--navbar-bg);
137 color: var(--navbar-fg);
138 padding: 1rem 2rem;
139 display: flex;
140 justify-content: space-between;
141 align-items: center;
142 box-shadow: var(--shadow-md);
143}
144
145.nav-brand a {
146 color: var(--navbar-fg);
147 text-decoration: none;
148 font-size: 1.5rem;
149 font-weight: bold;
150}
151
152.nav-brand .at-protocol {
153 color: var(--primary);
154}
155
156.nav-search {
157 flex: 1;
158 max-width: 400px;
159 margin: 0 2rem;
160}
161
162.nav-search input {
163 width: 100%;
164 padding: 0.5rem 1rem;
165 border: none;
166 border-radius: 4px;
167 font-size: 0.95rem;
168}
169
170.nav-links {
171 display: flex;
172 gap: 1rem;
173 align-items: center;
174}
175
176.nav-links a {
177 color: var(--navbar-fg);
178 text-decoration: none;
179 padding: 0.5rem 1rem;
180}
181
182.nav-links a:hover {
183 background: var(--secondary);
184 border-radius: 4px;
185}
186
187/* User dropdown */
188.user-dropdown {
189 position: relative;
190}
191
192.user-menu-btn {
193 display: flex;
194 align-items: center;
195 gap: 0.5rem;
196 background: transparent;
197 color: var(--navbar-fg);
198 border: none;
199 padding: 0.5rem;
200 cursor: pointer;
201 border-radius: 4px;
202 transition: background 0.2s;
203}
204
205.user-menu-btn:hover {
206 background: var(--secondary);
207}
208
209.user-avatar {
210 width: 32px;
211 height: 32px;
212 border-radius: 50%;
213 object-fit: cover;
214}
215
216.user-avatar-placeholder {
217 width: 32px;
218 height: 32px;
219 border-radius: 50%;
220 background: var(--button-primary);
221 display: flex;
222 align-items: center;
223 justify-content: center;
224 font-weight: bold;
225 text-transform: uppercase;
226}
227
228/* Profile page avatars */
229.profile-avatar {
230 width: 80px;
231 height: 80px;
232 border-radius: 50%;
233 object-fit: cover;
234}
235
236.profile-avatar-placeholder {
237 width: 80px;
238 height: 80px;
239 border-radius: 50%;
240 background: var(--button-primary);
241 display: flex;
242 align-items: center;
243 justify-content: center;
244 font-weight: bold;
245 font-size: 2rem;
246 text-transform: uppercase;
247 color: var(--btn-text);
248}
249
250.user-profile {
251 display: flex;
252 align-items: center;
253 gap: 1rem;
254 margin-bottom: 2rem;
255}
256
257.user-profile h1 {
258 font-size: 1.8rem;
259 margin: 0;
260}
261
262.user-handle {
263 color: var(--navbar-fg);
264 font-size: 0.95rem;
265}
266
267.dropdown-arrow {
268 transition: transform 0.2s;
269}
270
271.user-menu-btn[aria-expanded="true"] .dropdown-arrow {
272 transform: rotate(180deg);
273}
274
275.dropdown-menu {
276 position: absolute;
277 top: calc(100% + 0.5rem);
278 right: 0;
279 background: var(--bg);
280 border: 1px solid var(--border);
281 border-radius: 8px;
282 box-shadow: var(--shadow-lg);
283 min-width: 200px;
284 overflow: hidden;
285 z-index: 1000;
286}
287
288.dropdown-menu[hidden] {
289 display: none;
290}
291
292.dropdown-menu .dropdown-item {
293 display: block;
294 width: 100%;
295 padding: 0.75rem 1rem;
296 text-align: left;
297 color: var(--fg);
298 text-decoration: none;
299 border: none;
300 background: var(--bg);
301 cursor: pointer;
302 transition: background 0.2s;
303 font-size: 0.95rem;
304}
305
306.dropdown-menu .dropdown-item:hover {
307 background: var(--hover-bg);
308}
309
310.dropdown-divider {
311 margin: 0;
312 border: none;
313 border-top: 1px solid var(--border);
314}
315
316.dropdown-menu .logout-btn {
317 color: var(--danger);
318 font-weight: 500;
319}
320
321/* Buttons */
322button,
323.btn,
324.btn-primary,
325.btn-secondary {
326 padding: 0.5rem 1rem;
327 background: var(--button-primary);
328 color: var(--btn-text);
329 border: none;
330 border-radius: 4px;
331 cursor: pointer;
332 text-decoration: none;
333 display: inline-block;
334 font-size: 0.95rem;
335 transition: opacity 0.2s;
336}
337
338button:hover,
339.btn:hover,
340.btn-primary:hover,
341.btn-secondary:hover {
342 opacity: 0.9;
343}
344
345/* Override nav-links color for primary button */
346.nav-links .btn-primary {
347 color: var(--btn-text);
348}
349
350.btn-secondary {
351 background: var(--secondary);
352}
353
354.btn-link {
355 background: transparent;
356 color: var(--navbar-fg);
357 text-decoration: none;
358}
359
360.theme-toggle-btn {
361 display: inline-flex;
362 align-items: center;
363 justify-content: center;
364}
365
366.theme-toggle-btn .theme-icon {
367 width: 1.25rem;
368 height: 1.25rem;
369}
370
371.delete-btn {
372 background: transparent;
373 border: none;
374 color: var(--danger);
375 padding: 0.25rem 0.5rem;
376 font-size: 0.85rem;
377 cursor: pointer;
378 transition: all 0.2s ease;
379 display: inline-flex;
380 align-items: center;
381}
382
383.delete-btn:hover {
384 color: var(--danger);
385}
386
387.delete-btn:hover .lucide {
388 transform: scale(1.2);
389}
390
391.copy-btn {
392 padding: 0.25rem 0.5rem;
393 background: transparent;
394 color: var(--secondary);
395 border: none;
396 font-size: 0.85rem;
397 cursor: pointer;
398 transition: all 0.2s ease;
399 display: inline-flex;
400 align-items: center;
401}
402
403.copy-btn:hover {
404 color: var(--primary);
405}
406
407.copy-btn:hover .lucide {
408 transform: scale(1.2);
409}
410
411/* Cards */
412.push-card,
413.repository-card {
414 border: 1px solid var(--border);
415 border-radius: 8px;
416 padding: 1rem;
417 margin-bottom: 1rem;
418 background: var(--bg);
419 box-shadow: var(--shadow-sm);
420}
421
422.push-header {
423 display: flex;
424 gap: 1rem;
425 align-items: flex-start;
426 margin-bottom: 0.75rem;
427}
428
429.push-user {
430 color: var(--primary);
431 text-decoration: none;
432 font-weight: 500;
433}
434
435.push-user:hover {
436 text-decoration: underline;
437}
438
439.push-separator {
440 color: var(--border-dark);
441 margin: 0 0.25rem;
442}
443
444.push-repo {
445 font-weight: 500;
446 color: var(--primary);
447 text-decoration: none;
448}
449
450.push-repo:hover {
451 color: var(--primary);
452 text-decoration: underline;
453}
454
455.push-tag {
456 color: var(--secondary);
457}
458
459.push-details {
460 display: flex;
461 align-items: center;
462 gap: 1rem;
463 color: var(--border-dark);
464 font-size: 0.9rem;
465 margin-bottom: 0.75rem;
466}
467
468.digest {
469 font-family: "Monaco", "Courier New", monospace;
470 font-size: 0.85rem;
471 background: var(--code-bg);
472 padding: 0.1rem 0.3rem;
473 border-radius: 3px;
474 max-width: 200px;
475 overflow: hidden;
476 text-overflow: ellipsis;
477 white-space: nowrap;
478 display: inline-block;
479 vertical-align: middle;
480 position: relative;
481}
482
483/* Digest with copy button container */
484.digest-container {
485 display: inline-flex;
486 align-items: center;
487 gap: 0.5rem;
488}
489
490/* Docker command component */
491.docker-command {
492 display: inline-flex;
493 position: relative;
494 align-items: center;
495 gap: 0.5rem;
496 background: var(--code-bg);
497 border: 1px solid var(--border);
498 border-radius: 6px;
499 padding: 0.75rem;
500 margin: 0.5rem 0;
501 max-width: 100%;
502}
503
504.docker-command-icon {
505 width: 1.25rem;
506 height: 1.25rem;
507 color: var(--secondary);
508 flex-shrink: 0;
509}
510
511.docker-command-text {
512 font-family: "Monaco", "Courier New", monospace;
513 font-size: 0.85rem;
514 color: var(--fg);
515 flex: 0 1 auto;
516 word-break: break-all;
517}
518
519.docker-command .copy-btn {
520 position: absolute;
521 right: 0.5rem;
522 top: 50%;
523 transform: translateY(-50%);
524 background: linear-gradient(to right, transparent, var(--code-bg) 30%);
525 padding: 0.5rem;
526 padding-left: 1.5rem;
527 border-radius: 4px;
528 opacity: 0;
529 visibility: hidden;
530 transition:
531 opacity 0.2s,
532 visibility 0.2s;
533}
534
535.docker-command:hover .copy-btn {
536 opacity: 1;
537 visibility: visible;
538}
539
540/* Digest tooltip on hover - using title attribute for native browser tooltip */
541.digest {
542 cursor: default;
543}
544
545/* Digest copy button */
546.digest-copy-btn {
547 background: transparent;
548 border: none;
549 color: var(--secondary);
550 padding: 0.1rem 0.4rem;
551 cursor: pointer;
552 transition: all 0.2s ease;
553 display: inline-flex;
554 align-items: center;
555}
556
557.digest-copy-btn:hover {
558 color: var(--primary);
559}
560
561.digest-copy-btn:hover .lucide {
562 transform: scale(1.2);
563}
564
565.digest-copy-btn .lucide {
566 width: 0.875rem;
567 height: 0.875rem;
568 transition: transform 0.2s ease;
569}
570
571.delete-btn .lucide {
572 width: 1rem;
573 height: 1rem;
574 transition: transform 0.2s ease;
575}
576
577.copy-btn .lucide {
578 width: 1rem;
579 height: 1rem;
580 transition: transform 0.2s ease;
581}
582
583.separator {
584 color: var(--border);
585}
586
587/* Push card icon and layout */
588.push-icon {
589 width: 48px;
590 height: 48px;
591 border-radius: 8px;
592 object-fit: cover;
593 flex-shrink: 0;
594}
595
596.push-icon-placeholder {
597 width: 48px;
598 height: 48px;
599 border-radius: 8px;
600 background: var(--button-primary);
601 display: flex;
602 align-items: center;
603 justify-content: center;
604 font-weight: bold;
605 font-size: 1.5rem;
606 text-transform: uppercase;
607 color: var(--btn-text);
608 flex-shrink: 0;
609}
610
611.push-info {
612 flex: 1;
613 min-width: 0;
614}
615
616.push-title-row {
617 display: flex;
618 justify-content: space-between;
619 align-items: center;
620 gap: 1rem;
621 margin-bottom: 0.25rem;
622}
623
624.push-title {
625 font-size: 1.1rem;
626 flex: 1;
627}
628
629.push-description {
630 color: var(--border-dark);
631 font-size: 0.9rem;
632 line-height: 1.4;
633 margin: 0.25rem 0 0 0;
634}
635
636/* Push stats */
637.push-stats {
638 display: flex;
639 gap: 1rem;
640 align-items: center;
641 flex-shrink: 0;
642}
643
644.push-stat {
645 display: flex;
646 align-items: center;
647 gap: 0.35rem;
648 color: var(--border-dark);
649 font-size: 0.9rem;
650}
651
652.push-stat .star-icon {
653 color: var(--star);
654 font-size: 1rem;
655 width: 1rem;
656 height: 1rem;
657 stroke: var(--star);
658 fill: none;
659}
660
661.push-stat .star-icon.star-filled {
662 fill: var(--star);
663}
664
665.push-stat .pull-icon {
666 color: var(--primary);
667 font-size: 1rem;
668 width: 1rem;
669 height: 1rem;
670 stroke: var(--primary);
671}
672
673.push-stat .stat-count {
674 font-weight: 600;
675 color: var(--fg);
676}
677
678/* Repository Cards */
679.repo-header {
680 padding: 1rem;
681 cursor: pointer;
682 display: flex;
683 gap: 1rem;
684 align-items: flex-start;
685 background: var(--hover-bg);
686 border-radius: 8px 8px 0 0;
687 margin: -1rem -1rem 0 -1rem;
688}
689
690.repo-header:hover {
691 background: var(--hover-bg);
692}
693
694.repo-icon {
695 width: 48px;
696 height: 48px;
697 border-radius: 8px;
698 object-fit: cover;
699 flex-shrink: 0;
700}
701
702.repo-info {
703 flex: 1;
704 min-width: 0;
705}
706
707.repo-title-row {
708 display: flex;
709 align-items: center;
710 gap: 0.75rem;
711 margin-bottom: 0.25rem;
712}
713
714.repo-header h2 {
715 font-size: 1.3rem;
716 margin: 0;
717}
718
719.repo-title-link {
720 color: var(--fg);
721 text-decoration: none;
722}
723
724.repo-title-link:hover {
725 color: var(--primary);
726 text-decoration: underline;
727}
728
729.repo-badge {
730 display: inline-flex;
731 align-items: center;
732 padding: 0.2rem 0.6rem;
733 font-size: 0.75rem;
734 font-weight: 500;
735 border-radius: 12px;
736 white-space: nowrap;
737}
738
739.license-badge {
740 background: var(--code-bg);
741 color: var(--primary);
742 border: 1px solid #90caf9;
743}
744
745/* Clickable license badges */
746a.license-badge {
747 text-decoration: none;
748 cursor: pointer;
749 transition: all 0.2s ease;
750}
751
752a.license-badge:hover {
753 background: var(--button-primary);
754 color: var(--btn-text);
755 border-color: var(--button-primary);
756 transform: translateY(-1px);
757 box-shadow: var(--shadow-md);
758}
759
760.version-badge {
761 background: var(--version-badge-bg);
762 color: var(--version-badge-text);
763 border: 1px solid var(--version-badge-border);
764}
765
766.repo-description {
767 color: var(--border-dark);
768 font-size: 0.95rem;
769 margin: 0.25rem 0 0.5rem 0;
770 line-height: 1.4;
771}
772
773.repo-stats {
774 color: var(--border-dark);
775 font-size: 0.9rem;
776 display: flex;
777 gap: 0.5rem;
778 align-items: center;
779 flex-wrap: wrap;
780}
781
782.repo-link {
783 color: var(--primary);
784 text-decoration: none;
785 font-weight: 500;
786}
787
788.repo-link:hover {
789 text-decoration: underline;
790}
791
792.expand-btn {
793 background: transparent;
794 color: var(--fg);
795 padding: 0.25rem 0.5rem;
796 font-size: 1.2rem;
797}
798
799.repo-details {
800 padding-top: 1rem;
801}
802
803.tags-section,
804.manifests-section {
805 margin-bottom: 1.5rem;
806}
807
808.tags-section h3,
809.manifests-section h3 {
810 font-size: 1.1rem;
811 margin-bottom: 0.5rem;
812 color: var(--secondary);
813}
814
815.tag-row,
816.manifest-row {
817 display: flex;
818 gap: 1rem;
819 align-items: center;
820 padding: 0.5rem;
821 border-bottom: 1px solid var(--border);
822}
823
824.tag-row:last-child,
825.manifest-row:last-child {
826 border-bottom: none;
827}
828
829.tag-name {
830 font-weight: 500;
831 min-width: 100px;
832}
833
834.tag-arrow {
835 color: var(--border-dark);
836}
837
838/* Note: .tag-digest and .manifest-digest styling now handled by .digest class above */
839
840/* Settings Page */
841.settings-page {
842 max-width: 800px;
843 margin: 0 auto;
844}
845
846.settings-section {
847 background: var(--bg);
848 border: 1px solid var(--border);
849 border-radius: 8px;
850 padding: 1.5rem;
851 margin-bottom: 1.5rem;
852 box-shadow: var(--shadow-sm);
853}
854
855.settings-section h2 {
856 font-size: 1.3rem;
857 margin-bottom: 1rem;
858 padding-bottom: 0.5rem;
859 border-bottom: 2px solid var(--border);
860}
861
862.form-group {
863 margin-bottom: 1rem;
864}
865
866.form-group label {
867 display: block;
868 margin-bottom: 0.5rem;
869 font-weight: 500;
870 color: var(--secondary);
871}
872
873.form-group input,
874.form-group select {
875 width: 100%;
876 padding: 0.5rem;
877 border: 1px solid var(--border);
878 border-radius: 4px;
879 font-size: 1rem;
880}
881
882.form-group small {
883 display: block;
884 margin-top: 0.25rem;
885 color: var(--border-dark);
886 font-size: 0.85rem;
887}
888
889.info-row {
890 margin-bottom: 0.75rem;
891}
892
893.info-row strong {
894 display: inline-block;
895 min-width: 150px;
896 color: var(--secondary);
897}
898
899/* Modal */
900.modal-overlay {
901 position: fixed;
902 top: 0;
903 left: 0;
904 right: 0;
905 bottom: 0;
906 background: rgba(0, 0, 0, 0.6);
907 display: flex;
908 justify-content: center;
909 align-items: center;
910 z-index: 1000;
911}
912
913.modal-content {
914 background: var(--bg);
915 padding: 2rem;
916 border-radius: 8px;
917 max-width: 800px;
918 max-height: 80vh;
919 overflow-y: auto;
920 position: relative;
921 box-shadow: var(--shadow-lg);
922}
923
924.modal-close {
925 position: absolute;
926 top: 1rem;
927 right: 1rem;
928 background: none;
929 border: none;
930 font-size: 1.5rem;
931 cursor: pointer;
932 color: var(--secondary);
933}
934
935.modal-close:hover {
936 color: var(--fg);
937}
938
939.manifest-json {
940 background: var(--code-bg);
941 padding: 1rem;
942 border-radius: 4px;
943 overflow-x: auto;
944 font-family: "Monaco", "Courier New", monospace;
945 font-size: 0.85rem;
946 border: 1px solid var(--border);
947}
948
949/* Loading and Empty States */
950.loading {
951 text-align: center;
952 padding: 2rem;
953 color: var(--border-dark);
954}
955
956.empty-state {
957 text-align: center;
958 padding: 3rem 2rem;
959 background: var(--hover-bg);
960 border-radius: 8px;
961 border: 1px solid var(--border);
962}
963
964.empty-state p {
965 margin-bottom: 1rem;
966 font-size: 1.1rem;
967 color: var(--secondary);
968}
969
970.empty-state pre {
971 background: var(--code-bg);
972 padding: 1rem;
973 border-radius: 4px;
974 display: inline-block;
975}
976
977.empty-message {
978 color: var(--border-dark);
979 font-style: italic;
980 padding: 1rem;
981}
982
983/* Status Messages / Callouts */
984.note {
985 background: var(--warning-bg);
986 border-left: 4px solid var(--warning);
987 padding: 1rem;
988 margin: 1rem 0;
989}
990
991.note a {
992 color: var(--warning);
993 text-decoration: underline;
994 font-weight: 500;
995}
996
997.note a:hover {
998 color: var(--primary);
999}
1000
1001.note a:visited {
1002 color: var(--warning);
1003}
1004
1005.success {
1006 background: var(--success-bg);
1007 border-left: 4px solid var(--success);
1008 padding: 1rem;
1009 margin: 1rem 0;
1010 display: flex;
1011 align-items: center;
1012 gap: 0.5rem;
1013}
1014
1015.success .lucide {
1016 width: 1.25rem;
1017 height: 1.25rem;
1018 color: var(--success);
1019 stroke: var(--success);
1020 flex-shrink: 0;
1021}
1022
1023.error {
1024 background: var(--danger-bg);
1025 border-left: 4px solid var(--danger);
1026 padding: 1rem;
1027 margin: 1rem 0;
1028}
1029
1030/* Login Page */
1031.login-page {
1032 max-width: 450px;
1033 margin: 4rem auto;
1034 padding: 2rem;
1035}
1036
1037.login-page h1 {
1038 font-size: 2rem;
1039 margin-bottom: 0.5rem;
1040 text-align: center;
1041}
1042
1043.login-page > p {
1044 text-align: center;
1045 color: var(--secondary);
1046 margin-bottom: 2rem;
1047}
1048
1049.login-form {
1050 background: var(--bg);
1051 padding: 2rem;
1052 border-radius: 8px;
1053 border: 1px solid var(--border);
1054 box-shadow: var(--shadow-sm);
1055}
1056
1057.login-form .form-group {
1058 margin-bottom: 1.5rem;
1059}
1060
1061.login-form label {
1062 display: block;
1063 margin-bottom: 0.5rem;
1064 font-weight: 500;
1065}
1066
1067.login-form input[type="text"] {
1068 width: 100%;
1069 padding: 0.75rem;
1070 border: 1px solid var(--border);
1071 border-radius: 4px;
1072 font-size: 1rem;
1073}
1074
1075.login-form input[type="text"]:focus {
1076 outline: none;
1077 border-color: var(--primary);
1078}
1079
1080.btn-large {
1081 width: 100%;
1082 padding: 0.75rem 1.5rem;
1083 font-size: 1rem;
1084 font-weight: 500;
1085}
1086
1087.login-help {
1088 text-align: center;
1089 margin-top: 2rem;
1090 color: var(--secondary);
1091}
1092
1093.login-help a {
1094 color: var(--primary);
1095 text-decoration: none;
1096}
1097
1098.login-help a:hover {
1099 text-decoration: underline;
1100}
1101
1102/* Login Typeahead */
1103.login-form .form-group {
1104 position: relative;
1105}
1106
1107.typeahead-dropdown {
1108 position: absolute;
1109 top: 100%;
1110 left: 0;
1111 right: 0;
1112 background: var(--bg);
1113 border: 1px solid var(--border);
1114 border-top: none;
1115 border-radius: 0 0 4px 4px;
1116 box-shadow: var(--shadow-md);
1117 max-height: 300px;
1118 overflow-y: auto;
1119 z-index: 1000;
1120 margin-top: -1px;
1121}
1122
1123.typeahead-header {
1124 padding: 0.5rem 0.75rem;
1125 font-size: 0.75rem;
1126 font-weight: 600;
1127 text-transform: uppercase;
1128 color: var(--secondary);
1129 border-bottom: 1px solid var(--border);
1130}
1131
1132.typeahead-item {
1133 display: flex;
1134 align-items: center;
1135 gap: 0.75rem;
1136 padding: 0.75rem;
1137 cursor: pointer;
1138 transition: background-color 0.15s ease;
1139 border-bottom: 1px solid var(--border);
1140}
1141
1142.typeahead-item:last-child {
1143 border-bottom: none;
1144}
1145
1146.typeahead-item:hover,
1147.typeahead-item.typeahead-focused {
1148 background: var(--hover-bg);
1149 border-left: 3px solid var(--primary);
1150 padding-left: calc(0.75rem - 3px);
1151}
1152
1153.typeahead-avatar {
1154 width: 32px;
1155 height: 32px;
1156 border-radius: 50%;
1157 object-fit: cover;
1158 flex-shrink: 0;
1159}
1160
1161.typeahead-text {
1162 flex: 1;
1163 min-width: 0;
1164}
1165
1166.typeahead-displayname {
1167 font-weight: 500;
1168 color: var(--text);
1169 overflow: hidden;
1170 text-overflow: ellipsis;
1171 white-space: nowrap;
1172}
1173
1174.typeahead-handle {
1175 font-size: 0.875rem;
1176 color: var(--secondary);
1177 overflow: hidden;
1178 text-overflow: ellipsis;
1179 white-space: nowrap;
1180}
1181
1182.typeahead-recent .typeahead-handle {
1183 font-size: 1rem;
1184 color: var(--text);
1185}
1186
1187.typeahead-loading {
1188 padding: 0.75rem;
1189 text-align: center;
1190 color: var(--secondary);
1191 font-size: 0.875rem;
1192}
1193
1194/* Repository Page */
1195.repository-page {
1196 /* Let container's max-width (1200px) control page width */
1197 margin: 0 auto;
1198}
1199
1200.repository-header {
1201 background: var(--bg);
1202 border: 1px solid var(--border);
1203 border-radius: 8px;
1204 padding: 2rem;
1205 margin-bottom: 2rem;
1206 box-shadow: var(--shadow-sm);
1207}
1208
1209.repo-hero {
1210 display: flex;
1211 gap: 1.5rem;
1212 align-items: flex-start;
1213 margin-bottom: 1.5rem;
1214}
1215
1216.repo-hero-icon {
1217 width: 80px;
1218 height: 80px;
1219 border-radius: 12px;
1220 object-fit: cover;
1221 flex-shrink: 0;
1222}
1223
1224.repo-hero-icon-placeholder {
1225 width: 80px;
1226 height: 80px;
1227 border-radius: 12px;
1228 background: var(--button-primary);
1229 display: flex;
1230 align-items: center;
1231 justify-content: center;
1232 font-weight: bold;
1233 font-size: 2.5rem;
1234 text-transform: uppercase;
1235 color: var(--btn-text);
1236 flex-shrink: 0;
1237}
1238
1239.repo-hero-icon-wrapper {
1240 position: relative;
1241 display: inline-block;
1242 flex-shrink: 0;
1243}
1244
1245.avatar-upload-overlay {
1246 position: absolute;
1247 inset: 0;
1248 display: flex;
1249 align-items: center;
1250 justify-content: center;
1251 background: rgba(0, 0, 0, 0.5);
1252 border-radius: 12px;
1253 opacity: 0;
1254 cursor: pointer;
1255 transition: opacity 0.2s ease;
1256}
1257
1258.avatar-upload-overlay i {
1259 color: white;
1260 width: 24px;
1261 height: 24px;
1262}
1263
1264.repo-hero-icon-wrapper:hover .avatar-upload-overlay {
1265 opacity: 1;
1266}
1267
1268.repo-hero-info {
1269 flex: 1;
1270}
1271
1272.repo-hero-info h1 {
1273 font-size: 2rem;
1274 margin: 0 0 0.5rem 0;
1275}
1276
1277.owner-link {
1278 color: var(--primary);
1279 text-decoration: none;
1280}
1281
1282.owner-link:hover {
1283 text-decoration: underline;
1284}
1285
1286.repo-separator {
1287 color: var(--border-dark);
1288 margin: 0 0.25rem;
1289}
1290
1291.repo-name {
1292 color: var(--fg);
1293}
1294
1295.repo-hero-description {
1296 color: var(--border-dark);
1297 font-size: 1.1rem;
1298 line-height: 1.5;
1299 margin: 0.5rem 0 0 0;
1300}
1301
1302.repo-info-row {
1303 display: flex;
1304 gap: 2rem;
1305 align-items: center;
1306 margin-top: 1.5rem;
1307}
1308
1309.repo-actions {
1310 flex: 0 0 auto;
1311}
1312
1313.star-btn {
1314 display: inline-flex;
1315 align-items: center;
1316 gap: 0.5rem;
1317 padding: 0.5rem 1rem;
1318 background: var(--bg);
1319 border: 2px solid var(--border);
1320 border-radius: 6px;
1321 font-size: 1rem;
1322 cursor: pointer;
1323 transition: all 0.2s ease;
1324 color: var(--fg);
1325}
1326
1327.star-btn:hover:not(:disabled) {
1328 border-color: var(--primary);
1329 background: var(--hover-bg);
1330}
1331
1332.star-btn:disabled {
1333 opacity: 0.6;
1334 cursor: not-allowed;
1335}
1336
1337.star-btn.starred {
1338 border-color: var(--star);
1339 background: var(--code-bg);
1340}
1341
1342.star-btn.starred:hover:not(:disabled) {
1343 background: var(--hover-bg);
1344}
1345
1346/* Lucide icon base styles */
1347.lucide {
1348 display: inline-block;
1349 width: 1em;
1350 height: 1em;
1351 vertical-align: middle;
1352 stroke-width: 2;
1353 transition: transform 0.2s ease;
1354}
1355
1356/* Star icon styles */
1357.star-icon {
1358 font-size: 1.25rem;
1359 line-height: 1;
1360 transition: transform 0.2s ease;
1361 color: var(--star);
1362 width: 1.25rem;
1363 height: 1.25rem;
1364 stroke: var(--star);
1365 fill: none;
1366}
1367
1368.star-icon.star-filled {
1369 fill: var(--star);
1370}
1371
1372.star-btn:hover:not(:disabled) .star-icon {
1373 transform: scale(1.1);
1374}
1375
1376.star-count {
1377 font-weight: 600;
1378 color: var(--fg);
1379}
1380
1381.repo-metadata {
1382 display: flex;
1383 gap: 1rem;
1384 align-items: center;
1385 flex-wrap: wrap;
1386 flex: 1;
1387 justify-content: flex-end;
1388}
1389
1390.metadata-badge {
1391 display: inline-flex;
1392 align-items: center;
1393 padding: 0.3rem 0.75rem;
1394 font-size: 0.85rem;
1395 font-weight: 500;
1396 border-radius: 16px;
1397 white-space: nowrap;
1398}
1399
1400.metadata-link {
1401 color: var(--primary);
1402 text-decoration: none;
1403 font-weight: 500;
1404}
1405
1406.metadata-link:hover {
1407 text-decoration: underline;
1408}
1409
1410.pull-command-section {
1411 padding-top: 1rem;
1412 border-top: 1px solid var(--border);
1413}
1414
1415.pull-command-section h3 {
1416 font-size: 1rem;
1417 margin-bottom: 0.75rem;
1418 color: var(--secondary);
1419}
1420
1421.repo-section {
1422 background: var(--bg);
1423 border: 1px solid var(--border);
1424 border-radius: 8px;
1425 padding: 1.5rem;
1426 margin-bottom: 2rem;
1427 box-shadow: var(--shadow-sm);
1428}
1429
1430.repo-section h2 {
1431 font-size: 1.5rem;
1432 margin-bottom: 1rem;
1433 padding-bottom: 0.5rem;
1434 border-bottom: 2px solid var(--border);
1435}
1436
1437.tags-list,
1438.manifests-list {
1439 display: flex;
1440 flex-direction: column;
1441 gap: 1rem;
1442}
1443
1444.tag-item,
1445.manifest-item {
1446 border: 1px solid var(--border);
1447 border-radius: 6px;
1448 padding: 1rem;
1449 background: var(--hover-bg);
1450}
1451
1452.tag-item-header,
1453.manifest-item-header {
1454 display: flex;
1455 justify-content: space-between;
1456 align-items: center;
1457 margin-bottom: 0.5rem;
1458}
1459
1460.tag-name-large {
1461 font-size: 1.2rem;
1462 font-weight: 600;
1463 color: var(--fg);
1464}
1465
1466.tag-timestamp {
1467 color: var(--border-dark);
1468 font-size: 0.9rem;
1469}
1470
1471.tag-item-details {
1472 margin-bottom: 0.75rem;
1473}
1474
1475.manifest-item-details {
1476 display: flex;
1477 gap: 0.5rem;
1478 align-items: center;
1479 color: var(--border-dark);
1480 font-size: 0.9rem;
1481 margin-top: 0.5rem;
1482}
1483
1484/* Offline manifest badge */
1485.offline-badge {
1486 display: inline-flex;
1487 align-items: center;
1488 gap: 0.35rem;
1489 padding: 0.25rem 0.5rem;
1490 background: var(--warning-bg);
1491 color: var(--warning);
1492 border: 1px solid var(--warning);
1493 border-radius: 4px;
1494 font-size: 0.85rem;
1495 font-weight: 600;
1496 margin-left: 0.5rem;
1497}
1498
1499.offline-badge .lucide {
1500 width: 0.875rem;
1501 height: 0.875rem;
1502}
1503
1504/* Checking manifest badge (health check in progress) */
1505.checking-badge {
1506 display: inline-flex;
1507 align-items: center;
1508 gap: 0.35rem;
1509 padding: 0.25rem 0.5rem;
1510 background: #e3f2fd;
1511 color: #1976d2;
1512 border: 1px solid #1976d2;
1513 border-radius: 4px;
1514 font-size: 0.85rem;
1515 font-weight: 600;
1516 margin-left: 0.5rem;
1517}
1518
1519.checking-badge .lucide {
1520 width: 0.875rem;
1521 height: 0.875rem;
1522}
1523
1524/* Hide offline manifests by default */
1525.manifest-item[data-reachable="false"] {
1526 display: none;
1527}
1528
1529/* Show offline manifests when toggle is checked */
1530.manifests-list.show-offline .manifest-item[data-reachable="false"] {
1531 display: block;
1532 opacity: 0.6;
1533}
1534
1535/* Show offline images toggle styling */
1536.show-offline-toggle {
1537 display: flex;
1538 align-items: center;
1539 gap: 0.5rem;
1540 cursor: pointer;
1541 user-select: none;
1542}
1543
1544.show-offline-toggle input[type="checkbox"] {
1545 cursor: pointer;
1546}
1547
1548.show-offline-toggle span {
1549 font-size: 0.9rem;
1550 color: var(--border-dark);
1551}
1552
1553.manifest-detail-label {
1554 font-weight: 500;
1555 color: var(--secondary);
1556}
1557
1558/* Multi-architecture badges */
1559.badge-multi {
1560 display: inline-flex;
1561 align-items: center;
1562 padding: 0.25rem 0.6rem;
1563 font-size: 0.75rem;
1564 font-weight: 600;
1565 border-radius: 12px;
1566 background: var(--button-primary);
1567 color: var(--btn-text);
1568 white-space: nowrap;
1569 margin-left: 0.5rem;
1570}
1571
1572.platform-badge {
1573 display: inline-flex;
1574 align-items: center;
1575 padding: 0.2rem 0.5rem;
1576 font-size: 0.75rem;
1577 font-weight: 500;
1578 border-radius: 4px;
1579 background: var(--code-bg);
1580 color: var(--fg);
1581 border: 1px solid var(--border);
1582 white-space: nowrap;
1583 font-family: "Monaco", "Courier New", monospace;
1584}
1585
1586.platforms-inline {
1587 display: flex;
1588 flex-wrap: wrap;
1589 gap: 0.5rem;
1590 align-items: center;
1591}
1592
1593.manifest-type {
1594 display: inline-flex;
1595 align-items: center;
1596 gap: 0.35rem;
1597 font-size: 0.9rem;
1598 font-weight: 500;
1599 color: var(--secondary);
1600}
1601
1602.manifest-type .lucide {
1603 width: 0.95rem;
1604 height: 0.95rem;
1605}
1606
1607.platform-count {
1608 color: var(--border-dark);
1609 font-size: 0.85rem;
1610 font-style: italic;
1611}
1612
1613.text-muted {
1614 color: var(--border-dark);
1615 font-style: italic;
1616}
1617
1618.badge-attestation {
1619 display: inline-flex;
1620 align-items: center;
1621 gap: 0.3rem;
1622 padding: 0.25rem 0.6rem;
1623 background: var(--attestation-badge-bg);
1624 color: var(--attestation-badge-text);
1625 border-radius: 12px;
1626 font-size: 0.75rem;
1627 font-weight: 600;
1628 margin-left: 0.5rem;
1629 vertical-align: middle;
1630 white-space: nowrap;
1631}
1632
1633.badge-attestation .lucide {
1634 width: 0.75rem;
1635 height: 0.75rem;
1636}
1637
1638/* Featured Repositories Section */
1639.featured-section {
1640 margin-bottom: 3rem;
1641}
1642
1643.featured-section h1 {
1644 font-size: 1.8rem;
1645 margin-bottom: 1.5rem;
1646}
1647
1648.featured-grid {
1649 display: grid;
1650 grid-template-columns: repeat(3, 1fr);
1651 gap: 1.5rem;
1652 margin-bottom: 2rem;
1653}
1654
1655.featured-card {
1656 border: 1px solid var(--border);
1657 border-radius: 8px;
1658 padding: 1.5rem;
1659 background: var(--bg);
1660 box-shadow: var(--shadow-sm);
1661 transition: all 0.2s ease;
1662 text-decoration: none;
1663 color: var(--fg);
1664 display: flex;
1665 flex-direction: column;
1666 justify-content: space-between;
1667 min-height: 180px;
1668}
1669
1670.featured-card:hover {
1671 box-shadow: var(--shadow-md);
1672 border-color: var(--primary);
1673 transform: translateY(-2px);
1674}
1675
1676.featured-header {
1677 display: flex;
1678 gap: 1rem;
1679 align-items: flex-start;
1680 margin-bottom: 1rem;
1681}
1682
1683.featured-icon {
1684 width: 48px;
1685 height: 48px;
1686 border-radius: 8px;
1687 object-fit: cover;
1688 flex-shrink: 0;
1689}
1690
1691.featured-icon-placeholder {
1692 width: 48px;
1693 height: 48px;
1694 border-radius: 8px;
1695 background: var(--button-primary);
1696 display: flex;
1697 align-items: center;
1698 justify-content: center;
1699 font-weight: bold;
1700 font-size: 1.5rem;
1701 text-transform: uppercase;
1702 color: var(--btn-text);
1703 flex-shrink: 0;
1704}
1705
1706.featured-info {
1707 flex: 1;
1708 min-width: 0;
1709}
1710
1711.featured-title {
1712 font-size: 1.1rem;
1713 font-weight: 600;
1714 margin-bottom: 0.5rem;
1715 line-height: 1.3;
1716}
1717
1718.featured-owner {
1719 color: var(--primary);
1720}
1721
1722.featured-separator {
1723 color: var(--border-dark);
1724 margin: 0 0.25rem;
1725}
1726
1727.featured-name {
1728 color: var(--fg);
1729}
1730
1731.featured-description {
1732 color: var(--border-dark);
1733 font-size: 0.9rem;
1734 line-height: 1.4;
1735 margin: 0;
1736 overflow: hidden;
1737 text-overflow: ellipsis;
1738 display: -webkit-box;
1739 -webkit-line-clamp: 2;
1740 -webkit-box-orient: vertical;
1741 line-clamp: 2;
1742}
1743
1744.featured-stats {
1745 display: flex;
1746 gap: 1.5rem;
1747 align-items: center;
1748 padding-top: 0.75rem;
1749 border-top: 1px solid var(--border);
1750}
1751
1752.featured-stat {
1753 display: flex;
1754 align-items: center;
1755 gap: 0.5rem;
1756 color: var(--border-dark);
1757 font-size: 0.95rem;
1758}
1759
1760.featured-stat .star-icon {
1761 color: var(--star);
1762 font-size: 1.1rem;
1763 width: 1.1rem;
1764 height: 1.1rem;
1765 stroke: var(--star);
1766 fill: none;
1767}
1768
1769.featured-stat .star-icon.star-filled {
1770 fill: var(--star);
1771}
1772
1773.featured-stat .pull-icon {
1774 color: var(--primary);
1775 font-size: 1.1rem;
1776 width: 1.1rem;
1777 height: 1.1rem;
1778 stroke: var(--primary);
1779}
1780
1781.featured-stat .stat-count {
1782 font-weight: 600;
1783 color: var(--fg);
1784}
1785
1786/* Hero Section */
1787.hero-section {
1788 background: linear-gradient(
1789 135deg,
1790 var(--hero-bg-start) 0%,
1791 var(--hero-bg-end) 100%
1792 );
1793 padding: 4rem 2rem;
1794 border-bottom: 1px solid var(--border);
1795}
1796
1797.hero-content {
1798 max-width: 900px;
1799 margin: 0 auto;
1800 text-align: center;
1801}
1802
1803.hero-title {
1804 font-size: 3rem;
1805 font-weight: 700;
1806 margin-bottom: 1.5rem;
1807 color: var(--fg);
1808 line-height: 1.2;
1809}
1810
1811.hero-subtitle {
1812 font-size: 1.2rem;
1813 color: var(--border-dark);
1814 margin-bottom: 3rem;
1815 line-height: 1.6;
1816}
1817
1818.hero-terminal {
1819 max-width: 600px;
1820 margin: 0 auto 2.5rem;
1821 background: var(--terminal-bg);
1822 border-radius: 8px;
1823 box-shadow: var(--shadow-lg);
1824 overflow: hidden;
1825}
1826
1827.terminal-header {
1828 background: var(--terminal-header-bg);
1829 padding: 0.75rem 1rem;
1830 display: flex;
1831 gap: 0.5rem;
1832 align-items: center;
1833}
1834
1835.terminal-dot {
1836 width: 12px;
1837 height: 12px;
1838 border-radius: 50%;
1839 background: var(--border-dark);
1840}
1841
1842.terminal-dot:nth-child(1) {
1843 background: #ff5f56;
1844}
1845
1846.terminal-dot:nth-child(2) {
1847 background: #ffbd2e;
1848}
1849
1850.terminal-dot:nth-child(3) {
1851 background: #27c93f;
1852}
1853
1854.terminal-content {
1855 padding: 1.5rem;
1856 margin: 0;
1857 font-family: "Monaco", "Courier New", monospace;
1858 font-size: 0.95rem;
1859 line-height: 1.8;
1860 color: var(--terminal-text);
1861 overflow-x: auto;
1862}
1863
1864.terminal-prompt {
1865 color: var(--terminal-prompt);
1866 font-weight: bold;
1867}
1868
1869.terminal-comment {
1870 color: var(--terminal-comment);
1871 font-style: italic;
1872}
1873
1874.hero-actions {
1875 display: flex;
1876 gap: 1rem;
1877 justify-content: center;
1878 margin-bottom: 4rem;
1879}
1880
1881.btn-hero-primary,
1882.btn-hero-secondary {
1883 padding: 0.9rem 2rem;
1884 font-size: 1.1rem;
1885 font-weight: 600;
1886 border-radius: 6px;
1887 text-decoration: none;
1888 transition: all 0.2s ease;
1889 display: inline-block;
1890}
1891
1892.btn-hero-primary {
1893 background: var(--button-primary);
1894 color: var(--btn-text);
1895 border: 2px solid var(--button-primary);
1896}
1897
1898.btn-hero-primary:hover {
1899 background: var(--primary-dark);
1900 border-color: var(--primary-dark);
1901 transform: translateY(-2px);
1902 box-shadow: 0 4px 12px rgba(0, 102, 204, 0.3);
1903}
1904
1905.btn-hero-secondary {
1906 background: transparent;
1907 color: var(--primary);
1908 border: 2px solid var(--button-primary);
1909}
1910
1911.btn-hero-secondary:hover {
1912 background: var(--button-primary);
1913 color: var(--btn-text);
1914 transform: translateY(-2px);
1915}
1916
1917.hero-benefits {
1918 max-width: 1000px;
1919 margin: 0 auto;
1920 display: grid;
1921 grid-template-columns: repeat(3, 1fr);
1922 gap: 2rem;
1923}
1924
1925.benefit-card {
1926 background: var(--bg);
1927 border: 1px solid var(--border);
1928 border-radius: 8px;
1929 padding: 2rem 1.5rem;
1930 text-align: center;
1931 transition: all 0.2s ease;
1932}
1933
1934.benefit-card:hover {
1935 border-color: var(--primary);
1936 box-shadow: var(--shadow-md);
1937 transform: translateY(-4px);
1938}
1939
1940.benefit-icon {
1941 font-size: 3rem;
1942 margin-bottom: 1rem;
1943 line-height: 1;
1944}
1945
1946.benefit-icon .lucide {
1947 width: 3rem;
1948 height: 3rem;
1949 stroke-width: 1.5;
1950 color: var(--primary);
1951 stroke: var(--primary);
1952}
1953
1954.benefit-card h3 {
1955 font-size: 1.2rem;
1956 margin-bottom: 0.75rem;
1957 color: var(--fg);
1958}
1959
1960.benefit-card p {
1961 color: var(--border-dark);
1962 font-size: 0.95rem;
1963 line-height: 1.5;
1964 margin: 0;
1965}
1966
1967/* Install Page */
1968.install-page {
1969 max-width: 800px;
1970 margin: 0 auto;
1971 padding: 2rem 1rem;
1972}
1973
1974.install-section {
1975 margin: 2rem 0;
1976}
1977
1978.install-section h2 {
1979 margin-bottom: 1rem;
1980 color: var(--fg);
1981}
1982
1983.install-section h3 {
1984 margin: 1.5rem 0 0.5rem;
1985 color: var(--border-dark);
1986 font-size: 1.1rem;
1987}
1988
1989.install-section a {
1990 color: var(--primary);
1991 text-decoration: underline;
1992 font-weight: 500;
1993}
1994
1995.install-section a:hover {
1996 color: var(--primary-dark);
1997}
1998
1999.install-section a:visited {
2000 color: var(--primary);
2001}
2002
2003.code-block {
2004 background: var(--code-bg);
2005 border: 1px solid var(--border);
2006 border-radius: 4px;
2007 padding: 1rem;
2008 margin: 0.5rem 0 1rem;
2009 overflow-x: auto;
2010}
2011
2012.code-block code {
2013 font-family: "Monaco", "Menlo", monospace;
2014 font-size: 0.9rem;
2015 line-height: 1.5;
2016 white-space: pre-wrap;
2017}
2018
2019.platform-tabs {
2020 display: flex;
2021 gap: 0.5rem;
2022 border-bottom: 2px solid var(--border);
2023 margin-bottom: 1rem;
2024}
2025
2026.platform-tab {
2027 padding: 0.5rem 1rem;
2028 cursor: pointer;
2029 border: none;
2030 background: none;
2031 font-size: 1rem;
2032 color: var(--border-dark);
2033 transition: all 0.2s;
2034}
2035
2036.platform-tab:hover {
2037 color: var(--fg);
2038}
2039
2040.platform-tab.active {
2041 color: var(--primary);
2042 border-bottom: 2px solid var(--primary);
2043 margin-bottom: -2px;
2044}
2045
2046.platform-content {
2047 display: none;
2048}
2049
2050.platform-content.active {
2051 display: block;
2052}
2053
2054/* Responsive */
2055@media (max-width: 768px) {
2056 .navbar {
2057 flex-direction: column;
2058 gap: 1rem;
2059 }
2060
2061 .nav-search {
2062 max-width: 100%;
2063 margin: 0;
2064 }
2065
2066 .push-details {
2067 flex-wrap: wrap;
2068 }
2069
2070 .tag-row,
2071 .manifest-row {
2072 flex-wrap: wrap;
2073 }
2074
2075 .login-page {
2076 margin: 2rem auto;
2077 padding: 1rem;
2078 }
2079
2080 .repo-hero {
2081 flex-direction: column;
2082 }
2083
2084 .repo-hero-info h1 {
2085 font-size: 1.5rem;
2086 }
2087
2088 .tag-item-header {
2089 flex-direction: column;
2090 align-items: flex-start;
2091 gap: 0.5rem;
2092 }
2093
2094 .manifest-item-details {
2095 flex-direction: column;
2096 align-items: flex-start;
2097 }
2098
2099 .featured-grid {
2100 grid-template-columns: 1fr;
2101 gap: 1rem;
2102 }
2103
2104 .featured-card {
2105 min-height: auto;
2106 }
2107
2108 .hero-section {
2109 padding: 3rem 1.5rem;
2110 }
2111
2112 .hero-title {
2113 font-size: 2rem;
2114 }
2115
2116 .hero-subtitle {
2117 font-size: 1rem;
2118 margin-bottom: 2rem;
2119 }
2120
2121 .hero-terminal {
2122 margin-bottom: 2rem;
2123 }
2124
2125 .terminal-content {
2126 font-size: 0.85rem;
2127 padding: 1rem;
2128 }
2129
2130 .hero-actions {
2131 flex-direction: column;
2132 margin-bottom: 3rem;
2133 }
2134
2135 .btn-hero-primary,
2136 .btn-hero-secondary {
2137 width: 100%;
2138 text-align: center;
2139 }
2140
2141 .hero-benefits {
2142 grid-template-columns: 1fr;
2143 gap: 1.5rem;
2144 }
2145}
2146
2147@media (max-width: 1024px) and (min-width: 769px) {
2148 .featured-grid {
2149 grid-template-columns: repeat(2, 1fr);
2150 }
2151
2152 .hero-benefits {
2153 grid-template-columns: repeat(3, 1fr);
2154 }
2155}
2156
2157/* README and Repository Layout */
2158.repo-content-layout {
2159 display: grid;
2160 grid-template-columns: 6fr 4fr;
2161 gap: 2rem;
2162 margin-top: 2rem;
2163}
2164
2165.readme-section {
2166 background: var(--bg);
2167 border: 1px solid var(--border);
2168 border-radius: 8px;
2169 padding: 2rem;
2170 min-width: 0;
2171 box-sizing: border-box;
2172}
2173
2174.readme-section h2 {
2175 margin-bottom: 1.5rem;
2176 padding-bottom: 0.5rem;
2177 border-bottom: 2px solid var(--border);
2178}
2179
2180.readme-content {
2181 overflow-wrap: break-word;
2182 max-width: 100%;
2183 box-sizing: border-box;
2184}
2185
2186.repo-sidebar {
2187 display: flex;
2188 flex-direction: column;
2189 gap: 1.5rem;
2190}
2191
2192/* Markdown Styling */
2193.markdown-body {
2194 font-size: 1rem;
2195 line-height: 1.6;
2196 word-wrap: break-word;
2197}
2198
2199.markdown-body h1,
2200.markdown-body h2,
2201.markdown-body h3,
2202.markdown-body h4,
2203.markdown-body h5,
2204.markdown-body h6 {
2205 margin-top: 1.5rem;
2206 margin-bottom: 1rem;
2207 font-weight: 600;
2208 line-height: 1.25;
2209}
2210
2211.markdown-body h1 {
2212 font-size: 2rem;
2213 border-bottom: 1px solid var(--border);
2214 padding-bottom: 0.3rem;
2215}
2216
2217.markdown-body h2 {
2218 font-size: 1.5rem;
2219 border-bottom: 1px solid var(--border);
2220 padding-bottom: 0.3rem;
2221}
2222
2223.markdown-body h3 {
2224 font-size: 1.25rem;
2225}
2226
2227.markdown-body h4 {
2228 font-size: 1rem;
2229}
2230
2231.markdown-body h5 {
2232 font-size: 0.875rem;
2233}
2234
2235.markdown-body h6 {
2236 font-size: 0.85rem;
2237 color: var(--secondary);
2238}
2239
2240.markdown-body p {
2241 margin-bottom: 1rem;
2242}
2243
2244.markdown-body ul,
2245.markdown-body ol {
2246 margin-bottom: 1rem;
2247 padding-left: 2rem;
2248}
2249
2250.markdown-body li {
2251 margin-bottom: 0.25rem;
2252}
2253
2254.markdown-body li > p {
2255 margin-bottom: 0.5rem;
2256}
2257
2258.markdown-body a {
2259 color: var(--primary);
2260 text-decoration: none;
2261}
2262
2263.markdown-body a:hover {
2264 text-decoration: underline;
2265}
2266
2267.markdown-body code {
2268 background: var(--code-bg);
2269 padding: 0.2rem 0.4rem;
2270 border-radius: 3px;
2271 font-family:
2272 "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
2273 font-size: 0.9em;
2274}
2275
2276.markdown-body pre {
2277 background: var(--code-bg);
2278 padding: 1rem;
2279 border-radius: 6px;
2280 overflow-x: auto;
2281 margin-bottom: 1rem;
2282 max-width: 100%;
2283 box-sizing: border-box;
2284}
2285
2286.markdown-body pre code {
2287 background: none;
2288 padding: 0;
2289 font-size: 0.875rem;
2290}
2291
2292.markdown-body blockquote {
2293 padding: 0 1rem;
2294 margin-bottom: 1rem;
2295 color: var(--secondary);
2296 border-left: 4px solid var(--border);
2297}
2298
2299.markdown-body table {
2300 border-collapse: collapse;
2301 width: 100%;
2302 margin-bottom: 1rem;
2303}
2304
2305.markdown-body table th,
2306.markdown-body table td {
2307 padding: 0.5rem 1rem;
2308 border: 1px solid var(--border);
2309 text-align: left;
2310}
2311
2312.markdown-body table th {
2313 background: var(--code-bg);
2314 font-weight: 600;
2315}
2316
2317.markdown-body table tr:nth-child(even) {
2318 background: var(--hover-bg);
2319}
2320
2321.markdown-body img {
2322 max-width: 100%;
2323 height: auto;
2324 margin: 1rem 0;
2325}
2326
2327.markdown-body hr {
2328 height: 0.25rem;
2329 margin: 1.5rem 0;
2330 background: var(--border);
2331 border: 0;
2332}
2333
2334/* Task lists */
2335.markdown-body input[type="checkbox"] {
2336 margin-right: 0.5rem;
2337}
2338
2339.markdown-body .task-list-item {
2340 list-style-type: none;
2341}
2342
2343.markdown-body .task-list-item input {
2344 margin: 0 0.2rem 0.25rem -1.6rem;
2345 vertical-align: middle;
2346}
2347
2348/* Responsive Layout */
2349@media (max-width: 1024px) {
2350 .repo-content-layout {
2351 grid-template-columns: 1fr;
2352 }
2353
2354 .repo-sidebar {
2355 order: -1; /* Show sidebar first on mobile */
2356 }
2357}
2358
2359@media (max-width: 768px) {
2360 .readme-section {
2361 padding: 1rem;
2362 }
2363
2364 .markdown-body h1 {
2365 font-size: 1.5rem;
2366 }
2367
2368 .markdown-body h2 {
2369 font-size: 1.25rem;
2370 }
2371
2372 .markdown-body pre {
2373 padding: 0.75rem;
2374 }
2375}
2376
2377/* 404 Error Page */
2378.error-page {
2379 display: flex;
2380 align-items: center;
2381 justify-content: center;
2382 min-height: calc(100vh - 60px);
2383 text-align: center;
2384 padding: 2rem;
2385}
2386
2387.error-content {
2388 max-width: 480px;
2389}
2390
2391.error-icon {
2392 width: 80px;
2393 height: 80px;
2394 color: var(--secondary);
2395 margin-bottom: 1.5rem;
2396}
2397
2398.error-code {
2399 font-size: 8rem;
2400 font-weight: 700;
2401 color: var(--primary);
2402 line-height: 1;
2403 margin-bottom: 0.5rem;
2404}
2405
2406.error-content h1 {
2407 font-size: 2rem;
2408 margin-bottom: 0.75rem;
2409 color: var(--fg);
2410}
2411
2412.error-content p {
2413 font-size: 1.125rem;
2414 color: var(--secondary);
2415 margin-bottom: 2rem;
2416}
2417
2418@media (max-width: 768px) {
2419 .error-code {
2420 font-size: 5rem;
2421 }
2422
2423 .error-icon {
2424 width: 60px;
2425 height: 60px;
2426 }
2427
2428 .error-content h1 {
2429 font-size: 1.5rem;
2430 }
2431}
2432
2433/* Artifact type badges */
2434.artifact-badge {
2435 display: inline-flex;
2436 align-items: center;
2437 justify-content: center;
2438 padding: 0.15rem 0.35rem;
2439 border-radius: 4px;
2440 font-size: 0.7rem;
2441 font-weight: 500;
2442 margin-left: 0.5rem;
2443 vertical-align: middle;
2444}
2445
2446.artifact-badge.helm {
2447 background-color: rgba(13, 108, 191, 0.15);
2448 color: #0d6cbf;
2449}
2450
2451.artifact-badge i {
2452 width: 12px;
2453 height: 12px;
2454}
2455
2456.manifest-type.helm {
2457 background-color: rgba(13, 108, 191, 0.15);
2458 color: #0d6cbf;
2459}