The codebase that powers boop.cat boop.cat
at main 78 kB view raw
1.compatCard { 2 margin-top: 12px; 3 padding: 16px; 4 border-radius: 18px; 5 background: rgba(255, 255, 255, 0.82); 6 border: 1px solid rgba(232, 137, 120, 0.18); 7 box-shadow: 0 8px 18px rgba(45, 20, 15, 0.12); 8} 9 10[data-theme='dark'] .compatCard { 11 background: rgba(12, 18, 32, 0.88); 12 border-color: rgba(255, 255, 255, 0.08); 13 box-shadow: 0 10px 22px rgba(0, 0, 0, 0.45); 14} 15 16.compatHint { 17 font-size: 13px; 18 color: var(--muted); 19} 20 21[data-theme='dark'] .compatHint { 22 color: rgba(226, 232, 240, 0.7); 23} 24 25.compatBadgeRow { 26 display: flex; 27 align-items: center; 28 gap: 12px; 29 margin-bottom: 6px; 30} 31 32.compatBadge { 33 padding: 4px 12px; 34 border-radius: 999px; 35 font-size: 12px; 36 font-weight: 600; 37 background: rgba(34, 197, 94, 0.16); 38 color: #166534; 39} 40 41.compatBadge.warn { 42 background: rgba(248, 113, 113, 0.2); 43 color: #b91c1c; 44} 45 46[data-theme='dark'] .compatBadge { 47 background: rgba(34, 197, 94, 0.22); 48 color: #bbf7d0; 49} 50 51[data-theme='dark'] .compatBadge.warn { 52 background: rgba(248, 113, 113, 0.25); 53 color: #fecaca; 54} 55 56.compatStatus { 57 font-size: 13px; 58 color: var(--muted); 59} 60 61[data-theme='dark'] .compatStatus { 62 color: rgba(226, 232, 240, 0.65); 63} 64 65.compatHeadline { 66 font-size: 14px; 67 font-weight: 600; 68 margin-bottom: 8px; 69 color: var(--card-text); 70} 71 72[data-theme='dark'] .compatHeadline { 73 color: var(--card-text-light); 74} 75 76.compatSuggestion { 77 font-size: 13px; 78 padding: 8px 10px; 79 border-radius: 10px; 80 background: rgba(248, 113, 113, 0.12); 81 color: #b91c1c; 82 margin-bottom: 8px; 83} 84 85[data-theme='dark'] .compatSuggestion { 86 background: rgba(248, 113, 113, 0.25); 87 color: #fecaca; 88} 89 90.compatError { 91 font-size: 13px; 92 color: #b91c1c; 93} 94 95[data-theme='dark'] .compatError { 96 color: #fecaca; 97} 98 99.compatSignals { 100 margin-top: 10px; 101} 102 103.compatSignals.warn .compatSignalsLabel { 104 color: #b91c1c; 105} 106 107.compatSignalsLabel { 108 font-size: 12px; 109 font-weight: 600; 110 margin-bottom: 6px; 111 color: var(--muted); 112 text-transform: uppercase; 113 letter-spacing: 0.05em; 114} 115 116[data-theme='dark'] .compatSignalsLabel { 117 color: rgba(226, 232, 240, 0.7); 118} 119 120.compatSignals.warn .compatSignalsLabel { 121 color: #b91c1c; 122} 123 124[data-theme='dark'] .compatSignals.warn .compatSignalsLabel { 125 color: #feb2b2; 126} 127 128.compatSignalPills { 129 display: flex; 130 gap: 6px; 131 flex-wrap: wrap; 132} 133 134.compatPill { 135 padding: 4px 8px; 136 border-radius: 999px; 137 background: rgba(232, 137, 120, 0.15); 138 color: #c45a47; 139 font-size: 12px; 140} 141 142.compatPill.pillWarn { 143 background: rgba(248, 113, 113, 0.18); 144 color: #991b1b; 145} 146 147[data-theme='dark'] .compatPill { 148 background: rgba(244, 162, 149, 0.3); 149 color: #f4a295; 150} 151 152[data-theme='dark'] .compatPill.pillWarn { 153 background: rgba(248, 113, 113, 0.3); 154 color: #fecdd3; 155} 156 157:root { 158 --bg-gradient-1: #fff5f2; 159 --bg-gradient-2: #ffeee8; 160 --bg-gradient-3: #ffe4dc; 161 --card-text: #2d1f1c; 162 --card-text-light: #7a5a52; 163 --card-bg: rgba(255, 255, 255, 0.75); 164 --card-bg-solid: rgba(255, 255, 255, 0.85); 165 --card-border: rgba(255, 255, 255, 0.8); 166 --glass-bg: color-mix(in srgb, #f8ded6 60%, white 40%); 167 --glass-border: rgba(232, 137, 120, 0.15); 168 --input-bg: rgba(255, 255, 255, 0.8); 169 --input-border: rgba(232, 137, 120, 0.15); 170 --sidebar-bg: color-mix(in srgb, #f8ded6 60%, white 40%); 171 --sidebar-border: rgba(232, 137, 120, 0.15); 172 --sidebar-hover: rgba(255, 255, 255, 0.6); 173 --sidebar-active-bg: linear-gradient(135deg, #f4a295 0%, #e88978 100%); 174 --dropdown-bg: #fff; 175 --dropdown-border: #f0e2de; 176 --dropdown-hover: #fdf5f3; 177 --accent: #e88978; 178 --accent-gradient: linear-gradient(135deg, #f4a295 0%, #e88978 100%); 179 --radius-card: 24px; 180 --radius-btn: 14px; 181 --blue: #1d9bf0; 182 --orange: #ff7a00; 183 --fg: #2d1f1c; 184 --muted: rgba(45, 31, 28, 0.55); 185 --border: rgba(45, 31, 28, 0.08); 186 --shadow: 0 4px 24px rgba(45, 20, 15, 0.06); 187 --shadow-hover: 0 12px 40px rgba(45, 20, 15, 0.1); 188 --divider: rgba(0, 0, 0, 0.06); 189 --code-bg: #fdfaf9; 190 --modal-bg: color-mix(in srgb, #fce8e2 70%, white 30%); 191 --modal-border: rgba(255, 255, 255, 0.6); 192 --modal-inset: rgba(255, 255, 255, 0.6); 193 --modal-header-bg: rgba(255, 255, 255, 0.5); 194 --modal-header-border: rgba(232, 137, 120, 0.12); 195 --icon-btn-bg: rgba(255, 255, 255, 0.6); 196 --notice-bg: #fef3c7; 197 --notice-border: #fcd34d; 198 --notice-text: #92400e; 199 --error-bg: rgba(254, 226, 226, 0.6); 200 --error-border: rgba(252, 165, 165, 0.5); 201 --error-text: #b91c1c; 202} 203 204[data-theme='dark'] .deployRow { 205 background: color-mix(in srgb, var(--card-bg) 80%, rgba(255, 255, 255, 0.04) 20%); 206 border-color: rgba(255, 255, 255, 0.08); 207} 208 209.deployRowMain { 210 display: flex; 211 flex-direction: column; 212 gap: 6px; 213 flex: 1; 214} 215 216.deployRowTop { 217 display: flex; 218 align-items: center; 219 gap: 10px; 220 flex-wrap: wrap; 221} 222 223.statusPill { 224 padding: 4px 10px; 225 border-radius: 999px; 226 font-size: 12px; 227 font-weight: 600; 228 letter-spacing: 0.02em; 229 background: rgba(232, 137, 120, 0.15); 230 color: #c45a47; 231} 232 233.status-building { 234 background: rgba(245, 158, 11, 0.12); 235 color: #b45309; 236} 237 238.status-running { 239 background: rgba(34, 197, 94, 0.14); 240 color: #15803d; 241} 242 243.status-failed { 244 background: rgba(239, 68, 68, 0.14); 245 color: #b91c1c; 246} 247 248.status-stopped { 249 background: rgba(148, 163, 184, 0.16); 250 color: #475569; 251} 252 253[data-theme='dark'] .statusPill { 254 background: rgba(244, 162, 149, 0.18); 255 color: #f4a295; 256} 257 258[data-theme='dark'] .status-building { 259 background: rgba(245, 158, 11, 0.18); 260 color: #fcd34d; 261} 262 263[data-theme='dark'] .status-running { 264 background: rgba(34, 197, 94, 0.18); 265 color: #86efac; 266} 267 268[data-theme='dark'] .status-failed { 269 background: rgba(239, 68, 68, 0.18); 270 color: #fecdd3; 271} 272 273[data-theme='dark'] .status-stopped { 274 background: rgba(148, 163, 184, 0.18); 275 color: #cbd5e1; 276} 277 278.deployTime { 279 font-size: 12px; 280} 281 282.deployLinks { 283 display: flex; 284 gap: 8px; 285 flex-wrap: wrap; 286} 287 288.linkChip { 289 display: inline-flex; 290 align-items: center; 291 gap: 4px; 292 padding: 6px 10px; 293 background: rgba(0, 0, 0, 0.03); 294 border-radius: 10px; 295 font-size: 13px; 296} 297 298[data-theme='dark'] .linkChip { 299 background: rgba(255, 255, 255, 0.05); 300} 301 302.deployCommit { 303 display: flex; 304 align-items: center; 305 gap: 8px; 306 flex-wrap: wrap; 307 font-size: 13px; 308 color: var(--muted); 309} 310 311.commitAvatar { 312 width: 28px; 313 height: 28px; 314 border-radius: 50%; 315 object-fit: cover; 316 border: 1px solid var(--border); 317} 318 319.commitBadge { 320 font-family: 'SFMono-Regular', Menlo, Consolas, 'Liberation Mono', monospace; 321 background: rgba(0, 0, 0, 0.05); 322 padding: 4px 8px; 323 border-radius: 8px; 324 letter-spacing: 0.02em; 325 color: var(--card-text); 326 text-decoration: none; 327} 328 329[data-theme='dark'] .commitBadge { 330 background: rgba(255, 255, 255, 0.08); 331 color: #e5edff; 332} 333 334.commitMessage { 335 max-width: 320px; 336 white-space: nowrap; 337 overflow: hidden; 338 text-overflow: ellipsis; 339 color: var(--card-text); 340} 341 342[data-theme='dark'] .commitMessage { 343 color: var(--card-text-light); 344} 345 346.commitAuthor { 347 color: var(--muted); 348} 349 350[data-theme='dark'] .commitAuthor { 351 color: #7a8ba8; 352} 353 354.commitAuthorInfo { 355 display: flex; 356 align-items: center; 357 gap: 6px; 358} 359 360.commitAuthorName { 361 font-weight: 600; 362 font-size: 13px; 363 color: #1e293b; 364} 365 366[data-theme='dark'] .commitAuthorName { 367 color: #f1f5f9; 368} 369 370.actions .btn.ghost { 371 border-color: var(--border); 372} 373 374[data-theme='dark'] { 375 --bg-gradient-1: #1a0f0d; 376 --bg-gradient-2: #1f1412; 377 --bg-gradient-3: #251916; 378 --card-text: #f5ebe8; 379 --card-text-light: #d6b4a9; 380 --card-bg: rgba(32, 18, 14, 0.82); 381 --card-bg-solid: rgba(32, 18, 14, 0.94); 382 --card-border: rgba(255, 255, 255, 0.14); 383 --glass-bg: color-mix(in srgb, #26140d 70%, rgba(32, 18, 14, 0.9) 30%); 384 --glass-border: rgba(255, 255, 255, 0.16); 385 --input-bg: rgba(32, 18, 14, 0.78); 386 --input-border: rgba(255, 255, 255, 0.14); 387 --sidebar-bg: rgba(26, 14, 10, 0.95); 388 --sidebar-border: rgba(255, 255, 255, 0.12); 389 --sidebar-hover: rgba(255, 255, 255, 0.08); 390 --sidebar-active-bg: linear-gradient(135deg, #f4a295 0%, #e88978 100%); 391 --dropdown-bg: #1f1210; 392 --dropdown-border: rgba(255, 255, 255, 0.14); 393 --dropdown-hover: rgba(255, 255, 255, 0.08); 394 --accent: #f4a295; 395 --accent-gradient: linear-gradient(135deg, #f4a295 0%, #e88978 100%); 396 --shadow: 0 6px 28px rgba(0, 0, 0, 0.35); 397 --shadow-hover: 0 14px 46px rgba(0, 0, 0, 0.45); 398 --divider: rgba(255, 255, 255, 0.12); 399 --code-bg: rgba(32, 18, 14, 0.65); 400 --modal-bg: rgba(30, 17, 14, 0.96); 401 --modal-border: rgba(255, 255, 255, 0.14); 402 --modal-inset: rgba(255, 255, 255, 0.08); 403 --modal-header-bg: rgba(36, 20, 16, 0.7); 404 --modal-header-border: rgba(255, 255, 255, 0.12); 405 --icon-btn-bg: rgba(255, 255, 255, 0.14); 406 --notice-bg: rgba(251, 191, 36, 0.25); 407 --notice-border: rgba(251, 191, 36, 0.45); 408 --notice-text: #f7e3a3; 409 --error-bg: rgba(239, 68, 68, 0.28); 410 --error-border: rgba(239, 68, 68, 0.45); 411 --error-text: #fca5a5; 412} 413 414.repoGrid { 415 display: flex; 416 flex-direction: column; 417 gap: 12px; 418 margin-top: 16px; 419 max-height: 600px; 420 overflow-y: auto; 421 padding: 12px; 422 margin-left: -12px; 423 margin-right: -12px; 424} 425 426.repoGrid::-webkit-scrollbar { 427 width: 6px; 428} 429 430.repoGrid::-webkit-scrollbar-track { 431 background: transparent; 432} 433 434.repoGrid::-webkit-scrollbar-thumb { 435 background: var(--border); 436 border-radius: 99px; 437} 438 439.repoGrid::-webkit-scrollbar-thumb:hover { 440 background: var(--muted); 441} 442 443.repoItem { 444 display: flex; 445 flex-direction: row; 446 align-items: center; 447 width: 100%; 448 padding: 16px; 449 gap: 16px; 450 background: rgba(255, 255, 255, 0.65); 451 border: 1px solid rgba(255, 255, 255, 0.8); 452 border-radius: 18px; 453 text-align: left; 454 cursor: pointer; 455 transition: all 0.2s cubic-bezier(0.2, 0.8, 0.2, 1); 456 position: relative; 457 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.02); 458} 459 460.repoItem:hover { 461 background: rgba(255, 255, 255, 0.95); 462 transform: scale(1.005); 463 box-shadow: 0 8px 16px -4px rgba(0, 0, 0, 0.08); 464 border-color: rgba(255, 255, 255, 1); 465 z-index: 2; 466} 467 468[data-theme='dark'] .repoItem { 469 background: rgba(15, 23, 42, 0.6); 470 border-color: rgba(255, 255, 255, 0.06); 471 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); 472} 473 474[data-theme='dark'] .repoItem:hover { 475 background: rgba(30, 41, 59, 1); 476 border-color: rgba(244, 162, 149, 0.3); 477 box-shadow: 0 8px 16px -4px rgba(0, 0, 0, 0.4); 478} 479 480.repoItemIcon { 481 display: flex; 482 align-items: center; 483 justify-content: center; 484 width: 42px; 485 height: 42px; 486 background: white; 487 border-radius: 12px; 488 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); 489 border: 1px solid rgba(0, 0, 0, 0.04); 490 color: #171717; 491 flex-shrink: 0; 492} 493 494[data-theme='dark'] .repoItemIcon { 495 background: #1e293b; 496 border-color: rgba(255, 255, 255, 0.1); 497 color: #e2e8f0; 498 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); 499} 500 501.repoItemContent { 502 display: flex; 503 flex-direction: column; 504 flex: 1; 505 min-width: 0; 506 gap: 4px; 507} 508 509.repoItemName { 510 font-weight: 600; 511 font-size: 15px; 512 color: var(--card-text); 513 white-space: nowrap; 514 overflow: hidden; 515 text-overflow: ellipsis; 516} 517 518[data-theme='dark'] .repoItemName { 519 color: var(--card-text-light); 520} 521 522.repoItemDesc { 523 font-size: 13px; 524 color: var(--muted); 525 line-height: 1.4; 526 white-space: nowrap; 527 overflow: hidden; 528 text-overflow: ellipsis; 529} 530 531[data-theme='dark'] .repoItemDesc { 532 color: rgba(148, 163, 184, 0.7); 533} 534 535.repoItemMetaColumn { 536 display: flex; 537 flex-direction: column; 538 align-items: flex-end; 539 gap: 6px; 540 flex-shrink: 0; 541 margin-left: auto; 542} 543 544.repoItemPrivate { 545 background: rgba(245, 158, 11, 0.1); 546 color: #b45309; 547 padding: 2px 8px; 548 border-radius: 99px; 549 font-size: 11px; 550 font-weight: 600; 551 display: inline-flex; 552 align-items: center; 553 gap: 4px; 554} 555 556[data-theme='dark'] .repoItemPrivate { 557 background: rgba(245, 158, 11, 0.15); 558 color: #fbbf24; 559} 560 561.repoItemMetaRow { 562 display: flex; 563 align-items: center; 564 gap: 12px; 565 font-size: 12px; 566 color: var(--muted); 567} 568 569[data-theme='dark'] .repoItemMetaRow { 570 color: rgba(148, 163, 184, 0.9); 571} 572 573.repoItemMetaRow span { 574 display: flex; 575 align-items: center; 576 gap: 4px; 577} 578 579.repoLangDot { 580 width: 8px; 581 height: 8px; 582 border-radius: 50%; 583 background-color: var(--accent); 584 display: inline-block; 585} 586 587[data-theme='dark'] .repoItem:hover { 588 background: rgba(12, 18, 32, 0.9); 589 border-color: var(--accent); 590} 591 592.repoArrow { 593 color: var(--muted); 594 opacity: 0.5; 595 margin-left: 8px; 596} 597 598[data-theme='dark'] .repoArrow { 599 color: #fbbf24; 600 opacity: 0.8; 601} 602 603[data-theme='dark'] .repoItemPrivate { 604 background: rgba(255, 255, 255, 0.1); 605 color: var(--card-text-light); 606} 607 608.searchIcon { 609 color: var(--muted); 610 pointer-events: none; 611} 612 613.repoLoadingState, 614.repoEmptyState { 615 color: var(--muted); 616} 617 618[data-theme='dark'] .searchIcon, 619html[data-theme='dark'] .searchIcon, 620[data-theme='dark'] .repoLoadingState, 621html[data-theme='dark'] .repoLoadingState, 622[data-theme='dark'] .repoEmptyState, 623html[data-theme='dark'] .repoEmptyState { 624 color: #94a3b8 !important; 625 opacity: 1 !important; 626} 627 628* { 629 box-sizing: border-box; 630} 631 632html { 633 scroll-behavior: smooth; 634 background: linear-gradient(160deg, var(--bg-gradient-1) 0%, var(--bg-gradient-2) 50%, var(--bg-gradient-3) 100%); 635 background-color: var(--bg-gradient-3); 636} 637 638html, 639body { 640 height: 100%; 641 margin: 0; 642} 643 644body { 645 font-family: 646 'Kumbh Sans', 647 'Inter', 648 ui-sans-serif, 649 system-ui, 650 -apple-system, 651 sans-serif; 652 background: linear-gradient(160deg, var(--bg-gradient-1) 0%, var(--bg-gradient-2) 50%, var(--bg-gradient-3) 100%); 653 color: var(--card-text); 654 line-height: 1.6; 655 transition: 656 background 0.3s ease, 657 color 0.3s ease; 658} 659 660a { 661 color: inherit; 662 text-decoration: none; 663} 664 665a:hover { 666 text-decoration: none; 667} 668 669.themeToggle { 670 display: flex; 671 align-items: center; 672 justify-content: center; 673 width: 40px; 674 height: 40px; 675 border-radius: 12px; 676 border: none; 677 background: var(--card-bg); 678 backdrop-filter: blur(12px); 679 -webkit-backdrop-filter: blur(12px); 680 cursor: pointer; 681 color: var(--card-text); 682 transition: all 0.2s ease; 683 position: relative; 684 overflow: hidden; 685} 686 687.themeToggle:hover { 688 background: var(--sidebar-hover); 689 transform: scale(1.05); 690} 691 692.themeToggle svg { 693 width: 20px; 694 height: 20px; 695 transition: 696 transform 0.3s ease, 697 opacity 0.3s ease; 698} 699 700.themeToggle .sunIcon { 701 position: absolute; 702 opacity: 0; 703 transform: rotate(-90deg) scale(0.5); 704} 705 706.themeToggle .moonIcon { 707 opacity: 1; 708 transform: rotate(0deg) scale(1); 709} 710 711[data-theme='dark'] .themeToggle .sunIcon { 712 opacity: 1; 713 transform: rotate(0deg) scale(1); 714} 715 716[data-theme='dark'] .themeToggle .moonIcon { 717 opacity: 0; 718 transform: rotate(90deg) scale(0.5); 719} 720 721.landing-page { 722 min-height: 100vh; 723 color: var(--card-text); 724} 725 726.navbar-frame { 727 position: fixed; 728 top: 16px; 729 left: 50%; 730 transform: translateX(-50%) translateY(0); 731 z-index: 100; 732 width: calc(100% - 32px); 733 max-width: 1100px; 734 transition: 735 transform 0.3s ease, 736 opacity 0.3s ease; 737} 738 739.navbar-frame.nav-hidden { 740 transform: translateX(-50%) translateY(-120%); 741 opacity: 0; 742 pointer-events: none; 743} 744 745.navbar-content { 746 display: flex; 747 justify-content: space-between; 748 align-items: center; 749 background: var(--card-bg); 750 backdrop-filter: blur(20px); 751 -webkit-backdrop-filter: blur(20px); 752 padding: 12px 20px; 753 border-radius: 20px; 754 box-shadow: var(--shadow); 755 border: 1px solid var(--card-border); 756 transition: 757 background 0.3s ease, 758 border 0.3s ease; 759} 760 761.navbar-logo { 762 display: flex; 763 align-items: center; 764 gap: 10px; 765 font-weight: 700; 766 font-size: 1.1rem; 767 color: var(--card-text); 768} 769 770.navbar-logo svg { 771 color: var(--accent); 772} 773 774.navbar-buttons { 775 display: flex; 776 gap: 8px; 777 align-items: center; 778} 779 780.glass-btn { 781 display: inline-flex; 782 align-items: center; 783 gap: 8px; 784 padding: 10px 16px; 785 background: var(--card-bg); 786 border: 1px solid var(--card-border); 787 border-radius: var(--radius-btn); 788 color: var(--card-text); 789 font-weight: 600; 790 font-size: 0.9rem; 791 text-decoration: none; 792 cursor: pointer; 793 transition: all 0.2s ease; 794} 795 796.glass-btn:hover { 797 background: var(--sidebar-hover); 798 transform: translateY(-1px); 799} 800 801.tangled-icon { 802 width: 20px; 803 height: 20px; 804 display: block; 805} 806 807.tangled-nav-link { 808 display: flex; 809 align-items: center; 810 justify-content: center; 811 width: 40px; 812 height: 40px; 813 border-radius: 12px; 814 background: var(--card-bg); 815 border: 1px solid var(--card-border); 816 transition: all 0.2s ease; 817} 818 819.tangled-nav-link:hover { 820 background: var(--sidebar-hover); 821 transform: scale(1.05); 822} 823 824.tangled-footer-link, 825.footer-external-link { 826 display: inline-flex; 827 align-items: center; 828 gap: 6px; 829 transition: opacity 0.2s ease; 830} 831 832.tangled-footer-link:hover, 833.footer-external-link:hover { 834 opacity: 0.8; 835} 836 837.tangled-footer-link .tangled-icon, 838.footer-external-link svg { 839 width: 16px; 840 height: 16px; 841} 842 843.dark-only { 844 display: none; 845} 846 847[data-theme='dark'] .dark-only { 848 display: block; 849} 850 851[data-theme='dark'] .light-only { 852 display: none; 853} 854 855.glass-btn.accent { 856 background: var(--accent-gradient); 857 color: white; 858} 859 860.glass-btn.accent:hover { 861 background: linear-gradient(135deg, #f4a295 0%, #e88978 100%); 862 box-shadow: 0 4px 16px rgba(232, 137, 120, 0.3); 863} 864 865.glass-btn.large { 866 padding: 14px 24px; 867 font-size: 1rem; 868 border-radius: 16px; 869} 870 871.page-frame { 872 max-width: 1100px; 873 margin: 0 auto; 874 padding: 100px 24px 40px; 875} 876 877.content-section { 878 margin-bottom: 80px; 879} 880 881.section-title { 882 font-size: 1.75rem; 883 font-weight: 700; 884 text-align: center; 885 margin: 0 0 32px; 886 color: var(--card-text); 887} 888 889.hero-section { 890 text-align: center; 891 padding: 60px 0 80px; 892 animation: fadeInUp 0.7s ease-out; 893} 894 895.hero-icon { 896 display: inline-flex; 897 align-items: center; 898 justify-content: center; 899 margin-bottom: 32px; 900 animation: float 4s ease-in-out infinite; 901} 902 903.hero-icon img { 904 width: 80px; 905 height: 80px; 906 image-rendering: pixelated; 907} 908 909@keyframes float { 910 0%, 911 100% { 912 transform: translateY(0); 913 } 914 915 50% { 916 transform: translateY(-10px); 917 } 918} 919 920@keyframes fadeInUp { 921 from { 922 opacity: 0; 923 transform: translateY(24px); 924 } 925 926 to { 927 opacity: 1; 928 transform: translateY(0); 929 } 930} 931 932.hero-section h1 { 933 font-size: 3rem; 934 font-weight: 800; 935 margin: 0 0 16px; 936 color: var(--card-text); 937} 938 939.hero-desc { 940 font-size: 1.2rem; 941 color: var(--card-text-light); 942 max-width: 480px; 943 margin: 0 auto 32px; 944 line-height: 1.6; 945} 946 947.hero-buttons { 948 display: flex; 949 justify-content: center; 950 gap: 12px; 951 flex-wrap: wrap; 952} 953 954.block-card, 955.step-card, 956.cta-card { 957 --card-color: #d0e4f8; 958 background: color-mix(in srgb, var(--card-color) 60%, transparent 40%); 959 backdrop-filter: blur(12px); 960 -webkit-backdrop-filter: blur(12px); 961 border-radius: var(--radius-card); 962 border: 1px solid color-mix(in srgb, var(--card-color) 40%, white 60%); 963 padding: 28px; 964 position: relative; 965 box-shadow: var(--shadow); 966 transition: 967 transform 0.3s ease, 968 box-shadow 0.3s ease, 969 background 0.3s ease; 970} 971 972[data-theme='dark'] .block-card, 973[data-theme='dark'] .step-card, 974[data-theme='dark'] .cta-card { 975 background: color-mix(in srgb, var(--card-color) 65%, rgba(12, 18, 32, 0.6) 35%); 976 border: 1px solid color-mix(in srgb, var(--card-color) 60%, rgba(255, 255, 255, 0.1) 40%); 977} 978 979.block-card:hover, 980.step-card:hover { 981 transform: translateY(-6px); 982 box-shadow: var(--shadow-hover); 983} 984 985.features-row { 986 display: grid; 987 grid-template-columns: repeat(4, 1fr); 988 gap: 16px; 989} 990 991@media (max-width: 900px) { 992 .features-row { 993 grid-template-columns: repeat(2, 1fr); 994 } 995} 996 997@media (max-width: 560px) { 998 .features-row { 999 grid-template-columns: 1fr; 1000 } 1001 1002 .hero-section h1 { 1003 font-size: 2.25rem; 1004 } 1005} 1006 1007html[data-theme='dark'] .landing-page .block-card { 1008 --card-color: #4cc9f0 !important; 1009} 1010 1011html[data-theme='dark'] .landing-page .block-card:nth-child(2) { 1012 --card-color: #7bf1a8 !important; 1013} 1014 1015html[data-theme='dark'] .landing-page .block-card:nth-child(3) { 1016 --card-color: #f5a524 !important; 1017} 1018 1019html[data-theme='dark'] .landing-page .block-card:nth-child(4) { 1020 --card-color: #ff6fb1 !important; 1021} 1022 1023html[data-theme='dark'] .landing-page .step-card { 1024 --card-color: #6bd1ff !important; 1025} 1026 1027html[data-theme='dark'] .landing-page .step-card:nth-of-type(2) { 1028 --card-color: #9cff6b !important; 1029} 1030 1031html[data-theme='dark'] .landing-page .step-card:nth-of-type(3) { 1032 --card-color: #ffb86b !important; 1033} 1034 1035html[data-theme='dark'] .landing-page .framework-chip:nth-child(1) { 1036 background: #61dafb33 !important; 1037} 1038 1039html[data-theme='dark'] .landing-page .framework-chip:nth-child(2) { 1040 background: #42b88333 !important; 1041} 1042 1043html[data-theme='dark'] .landing-page .framework-chip:nth-child(3) { 1044 background: #ff3e0033 !important; 1045} 1046 1047html[data-theme='dark'] .landing-page .framework-chip:nth-child(4) { 1048 background: #ff5d0133 !important; 1049} 1050 1051html[data-theme='dark'] .landing-page .framework-chip:nth-child(5) { 1052 background: #00000022 !important; 1053} 1054 1055html[data-theme='dark'] .landing-page .framework-chip:nth-child(6) { 1056 background: #646cff33 !important; 1057} 1058 1059html[data-theme='dark'] .landing-page .block-card, 1060html[data-theme='dark'] .landing-page .step-card, 1061html[data-theme='dark'] .landing-page .cta-card { 1062 background: color-mix(in srgb, var(--card-color) 55%, rgba(8, 12, 24, 0.75) 45%); 1063 border: 1px solid color-mix(in srgb, var(--card-color) 50%, rgba(255, 255, 255, 0.08) 50%); 1064} 1065 1066.block-card .card-icon-wrap { 1067 display: inline-flex; 1068 align-items: center; 1069 justify-content: center; 1070 width: 48px; 1071 height: 48px; 1072 background: color-mix(in srgb, var(--card-color) 70%, white 30%); 1073 border-radius: 14px; 1074 margin-bottom: 16px; 1075 color: var(--card-text); 1076} 1077 1078[data-theme='dark'] .block-card .card-icon-wrap { 1079 background: color-mix(in srgb, var(--card-color) 75%, rgba(15, 22, 40, 0.7) 25%); 1080} 1081 1082.block-card h3 { 1083 font-size: 1.05rem; 1084 font-weight: 700; 1085 margin: 0 0 8px; 1086 color: var(--card-text); 1087} 1088 1089.block-card p { 1090 font-size: 0.9rem; 1091 color: var(--card-text-light); 1092 line-height: 1.5; 1093 margin: 0; 1094} 1095 1096[data-theme='dark'] .landing-page .block-card h3 { 1097 color: #f6f8ff; 1098} 1099 1100[data-theme='dark'] .landing-page .block-card p { 1101 color: color-mix(in srgb, #e5edff 90%, #9fb4d6 10%); 1102} 1103 1104.steps-row { 1105 display: flex; 1106 align-items: center; 1107 justify-content: center; 1108 gap: 16px; 1109 flex-wrap: wrap; 1110} 1111 1112.step-card { 1113 flex: 1; 1114 min-width: 200px; 1115 max-width: 280px; 1116 text-align: center; 1117} 1118 1119.step-num { 1120 display: inline-flex; 1121 align-items: center; 1122 justify-content: center; 1123 width: 40px; 1124 height: 40px; 1125 background: color-mix(in srgb, var(--card-color) 70%, white 30%); 1126 border-radius: 12px; 1127 font-weight: 800; 1128 font-size: 1.1rem; 1129 margin-bottom: 12px; 1130 color: var(--card-text); 1131} 1132 1133[data-theme='dark'] .step-num { 1134 background: color-mix(in srgb, var(--card-color) 75%, rgba(15, 22, 40, 0.7) 25%); 1135} 1136 1137.step-card h3 { 1138 font-size: 1rem; 1139 font-weight: 700; 1140 margin: 0 0 6px; 1141 color: var(--card-text); 1142} 1143 1144.step-card p { 1145 font-size: 0.85rem; 1146 color: var(--card-text-light); 1147 margin: 0; 1148 line-height: 1.4; 1149} 1150 1151.step-arrow { 1152 color: var(--card-text-light); 1153 opacity: 0.4; 1154} 1155 1156@media (max-width: 700px) { 1157 .step-arrow { 1158 display: none; 1159 } 1160 1161 .steps-row { 1162 flex-direction: column; 1163 } 1164 1165 .step-card { 1166 max-width: 100%; 1167 } 1168} 1169 1170.frameworks-row { 1171 display: flex; 1172 justify-content: center; 1173 gap: 12px; 1174 flex-wrap: wrap; 1175} 1176 1177.framework-chip { 1178 padding: 10px 20px; 1179 border-radius: 12px; 1180 font-weight: 600; 1181 font-size: 0.95rem; 1182 color: var(--card-text); 1183 transition: transform 0.2s ease; 1184} 1185 1186.framework-chip:hover { 1187 transform: scale(1.05); 1188} 1189 1190.cta-section { 1191 margin-bottom: 60px; 1192} 1193 1194.cta-card { 1195 text-align: center; 1196 padding: 48px 32px; 1197 max-width: 600px; 1198 margin: 0 auto; 1199} 1200 1201.cta-card svg { 1202 color: var(--card-text); 1203 opacity: 0.7; 1204 margin-bottom: 20px; 1205} 1206 1207.cta-card h2 { 1208 font-size: 1.5rem; 1209 font-weight: 700; 1210 margin: 0 0 12px; 1211 color: var(--card-text); 1212} 1213 1214.cta-card p { 1215 font-size: 1rem; 1216 color: var(--card-text-light); 1217 margin: 0 0 24px; 1218 line-height: 1.5; 1219} 1220 1221.site-footer { 1222 padding: 24px; 1223 border-top: 1px solid rgba(0, 0, 0, 0.05); 1224} 1225 1226.footer-inner { 1227 max-width: 1100px; 1228 margin: 0 auto; 1229 display: flex; 1230 justify-content: space-between; 1231 align-items: center; 1232 font-size: 0.85rem; 1233 color: var(--card-text-light); 1234 flex-wrap: wrap; 1235 gap: 16px; 1236} 1237 1238.footer-links { 1239 display: flex; 1240 gap: 20px; 1241} 1242 1243.footer-links a { 1244 color: var(--card-text); 1245 text-decoration: none; 1246 font-weight: 500; 1247 transition: opacity 0.2s; 1248} 1249 1250.footer-links a:hover { 1251 opacity: 0.6; 1252} 1253 1254@media (max-width: 640px) { 1255 .footer-inner { 1256 flex-direction: column; 1257 gap: 20px; 1258 text-align: center; 1259 } 1260 1261 .footer-links { 1262 flex-wrap: wrap; 1263 justify-content: center; 1264 gap: 16px 24px; 1265 } 1266} 1267 1268.content-section { 1269 animation: fadeInUp 0.6s ease-out backwards; 1270} 1271 1272.content-section:nth-child(2) { 1273 animation-delay: 0.1s; 1274} 1275 1276.content-section:nth-child(3) { 1277 animation-delay: 0.2s; 1278} 1279 1280.content-section:nth-child(4) { 1281 animation-delay: 0.3s; 1282} 1283 1284.block-card, 1285.step-card { 1286 animation: fadeInUp 0.5s ease-out backwards; 1287} 1288 1289.features-row .block-card:nth-child(1) { 1290 animation-delay: 0.1s; 1291} 1292 1293.features-row .block-card:nth-child(2) { 1294 animation-delay: 0.15s; 1295} 1296 1297.features-row .block-card:nth-child(3) { 1298 animation-delay: 0.2s; 1299} 1300 1301.features-row .block-card:nth-child(4) { 1302 animation-delay: 0.25s; 1303} 1304 1305.auth-page { 1306 min-height: 100vh; 1307 display: flex; 1308 align-items: center; 1309 justify-content: center; 1310 padding: 32px; 1311 position: relative; 1312} 1313 1314.auth-theme-toggle { 1315 position: absolute; 1316 top: 24px; 1317 right: 24px; 1318} 1319 1320.auth-card { 1321 width: min(440px, 100%); 1322 background: var(--glass-bg); 1323 backdrop-filter: blur(16px); 1324 -webkit-backdrop-filter: blur(16px); 1325 border: 1px solid var(--card-border); 1326 border-radius: 28px; 1327 padding: 40px; 1328 box-shadow: var(--shadow); 1329 animation: fadeInUp 0.5s ease-out; 1330 transition: 1331 background 0.3s ease, 1332 border 0.3s ease; 1333} 1334 1335.auth-card h1 { 1336 font-size: 2rem; 1337 font-weight: 800; 1338 margin: 0 0 8px; 1339 text-align: center; 1340 color: var(--card-text); 1341} 1342 1343.auth-card .subtitle { 1344 text-align: center; 1345 color: var(--card-text-light); 1346 margin-bottom: 28px; 1347 font-size: 0.95rem; 1348} 1349 1350.auth-divider { 1351 display: flex; 1352 align-items: center; 1353 gap: 16px; 1354 margin: 20px 0; 1355 color: var(--card-text-light); 1356 font-size: 0.85rem; 1357} 1358 1359.auth-divider::before, 1360.auth-divider::after { 1361 content: ''; 1362 flex: 1; 1363 height: 1px; 1364 background: var(--glass-border); 1365} 1366 1367.auth-footer { 1368 text-align: center; 1369 margin-top: 24px; 1370 font-size: 0.9rem; 1371 color: var(--card-text-light); 1372} 1373 1374.auth-footer a { 1375 color: var(--accent); 1376 font-weight: 600; 1377} 1378 1379.auth-footer a:hover { 1380 text-decoration: underline; 1381} 1382 1383.center { 1384 min-height: 100vh; 1385 display: flex; 1386 flex-direction: column; 1387 align-items: center; 1388 justify-content: center; 1389 padding: 32px; 1390 text-align: center; 1391} 1392 1393.title { 1394 font-size: 2.5rem; 1395 line-height: 1.1; 1396 margin: 0 0 20px; 1397 letter-spacing: -0.03em; 1398 font-weight: 800; 1399 color: var(--card-text); 1400} 1401 1402.buttons { 1403 display: flex; 1404 gap: 12px; 1405 flex-wrap: wrap; 1406 justify-content: center; 1407} 1408 1409.btn { 1410 display: inline-flex; 1411 align-items: center; 1412 justify-content: center; 1413 gap: 8px; 1414 border-radius: 14px; 1415 border: none; 1416 padding: 12px 20px; 1417 font-weight: 600; 1418 text-decoration: none; 1419 cursor: pointer; 1420 background: var(--card-bg); 1421 color: var(--card-text); 1422 min-width: 140px; 1423 font-size: 14px; 1424 transition: all 0.2s ease; 1425} 1426 1427.btn:hover { 1428 transform: translateY(-2px); 1429 background: var(--sidebar-hover); 1430 box-shadow: var(--shadow); 1431} 1432 1433.btn:disabled { 1434 opacity: 0.5; 1435 cursor: not-allowed; 1436 transform: none; 1437} 1438 1439.btn.primary { 1440 background: var(--accent-gradient); 1441 color: white; 1442} 1443 1444.btn.primary:hover { 1445 box-shadow: 0 4px 20px rgba(232, 137, 120, 0.4); 1446} 1447 1448.btn.accent { 1449 background: linear-gradient(135deg, #e8a36b 0%, #d89058 100%); 1450 color: white; 1451} 1452 1453.btn.accent:hover { 1454 background: linear-gradient(135deg, #f0b07a 0%, #e09860 100%); 1455 box-shadow: 0 4px 20px rgba(212, 143, 90, 0.3); 1456} 1457 1458.btn.ghost { 1459 background: var(--card-bg); 1460 border: 1px solid var(--glass-border); 1461} 1462 1463.btn.ghost:hover { 1464 background: var(--sidebar-hover); 1465} 1466 1467.btn.danger { 1468 background: rgba(220, 38, 38, 0.1); 1469 color: #b91c1c; 1470} 1471 1472.btn.danger:hover { 1473 background: rgba(220, 38, 38, 0.18); 1474} 1475 1476.form { 1477 width: 100%; 1478 display: flex; 1479 flex-direction: column; 1480 gap: 14px; 1481} 1482 1483.input { 1484 border-radius: 14px; 1485 border: 1px solid var(--input-border); 1486 padding: 14px 16px; 1487 font-size: 15px; 1488 background: var(--input-bg); 1489 color: var(--card-text); 1490 transition: all 0.2s ease; 1491} 1492 1493.input:focus { 1494 outline: none; 1495 border-color: var(--accent); 1496 background: var(--card-bg-solid); 1497 box-shadow: 0 0 0 4px rgba(232, 137, 120, 0.15); 1498} 1499 1500.input:disabled { 1501 background: var(--sidebar-hover); 1502 cursor: not-allowed; 1503 opacity: 0.6; 1504} 1505 1506.input::placeholder { 1507 color: var(--card-text-light); 1508} 1509 1510.oauth { 1511 display: flex; 1512 flex-direction: column; 1513 gap: 10px; 1514} 1515 1516.oauth-providers { 1517 display: flex; 1518 gap: 10px; 1519 justify-content: center; 1520} 1521 1522.oauth-btn { 1523 flex: 1; 1524 display: flex; 1525 flex-direction: column; 1526 align-items: center; 1527 justify-content: center; 1528 gap: 8px; 1529 padding: 16px 12px; 1530 background: var(--card-bg); 1531 border: 1px solid var(--glass-border); 1532 border-radius: 14px; 1533 color: var(--card-text); 1534 font-weight: 600; 1535 font-size: 13px; 1536 text-decoration: none; 1537 cursor: pointer; 1538 transition: all 0.2s ease; 1539 min-width: 0; 1540} 1541 1542.oauth-btn:hover { 1543 background: var(--sidebar-hover); 1544 border-color: var(--accent); 1545 transform: translateY(-2px); 1546 box-shadow: var(--shadow); 1547} 1548 1549.oauth-btn svg { 1550 flex-shrink: 0; 1551} 1552 1553.oauth-btn span { 1554 white-space: nowrap; 1555 overflow: hidden; 1556 text-overflow: ellipsis; 1557} 1558 1559@media (max-width: 400px) { 1560 .oauth-providers { 1561 gap: 8px; 1562 } 1563 1564 .oauth-btn { 1565 padding: 14px 8px; 1566 } 1567 1568 .oauth-btn span { 1569 font-size: 11px; 1570 } 1571} 1572 1573.error { 1574 color: #b91c1c; 1575 font-weight: 600; 1576 font-size: 14px; 1577 padding: 12px 16px; 1578 background: rgba(220, 38, 38, 0.08); 1579 border-radius: 12px; 1580 border: 1px solid rgba(220, 38, 38, 0.12); 1581} 1582 1583.muted { 1584 color: var(--card-text-light); 1585 font-size: 14px; 1586} 1587 1588.muted a { 1589 color: var(--accent); 1590 font-weight: 600; 1591} 1592 1593.muted a:hover { 1594 text-decoration: underline; 1595} 1596 1597.legal-page { 1598 min-height: 100vh; 1599 padding: 40px 24px; 1600 position: relative; 1601} 1602 1603.legal-theme-toggle { 1604 position: absolute; 1605 top: 24px; 1606 right: 24px; 1607} 1608 1609.legal-container { 1610 max-width: 800px; 1611 margin: 0 auto; 1612} 1613 1614.legal-header { 1615 margin-bottom: 32px; 1616} 1617 1618.legal-header h1 { 1619 font-size: 2.25rem; 1620 font-weight: 800; 1621 margin: 0 0 8px; 1622 color: var(--card-text); 1623} 1624 1625.legal-header .date, 1626.legal-date { 1627 color: var(--card-text-light); 1628 font-size: 0.9rem; 1629} 1630 1631.legal-card { 1632 background: var(--glass-bg); 1633 backdrop-filter: blur(12px); 1634 -webkit-backdrop-filter: blur(12px); 1635 border: 1px solid var(--card-border); 1636 border-radius: 24px; 1637 padding: 32px; 1638 box-shadow: var(--shadow); 1639 color: var(--card-text); 1640 max-width: 860px; 1641 margin: 0 auto; 1642 transition: 1643 background 0.3s ease, 1644 border 0.3s ease; 1645} 1646 1647.legal-card a { 1648 color: var(--accent); 1649 font-weight: 500; 1650} 1651 1652.legal-card a:hover { 1653 text-decoration: underline; 1654} 1655 1656.legal-callout { 1657 margin: 16px 0; 1658 padding: 16px 20px; 1659 background: var(--card-bg); 1660 border: 1px solid var(--glass-border); 1661 border-radius: 14px; 1662 font-size: 14px; 1663 color: var(--card-text); 1664} 1665 1666.legal-callout a { 1667 color: var(--accent); 1668 font-weight: 600; 1669} 1670 1671.legal-content { 1672 line-height: 1.7; 1673} 1674 1675.legal-content h2 { 1676 font-size: 1.15rem; 1677 font-weight: 700; 1678 margin: 24px 0 10px; 1679 color: var(--card-text); 1680} 1681 1682.legal-content h2:first-child { 1683 margin-top: 0; 1684} 1685 1686.legal-content p { 1687 margin: 0 0 12px; 1688 color: var(--card-text-light); 1689} 1690 1691.legal-content ul { 1692 margin: 8px 0 16px 20px; 1693 padding: 0; 1694} 1695 1696.legal-content li { 1697 margin-bottom: 6px; 1698 color: var(--card-text-light); 1699} 1700 1701.legal-content a { 1702 color: #e88978; 1703 font-weight: 500; 1704} 1705 1706.legal-content a:hover { 1707 text-decoration: underline; 1708} 1709 1710.legal-footer { 1711 margin-top: 24px; 1712} 1713 1714.legal-footer a { 1715 display: inline-flex; 1716 align-items: center; 1717 gap: 6px; 1718 color: var(--card-text-light); 1719 font-weight: 500; 1720 font-size: 0.9rem; 1721} 1722 1723.legal-footer a:hover { 1724 color: var(--card-text); 1725} 1726 1727.dashWrapper { 1728 min-height: 100vh; 1729 display: flex; 1730 position: relative; 1731 background: linear-gradient(180deg, var(--bg-gradient-1) 0%, var(--bg-gradient-2) 100%); 1732 transition: background 0.3s ease; 1733} 1734 1735@keyframes spin { 1736 from { 1737 transform: rotate(0deg); 1738 } 1739 1740 to { 1741 transform: rotate(360deg); 1742 } 1743} 1744 1745.animate-spin { 1746 animation: spin 1s linear infinite; 1747 display: inline-block; 1748} 1749 1750.sidebarUser { 1751 display: flex; 1752 align-items: center; 1753 gap: 10px; 1754 padding: 12px; 1755 margin: auto 12px 12px; 1756 border-radius: 12px; 1757 background: var(--sidebar-hover); 1758 transition: background 0.3s ease; 1759} 1760 1761.sidebarUserInfo { 1762 display: flex; 1763 align-items: center; 1764 gap: 10px; 1765 min-width: 0; 1766 flex: 1; 1767} 1768 1769.sidebarAvatar { 1770 width: 32px; 1771 height: 32px; 1772 border-radius: 10px; 1773 object-fit: cover; 1774 flex-shrink: 0; 1775} 1776 1777.sidebarAvatarPlaceholder { 1778 width: 32px; 1779 height: 32px; 1780 border-radius: 10px; 1781 background: var(--card-bg); 1782 display: flex; 1783 align-items: center; 1784 justify-content: center; 1785 color: var(--accent); 1786 flex-shrink: 0; 1787} 1788 1789.sidebarUserText { 1790 display: flex; 1791 flex-direction: column; 1792 min-width: 0; 1793 gap: 1px; 1794} 1795 1796.sidebarUserName { 1797 font-weight: 600; 1798 font-size: 13px; 1799 color: var(--card-text); 1800 white-space: nowrap; 1801 overflow: hidden; 1802 text-overflow: ellipsis; 1803} 1804 1805.sidebarUserEmail { 1806 font-size: 11px; 1807 color: var(--card-text-light); 1808 white-space: nowrap; 1809 overflow: hidden; 1810 text-overflow: ellipsis; 1811} 1812 1813.sidebarLogout { 1814 display: flex; 1815 align-items: center; 1816 justify-content: center; 1817 width: 28px; 1818 height: 28px; 1819 border-radius: 8px; 1820 border: none; 1821 background: transparent; 1822 color: var(--card-text-light); 1823 cursor: pointer; 1824 transition: all 0.15s ease; 1825 flex-shrink: 0; 1826} 1827 1828.sidebarLogout:hover { 1829 background: rgba(220, 38, 38, 0.15); 1830 color: #dc2626; 1831} 1832 1833.sidebar.collapsed .sidebarUser { 1834 flex-direction: column; 1835 padding: 10px 8px; 1836 margin: auto 8px 12px; 1837 gap: 6px; 1838} 1839 1840.sidebar.collapsed .sidebarUserText { 1841 display: none; 1842} 1843 1844.sidebar { 1845 position: fixed; 1846 left: 0; 1847 top: 0; 1848 bottom: 0; 1849 width: 260px; 1850 background: var(--sidebar-bg); 1851 backdrop-filter: blur(16px); 1852 -webkit-backdrop-filter: blur(16px); 1853 border-right: 1px solid var(--sidebar-border); 1854 display: flex; 1855 flex-direction: column; 1856 transition: 1857 width 0.25s ease, 1858 background 0.3s ease, 1859 border 0.3s ease; 1860 z-index: 40; 1861 overflow: hidden; 1862} 1863 1864.sidebar.collapsed { 1865 width: 72px; 1866} 1867 1868.sidebarHeader { 1869 display: flex; 1870 align-items: center; 1871 justify-content: flex-start; 1872 padding: 24px 20px; 1873 border-bottom: 1px solid var(--sidebar-border); 1874 min-height: 72px; 1875} 1876 1877.sidebar.collapsed .sidebarHeader { 1878 justify-content: center; 1879 padding: 24px 12px; 1880} 1881 1882.brand { 1883 display: flex; 1884 align-items: center; 1885 gap: 12px; 1886 font-weight: 700; 1887 font-size: 16px; 1888 color: var(--card-text); 1889 white-space: nowrap; 1890 text-decoration: none; 1891 transition: opacity 0.15s; 1892} 1893 1894.brand:hover { 1895 opacity: 0.8; 1896} 1897 1898.brand svg { 1899 flex-shrink: 0; 1900 color: var(--accent); 1901} 1902 1903.sidebar.collapsed .brand span { 1904 display: none; 1905} 1906 1907.sidebarFooter { 1908 padding: 12px 14px; 1909 border-top: 1px solid var(--sidebar-border); 1910} 1911 1912.sidebarToggle { 1913 width: 100%; 1914 display: flex; 1915 align-items: center; 1916 justify-content: center; 1917 gap: 10px; 1918 padding: 10px 14px; 1919 border-radius: 12px; 1920 border: none; 1921 background: var(--sidebar-hover); 1922 cursor: pointer; 1923 color: var(--card-text-light); 1924 font-weight: 600; 1925 font-size: 13px; 1926 transition: all 0.2s ease; 1927} 1928 1929.sidebarToggle:hover { 1930 background: var(--card-bg); 1931 color: var(--card-text); 1932} 1933 1934.sidebar.collapsed .sidebarToggle span { 1935 display: none; 1936} 1937 1938.sidebar.collapsed .sidebarToggle { 1939 padding: 12px; 1940} 1941 1942.sidebarNav { 1943 display: flex; 1944 flex-direction: column; 1945 gap: 4px; 1946 padding: 16px 12px; 1947} 1948 1949.sidebarLink { 1950 display: flex; 1951 align-items: center; 1952 gap: 12px; 1953 padding: 12px 14px; 1954 border-radius: 12px; 1955 color: var(--card-text-light); 1956 text-decoration: none; 1957 font-weight: 600; 1958 font-size: 14px; 1959 transition: all 0.15s ease; 1960 white-space: nowrap; 1961} 1962 1963.sidebarLink:hover { 1964 background: var(--sidebar-hover); 1965 color: var(--card-text); 1966 text-decoration: none; 1967} 1968 1969.sidebarLink.active { 1970 background: var(--sidebar-active-bg); 1971 color: #fff; 1972 box-shadow: 0 4px 12px rgba(232, 137, 120, 0.25); 1973} 1974 1975.sidebarLink svg { 1976 flex-shrink: 0; 1977 color: inherit; 1978 opacity: 0.7; 1979 transition: opacity 0.15s; 1980} 1981 1982.sidebarLink:hover svg { 1983 opacity: 1; 1984} 1985 1986.sidebarLink.active svg { 1987 color: #fff; 1988 opacity: 1; 1989} 1990 1991.sidebar.collapsed .sidebarLink { 1992 justify-content: center; 1993 padding: 12px; 1994} 1995 1996.sidebar.collapsed .sidebarLink span { 1997 display: none; 1998} 1999 2000.sidebarSection { 2001 padding: 12px 12px; 2002 border-top: 1px solid var(--sidebar-border); 2003 margin-top: 8px; 2004 flex: 1; 2005 min-height: 0; 2006 display: flex; 2007 flex-direction: column; 2008 overflow: hidden; 2009} 2010 2011.sidebarLabel { 2012 font-size: 10px; 2013 font-weight: 700; 2014 color: var(--card-text-light); 2015 text-transform: uppercase; 2016 letter-spacing: 0.08em; 2017 padding: 8px 14px 12px; 2018 white-space: nowrap; 2019} 2020 2021.sidebarProjects { 2022 display: flex; 2023 flex-direction: column; 2024 gap: 2px; 2025 flex: 1; 2026 min-height: 0; 2027 overflow-y: auto; 2028} 2029 2030.sidebarProjects::-webkit-scrollbar { 2031 width: 4px; 2032} 2033 2034.sidebarProjects::-webkit-scrollbar-track { 2035 background: transparent; 2036} 2037 2038.sidebarProjects::-webkit-scrollbar-thumb { 2039 background: var(--glass-border); 2040 border-radius: 4px; 2041} 2042 2043.sidebarProject { 2044 display: flex; 2045 align-items: center; 2046 gap: 12px; 2047 padding: 10px 14px; 2048 border-radius: 10px; 2049 color: var(--card-text-light); 2050 text-decoration: none; 2051 transition: all 0.15s ease; 2052} 2053 2054.sidebarProject:hover { 2055 background: var(--sidebar-hover); 2056 color: var(--card-text); 2057 text-decoration: none; 2058} 2059 2060.sidebarProject.active { 2061 background: var(--card-bg); 2062 color: var(--accent); 2063} 2064 2065.sidebarProject svg { 2066 flex-shrink: 0; 2067 color: var(--card-text-light); 2068} 2069 2070.sidebarProject.active svg, 2071.sidebarProject:hover svg { 2072 color: var(--accent); 2073} 2074 2075.sidebarProjectInfo { 2076 display: flex; 2077 flex-direction: column; 2078 min-width: 0; 2079 gap: 2px; 2080} 2081 2082.sidebarProjectName { 2083 font-weight: 600; 2084 font-size: 13px; 2085 white-space: nowrap; 2086 overflow: hidden; 2087 text-overflow: ellipsis; 2088 color: inherit; 2089} 2090 2091.sidebarProjectUrl { 2092 font-size: 11px; 2093 color: var(--card-text-light); 2094 white-space: nowrap; 2095 overflow: hidden; 2096 text-overflow: ellipsis; 2097} 2098 2099.dashMain { 2100 flex: 1; 2101 margin-left: 260px; 2102 padding: 24px 32px 32px; 2103 min-height: 100vh; 2104 transition: margin-left 0.25s ease; 2105} 2106 2107.dashHeader { 2108 display: flex; 2109 justify-content: flex-end; 2110 align-items: center; 2111 margin-bottom: 24px; 2112} 2113 2114.dashWrapper.sidebarCollapsed .dashMain { 2115 margin-left: 72px; 2116} 2117 2118.sidebar.collapsed .sidebarProject { 2119 justify-content: center; 2120 padding: 10px; 2121} 2122 2123.sidebar.collapsed .sidebarProject .sidebarProjectInfo { 2124 display: none; 2125} 2126 2127.sidebar.collapsed .sidebarSection { 2128 padding: 12px 8px; 2129} 2130 2131.sidebar.collapsed .sidebarLabel { 2132 display: none; 2133} 2134 2135.mobileMenuBtn { 2136 display: none; 2137 align-items: center; 2138 justify-content: center; 2139 width: 40px; 2140 height: 40px; 2141 border-radius: 12px; 2142 border: none; 2143 background: var(--card-bg); 2144 backdrop-filter: blur(12px); 2145 -webkit-backdrop-filter: blur(12px); 2146 cursor: pointer; 2147 color: var(--card-text); 2148 transition: all 0.2s ease; 2149} 2150 2151.mobileMenuBtn:hover { 2152 background: var(--sidebar-hover); 2153} 2154 2155.sidebarOverlay { 2156 display: none; 2157 position: fixed; 2158 inset: 0; 2159 background: rgba(0, 0, 0, 0.5); 2160 backdrop-filter: blur(4px); 2161 -webkit-backdrop-filter: blur(4px); 2162 z-index: 39; 2163 opacity: 0; 2164 transition: opacity 0.3s ease; 2165} 2166 2167.sidebarOverlay.visible { 2168 opacity: 1; 2169} 2170 2171@media (max-width: 768px) { 2172 .mobileMenuBtn { 2173 display: flex; 2174 } 2175 2176 .sidebarOverlay { 2177 display: block; 2178 pointer-events: none; 2179 } 2180 2181 .sidebarOverlay.visible { 2182 pointer-events: auto; 2183 } 2184 2185 .sidebar { 2186 width: 280px; 2187 transform: translateX(-100%); 2188 transition: 2189 transform 0.3s ease, 2190 width 0.25s ease; 2191 z-index: 50; 2192 } 2193 2194 .sidebar.mobileOpen { 2195 transform: translateX(0); 2196 } 2197 2198 .sidebar.collapsed { 2199 width: 280px; 2200 } 2201 2202 .sidebar.collapsed .sidebarLink span, 2203 .sidebar.collapsed .sidebarSection .sidebarLabel, 2204 .sidebar.collapsed .sidebarProjectInfo, 2205 .sidebar.collapsed .sidebarUserText, 2206 .sidebar.collapsed .brand span { 2207 display: unset; 2208 } 2209 2210 .sidebar.collapsed .sidebarLink, 2211 .sidebar.collapsed .sidebarProject { 2212 justify-content: flex-start; 2213 } 2214 2215 .sidebar.collapsed .sidebarHeader { 2216 justify-content: flex-start; 2217 padding: 24px 20px; 2218 } 2219 2220 .sidebar.collapsed .sidebarUser { 2221 flex-direction: row; 2222 padding: 12px; 2223 margin: auto 12px 12px; 2224 gap: 10px; 2225 } 2226 2227 .sidebar .sidebarFooter { 2228 display: none; 2229 } 2230 2231 .dashMain { 2232 margin-left: 0; 2233 padding: 16px; 2234 } 2235 2236 .dashWrapper.sidebarCollapsed .dashMain { 2237 margin-left: 0; 2238 } 2239 2240 .dashHeader { 2241 justify-content: space-between; 2242 gap: 12px; 2243 } 2244} 2245 2246@media (max-width: 560px) { 2247 .dashMain { 2248 padding: 12px; 2249 } 2250 2251 .dashHeader { 2252 margin-bottom: 16px; 2253 } 2254} 2255 2256.userDropdown { 2257 position: relative; 2258} 2259 2260.userDropdownTrigger { 2261 display: flex; 2262 align-items: center; 2263 gap: 8px; 2264 padding: 4px; 2265 border-radius: 999px; 2266 border: 1px solid var(--card-border); 2267 background: var(--dropdown-bg); 2268 cursor: pointer; 2269 transition: all 0.15s ease; 2270 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); 2271} 2272 2273.userDropdownTrigger:hover { 2274 border-color: var(--sidebar-border); 2275 box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08); 2276} 2277 2278.userDropdownTrigger .userInfo { 2279 display: none; 2280} 2281 2282.avatar { 2283 width: 36px; 2284 height: 36px; 2285 border-radius: 50%; 2286 object-fit: cover; 2287} 2288 2289.avatarPlaceholder { 2290 width: 36px; 2291 height: 36px; 2292 border-radius: 50%; 2293 background: #e0f2fe; 2294 display: flex; 2295 align-items: center; 2296 justify-content: center; 2297 color: #0284c7; 2298} 2299 2300.userInfo { 2301 text-align: left; 2302} 2303 2304.userName { 2305 display: block; 2306 font-weight: 600; 2307 font-size: 13px; 2308 color: var(--card-text); 2309} 2310 2311.userEmail { 2312 display: block; 2313 font-size: 11px; 2314 color: var(--card-text-light); 2315 max-width: 150px; 2316 overflow: hidden; 2317 text-overflow: ellipsis; 2318 white-space: nowrap; 2319} 2320 2321.chevron { 2322 display: none; 2323 color: #94a3b8; 2324 transition: transform 0.2s ease; 2325} 2326 2327.chevron.open { 2328 transform: rotate(180deg); 2329} 2330 2331.dropdownOverlay { 2332 position: fixed; 2333 inset: 0; 2334 z-index: 99; 2335} 2336 2337.dropdownMenu { 2338 position: absolute; 2339 top: calc(100% + 8px); 2340 right: 0; 2341 min-width: 180px; 2342 background: var(--dropdown-bg); 2343 border: 1px solid var(--dropdown-border); 2344 border-radius: 12px; 2345 box-shadow: 0 10px 40px rgba(0, 0, 0, 0.12); 2346 overflow: hidden; 2347 z-index: 100; 2348 animation: dropdownFadeIn 0.15s ease; 2349 padding: 6px; 2350} 2351 2352@keyframes dropdownFadeIn { 2353 from { 2354 opacity: 0; 2355 transform: translateY(-4px); 2356 } 2357 2358 to { 2359 opacity: 1; 2360 transform: translateY(0); 2361 } 2362} 2363 2364.dropdownItem { 2365 display: flex; 2366 align-items: center; 2367 gap: 10px; 2368 width: 100%; 2369 padding: 10px 12px; 2370 border: none; 2371 background: transparent; 2372 text-align: left; 2373 font-size: 14px; 2374 font-weight: 500; 2375 color: var(--card-text-light); 2376 cursor: pointer; 2377 text-decoration: none; 2378 transition: all 0.1s ease; 2379 border-radius: 8px; 2380} 2381 2382.dropdownItem:hover { 2383 background: var(--dropdown-hover); 2384 text-decoration: none; 2385 color: var(--card-text); 2386} 2387 2388.dropdownItem svg { 2389 color: var(--card-text-light); 2390} 2391 2392.page { 2393 display: flex; 2394 flex-direction: column; 2395 gap: 24px; 2396} 2397 2398.pageHeader { 2399 display: flex; 2400 align-items: flex-end; 2401 justify-content: space-between; 2402 gap: 20px; 2403} 2404 2405@media (max-width: 768px) { 2406 .pageHeader { 2407 flex-direction: column; 2408 align-items: stretch; 2409 } 2410} 2411 2412.h { 2413 font-size: 1.75rem; 2414 font-weight: 700; 2415 letter-spacing: -0.02em; 2416 line-height: 1.2; 2417 color: var(--card-text); 2418} 2419 2420.topActions { 2421 display: flex; 2422 gap: 10px; 2423 align-items: center; 2424 justify-content: flex-end; 2425} 2426 2427.crumbs { 2428 display: flex; 2429 gap: 8px; 2430 align-items: center; 2431 margin-bottom: 6px; 2432 font-size: 13px; 2433} 2434 2435.crumb { 2436 font-weight: 600; 2437 color: var(--accent); 2438} 2439 2440.panel { 2441 background: var(--card-bg); 2442 backdrop-filter: blur(12px); 2443 -webkit-backdrop-filter: blur(12px); 2444 border: 1px solid var(--card-border); 2445 border-radius: 20px; 2446 padding: 24px; 2447 box-shadow: var(--shadow); 2448 transition: 2449 background 0.3s ease, 2450 border 0.3s ease; 2451} 2452 2453.panel:hover { 2454 box-shadow: var(--shadow-hover); 2455} 2456 2457.panelTitle { 2458 font-weight: 700; 2459 font-size: 16px; 2460 margin-bottom: 10px; 2461 color: var(--card-text); 2462 display: flex; 2463 align-items: center; 2464} 2465 2466.panelActions { 2467 display: flex; 2468 justify-content: flex-end; 2469 gap: 10px; 2470 margin-top: 20px; 2471} 2472 2473.box { 2474 background: var(--card-bg); 2475 backdrop-filter: blur(12px); 2476 -webkit-backdrop-filter: blur(12px); 2477 border: 1px solid var(--card-border); 2478 border-radius: 20px; 2479 padding: 24px; 2480 box-shadow: var(--shadow); 2481 transition: 2482 background 0.3s ease, 2483 border 0.3s ease; 2484} 2485 2486.divider { 2487 height: 1px; 2488 background: var(--glass-border); 2489 margin: 20px 0; 2490} 2491 2492.gridCards { 2493 display: grid; 2494 grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); 2495 gap: 16px; 2496} 2497 2498.grid2 { 2499 display: grid; 2500 grid-template-columns: repeat(2, 1fr); 2501 gap: 16px; 2502 align-items: start; 2503} 2504 2505@media (max-width: 900px) { 2506 .grid2 { 2507 grid-template-columns: 1fr; 2508 } 2509} 2510 2511.projectCard { 2512 display: block; 2513 position: relative; 2514 background: var(--card-bg); 2515 backdrop-filter: blur(12px); 2516 -webkit-backdrop-filter: blur(12px); 2517 border: 1px solid var(--card-border); 2518 border-radius: 16px; 2519 padding: 20px; 2520 box-shadow: var(--shadow); 2521 text-decoration: none; 2522 color: var(--card-text); 2523 transition: all 0.2s ease; 2524} 2525 2526.projectCard:hover { 2527 transform: translateY(-4px); 2528 box-shadow: var(--shadow-hover); 2529 text-decoration: none; 2530} 2531 2532.projectTitle { 2533 font-weight: 700; 2534 font-size: 16px; 2535 letter-spacing: -0.01em; 2536 color: var(--card-text); 2537} 2538 2539.projectMeta { 2540 display: flex; 2541 gap: 8px; 2542 flex-wrap: wrap; 2543 margin-top: 12px; 2544} 2545 2546.chip { 2547 font-size: 11px; 2548 font-weight: 600; 2549 padding: 5px 12px; 2550 border-radius: 999px; 2551 background: var(--card-bg); 2552 color: var(--card-text-light); 2553} 2554 2555.badge { 2556 display: inline-flex; 2557 align-items: center; 2558 justify-content: center; 2559 padding: 5px 12px; 2560 border-radius: 999px; 2561 background: var(--card-bg); 2562 font-weight: 600; 2563 font-size: 11px; 2564 color: var(--card-text-light); 2565} 2566 2567.field { 2568 display: flex; 2569 flex-direction: column; 2570 margin-bottom: 4px; 2571 min-width: 0; 2572} 2573 2574.label { 2575 font-size: 12px; 2576 font-weight: 600; 2577 color: var(--card-text); 2578 margin-bottom: 8px; 2579 letter-spacing: 0.01em; 2580} 2581 2582.row { 2583 display: grid; 2584 grid-template-columns: 1fr 1fr; 2585 gap: 16px; 2586} 2587 2588.row .field .input { 2589 min-width: 0; 2590 width: 100%; 2591} 2592 2593@media (max-width: 560px) { 2594 .row { 2595 grid-template-columns: 1fr; 2596 } 2597} 2598 2599.textarea { 2600 width: 100%; 2601 min-height: 160px; 2602 border-radius: 10px; 2603 border: 1px solid var(--card-border); 2604 padding: 14px; 2605 font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; 2606 font-size: 13px; 2607 background: var(--input-bg); 2608 color: var(--card-text); 2609 resize: vertical; 2610 transition: all 0.15s ease; 2611} 2612 2613.textarea:focus { 2614 outline: none; 2615 border-color: #e88978; 2616 box-shadow: 0 0 0 3px rgba(232, 137, 120, 0.1); 2617} 2618 2619.tabs { 2620 display: flex; 2621 gap: 4px; 2622 align-items: center; 2623 flex-wrap: wrap; 2624 padding: 4px; 2625 background: var(--code-bg); 2626 border-radius: 10px; 2627 margin-bottom: 20px; 2628} 2629 2630.tab { 2631 display: inline-flex; 2632 align-items: center; 2633 background: transparent; 2634 border: none; 2635 border-radius: 8px; 2636 padding: 10px 16px; 2637 font-weight: 600; 2638 font-size: 13px; 2639 cursor: pointer; 2640 color: var(--card-text-light); 2641 transition: all 0.15s ease; 2642} 2643 2644.tab:hover { 2645 color: var(--card-text); 2646} 2647 2648.tab.active { 2649 background: var(--card-bg); 2650 color: var(--card-text); 2651 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); 2652} 2653 2654.subTabs { 2655 display: inline-flex; 2656 padding: 4px; 2657 background: var(--code-bg); 2658 border-radius: 10px; 2659 margin: 12px 0 16px; 2660 gap: 4px; 2661} 2662 2663.subTab { 2664 background: transparent; 2665 border: none; 2666 border-radius: 8px; 2667 padding: 8px 14px; 2668 font-weight: 600; 2669 font-size: 13px; 2670 cursor: pointer; 2671 color: var(--card-text-light); 2672 transition: all 0.15s ease; 2673} 2674 2675.subTab:hover { 2676 color: var(--card-text); 2677} 2678 2679.subTab.active { 2680 background: var(--card-bg); 2681 color: var(--card-text); 2682 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); 2683} 2684 2685[data-theme='dark'] .tabs { 2686 background: color-mix(in srgb, var(--sidebar-bg) 70%, #0b1221 30%); 2687 border: 1px solid var(--sidebar-border); 2688} 2689 2690[data-theme='dark'] .tab { 2691 color: color-mix(in srgb, var(--card-text-light) 70%, #f5cdc6 30%); 2692} 2693 2694[data-theme='dark'] .tab.active { 2695 background: color-mix(in srgb, var(--card-bg) 70%, rgba(244, 162, 149, 0.3) 30%); 2696 box-shadow: 2697 0 0 0 1px color-mix(in srgb, var(--card-color, #f4a295) 35%, rgba(255, 255, 255, 0.25) 65%), 2698 0 6px 20px rgba(0, 0, 0, 0.35); 2699 color: #fff5f2; 2700} 2701 2702[data-theme='dark'] .subTabs { 2703 background: color-mix(in srgb, var(--sidebar-bg) 70%, #0b1221 30%); 2704 border: 1px solid var(--sidebar-border); 2705} 2706 2707[data-theme='dark'] .subTab { 2708 color: color-mix(in srgb, var(--card-text-light) 70%, #f5cdc6 30%); 2709} 2710 2711[data-theme='dark'] .subTab.active { 2712 background: color-mix(in srgb, var(--card-bg) 70%, rgba(244, 162, 149, 0.25) 30%); 2713 color: #fff5f2; 2714 box-shadow: 2715 0 0 0 1px color-mix(in srgb, var(--card-color, #f4a295) 35%, rgba(255, 255, 255, 0.2) 65%), 2716 0 6px 20px rgba(0, 0, 0, 0.25); 2717} 2718 2719.deployList { 2720 display: flex; 2721 flex-direction: column; 2722 gap: 8px; 2723} 2724 2725.deployRow { 2726 display: flex; 2727 align-items: flex-start; 2728 justify-content: space-between; 2729 gap: 16px; 2730 background: var(--card-bg); 2731 border: 1px solid var(--card-border); 2732 border-radius: 12px; 2733 padding: 16px; 2734 transition: all 0.15s ease; 2735} 2736 2737.deployRow:hover { 2738 border-color: var(--sidebar-border); 2739 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); 2740} 2741 2742.deployRow .siteName { 2743 font-weight: 600; 2744 font-size: 14px; 2745 color: var(--card-text); 2746} 2747 2748.envHeader { 2749 display: flex; 2750 align-items: center; 2751 justify-content: space-between; 2752 margin-top: 0; 2753 margin-bottom: 10px; 2754 gap: 12px; 2755} 2756 2757.envHeaderLeft { 2758 display: flex; 2759 align-items: center; 2760 gap: 10px; 2761} 2762 2763.envHeaderRight { 2764 display: flex; 2765 gap: 8px; 2766} 2767 2768.envCount { 2769 display: inline-flex; 2770 align-items: center; 2771 justify-content: center; 2772 min-width: 24px; 2773 height: 24px; 2774 padding: 0 8px; 2775 background: var(--accent); 2776 color: white; 2777 border-radius: 12px; 2778 font-size: 12px; 2779 font-weight: 700; 2780} 2781 2782.envContainer { 2783 display: flex; 2784 flex-direction: column; 2785 gap: 16px; 2786} 2787 2788.envDescription { 2789 padding-left: 0; 2790 margin-bottom: 16px; 2791} 2792 2793.envDescription code { 2794 background: var(--code-bg); 2795 padding: 2px 6px; 2796 border-radius: 4px; 2797 font-size: 12px; 2798} 2799 2800.envEmptyState { 2801 display: flex; 2802 flex-direction: column; 2803 align-items: center; 2804 justify-content: center; 2805 padding: 48px 24px; 2806 text-align: center; 2807 background: var(--code-bg); 2808 border: 1px dashed var(--card-border); 2809 border-radius: 12px; 2810} 2811 2812.envEmptyIcon { 2813 width: 64px; 2814 height: 64px; 2815 display: flex; 2816 align-items: center; 2817 justify-content: center; 2818 background: var(--card-bg); 2819 border-radius: 16px; 2820 margin-bottom: 16px; 2821 color: var(--card-text-light); 2822} 2823 2824.envEmptyTitle { 2825 font-size: 16px; 2826 font-weight: 600; 2827 color: var(--card-text); 2828 margin-bottom: 4px; 2829} 2830 2831.envEmptyDesc { 2832 font-size: 14px; 2833 color: var(--card-text-light); 2834 margin-bottom: 20px; 2835 max-width: 320px; 2836} 2837 2838.envTable { 2839 border: 1px solid var(--card-border); 2840 border-radius: 12px; 2841 overflow: hidden; 2842 background: var(--card-bg); 2843} 2844 2845.envTableHeader { 2846 display: grid; 2847 grid-template-columns: 200px 1fr 120px; 2848 background: var(--code-bg); 2849 border-bottom: 1px solid var(--card-border); 2850 padding: 12px 16px; 2851 font-size: 12px; 2852 font-weight: 600; 2853 color: var(--card-text-light); 2854 text-transform: uppercase; 2855 letter-spacing: 0.03em; 2856} 2857 2858.envTableRow { 2859 display: grid; 2860 grid-template-columns: 200px 1fr 120px; 2861 padding: 12px 16px; 2862 border-bottom: 1px solid var(--card-border); 2863 transition: background 0.15s ease; 2864} 2865 2866.envTableRow:last-child { 2867 border-bottom: none; 2868} 2869 2870.envTableRow:hover { 2871 background: var(--code-bg); 2872} 2873 2874.envTableCell { 2875 display: flex; 2876 align-items: center; 2877 min-width: 0; 2878} 2879 2880.envTableName { 2881 font-weight: 500; 2882} 2883 2884.envKeyCode { 2885 background: var(--code-bg); 2886 padding: 4px 8px; 2887 border-radius: 6px; 2888 font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; 2889 font-size: 13px; 2890 color: var(--accent); 2891 white-space: nowrap; 2892 overflow: hidden; 2893 text-overflow: ellipsis; 2894 max-width: 100%; 2895} 2896 2897.envValueContainer { 2898 min-width: 0; 2899 overflow: hidden; 2900} 2901 2902.envValueCode { 2903 font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; 2904 font-size: 13px; 2905 color: var(--card-text); 2906 word-break: break-all; 2907 white-space: pre-wrap; 2908} 2909 2910.envMasked { 2911 font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; 2912 font-size: 13px; 2913 color: var(--card-text-light); 2914 letter-spacing: 2px; 2915 opacity: 0.6; 2916} 2917 2918.envTableActions { 2919 display: flex; 2920 align-items: center; 2921 justify-content: flex-end; 2922 gap: 4px; 2923} 2924 2925.envActionBtn { 2926 display: flex; 2927 align-items: center; 2928 justify-content: center; 2929 width: 32px; 2930 height: 32px; 2931 border: none; 2932 background: transparent; 2933 border-radius: 8px; 2934 color: var(--card-text-light); 2935 cursor: pointer; 2936 transition: all 0.15s ease; 2937} 2938 2939.envActionBtn:hover { 2940 background: var(--sidebar-hover); 2941 color: var(--card-text); 2942} 2943 2944.envActionBtnDanger:hover { 2945 background: rgba(220, 38, 38, 0.1); 2946 color: #dc2626; 2947} 2948 2949.envFooter { 2950 display: flex; 2951 align-items: center; 2952 justify-content: space-between; 2953 gap: 12px; 2954 padding-top: 4px; 2955} 2956 2957.envRawTextarea { 2958 min-height: 300px; 2959 font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; 2960 font-size: 13px; 2961 line-height: 1.6; 2962 resize: vertical; 2963} 2964 2965.envModal .envKeyInput { 2966 font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; 2967 text-transform: uppercase; 2968} 2969 2970.envModal .envValueInput { 2971 font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; 2972 min-height: 100px; 2973} 2974 2975[data-theme='dark'] .envCount { 2976 background: var(--accent); 2977} 2978 2979[data-theme='dark'] .envEmptyState { 2980 background: color-mix(in srgb, var(--card-bg) 50%, transparent 50%); 2981 border-color: rgba(255, 255, 255, 0.1); 2982} 2983 2984[data-theme='dark'] .envEmptyIcon { 2985 background: var(--sidebar-bg); 2986} 2987 2988[data-theme='dark'] .envTable { 2989 background: color-mix(in srgb, var(--card-bg) 80%, rgba(255, 255, 255, 0.02) 20%); 2990 border-color: rgba(255, 255, 255, 0.08); 2991} 2992 2993[data-theme='dark'] .envTableHeader { 2994 background: var(--sidebar-bg); 2995 border-color: rgba(255, 255, 255, 0.08); 2996} 2997 2998[data-theme='dark'] .envTableRow { 2999 border-color: rgba(255, 255, 255, 0.06); 3000} 3001 3002[data-theme='dark'] .envTableRow:hover { 3003 background: rgba(255, 255, 255, 0.03); 3004} 3005 3006[data-theme='dark'] .envKeyCode { 3007 background: rgba(255, 255, 255, 0.06); 3008 color: var(--accent); 3009} 3010 3011[data-theme='dark'] .envActionBtn:hover { 3012 background: rgba(255, 255, 255, 0.08); 3013} 3014 3015[data-theme='dark'] .envActionBtnDanger:hover { 3016 background: rgba(248, 113, 113, 0.15); 3017 color: #f87171; 3018} 3019 3020@media (max-width: 768px) { 3021 .envHeader { 3022 flex-direction: column; 3023 align-items: flex-start; 3024 } 3025 3026 .envTableHeader { 3027 display: none; 3028 } 3029 3030 .envTableRow { 3031 display: flex; 3032 flex-direction: column; 3033 gap: 8px; 3034 padding: 16px; 3035 } 3036 3037 .envTableCell { 3038 width: 100%; 3039 } 3040 3041 .envTableName { 3042 order: 1; 3043 } 3044 3045 .envTableValue { 3046 order: 2; 3047 padding: 8px 0; 3048 } 3049 3050 .envTableActions { 3051 order: 3; 3052 justify-content: flex-start; 3053 padding-top: 8px; 3054 border-top: 1px solid var(--card-border); 3055 } 3056 3057 .envFooter { 3058 flex-direction: column; 3059 } 3060 3061 .envFooter .btn { 3062 width: 100%; 3063 } 3064} 3065 3066.envList { 3067 display: flex; 3068 flex-direction: column; 3069 gap: 8px; 3070 margin: 12px 0 16px; 3071} 3072 3073.envListItem { 3074 background: var(--card-bg); 3075 border: 1px solid var(--card-border); 3076 border-radius: 12px; 3077 padding: 12px 16px; 3078 display: flex; 3079 align-items: center; 3080 justify-content: space-between; 3081 gap: 12px; 3082 transition: all 0.15s ease; 3083} 3084 3085.envListItem:hover { 3086 border-color: var(--sidebar-border); 3087 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); 3088} 3089 3090.envListItemMain { 3091 display: flex; 3092 align-items: center; 3093 gap: 16px; 3094 flex: 1; 3095 min-width: 0; 3096} 3097 3098.envListItemRight { 3099 display: flex; 3100 align-items: center; 3101 gap: 8px; 3102} 3103 3104.envKey { 3105 font-weight: 600; 3106 font-size: 14px; 3107 color: var(--card-text); 3108 white-space: nowrap; 3109 overflow: hidden; 3110 text-overflow: ellipsis; 3111 max-width: 200px; 3112} 3113 3114.envValue { 3115 flex: 1; 3116 min-width: 0; 3117} 3118 3119.envValueText { 3120 font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; 3121 font-size: 13px; 3122 color: var(--card-text); 3123 word-break: break-all; 3124} 3125 3126.maskedPlaceholder { 3127 color: var(--muted); 3128 font-style: italic; 3129} 3130 3131.envMaskedPill { 3132 display: flex; 3133 align-items: center; 3134 justify-content: center; 3135 padding: 8px 12px; 3136 background: var(--code-bg); 3137 border: 1px solid var(--card-border); 3138 border-radius: 0; 3139 min-width: 120px; 3140 max-width: 300px; 3141 min-height: 40px; 3142 font-size: 16px; 3143 color: var(--muted); 3144} 3145 3146.envMaskedPill.clickable { 3147 cursor: pointer; 3148 transition: all 0.15s ease; 3149} 3150 3151.envMaskedPill.clickable:hover { 3152 background: var(--card-bg); 3153 border-color: var(--sidebar-border); 3154} 3155 3156.envMaskedPill.clickable:active { 3157 transform: scale(0.98); 3158} 3159 3160.inlineTextarea { 3161 width: 100%; 3162 min-width: 120px; 3163 max-width: 300px; 3164 height: auto; 3165 min-height: 32px; 3166 padding: 4px 0; 3167 border: none; 3168 border-radius: 0; 3169 background: transparent; 3170 resize: none; 3171 font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; 3172 font-size: 15px; 3173 line-height: 1.2; 3174} 3175 3176.maskCircles { 3177 font-size: 16px; 3178 color: var(--muted); 3179 opacity: 0.6; 3180 letter-spacing: 0; 3181} 3182 3183.maskValue { 3184 font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; 3185 font-size: 12px; 3186 color: var(--card-text); 3187 white-space: nowrap; 3188 overflow: hidden; 3189 text-overflow: ellipsis; 3190 max-width: 120px; 3191} 3192 3193.envListItemActions { 3194 display: flex; 3195 align-items: center; 3196 gap: 6px; 3197} 3198 3199.dropdownWrapper { 3200 position: relative; 3201} 3202 3203.dropdownMenu { 3204 position: absolute; 3205 top: 100%; 3206 right: 0; 3207 margin-top: 4px; 3208 background: var(--dropdown-bg); 3209 border: 1px solid var(--dropdown-border); 3210 border-radius: 8px; 3211 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); 3212 z-index: 10; 3213 min-width: 140px; 3214 overflow: hidden; 3215} 3216 3217.dropdownItem { 3218 display: flex; 3219 align-items: center; 3220 gap: 8px; 3221 width: 100%; 3222 padding: 8px 12px; 3223 background: none; 3224 border: none; 3225 font-size: 13px; 3226 color: var(--card-text); 3227 cursor: pointer; 3228 transition: background 0.15s ease; 3229} 3230 3231.dropdownItem:hover { 3232 background: var(--dropdown-hover); 3233} 3234 3235.dropdownItem.danger { 3236 color: #dc2626; 3237} 3238 3239.dropdownItem.danger:hover { 3240 background: rgba(220, 38, 38, 0.1); 3241} 3242 3243[data-theme='dark'] .envListItem { 3244 background: color-mix(in srgb, var(--card-bg) 80%, rgba(255, 255, 255, 0.04) 20%); 3245 border-color: rgba(255, 255, 255, 0.08); 3246 box-shadow: 0 2px 10px rgba(0, 0, 0, 0.35); 3247} 3248 3249[data-theme='dark'] .envListItem:hover { 3250 border-color: rgba(255, 255, 255, 0.14); 3251 box-shadow: 0 4px 16px rgba(0, 0, 0, 0.45); 3252} 3253 3254[data-theme='dark'] .envValueText { 3255 color: var(--card-text-light); 3256} 3257 3258[data-theme='dark'] .maskedPlaceholder { 3259 color: var(--card-text-light); 3260} 3261 3262[data-theme='dark'] .envMaskedPill { 3263 background: var(--code-bg); 3264 border-color: var(--card-border); 3265 color: var(--card-text-light); 3266} 3267 3268[data-theme='dark'] .envMaskedPill.clickable:hover { 3269 background: var(--card-bg); 3270 border-color: rgba(255, 255, 255, 0.14); 3271} 3272 3273[data-theme='dark'] .inlineTextarea { 3274 color: var(--card-text-light); 3275} 3276 3277[data-theme='dark'] .maskCircles { 3278 color: var(--card-text-light); 3279 opacity: 0.5; 3280} 3281 3282[data-theme='dark'] .maskValue { 3283 color: var(--card-text-light); 3284} 3285 3286[data-theme='dark'] .dropdownMenu { 3287 background: var(--dropdown-bg); 3288 border-color: var(--dropdown-border); 3289 box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4); 3290} 3291 3292[data-theme='dark'] .dropdownItem:hover { 3293 background: var(--dropdown-hover); 3294} 3295 3296[data-theme='dark'] .dropdownItem.danger:hover { 3297 background: rgba(248, 113, 113, 0.2); 3298} 3299 3300.envToolbar { 3301 display: flex; 3302 align-items: center; 3303 justify-content: space-between; 3304 gap: 12px; 3305 padding: 12px; 3306 background: var(--code-bg); 3307 border-radius: 12px; 3308 border: 1px solid var(--card-border); 3309 margin-bottom: 12px; 3310} 3311 3312.envToolbarActions { 3313 display: flex; 3314 gap: 8px; 3315 flex-wrap: wrap; 3316} 3317 3318.envRawArea { 3319 min-height: 220px; 3320 font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; 3321} 3322 3323.pill { 3324 display: inline-flex; 3325 align-items: center; 3326 gap: 6px; 3327 border-radius: 999px; 3328 padding: 4px 10px; 3329 font-weight: 600; 3330 font-size: 12px; 3331 border: 1px solid var(--border); 3332 background: rgba(0, 0, 0, 0.02); 3333 color: var(--muted); 3334} 3335 3336.mutedChip { 3337 background: rgba(15, 23, 42, 0.04); 3338 border-color: rgba(15, 23, 42, 0.08); 3339} 3340 3341.softPill { 3342 background: rgba(232, 137, 120, 0.12); 3343 border-color: rgba(232, 137, 120, 0.2); 3344 color: #c45a47; 3345} 3346 3347[data-theme='dark'] .pill { 3348 border-color: rgba(255, 255, 255, 0.12); 3349 background: rgba(255, 255, 255, 0.05); 3350 color: var(--card-text-light); 3351} 3352 3353[data-theme='dark'] .mutedChip { 3354 background: rgba(255, 255, 255, 0.06); 3355 border-color: rgba(255, 255, 255, 0.1); 3356} 3357 3358[data-theme='dark'] .softPill { 3359 background: rgba(244, 162, 149, 0.18); 3360 border-color: rgba(244, 162, 149, 0.3); 3361 color: #f4a295; 3362} 3363 3364[data-theme='dark'] .envCard { 3365 background: color-mix(in srgb, var(--card-bg) 80%, rgba(255, 255, 255, 0.04) 20%); 3366 border-color: rgba(255, 255, 255, 0.08); 3367 box-shadow: 0 2px 10px rgba(0, 0, 0, 0.35); 3368} 3369 3370.actions { 3371 display: flex; 3372 gap: 8px; 3373 flex-wrap: wrap; 3374 justify-content: flex-end; 3375} 3376 3377.notice { 3378 background: var(--notice-bg); 3379 border: 1px solid var(--notice-border); 3380 padding: 14px 18px; 3381 border-radius: 10px; 3382 font-weight: 500; 3383 color: var(--notice-text); 3384 font-size: 14px; 3385 display: flex; 3386 align-items: center; 3387 gap: 10px; 3388} 3389 3390.notice::before { 3391 content: '⚡'; 3392 font-size: 16px; 3393} 3394 3395.errorBox { 3396 background: var(--error-bg); 3397 border: 1px solid var(--error-border); 3398 padding: 14px 18px; 3399 border-radius: 12px; 3400 font-weight: 500; 3401 color: var(--error-text); 3402 font-size: 14px; 3403} 3404 3405.modalOverlay { 3406 position: fixed; 3407 inset: 0; 3408 background: rgba(15, 23, 42, 0.4); 3409 backdrop-filter: blur(8px); 3410 -webkit-backdrop-filter: blur(8px); 3411 display: flex; 3412 align-items: center; 3413 justify-content: center; 3414 padding: 24px; 3415 z-index: 100; 3416 animation: modalOverlayIn 0.2s ease; 3417} 3418 3419@keyframes modalOverlayIn { 3420 from { 3421 opacity: 0; 3422 } 3423 3424 to { 3425 opacity: 1; 3426 } 3427} 3428 3429.modal { 3430 width: min(540px, 96vw); 3431 max-height: calc(100vh - 48px); 3432 overflow-y: auto; 3433 background: var(--modal-bg); 3434 backdrop-filter: blur(20px); 3435 -webkit-backdrop-filter: blur(20px); 3436 border: 1px solid var(--modal-border); 3437 border-radius: 24px; 3438 box-shadow: 3439 0 24px 80px rgba(0, 0, 0, 0.15), 3440 inset 0 1px 1px var(--modal-inset); 3441 animation: modalIn 0.25s cubic-bezier(0.16, 1, 0.3, 1); 3442} 3443 3444@keyframes modalIn { 3445 from { 3446 opacity: 0; 3447 transform: translateY(20px) scale(0.96); 3448 } 3449 3450 to { 3451 opacity: 1; 3452 transform: translateY(0) scale(1); 3453 } 3454} 3455 3456.modalHeader { 3457 display: flex; 3458 align-items: center; 3459 justify-content: space-between; 3460 padding: 24px 28px; 3461 border-bottom: 1px solid var(--modal-header-border); 3462 background: var(--modal-header-bg); 3463} 3464 3465.modalTitle { 3466 font-weight: 700; 3467 font-size: 18px; 3468 display: flex; 3469 align-items: center; 3470 gap: 10px; 3471 color: var(--card-text); 3472} 3473 3474.iconBtn { 3475 width: 36px; 3476 height: 36px; 3477 border-radius: 12px; 3478 border: none; 3479 background: var(--icon-btn-bg); 3480 cursor: pointer; 3481 font-size: 20px; 3482 line-height: 1; 3483 display: flex; 3484 align-items: center; 3485 justify-content: center; 3486 transition: all 0.15s ease; 3487 color: var(--card-text-light); 3488} 3489 3490.iconBtn:hover { 3491 background: rgba(220, 38, 38, 0.12); 3492 color: #dc2626; 3493} 3494 3495.modalBody { 3496 padding: 28px; 3497 display: flex; 3498 flex-direction: column; 3499 gap: 24px; 3500} 3501 3502.modalActions { 3503 display: flex; 3504 justify-content: flex-end; 3505 gap: 12px; 3506 margin-top: 8px; 3507 padding-top: 20px; 3508 border-top: 1px solid var(--modal-header-border); 3509} 3510 3511.errorModal .modalHeader { 3512 background: rgba(254, 226, 226, 0.5); 3513} 3514 3515.errorContent { 3516 display: flex; 3517 flex-direction: column; 3518 gap: 16px; 3519} 3520 3521.errorMessage { 3522 font-size: 15px; 3523 color: var(--card-text); 3524 line-height: 1.6; 3525 margin: 0; 3526} 3527 3528.statusPill.status-ready, 3529.statusPill.status-active, 3530.statusPill.status-success { 3531 background: rgba(34, 197, 94, 0.1); 3532 color: #22c55e; 3533 border: 1px solid rgba(34, 197, 94, 0.2); 3534} 3535 3536.errorSuggestion { 3537 display: flex; 3538 align-items: flex-start; 3539 gap: 10px; 3540 background: rgba(220, 252, 231, 0.6); 3541 border: 1px solid rgba(134, 239, 172, 0.5); 3542 border-radius: 12px; 3543 padding: 14px; 3544} 3545 3546.errorSuggestion svg { 3547 color: #15803d; 3548 flex-shrink: 0; 3549 margin-top: 2px; 3550} 3551 3552.errorSuggestion strong { 3553 color: #15803d; 3554 font-size: 13px; 3555} 3556 3557.errorSuggestion p { 3558 margin: 4px 0 0; 3559 color: #166534; 3560 font-size: 14px; 3561} 3562 3563.errorDetails { 3564 margin-top: 8px; 3565} 3566 3567.errorDetails summary { 3568 cursor: pointer; 3569 font-size: 13px; 3570 color: var(--card-text-light); 3571 font-weight: 600; 3572} 3573 3574.errorDetails pre { 3575 background: var(--code-bg); 3576 border-radius: 8px; 3577 padding: 12px; 3578 font-size: 12px; 3579 overflow-x: auto; 3580 margin-top: 8px; 3581 color: var(--card-text); 3582} 3583 3584.logsModal { 3585 width: min(900px, 96vw); 3586 max-height: 80vh; 3587 display: flex; 3588 flex-direction: column; 3589} 3590 3591.logsModal .modalBody { 3592 flex: 1; 3593 overflow: hidden; 3594 display: flex; 3595 flex-direction: column; 3596 gap: 12px; 3597} 3598 3599.logsInfo { 3600 display: flex; 3601 align-items: center; 3602 gap: 12px; 3603 flex-wrap: wrap; 3604} 3605 3606.logsLoading { 3607 padding: 24px; 3608 text-align: center; 3609 color: var(--card-text-light); 3610} 3611 3612.logsContent { 3613 flex: 1; 3614 margin: 0; 3615 padding: 14px; 3616 background: var(--code-bg); 3617 border-radius: 10px; 3618 border: 1px solid var(--card-border); 3619 font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; 3620 font-size: 12px; 3621 line-height: 1.6; 3622 overflow: auto; 3623 white-space: pre-wrap; 3624 word-break: break-all; 3625 max-height: 60vh; 3626 color: var(--card-text); 3627} 3628 3629.turnstile-container { 3630 display: flex; 3631 justify-content: center; 3632 margin: 8px 0; 3633} 3634 3635.toast { 3636 position: fixed; 3637 bottom: 24px; 3638 right: 24px; 3639 padding: 14px 20px; 3640 background: var(--card-bg-solid); 3641 color: var(--card-text); 3642 border: 1px solid var(--card-border); 3643 border-radius: 12px; 3644 box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); 3645 font-size: 14px; 3646 font-weight: 500; 3647 z-index: 9999; 3648 animation: toastIn 0.25s ease; 3649 display: flex; 3650 align-items: center; 3651 gap: 10px; 3652 backdrop-filter: blur(12px); 3653 -webkit-backdrop-filter: blur(12px); 3654} 3655 3656.toast svg { 3657 color: #4ade80; 3658} 3659 3660@keyframes toastIn { 3661 from { 3662 transform: translateY(16px) scale(0.95); 3663 opacity: 0; 3664 } 3665 3666 to { 3667 transform: translateY(0) scale(1); 3668 opacity: 1; 3669 } 3670} 3671 3672@media (max-width: 768px) { 3673 .pageHeader { 3674 flex-direction: column; 3675 align-items: stretch; 3676 gap: 16px; 3677 } 3678 3679 .pageHeader .topActions { 3680 flex-wrap: wrap; 3681 } 3682 3683 .h { 3684 font-size: 1.5rem; 3685 } 3686 3687 .crumbs { 3688 font-size: 12px; 3689 } 3690} 3691 3692@media (max-width: 768px) { 3693 .panel { 3694 padding: 16px; 3695 border-radius: 16px; 3696 } 3697 3698 .panelTitle { 3699 font-size: 15px; 3700 } 3701 3702 .panelActions { 3703 flex-direction: column; 3704 } 3705 3706 .panelActions .btn { 3707 width: 100%; 3708 } 3709} 3710 3711@media (max-width: 768px) { 3712 .gridCards { 3713 grid-template-columns: 1fr; 3714 gap: 12px; 3715 } 3716} 3717 3718@media (max-width: 560px) { 3719 .gridCards { 3720 gap: 10px; 3721 } 3722} 3723 3724@media (max-width: 560px) { 3725 .projectCard { 3726 padding: 16px; 3727 border-radius: 14px; 3728 } 3729 3730 .projectTitle { 3731 font-size: 15px; 3732 } 3733 3734 .projectMeta { 3735 margin-top: 10px; 3736 } 3737} 3738 3739@media (max-width: 768px) { 3740 .tabs { 3741 width: 100%; 3742 overflow-x: auto; 3743 -webkit-overflow-scrolling: touch; 3744 scrollbar-width: none; 3745 -ms-overflow-style: none; 3746 } 3747 3748 .tabs::-webkit-scrollbar { 3749 display: none; 3750 } 3751 3752 .tab { 3753 flex-shrink: 0; 3754 padding: 10px 14px; 3755 font-size: 13px; 3756 } 3757} 3758 3759@media (max-width: 768px) { 3760 .deployRow { 3761 flex-direction: column; 3762 align-items: stretch; 3763 gap: 12px; 3764 padding: 14px; 3765 } 3766 3767 .deployRowMain { 3768 gap: 8px; 3769 } 3770 3771 .deployRowTop { 3772 flex-wrap: wrap; 3773 gap: 8px; 3774 } 3775 3776 .deployLinks { 3777 flex-direction: column; 3778 gap: 6px; 3779 } 3780 3781 .linkChip { 3782 width: 100%; 3783 justify-content: flex-start; 3784 padding: 8px 10px; 3785 font-size: 12px; 3786 word-break: break-all; 3787 } 3788 3789 .deployCommit { 3790 flex-direction: column; 3791 align-items: flex-start; 3792 gap: 6px; 3793 } 3794 3795 .commitMessage { 3796 max-width: 100%; 3797 } 3798 3799 .actions { 3800 width: 100%; 3801 justify-content: stretch; 3802 } 3803 3804 .actions .btn { 3805 flex: 1; 3806 justify-content: center; 3807 } 3808} 3809 3810@media (max-width: 560px) { 3811 .deployRow { 3812 padding: 12px; 3813 border-radius: 10px; 3814 } 3815 3816 .statusPill { 3817 padding: 3px 8px; 3818 font-size: 11px; 3819 } 3820 3821 .deployTime { 3822 font-size: 11px; 3823 } 3824} 3825 3826@media (max-width: 560px) { 3827 .row { 3828 grid-template-columns: 1fr; 3829 gap: 12px; 3830 } 3831 3832 .field .input { 3833 font-size: 16px; 3834 } 3835 3836 .textarea { 3837 font-size: 14px; 3838 min-height: 120px; 3839 } 3840} 3841 3842@media (max-width: 560px) { 3843 .btn { 3844 padding: 12px 16px; 3845 font-size: 14px; 3846 min-width: unset; 3847 } 3848 3849 .topActions { 3850 width: 100%; 3851 } 3852 3853 .topActions .btn { 3854 flex: 1; 3855 justify-content: center; 3856 } 3857} 3858 3859@media (max-width: 768px) { 3860 .modalOverlay { 3861 padding: 16px; 3862 align-items: flex-end; 3863 } 3864 3865 .modal { 3866 width: 100%; 3867 max-height: 90vh; 3868 border-radius: 20px 20px 0 0; 3869 animation: modalMobileIn 0.3s cubic-bezier(0.16, 1, 0.3, 1); 3870 } 3871 3872 @keyframes modalMobileIn { 3873 from { 3874 opacity: 0; 3875 transform: translateY(100%); 3876 } 3877 3878 to { 3879 opacity: 1; 3880 transform: translateY(0); 3881 } 3882 } 3883 3884 .modalHeader { 3885 padding: 20px; 3886 } 3887 3888 .modalTitle { 3889 font-size: 16px; 3890 } 3891 3892 .modalBody { 3893 padding: 20px; 3894 gap: 16px; 3895 } 3896 3897 .modalActions { 3898 flex-direction: column-reverse; 3899 gap: 10px; 3900 } 3901 3902 .modalActions .btn { 3903 width: 100%; 3904 } 3905 3906 .logsModal { 3907 width: 100%; 3908 max-height: 90vh; 3909 } 3910 3911 .logsContent { 3912 font-size: 11px; 3913 max-height: 50vh; 3914 } 3915} 3916 3917@media (max-width: 560px) { 3918 .modalOverlay { 3919 padding: 0; 3920 } 3921 3922 .modal { 3923 border-radius: 16px 16px 0 0; 3924 } 3925 3926 .modalHeader { 3927 padding: 16px; 3928 } 3929 3930 .modalBody { 3931 padding: 16px; 3932 } 3933} 3934 3935@media (max-width: 560px) { 3936 .toast { 3937 left: 12px; 3938 right: 12px; 3939 bottom: 12px; 3940 width: auto; 3941 justify-content: center; 3942 } 3943} 3944 3945@media (max-width: 560px) { 3946 .notice { 3947 padding: 12px 14px; 3948 font-size: 13px; 3949 border-radius: 10px; 3950 } 3951 3952 .errorBox { 3953 padding: 12px 14px; 3954 font-size: 13px; 3955 } 3956} 3957 3958@media (max-width: 768px) { 3959 .grid2 { 3960 grid-template-columns: 1fr; 3961 gap: 12px; 3962 } 3963} 3964 3965@media (max-width: 560px) { 3966 .box { 3967 padding: 16px; 3968 border-radius: 14px; 3969 } 3970} 3971 3972@media (max-width: 560px) { 3973 .chip { 3974 padding: 4px 10px; 3975 font-size: 10px; 3976 } 3977 3978 .badge { 3979 padding: 4px 10px; 3980 font-size: 10px; 3981 } 3982} 3983 3984@media (max-width: 768px) { 3985 .userDropdown { 3986 order: 2; 3987 } 3988 3989 .dropdownMenu { 3990 right: 0; 3991 min-width: 160px; 3992 } 3993} 3994 3995@media (max-width: 768px) { 3996 .errorModal .modalBody { 3997 padding: 16px; 3998 } 3999 4000 .errorSuggestion { 4001 padding: 12px; 4002 } 4003 4004 .errorMessage { 4005 font-size: 14px; 4006 } 4007} 4008 4009@media (max-width: 768px) { 4010 .sidebarProjects { 4011 max-height: calc(100vh - 320px); 4012 } 4013} 4014 4015@media (max-width: 560px) { 4016 .panel .row { 4017 flex-direction: column; 4018 align-items: stretch; 4019 } 4020 4021 .panel .row .field { 4022 align-self: stretch; 4023 } 4024 4025 .panel .row .field .btn { 4026 width: 100%; 4027 } 4028} 4029 4030@media (max-width: 768px) { 4031 .topbar { 4032 flex-direction: column; 4033 align-items: stretch; 4034 gap: 16px; 4035 } 4036 4037 .topbar .topActions { 4038 width: 100%; 4039 display: flex; 4040 } 4041 4042 .topbar .topActions .btn { 4043 flex: 1; 4044 } 4045} 4046 4047@media (max-width: 560px) { 4048 .panel .divider { 4049 margin: 16px 0; 4050 } 4051} 4052 4053@supports (padding-bottom: env(safe-area-inset-bottom)) { 4054 @media (max-width: 768px) { 4055 .modal { 4056 padding-bottom: env(safe-area-inset-bottom); 4057 } 4058 4059 .sidebar { 4060 padding-bottom: env(safe-area-inset-bottom); 4061 } 4062 4063 .toast { 4064 bottom: calc(12px + env(safe-area-inset-bottom)); 4065 } 4066 } 4067} 4068 4069.settingsContainer { 4070 display: flex; 4071 flex-direction: column; 4072 gap: 20px; 4073 padding-top: 16px; 4074} 4075 4076.settingsSection { 4077 background: var(--code-bg); 4078 border: 1px solid var(--card-border); 4079 border-radius: 16px; 4080 padding: 20px; 4081 transition: all 0.2s ease; 4082} 4083 4084.settingsSection:hover { 4085 border-color: var(--glass-border); 4086} 4087 4088.settingsSectionHeader { 4089 display: flex; 4090 align-items: flex-start; 4091 gap: 14px; 4092 margin-bottom: 20px; 4093} 4094 4095.settingsSectionIcon { 4096 width: 40px; 4097 height: 40px; 4098 display: flex; 4099 align-items: center; 4100 justify-content: center; 4101 background: var(--accent); 4102 color: white; 4103 border-radius: 10px; 4104 flex-shrink: 0; 4105} 4106 4107.settingsSectionTitle { 4108 font-size: 16px; 4109 font-weight: 700; 4110 color: var(--card-text); 4111 margin-bottom: 2px; 4112} 4113 4114.settingsSectionDesc { 4115 font-size: 13px; 4116 color: var(--card-text-light); 4117} 4118 4119.settingsGrid { 4120 display: grid; 4121 grid-template-columns: repeat(2, 1fr); 4122 gap: 16px; 4123} 4124 4125.settingsField { 4126 display: flex; 4127 flex-direction: column; 4128 gap: 6px; 4129} 4130 4131.settingsFieldFull { 4132 display: flex; 4133 flex-direction: column; 4134 gap: 6px; 4135 margin-bottom: 16px; 4136} 4137 4138.settingsLabel { 4139 font-size: 13px; 4140 font-weight: 600; 4141 color: var(--card-text); 4142} 4143 4144.settingsFieldHint { 4145 font-size: 11px; 4146 color: var(--card-text-light); 4147 margin-top: 2px; 4148} 4149 4150.settingsInputGroup { 4151 display: flex; 4152 align-items: stretch; 4153 width: 100%; 4154} 4155 4156.settingsInputGroup .input { 4157 border-top-right-radius: 0; 4158 border-bottom-right-radius: 0; 4159 flex: 1; 4160 min-width: 0; 4161} 4162 4163.settingsInputSuffix { 4164 display: flex; 4165 align-items: center; 4166 padding: 0 14px; 4167 background: var(--card-bg); 4168 border: 1px solid var(--input-border); 4169 border-left: 0; 4170 border-radius: 0 14px 14px 0; 4171 font-size: 13px; 4172 color: var(--card-text-light); 4173 white-space: nowrap; 4174 flex-shrink: 0; 4175} 4176 4177.settingsActions { 4178 display: flex; 4179 justify-content: flex-end; 4180 padding-top: 4px; 4181} 4182 4183.settingsDanger { 4184 background: rgba(239, 68, 68, 0.04); 4185 border-color: rgba(239, 68, 68, 0.15); 4186} 4187 4188.settingsDanger:hover { 4189 border-color: rgba(239, 68, 68, 0.25); 4190} 4191 4192.settingsDangerIcon { 4193 background: rgba(239, 68, 68, 0.12) !important; 4194 color: #dc2626 !important; 4195} 4196 4197.settingsDangerContent { 4198 display: flex; 4199 align-items: center; 4200 justify-content: space-between; 4201 gap: 20px; 4202} 4203 4204.settingsDangerTitle { 4205 font-size: 14px; 4206 font-weight: 600; 4207 color: var(--card-text); 4208 margin-bottom: 4px; 4209} 4210 4211.settingsDangerDesc { 4212 font-size: 13px; 4213 color: var(--card-text-light); 4214 max-width: 400px; 4215} 4216 4217[data-theme='dark'] .settingsSection { 4218 background: color-mix(in srgb, var(--card-bg) 60%, transparent 40%); 4219 border-color: rgba(255, 255, 255, 0.08); 4220} 4221 4222[data-theme='dark'] .settingsSection:hover { 4223 border-color: rgba(255, 255, 255, 0.14); 4224} 4225 4226[data-theme='dark'] .settingsSectionIcon { 4227 background: rgba(244, 162, 149, 0.2); 4228 color: #f4a295; 4229} 4230 4231[data-theme='dark'] .settingsInputSuffix { 4232 background: var(--sidebar-bg); 4233 border-color: var(--input-border); 4234} 4235 4236[data-theme='dark'] .settingsDanger { 4237 background: rgba(248, 113, 113, 0.06); 4238 border-color: rgba(248, 113, 113, 0.15); 4239} 4240 4241[data-theme='dark'] .settingsDanger:hover { 4242 border-color: rgba(248, 113, 113, 0.25); 4243} 4244 4245[data-theme='dark'] .settingsDangerIcon { 4246 background: rgba(248, 113, 113, 0.15) !important; 4247 color: #f87171 !important; 4248} 4249 4250@media (max-width: 768px) { 4251 .settingsGrid { 4252 grid-template-columns: 1fr; 4253 } 4254 4255 .settingsDangerContent { 4256 flex-direction: column; 4257 align-items: flex-start; 4258 gap: 16px; 4259 } 4260 4261 .settingsDangerContent .btn { 4262 width: 100%; 4263 } 4264 4265 .settingsDangerDesc { 4266 max-width: none; 4267 } 4268} 4269 4270@media (max-width: 560px) { 4271 .settingsSection { 4272 padding: 16px; 4273 border-radius: 12px; 4274 } 4275 4276 .settingsSectionHeader { 4277 gap: 12px; 4278 margin-bottom: 16px; 4279 } 4280 4281 .settingsSectionIcon { 4282 width: 36px; 4283 height: 36px; 4284 } 4285 4286 .settingsSectionTitle { 4287 font-size: 15px; 4288 } 4289 4290 .settingsActions { 4291 flex-direction: column; 4292 } 4293 4294 .settingsActions .btn { 4295 width: 100%; 4296 } 4297} 4298 4299/* ApiDocs Responsive Styles */ 4300.api-stats-grid { 4301 display: flex; 4302 gap: 12px; 4303 flex-wrap: wrap; 4304} 4305 4306.api-stat-card { 4307 padding: 8px 16px; 4308 background: var(--bg-secondary); 4309 border-radius: 8px; 4310 font-size: 13px; 4311} 4312 4313.api-endpoint-item { 4314 border-bottom: 1px solid var(--border); 4315 padding-bottom: 24px; 4316 margin-bottom: 24px; 4317} 4318 4319.api-endpoint-item:last-child { 4320 border-bottom: none; 4321 padding-bottom: 0; 4322 margin-bottom: 0; 4323} 4324 4325.api-endpoint-header { 4326 display: flex; 4327 align-items: center; 4328 gap: 12px; 4329 margin-bottom: 8px; 4330 flex-wrap: wrap; 4331} 4332 4333.api-method-badge { 4334 padding: 4px 10px; 4335 border-radius: 6px; 4336 font-size: 12px; 4337 font-weight: 700; 4338 font-family: monospace; 4339} 4340 4341.api-path { 4342 font-size: 14px; 4343 font-weight: 500; 4344 word-break: break-all; 4345} 4346 4347.api-example-header { 4348 display: flex; 4349 justify-content: space-between; 4350 align-items: center; 4351 margin-bottom: 6px; 4352} 4353 4354.api-code-block { 4355 background: var(--bg-tertiary, #1e1e1e); 4356 padding: 16px; 4357 border-radius: 8px; 4358 font-family: monospace; 4359 font-size: 12px; 4360 color: var(--code-text, #e0e0e0); 4361 overflow-x: auto; 4362 margin: 0; 4363 white-space: pre-wrap; 4364 word-break: break-word; 4365} 4366 4367.api-copy-btn { 4368 width: 28px; 4369 height: 28px; 4370 border-radius: 50%; 4371 background: var(--bg-secondary); 4372 border: none; 4373 display: flex; 4374 align-items: center; 4375 justify-content: center; 4376 cursor: pointer; 4377 color: var(--card-text); 4378 transition: background 0.2s; 4379} 4380 4381.api-copy-btn:hover { 4382 background: var(--sidebar-hover); 4383} 4384 4385@media (max-width: 600px) { 4386 .api-stats-grid { 4387 flex-direction: column; 4388 gap: 8px; 4389 } 4390 4391 .api-stat-card { 4392 width: 100%; 4393 } 4394 4395 .api-example-header { 4396 margin-bottom: 8px; 4397 } 4398}