/*
GoToSocial
Copyright (C) GoToSocial Authors admin@gotosocial.org
SPDX-License-Identifier: AGPL-3.0-or-later
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see
elements when they're focused (ie., by clicking or tabbing to them). This is used when we've got a preformatted code block with a scroll bar inside of it. */ $pre-focus-outline: 0.25rem dashed $link-fg; /****************************************** ***** SECTION 2: BASIC GLOBAL STYLING ***** *******************************************/ html, body { padding: 0; margin: 0; background: $bg; color: $fg; font-family: "Noto Sans", sans-serif; scrollbar-color: $orange1 $gray3; } body { line-height: 1.5em; position: relative; } a { color: $link-fg; &:focus-visible { outline: $link-focus-outline; } } /* Normalize margins of first and last children. We generally don't want to open a paragraph or paragraph-like element with a top margin or close it with a bottom margin. */ main { p:first-child, ol:first-child, ul:first-child { margin-top: 0; } p:last-child, ol:last-child, ul:last-child { margin-bottom: 0; } } .button, button { border-radius: $br-inner; color: $button-fg; background: $button-bg; box-shadow: $boxshadow; border: $button-border; text-decoration: none; font-size: 1.2rem; font-weight: bold; padding: 0.5rem; border: none; cursor: pointer; text-align: center; font-family: 'Noto Sans', sans-serif; &.danger { color: $button-danger-fg; background: $button-danger-bg; &:hover { background: $button-danger-hover-bg; } } &:disabled, &.disabled { color: $white2; background: $gray2; cursor: not-allowed; &:hover { background: $gray3; } } &:hover { background: $button-hover-bg; } &:focus-visible { outline: $button-focus-outline; } } summary:focus-visible { outline: $summary-focus-outline; } /* Form styling - used in settings frontend as well. */ input, select, textarea, .input { box-sizing: border-box; border: 0.15rem solid $input-border; border-radius: 0.1rem; color: $fg; background: $input-bg; width: 100%; font-family: 'Noto Sans', sans-serif; font-size: 1rem; padding: 0.3rem; &:focus, &:active { border-color: $input-focus-border; } &[type=checkbox]:focus-visible, &[type=radio]:focus-visible { outline: $input-clickable-focus-outline; } &:invalid, .invalid & { border-color: $input-error-border; } &:disabled { background: transparent; } &::placeholder { opacity: 1; color: $fg-reduced } } select { /* By default this looks awful on Gnome Web so restyle a bit to try to make it consistent with firefox + chrome. */ appearance: none; line-height: 1.5rem; } /* Squeeze emojis so they fit inline in text. */ .emoji { width: 1.45em; height: 1.45em; margin: -0.2em 0.02em 0; object-fit: contain; vertical-align: middle; @media (prefers-reduced-motion: no-preference) { /* Enlarge emojis on hover to give viewer a good look at them. */ transition: 0.1s; &:hover, &:active { transform: scale(2); background-color: $bg; box-shadow: $boxshadow; border: $boxshadow-border; border-radius: $br-inner; } } } /* Restyle unordered lists; outdent and replace dot with orange dot. */ ul { padding-left: 2.5rem; list-style: none; li::before { content: "\2022"; color: $border-accent; font-weight: bold; display: inline-block; width: 1.5rem; margin-left: -1.5rem; } } /* Mirror the same styling a little bit for ordered lists by making marker bold. */ ol { padding-left: 2.5rem; li::marker { font-weight: bold; } } /* Outdent block quotes a bit; use orange strip for left border. */ blockquote { padding: 0.5rem; border-left: 0.2rem solid $border-accent; margin: 0; font-style: normal; /* Same background color we use for code blocks */ background-color: $gray2; border-radius: 0; } /* Nice dashed orange line for horizontal rules. */ hr { border: 0; border-top: 1px dashed $border-accent; } /* Don't indent definition lists and definitions. */ dl { margin: 0; dd { margin-left: 0; } } label { cursor: pointer; } /* Set our own nice background and font for monospace code and pre blocks. */ pre, pre[class*="language-"], code, code[class*="language-"] { font-family: "Noto Sans Mono", monospace; background-color: $gray2; } /* Just code on its own inside status content, ie, `here is some code`. */ code { padding: 0.25rem; border-radius: $br-inner; white-space: pre-wrap; } /* Restyle Prism code highlighting toolbar plugin buttons to our own button style. We have to use really specific selectors because of how specific prism.css is. */ div.code-toolbar > div.toolbar { margin-right: 0.5rem; display: flex; gap: 0.25rem; > div.toolbar-item { > span, > button { color: $button-fg; background: $button-bg; font-weight: bold; box-shadow: $boxshadow; &:hover, &:focus { color: $button-fg; } } .copy-to-clipboard-button:hover { background: $button-hover-bg; } } } pre, pre[class*="language-"] { border-radius: $br; padding: 0.5rem; white-space: pre; overflow-x: auto; &:focus { outline: $pre-focus-outline; } /* Code inside a pre block, ie., ``` here is some code ``` */ code { width: 100%; padding: 0; white-space: pre; overflow-x: auto; -webkit-overflow-scrolling: touch; } } /************************************* ***** SECTION 3: UTILITY CLASSES ***** **************************************/ /* Column header that appears at the top of threads, at the top of sections of profiles (About, Pinned Posts, etc). */ .col-header { display: grid; grid-template-columns: auto 1fr; gap: 1rem; justify-content: start; align-items: center; margin: 0; background: $profile-bg; border-top-left-radius: $br; border-top-right-radius: $br; padding: 0.75rem; a { justify-self: end; } h1, h2, h3, h4 { font-size: 1.2rem; line-height: 1.3rem; margin: 0; } } .hidden { display: none; } .nounderline { text-decoration: none; } .accent { color: $acc1; } .text-cutoff { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } /* Class for lists that don't want the orange dot. */ .nodot { li::before { content: initial; } } /* Forms and sign-in / sign-up / confirm pages. */ section.with-form { form { display: flex; flex-direction: column; gap: 1rem; padding-bottom: 1rem; padding-top: 1rem; p { /* We use gap so we don't need top + bottom margins. */ margin-top: 0; margin-bottom: 0; } label, input { padding-left: 0.2rem; } .labelinput { display: flex; flex-direction: column; gap: 0.4rem; } .checkbox { display: flex; flex-direction: row-reverse; gap: 0.4rem; & > input { height: 1rem; width: 1rem; align-self: center; } } .btn { /* Visually separate buttons a bit */ margin-top: 1rem; } } } /*********************************** ***** SECTION 4: SHAMEFUL MESS ***** ************************************/ /* EVERYTHING BELOW THIS POINT: Should be moved somewhere else to avoid cluttering up this file. */ /* Below section stylings are used in transient pages + error templates. */ section.error { word-break: break-word; margin-bottom: 0.5rem; pre { border: 1px solid #ff000080; padding: 0.5rem; border-radius: 0.5em; background-color: #ff000010; font-size: 1.3em; white-space: pre-wrap; } } section.oob-token { code { background: $gray1; padding: 0.5rem; margin: 0; border-radius: 0.3rem; } } /* TODO: list and blocklist are only used in settings panel and on blocklist page; consider moving them somewhere else. */ .list { display: flex; flex-direction: column; .header, .entry { padding: 0.5rem; } .header { border: 0.1rem solid transparent !important; /* for alignment with .entry border padding */ background: $gray1 !important; display: flex; font-weight: bold; } .entries { display: flex; flex-direction: column; &.scrolling { height: 20rem; max-height: 20rem; overflow: auto; } } input[type=checkbox] { margin-left: 0.5rem; } .entry { display: flex; flex-wrap: wrap; background: $list-entry-bg; border: 0.1rem solid transparent; &:nth-child(even) { background: $list-entry-alternate-bg; } &:hover { background: $list-entry-hover-bg; } &:active, &:focus, &:hover, &:target { border-color: $fg-accent; } } } .domain-blocklist { box-shadow: $boxshadow; .entry { display: grid; grid-template-columns: max(30%, 10rem) 1fr; gap: 0.5rem; align-items: start; border: $boxshadow-border; border-top-color: transparent; & > div { display: flex; align-items: center } .domain a { font-weight: bold; text-decoration: none; display: inline-block; /* so it wraps properly */ } .public_comment p { margin: 0; } } .header .domain { color: $fg; } } @media screen and (max-width: 30rem) { .domain-blocklist .entry { grid-template-columns: 1fr; gap: 0; } } /* TODO: this is only used on About page and in settings application; consider moving it somewhere else. */ .account-card { display: inline-grid; grid-template-columns: auto 1fr; grid-template-rows: auto auto; text-decoration: none; gap: 0.5rem 1rem; border-radius: $br; padding: 0.5rem; min-width: 40%; margin-bottom: 0.3rem; background: $list-entry-bg; &:hover { background: $list-entry-alternate-bg; } h3 { align-self: end; margin: 0; color: $fg; } img.avatar { border-radius: 0.5rem; width: 5rem; height: 5rem; object-fit: cover; grid-row: 1 / span 2; } }