style.css (16213B)
1 /* 2 GoToSocial 3 Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org 4 5 This program is free software: you can redistribute it and/or modify 6 it under the terms of the GNU Affero General Public License as published by 7 the Free Software Foundation, either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU Affero General Public License for more details. 14 15 You should have received a copy of the GNU Affero General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 body { 20 grid-template-rows: auto 1fr; 21 } 22 23 .content { 24 grid-column: 1 / span 3; /* stretch entire width, to fit panel + sidebar nav */ 25 width: 100%; 26 } 27 28 header { 29 justify-content: start; 30 31 a { 32 margin: 1.5rem; 33 gap: 1rem; 34 35 h1 { 36 font-size: 1.5rem; 37 } 38 39 img { 40 height: 3rem; 41 } 42 } 43 } 44 45 #root { 46 box-sizing: border-box; 47 display: flex; 48 justify-content: center; 49 flex-wrap: wrap; 50 margin: 0 1rem; 51 gap: 1rem; 52 53 section.oauth { 54 max-width: 92%; 55 width: 60rem; 56 } 57 58 section.with-sidebar { 59 flex-grow: 100; 60 flex-basis: 40rem; 61 background: $bg-accent; 62 padding: 2rem; 63 border-radius: $br; 64 max-width: 100%; 65 66 & > div, & > form { 67 border-left: 0.2rem solid $border-accent; 68 padding-left: 0.4rem; 69 display: flex; 70 flex-direction: column; 71 gap: 0.5rem; 72 margin: 1rem 0; 73 74 h2 { 75 margin: 0; 76 margin-top: 0.1rem; 77 } 78 79 &:only-child { 80 border-left: none; 81 } 82 83 &:first-child { 84 margin-top: 0; 85 } 86 87 &:last-child { 88 margin-bottom: 0; 89 } 90 91 &.without-border { 92 border-left: 0; 93 padding-left: 0; 94 } 95 } 96 97 & > .error { 98 display: grid; /* prevents error overflowing */ 99 } 100 } 101 102 .sidebar { 103 flex-grow: 1; 104 flex-basis: 20rem; 105 align-self: start; 106 justify-self: end; 107 background: $bg; 108 display: flex; 109 flex-direction: column; 110 111 .account-card { 112 grid-template-columns: auto 1fr auto; 113 114 img.avatar { 115 width: 4rem; 116 height: 4rem; 117 } 118 119 span { 120 grid-row: 2; 121 } 122 123 .logout { 124 font-size: 1.5rem; 125 align-self: center; 126 grid-row: 1 / span 2; 127 } 128 129 &:hover { 130 background: $list-entry-bg; 131 } 132 } 133 } 134 } 135 136 nav.menu-tree { 137 ul { 138 display: flex; 139 flex-direction: column; 140 list-style-type: none; 141 margin: 0; 142 padding: 0; 143 } 144 145 .icon { 146 margin-right: 0.5rem; 147 } 148 149 /* top-level ul */ 150 & > ul { 151 gap: 0.3rem; 152 padding: 0.2rem; 153 } 154 155 li.top-level { /* top-level categories, orange all-caps titles */ 156 border-top: 0.1rem solid $gray3; 157 display: flex; 158 flex-direction: column; 159 gap: 0.3rem; 160 margin: 0; 161 162 & > a.title { 163 text-decoration: none; 164 color: $settings-nav-header-fg; 165 padding: 0.5rem; 166 padding-bottom: 0; 167 margin: 0; 168 font-size: 0.8rem; 169 font-weight: bold; 170 text-transform: uppercase; 171 } 172 173 & > ul { 174 gap: 0.2rem; 175 } 176 } 177 178 li.expanding { /* second-level categories, expanding box, active shows nested */ 179 a { 180 display: block; 181 color: $fg; 182 text-decoration: none; 183 184 border: 0.1rem solid transparent; 185 border-radius: $br; 186 padding: 0.5rem; 187 transition: background 0.1s; 188 189 &:hover { 190 color: $settings-nav-fg-hover; 191 background: $settings-nav-bg-hover; 192 } 193 194 &:focus, &:active { 195 border-color: $settings-nav-border-active; 196 outline: none; 197 } 198 } 199 200 &.active { 201 border: 0.1rem solid $settings-nav-border-active; 202 border-radius: $br; 203 overflow: hidden; 204 205 a { 206 transition: background 0s; 207 border: none; 208 color: $settings-nav-fg-active; 209 background: $settings-nav-bg-active; 210 font-weight: bold; 211 border-radius: 0; 212 } 213 } 214 } 215 216 li.nested { /* any deeper nesting, just has indent */ 217 a.title { 218 padding-left: 1rem; 219 font-weight: normal; 220 color: $fg; 221 background: $gray4; 222 223 &:focus { 224 color: $fg-accent; 225 outline: none; 226 } 227 228 &:hover { 229 background: $settings-nav-bg-hover; 230 } 231 } 232 233 &.active { 234 a.title { 235 color: $fg-accent; 236 font-weight: bold; 237 } 238 } 239 } 240 } 241 242 .capitalize { 243 text-transform: capitalize; 244 } 245 246 input, select, textarea { 247 box-sizing: border-box; 248 } 249 250 .error { 251 color: $error-fg; 252 background: $error-bg; 253 border: 0.02rem solid $error-fg; 254 border-radius: $br; 255 font-weight: bold; 256 padding: 0.5rem; 257 white-space: pre-wrap; 258 position: relative; 259 260 a { 261 color: $error-link; 262 } 263 264 .details { 265 max-width: 100%; 266 overflow: hidden; 267 display: flex; 268 flex-direction: column; 269 gap: 0.5rem; 270 } 271 272 pre { 273 background: $bg; 274 color: $fg; 275 padding: 1rem; 276 overflow: auto; 277 margin: 0; 278 } 279 } 280 281 .hidden { 282 display: none; 283 } 284 285 .messagebutton, .messagebutton > div { 286 display: flex; 287 align-items: center; 288 flex-wrap: wrap; 289 290 div.padded { 291 margin-left: 1rem; 292 } 293 294 button, .button { 295 white-space: nowrap; 296 margin-right: 1rem; 297 } 298 } 299 300 .messagebutton > div { 301 button, .button { 302 margin-top: 1rem; 303 } 304 } 305 306 .notImplemented { 307 border: 2px solid rgb(70, 79, 88); 308 background: repeating-linear-gradient( 309 -45deg, 310 #525c66, 311 #525c66 10px, 312 rgb(70, 79, 88) 10px, 313 rgb(70, 79, 88) 20px 314 ) !important; 315 } 316 317 section.with-sidebar > div, section.with-sidebar > form { 318 display: flex; 319 flex-direction: column; 320 gap: 1rem; 321 322 input, textarea { 323 width: 100%; 324 line-height: 1.5rem; 325 } 326 327 button { 328 width: auto; 329 align-self: flex-start; 330 line-height: 1.5rem; 331 } 332 333 input[type=checkbox] { 334 justify-self: start; 335 width: initial; 336 } 337 338 textarea { 339 width: 100%; 340 } 341 342 h1 { 343 margin-bottom: 0.5rem; 344 } 345 346 .moreinfolink { 347 font-size: 0.9em; 348 } 349 350 .labelinput .border { 351 border-radius: 0.2rem; 352 border: 0.15rem solid $border_accent; 353 padding: 0.3rem; 354 display: flex; 355 flex-direction: column; 356 } 357 358 .file-input.button { 359 display: inline-block; 360 font-size: 1rem; 361 font-weight: normal; 362 padding: 0.3rem 0.3rem; 363 align-self: flex-start; 364 margin-right: 0.2rem; 365 } 366 367 .labelinput, .labelselect { 368 display: flex; 369 flex-direction: column; 370 gap: 0.4rem; 371 } 372 373 .labelcheckbox { 374 display: flex; 375 gap: 0.4rem; 376 } 377 378 .titlesave { 379 display: flex; 380 flex-wrap: wrap; 381 gap: 0.4rem; 382 } 383 } 384 385 .form-flex { 386 display: flex; 387 flex-direction: column; 388 gap: 1rem; 389 } 390 391 .file-upload > div { 392 display: flex; 393 gap: 1rem; 394 395 img { 396 height: 8rem; 397 border: 0.2rem solid $border-accent; 398 } 399 400 img.avatar { 401 width: 8rem; 402 } 403 404 img.header { 405 width: 24rem; 406 } 407 } 408 409 .user-profile { 410 .overview { 411 display: grid; 412 max-width: 60rem; 413 grid-template-columns: 70% 30%; 414 grid-template-rows: 100%; 415 gap: 1rem; 416 417 .profile { 418 padding: 0; 419 420 .header { 421 border: 0.1rem solid $gray1; 422 } 423 } 424 425 .files { 426 width: 100%; 427 display: flex; 428 flex-direction: column; 429 justify-content: center; 430 gap: 1rem; 431 432 h3 { 433 margin: 0; 434 margin-bottom: 0.3rem; 435 } 436 437 span { 438 font-style: italic; 439 } 440 } 441 } 442 443 .fields { 444 display: flex; 445 flex-direction: column; 446 gap: 0.5rem; 447 448 .entry { 449 display: flex; 450 gap: 0.5rem; 451 } 452 } 453 } 454 455 form { 456 display: flex; 457 flex-direction: column; 458 gap: 0.5rem; 459 } 460 461 .form-field label { 462 font-weight: bold; 463 } 464 465 .form-field.file label { 466 display: grid; 467 grid-template-columns: auto 1fr; 468 469 .label { 470 grid-column: 1 / span 2; 471 } 472 } 473 474 span.form-info { 475 flex: 1 1 auto; 476 overflow: hidden; 477 text-overflow: ellipsis; 478 white-space: nowrap; 479 padding: 0.3rem 0; 480 font-weight: initial; 481 } 482 483 .checkbox-list { 484 .header, .entry { 485 display: grid; 486 gap: 0 1rem; 487 } 488 } 489 490 .instance-list { 491 p { 492 margin-top: 0; 493 } 494 495 .filter { 496 display: flex; 497 gap: 0.5rem; 498 } 499 500 .entry { 501 padding: 0.5rem; 502 margin: 0.2rem 0; 503 504 #domain { 505 flex: 1 1 auto; 506 overflow: hidden; 507 white-space: nowrap; 508 text-overflow: ellipsis; 509 } 510 } 511 } 512 513 .bulk h2 { 514 display: flex; 515 justify-content: space-between; 516 } 517 518 .emoji-list { 519 background: $list-entry-bg; 520 521 .header .form-field { 522 flex: 1 1 auto; 523 } 524 525 .entry { 526 flex-direction: column; 527 528 b { 529 padding-left: 0.4rem; 530 } 531 532 .emoji-group { 533 display: flex; 534 flex-wrap: wrap; 535 536 a { 537 border-radius: $br; 538 padding: 0.4rem; 539 line-height: 0; 540 541 img { 542 height: 2rem; 543 width: 2rem; 544 object-fit: contain; 545 vertical-align: middle; 546 } 547 548 &:hover { 549 background: $list-entry-hover-bg; 550 } 551 } 552 } 553 554 &:hover { 555 background: inherit; 556 } 557 } 558 } 559 560 .toot { 561 padding-top: 0.5rem; 562 .contentgrid { 563 padding: 0 0.5rem; 564 } 565 } 566 567 @media screen and (max-width: 60rem) { 568 /* vertical layout */ 569 #root { 570 padding: 1rem; 571 grid-template-columns: 100%; 572 grid-template-rows: auto auto; 573 574 .sidebar { 575 justify-self: auto; 576 margin-bottom: 2rem; 577 } 578 579 .sidebar, section.with-sidebar { 580 border-top-left-radius: $br; 581 border-top-right-radius: $br; 582 border-bottom-left-radius: $br; 583 border-bottom-right-radius: $br; 584 } 585 586 .sidebar a:first-child h2 { 587 border-top-right-radius: $br; 588 } 589 } 590 591 section { 592 grid-column: 1; 593 } 594 595 .user-profile .overview { 596 grid-template-columns: auto; 597 grid-template-rows: auto 1fr; 598 } 599 600 main section { 601 padding: 0.75rem; 602 } 603 604 .instance-list .filter { 605 flex-direction: column; 606 } 607 } 608 609 .combobox-wrapper { 610 display: flex; 611 flex-direction: column; 612 613 input[aria-expanded="true"] { 614 border-bottom: none; 615 } 616 } 617 618 .combobox { 619 height: 2.5rem; 620 font-size: 1rem; 621 line-height: 1.5rem; 622 } 623 624 .popover { 625 position: relative; 626 z-index: 50; 627 display: flex; 628 max-height: min(var(--popover-available-height,300px),300px); 629 flex-direction: column; 630 overflow: auto; 631 overscroll-behavior: contain; 632 border: 0.15rem solid $orange2; 633 background: $bg-accent; 634 } 635 636 .combobox-item { 637 display: flex; 638 cursor: pointer; 639 scroll-margin: 0.5rem; 640 align-items: center; 641 gap: 0.5rem; 642 padding: 0.5rem; 643 line-height: 1.5rem; 644 border-bottom: 0.15rem solid $gray3; 645 646 &:last-child { 647 border: none; 648 } 649 650 img { 651 height: 1.5rem; 652 width: 1.5rem; 653 object-fit: contain; 654 } 655 } 656 657 .combobox-item:hover { 658 background: $button-hover-bg; 659 color: $button-fg; 660 } 661 662 .combobox-item[data-active-item] { 663 background: $button-hover-bg; 664 color: hsl(204 20% 100%); 665 } 666 667 .row { 668 display: flex; 669 gap: 0.5rem; 670 } 671 672 .emoji-detail { 673 display: flex; 674 flex-direction: column; 675 gap: 1rem !important; 676 677 & > a { 678 align-self: flex-start; 679 } 680 681 .emoji-header { 682 display: flex; 683 align-items: center; 684 gap: 0.5rem; 685 686 div { 687 display: flex; 688 flex-direction: column; 689 gap: 0.5rem; 690 } 691 692 img { 693 height: 8.5rem; 694 width: 8.5rem; 695 border: 0.2rem solid $border-accent; 696 object-fit: contain; 697 padding: 0.5rem; 698 } 699 } 700 701 .update-category { 702 .combobox-wrapper button { 703 font-size: 1rem; 704 margin: 0.15rem 0; 705 } 706 707 .row { 708 margin-top: 0.1rem; 709 } 710 } 711 712 .update-image { 713 display: flex; 714 flex-direction: column; 715 gap: 0.5rem; 716 } 717 } 718 719 .left-border { 720 border-left: 0.2rem solid $border-accent; 721 padding-left: 0.4rem; 722 } 723 724 .parse-emoji { 725 .parsed { 726 margin-top: 0.5rem; 727 display: flex; 728 flex-direction: column; 729 gap: 1rem; 730 731 span { 732 margin-bottom: -0.5rem; 733 } 734 735 .action-buttons { 736 gap: 1rem; 737 } 738 739 .checkbox-list { 740 .entry { 741 grid-template-columns: auto auto 1fr; 742 } 743 744 .emoji { 745 height: 2rem; 746 width: 2rem; 747 margin: 0; 748 } 749 } 750 } 751 } 752 753 .info { 754 color: $info-fg; 755 background: $info-bg; 756 padding: 0.5rem; 757 border-radius: $br; 758 759 display: flex; 760 gap: 0.5rem; 761 align-items: center; 762 763 i { 764 margin-top: 0.1em; 765 } 766 767 a { 768 color: $info-link; 769 } 770 771 p { 772 margin-top: 0; 773 } 774 } 775 776 button.with-icon, .button.with-icon { 777 display: flex; 778 align-content: center; 779 padding-right: calc(0.5rem + $fa-fw); 780 781 .fa { 782 align-self: center; 783 } 784 } 785 786 button.with-padding { 787 padding: 0.5rem calc(0.5rem + $fa-fw); 788 } 789 790 .loading-icon { 791 align-self: flex-start; 792 } 793 794 .fadeout { 795 animation-name: fadeout; 796 animation-duration: 0.5s; 797 animation-delay: 2s; 798 animation-fill-mode: forwards; 799 } 800 801 .suspend-import-list { 802 .checkbox-list-wrapper { 803 overflow-x: auto; 804 display: grid; 805 gap: 1rem; 806 } 807 808 .checkbox-list { 809 810 .header { 811 input[type="checkbox"] { 812 align-self: start; 813 height: 1.5rem; 814 } 815 } 816 817 .entry { 818 gap: 0; 819 width: 100%; 820 grid-template-columns: auto minmax(25ch, 2fr) minmax(40ch, 1fr); 821 grid-template-rows: auto 1fr; 822 823 input[type="checkbox"] { 824 margin-right: 1rem; 825 } 826 827 .domain-input { 828 margin-right: 0.5rem; 829 display: grid; 830 grid-template-columns: 1fr $fa-fw; 831 gap: 0.5rem; 832 833 #icon { 834 align-self: center; 835 836 .already-blocked { 837 color: $green1; 838 } 839 840 .suggest-changes { 841 color: $orange2; 842 } 843 } 844 } 845 846 p { 847 align-self: center; 848 margin: 0; 849 grid-column: 4; 850 grid-row: 1 / span 2; 851 } 852 } 853 } 854 } 855 856 .import-export { 857 p { 858 margin: 0; 859 } 860 861 .export-file { 862 display: flex; 863 gap: 0.7rem; 864 align-items: center; 865 } 866 867 .button-grid { 868 display: inline-grid; 869 grid-template-columns: auto auto auto; 870 align-self: start; 871 gap: 0.5rem; 872 873 button { 874 width: 100%; 875 } 876 } 877 } 878 879 @media screen and (max-width: 35rem) { 880 .import-export { 881 .button-grid { 882 grid-template-columns: auto auto; 883 884 b { /* filler item */ 885 display: none; 886 } 887 888 & > * { 889 grid-column: 1 / span 2; 890 justify-self: start; 891 } 892 893 .export-file-button, .export-file { 894 grid-column: span 1; 895 } 896 } 897 } 898 } 899 900 .update-hints { 901 background: $list-entry-alternate-bg; 902 border: 0.1rem solid $border-accent; 903 /* border-radius: $br; */ 904 padding: 0.5rem; 905 display: flex; 906 flex-direction: column; 907 908 .hints { 909 max-width: 100%; 910 align-self: start; 911 align-items: center; 912 margin: 1rem 0; 913 display: inline-grid; 914 grid-template-columns: auto auto auto auto; 915 gap: 1rem; 916 } 917 } 918 919 .export-format-table-wrapper { 920 overflow-x: auto; 921 922 &, th, td { 923 border: 0.1rem solid $gray1 !important; 924 } 925 926 .export-format-table { 927 background: $list-entry-alternate-bg; 928 border-style: hidden; 929 border-collapse: collapse; 930 931 th, td { 932 padding: 0.3rem; 933 } 934 935 th { 936 background: $list-entry-bg; 937 } 938 939 td { 940 text-align: center; 941 942 .fa-check { 943 color: $green1; 944 } 945 946 .fa-times { 947 color: $error3; 948 } 949 } 950 } 951 } 952 953 .form-field.radio { 954 &, label { 955 display: flex; 956 gap: 0.5rem; 957 } 958 959 input { 960 width: auto; 961 place-self: center; 962 } 963 } 964 965 .reports { 966 p { 967 margin: 0; 968 } 969 970 .report { 971 display: flex; 972 flex-direction: column; 973 gap: 0.5rem; 974 margin: 0.5rem 0; 975 976 text-decoration: none; 977 color: $fg; 978 979 padding: 1rem; 980 981 border: none; 982 border-left: 0.3rem solid $border-accent; 983 984 .usernames { 985 line-height: 2rem; 986 } 987 988 .byline { 989 display: grid; 990 grid-template-columns: 1fr auto; 991 gap: 0.5rem; 992 993 .status { 994 color: $border-accent; 995 } 996 } 997 998 .details { 999 display: grid; 1000 grid-template-columns: auto 1fr; 1001 gap: 0.2rem 0.5rem; 1002 padding: 0.5rem; 1003 1004 justify-items: start; 1005 } 1006 1007 h3 { 1008 margin: 0; 1009 } 1010 1011 &.resolved { 1012 color: $fg-reduced; 1013 border-left: 0.4rem solid $bg; 1014 1015 .byline .status { 1016 color: $fg-reduced; 1017 } 1018 1019 .user { 1020 opacity: 0.8; 1021 } 1022 } 1023 1024 &.detail { 1025 border: none; 1026 padding: 0; 1027 } 1028 } 1029 1030 .report.detail { 1031 display: flex; 1032 flex-direction: column; 1033 margin-top: 1rem; 1034 gap: 1rem; 1035 1036 .info-block { 1037 padding: 0.5rem; 1038 background: $gray2; 1039 } 1040 1041 .info { 1042 display: block; 1043 } 1044 1045 .reported-toots { 1046 margin-top: 0.5rem; 1047 } 1048 1049 .toot .toot-info { 1050 padding: 0.5rem; 1051 background: $toot-info-bg; 1052 1053 a { 1054 color: $fg-reduced; 1055 } 1056 1057 &:last-child { 1058 border-bottom-left-radius: $br; 1059 border-bottom-right-radius: $br; 1060 } 1061 } 1062 } 1063 1064 .user { 1065 line-height: 1.3rem; 1066 display: inline-block; 1067 background: $fg-accent; 1068 color: $bg; 1069 border-radius: $br; 1070 padding: 0.15rem 0.15rem; 1071 margin: 0 0.1rem; 1072 font-weight: bold; 1073 text-decoration: none; 1074 1075 .acct { 1076 word-break: break-all; 1077 } 1078 1079 &.suspended { 1080 background: $bg-accent; 1081 color: $fg; 1082 text-decoration: line-through; 1083 } 1084 1085 &.local { 1086 background: $green1; 1087 } 1088 } 1089 } 1090 1091 .account-search { 1092 form { 1093 margin-bottom: 1rem; 1094 } 1095 1096 .list { 1097 margin: 0.5rem 0; 1098 1099 a { 1100 color: $fg; 1101 text-decoration: none; 1102 1103 #username { 1104 color: $link-fg; 1105 margin-left: 0.5em; 1106 } 1107 } 1108 } 1109 } 1110 1111 .account-detail { 1112 display: flex; 1113 flex-direction: column; 1114 gap: 1rem; 1115 1116 .profile { 1117 overflow: hidden; 1118 max-width: 60rem; 1119 } 1120 1121 .action-buttons { 1122 display: flex; 1123 gap: 0.5rem; 1124 } 1125 } 1126 1127 @media screen and (orientation: portrait) { 1128 .reports .report .byline { 1129 grid-template-columns: 1fr; 1130 1131 .status { 1132 grid-row: 1; 1133 } 1134 } 1135 } 1136 1137 [role="button"] { 1138 cursor: pointer; 1139 } 1140 1141 @keyframes fadeout { 1142 from { 1143 opacity: 1; 1144 } 1145 to { 1146 opacity: 0; 1147 } 1148 }