1* { 2 margin: 0; 3 padding: 0; 4 box-sizing: border-box; 5} 6 7:root { 8 /* Light theme colors */ 9 --bg-primary: #f9fafb; 10 --bg-secondary: #ffffff; 11 --bg-tertiary: #f3f4f6; 12 --bg-hover: #f3f4f6; 13 --bg-active: #dbeafe; 14 15 --text-primary: #111827; 16 --text-secondary: #4b5563; 17 --text-tertiary: #6b7280; 18 --text-heading: #111827; 19 20 --border-primary: #e5e7eb; 21 --border-secondary: #d1d5db; 22 --border-light: #f3f4f6; 23 24 --accent-primary: #3b82f6; 25 --accent-hover: #2563eb; 26 --accent-light: #dbeafe; 27 28 --success-bg: #dcfce7; 29 --success-text: #166534; 30 --success-border: #bbf7d0; 31 32 --error-bg: #fee2e2; 33 --error-text: #991b1b; 34 --error-border: #fecaca; 35 36 --code-bg: #f3f4f6; 37 --code-text: #111827; 38 --code-block-bg: #1f2937; 39 --code-block-text: #e5e7eb; 40 --code-block-border: #374151; 41 --code-block-line-numbers: #9ca3af; 42 43 --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05); 44 --shadow-md: 45 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); 46} 47 48body.dark-theme { 49 /* Dark theme colors */ 50 --bg-primary: #111827; 51 --bg-secondary: #1f2937; 52 --bg-tertiary: #374151; 53 --bg-hover: #374151; 54 --bg-active: #1e3a8a; 55 56 --text-primary: #f3f4f6; 57 --text-secondary: #d1d5db; 58 --text-tertiary: #9ca3af; 59 --text-heading: #ffffff; 60 61 --border-primary: #374151; 62 --border-secondary: #4b5563; 63 --border-light: #374151; 64 65 --accent-primary: #3b82f6; 66 --accent-hover: #60a5fa; 67 --accent-light: #1e3a8a; 68 69 --success-bg: #14532d; 70 --success-text: #86efac; 71 --success-border: #166534; 72 73 --error-bg: #7f1d1d; 74 --error-text: #fecaca; 75 --error-border: #991b1b; 76 77 --code-bg: #374151; 78 --code-text: #d1d5db; 79 --code-block-bg: #1f2937; 80 --code-block-text: #e5e7eb; 81 --code-block-border: #4b5563; 82 --code-block-line-numbers: #9ca3af; 83 84 --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.3); 85 --shadow-md: 86 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.4); 87} 88 89body { 90 font-family: InterVariable, system-ui, sans-serif, ui-sans-serif; 91 background: var(--bg-primary); 92 color: var(--text-primary); 93 font-size: 14px; 94 line-height: 1.5; 95 transition: 96 background-color 0.3s ease, 97 color 0.3s ease; 98} 99 100.container { 101 max-width: 1400px; 102 margin: 0 auto; 103 padding: 20px; 104} 105 106header { 107 background: var(--bg-secondary); 108 padding: 24px; 109 border-radius: 8px; 110 box-shadow: var(--shadow-md); 111 margin-bottom: 20px; 112 border: 1px solid var(--border-primary); 113} 114 115.header-top { 116 display: flex; 117 justify-content: space-between; 118 align-items: center; 119 margin-bottom: 20px; 120} 121 122h1 { 123 font-size: 24px; 124 margin: 0; 125 color: var(--text-heading); 126 font-weight: 600; 127} 128 129.theme-toggle { 130 background: var(--bg-tertiary); 131 border: 1px solid var(--border-primary); 132 color: var(--text-primary); 133 padding: 8px 16px; 134 border-radius: 6px; 135 cursor: pointer; 136 font-size: 14px; 137 display: flex; 138 align-items: center; 139 gap: 8px; 140 transition: all 0.15s; 141} 142 143.theme-toggle:hover { 144 background: var(--bg-hover); 145 border-color: var(--border-secondary); 146} 147 148.connection-panel { 149 display: flex; 150 gap: 12px; 151 margin-bottom: 12px; 152 flex-wrap: wrap; 153} 154 155.connection-panel input { 156 flex: 1; 157 min-width: 300px; 158 padding: 10px 14px; 159 border: 1px solid var(--border-secondary); 160 border-radius: 6px; 161 font-size: 14px; 162 background: var(--bg-secondary); 163 color: var(--text-primary); 164 transition: all 0.15s; 165} 166 167.connection-panel input:focus { 168 outline: none; 169 border-color: var(--accent-primary); 170 box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); 171} 172 173button { 174 padding: 10px 20px; 175 background: var(--accent-primary); 176 color: white; 177 border: none; 178 border-radius: 6px; 179 cursor: pointer; 180 font-size: 14px; 181 font-weight: 500; 182 transition: all 0.15s; 183 box-shadow: var(--shadow-sm); 184} 185 186button:hover { 187 background: var(--accent-hover); 188} 189 190button:active { 191 transform: translateY(1px); 192} 193 194button:disabled { 195 background: var(--text-tertiary); 196 cursor: not-allowed; 197 transform: none; 198} 199 200button.secondary { 201 background: var(--bg-secondary); 202 color: var(--text-secondary); 203 border: 1px solid var(--border-secondary); 204} 205 206button.secondary:hover { 207 background: var(--bg-hover); 208} 209 210.status { 211 padding: 10px 14px; 212 border-radius: 6px; 213 font-size: 13px; 214 display: none; 215 border: 1px solid transparent; 216} 217 218.status.success { 219 background: var(--success-bg); 220 color: var(--success-text); 221 border-color: var(--success-border); 222} 223 224.status.error { 225 background: var(--error-bg); 226 color: var(--error-text); 227 border-color: var(--error-border); 228} 229 230.main-content { 231 display: flex; 232 gap: 20px; 233 align-items: flex-start; 234} 235 236.sidebar { 237 width: 300px; 238 background: var(--bg-secondary); 239 border-radius: 8px; 240 border: 1px solid var(--border-primary); 241 box-shadow: var(--shadow-md); 242 flex-shrink: 0; 243} 244 245.sidebar h2 { 246 font-size: 16px; 247 font-weight: 600; 248 padding: 16px 20px; 249 border-bottom: 1px solid var(--border-primary); 250 color: var(--text-heading); 251 display: flex; 252 align-items: center; 253 justify-content: space-between; 254} 255 256.repo-info { 257 padding: 20px; 258} 259 260.repo-info h3 { 261 font-size: 14px; 262 font-weight: 600; 263 margin-bottom: 12px; 264 color: var(--text-tertiary); 265} 266 267.repo-info .label { 268 font-size: 12px; 269 color: var(--text-tertiary); 270 margin-bottom: 4px; 271 font-weight: 500; 272 text-transform: uppercase; 273 letter-spacing: 0.5px; 274} 275 276.repo-info .value { 277 font-size: 13px; 278 color: var(--text-primary); 279 margin-bottom: 12px; 280 font-family: IBMPlexMono, ui-monospace, monospace; 281} 282 283.clone-url { 284 display: flex; 285 align-items: center; 286 gap: 8px; 287 background: var(--bg-tertiary); 288 padding: 8px 12px; 289 border-radius: 6px; 290 border: 1px solid var(--border-primary); 291 margin-bottom: 12px; 292} 293 294.clone-url code { 295 flex: 1; 296 font-size: 12px; 297 color: var(--text-secondary); 298 overflow: hidden; 299 text-overflow: ellipsis; 300} 301 302.copy-btn { 303 padding: 4px 8px; 304 font-size: 11px; 305 min-width: 50px; 306} 307 308.copy-btn:hover { 309 background: var(--accent-hover); 310} 311 312.branches-section { 313 border-top: 1px solid var(--border-primary); 314} 315 316.branch-list { 317 max-height: 300px; 318 overflow-y: auto; 319} 320 321.branch-item { 322 padding: 10px 20px; 323 cursor: pointer; 324 transition: background 0.15s; 325 border-bottom: 1px solid var(--border-light); 326 font-size: 13px; 327 color: var(--text-secondary); 328 display: flex; 329 align-items: center; 330 gap: 8px; 331} 332 333.branch-item:hover { 334 background: var(--bg-hover); 335} 336 337.branch-item.active { 338 background: var(--accent-light); 339 color: var(--accent-primary); 340 font-weight: 500; 341} 342 343.viewer { 344 flex: 1; 345 background: var(--bg-secondary); 346 border-radius: 8px; 347 border: 1px solid var(--border-primary); 348 box-shadow: var(--shadow-md); 349 overflow: hidden; 350} 351 352.breadcrumb { 353 padding: 16px 20px; 354 border-bottom: 1px solid var(--border-primary); 355 font-size: 13px; 356 color: var(--text-tertiary); 357 background: var(--bg-tertiary); 358 display: flex; 359 align-items: center; 360 flex-wrap: wrap; 361} 362 363.breadcrumb a { 364 color: var(--accent-primary); 365 text-decoration: none; 366 transition: color 0.15s; 367 cursor: pointer; 368} 369 370.breadcrumb a:hover { 371 color: var(--accent-hover); 372 text-decoration: underline; 373} 374 375.breadcrumb span { 376 margin: 0 8px; 377} 378 379.breadcrumb .current { 380 color: var(--text-primary); 381 font-weight: 500; 382} 383 384.file-list { 385 padding: 0; 386 list-style: none; 387 margin: 0; 388} 389 390.file-item { 391 padding: 12px 20px; 392 display: flex; 393 align-items: center; 394 gap: 12px; 395 border-bottom: 1px solid var(--border-light); 396 cursor: pointer !important; 397} 398 399.file-item:last-child { 400 border-bottom: none; 401} 402 403.file-item:hover { 404 background: var(--bg-hover); 405} 406 407.file-icon { 408 width: 20px; 409 height: 20px; 410 flex-shrink: 0; 411 color: var(--text-tertiary); 412 cursor: pointer; 413} 414 415.file-name { 416 flex: 1; 417 color: var(--text-primary); 418 font-size: 14px; 419 cursor: pointer; 420} 421 422.file-size { 423 color: var(--text-tertiary); 424 font-size: 12px; 425 cursor: pointer; 426} 427 428.file-content { 429 padding: 0; 430 overflow-x: auto; 431 background: var(--code-block-bg); 432 font-family: IBMPlexMono, Monaco, Menlo, monospace; 433 font-size: 13px; 434} 435 436.file-content pre { 437 margin: 0; 438 white-space: pre; 439 background: transparent; 440 padding: 20px; 441} 442 443.file-content code { 444 background: transparent; 445} 446 447.file-content code.hljs { 448 padding: 0; 449 background: transparent; 450} 451 452.line-numbers { 453 display: flex; 454 gap: 0; 455 background: var(--code-block-bg); 456} 457 458.line-numbers .numbers { 459 color: var(--code-block-line-numbers); 460 text-align: right; 461 user-select: none; 462 min-width: 50px; 463 padding: 20px 16px 20px 20px; 464 border-right: 1px solid var(--code-block-border); 465 background: var(--code-block-bg); 466 line-height: 1.5; 467} 468 469.line-numbers pre:not(.numbers) { 470 flex: 1; 471 padding-left: 20px; 472} 473 474.loading { 475 padding: 40px; 476 text-align: center; 477 color: var(--text-tertiary); 478} 479 480.spinner { 481 width: 40px; 482 height: 40px; 483 margin: 0 auto 16px; 484 border: 3px solid var(--border-primary); 485 border-top-color: var(--accent-primary); 486 border-radius: 50%; 487 animation: spin 0.8s linear infinite; 488} 489 490@keyframes spin { 491 to { 492 transform: rotate(360deg); 493 } 494} 495 496.empty-state { 497 padding: 60px 40px; 498 text-align: center; 499} 500 501.empty-state svg { 502 width: 64px; 503 height: 64px; 504 margin: 0 auto 20px; 505 color: var(--text-tertiary); 506 display: block; 507} 508 509.empty-state h3 { 510 font-size: 18px; 511 color: var(--text-secondary); 512 margin-bottom: 8px; 513} 514 515.empty-state p { 516 color: var(--text-tertiary); 517 font-size: 14px; 518} 519 520.welcome-hero { 521 padding: 80px 40px; 522 text-align: center; 523 max-width: 700px; 524 margin: 0 auto; 525} 526 527.welcome-hero svg { 528 width: 96px; 529 height: 96px; 530 margin: 0 auto 32px; 531 color: var(--accent-primary); 532 display: block; 533} 534 535.welcome-hero h2 { 536 font-size: 32px; 537 color: var(--text-heading); 538 margin-bottom: 16px; 539 font-weight: 700; 540} 541 542.welcome-hero .subtitle { 543 font-size: 18px; 544 color: var(--text-secondary); 545 margin-bottom: 48px; 546 line-height: 1.6; 547} 548 549.feature-list { 550 display: grid; 551 grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); 552 gap: 24px; 553 margin-top: 48px; 554 text-align: left; 555} 556 557.feature-item { 558 padding: 20px; 559 background: var(--bg-tertiary); 560 border-radius: 8px; 561 border: 1px solid var(--border-primary); 562} 563 564.feature-item h4 { 565 font-size: 16px; 566 color: var(--text-heading); 567 margin-bottom: 8px; 568 display: flex; 569 align-items: center; 570 gap: 8px; 571} 572 573.feature-item p { 574 font-size: 14px; 575 color: var(--text-tertiary); 576 line-height: 1.5; 577 margin: 0; 578} 579 580.getting-started { 581 margin-top: 48px; 582 padding: 24px; 583 background: var(--bg-tertiary); 584 border-radius: 8px; 585 border: 1px solid var(--border-primary); 586 text-align: left; 587} 588 589.getting-started h3 { 590 font-size: 18px; 591 color: var(--text-heading); 592 margin-bottom: 16px; 593} 594 595.getting-started ol { 596 margin-left: 20px; 597 color: var(--text-secondary); 598} 599 600.getting-started li { 601 margin-bottom: 8px; 602 line-height: 1.6; 603} 604 605.error-message { 606 padding: 40px; 607 text-align: center; 608 color: var(--error-text); 609 background: var(--error-bg); 610 margin: 20px; 611 border-radius: 8px; 612 border: 1px solid var(--error-border); 613} 614 615.file-header { 616 padding: 16px 20px; 617 border-bottom: 1px solid var(--border-primary); 618 background: var(--bg-tertiary); 619 display: flex; 620 justify-content: space-between; 621 align-items: center; 622} 623 624.file-header h3 { 625 font-size: 15px; 626 color: var(--text-primary); 627 font-weight: 600; 628} 629 630.file-actions { 631 display: flex; 632 gap: 8px; 633} 634 635.file-actions button { 636 padding: 6px 12px; 637 font-size: 12px; 638} 639 640.user-item { 641 margin-bottom: 24px; 642} 643 644.user-header { 645 font-size: 16px; 646 font-weight: 600; 647 color: var(--text-heading); 648 margin-bottom: 12px; 649 padding: 12px; 650 background: var(--bg-tertiary); 651 border-radius: 6px; 652} 653 654.repo-item { 655 padding: 12px; 656 margin-bottom: 8px; 657 background: var(--bg-secondary); 658 border: 1px solid var(--border-primary); 659 border-radius: 6px; 660 cursor: pointer; 661 transition: all 0.15s; 662} 663 664.repo-item:hover { 665 border-color: var(--accent-primary); 666 box-shadow: 0 2px 4px rgba(59, 130, 246, 0.1); 667} 668 669.repo-item strong { 670 display: block; 671 font-size: 14px; 672 color: var(--text-primary); 673 margin-bottom: 4px; 674} 675 676.repo-item small { 677 font-size: 12px; 678 color: var(--text-tertiary); 679 font-family: IBMPlexMono, monospace; 680} 681 682.markdown-content { 683 padding: 20px 40px; 684 background: var(--bg-secondary); 685 font-family: InterVariable, system-ui, sans-serif; 686 font-size: 15px; 687 line-height: 1.6; 688 color: var(--text-primary); 689} 690 691.markdown-content h1, 692.markdown-content h2, 693.markdown-content h3, 694.markdown-content h4, 695.markdown-content h5, 696.markdown-content h6 { 697 margin-top: 24px; 698 margin-bottom: 16px; 699 font-weight: 600; 700 line-height: 1.25; 701 color: var(--text-heading); 702} 703 704.markdown-content h1 { 705 font-size: 2em; 706 padding-bottom: 0.3em; 707 border-bottom: 1px solid var(--border-primary); 708} 709 710.markdown-content h2 { 711 font-size: 1.5em; 712 padding-bottom: 0.3em; 713 border-bottom: 1px solid var(--border-primary); 714} 715 716.markdown-content h3 { 717 font-size: 1.25em; 718} 719 720.markdown-content h4 { 721 font-size: 1em; 722} 723 724.markdown-content h5 { 725 font-size: 0.875em; 726} 727 728.markdown-content h6 { 729 font-size: 0.85em; 730 color: var(--text-tertiary); 731} 732 733.markdown-content p { 734 margin-top: 0; 735 margin-bottom: 16px; 736} 737 738.markdown-content ul, 739.markdown-content ol { 740 margin-top: 0; 741 margin-bottom: 16px; 742 padding-left: 2em; 743} 744 745.markdown-content li + li { 746 margin-top: 0.25em; 747} 748 749.markdown-content code { 750 padding: 0.2em 0.4em; 751 margin: 0; 752 font-size: 85%; 753 background: var(--code-bg); 754 border-radius: 6px; 755 font-family: IBMPlexMono, Monaco, Menlo, monospace; 756 color: var(--code-text); 757} 758 759.markdown-content pre { 760 padding: 16px; 761 overflow: auto; 762 font-size: 85%; 763 line-height: 1.45; 764 background: var(--code-block-bg); 765 border-radius: 6px; 766 margin-bottom: 16px; 767} 768 769.markdown-content pre code { 770 display: block; 771 padding: 0; 772 margin: 0; 773 overflow: visible; 774 line-height: inherit; 775 word-wrap: normal; 776 background: transparent; 777 border: 0; 778 color: var(--code-block-text); 779} 780 781.markdown-content pre code.hljs { 782 background: transparent; 783} 784 785.markdown-content blockquote { 786 padding: 0 1em; 787 color: var(--text-tertiary); 788 border-left: 0.25em solid var(--border-secondary); 789 margin: 0 0 16px 0; 790} 791 792.markdown-content blockquote > :first-child { 793 margin-top: 0; 794} 795 796.markdown-content blockquote > :last-child { 797 margin-bottom: 0; 798} 799 800.markdown-content table { 801 border-spacing: 0; 802 border-collapse: collapse; 803 margin-bottom: 16px; 804 width: 100%; 805 overflow: auto; 806} 807 808.markdown-content table th, 809.markdown-content table td { 810 padding: 6px 13px; 811 border: 1px solid var(--border-primary); 812} 813 814.markdown-content table th { 815 font-weight: 600; 816 background: var(--bg-tertiary); 817} 818 819.markdown-content table tr { 820 background: var(--bg-secondary); 821 border-top: 1px solid var(--border-primary); 822} 823 824.markdown-content table tr:nth-child(2n) { 825 background: var(--bg-tertiary); 826} 827 828.markdown-content img { 829 max-width: 100%; 830 box-sizing: border-box; 831 border-radius: 6px; 832} 833 834.markdown-content a { 835 color: var(--accent-primary); 836 text-decoration: none; 837} 838 839.markdown-content a:hover { 840 text-decoration: underline; 841} 842 843.markdown-content hr { 844 height: 0.25em; 845 padding: 0; 846 margin: 24px 0; 847 background-color: var(--border-primary); 848 border: 0; 849} 850 851@media (max-width: 768px) { 852 .main-content { 853 flex-direction: column; 854 } 855 856 .sidebar { 857 width: 100%; 858 } 859 860 .connection-panel { 861 flex-direction: column; 862 } 863 864 .connection-panel input { 865 min-width: 100%; 866 } 867 868 .markdown-content { 869 padding: 20px; 870 } 871 872 .welcome-hero { 873 padding: 40px 20px; 874 } 875}