A container registry that uses the AT Protocol for manifest storage and S3 for blob storage.
at codeberg-source 2459 lines 44 kB view raw
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}