/*
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 lists.
*/
ul {
li::marker {
color: $border-accent;
}
}
ol {
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-inline: 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-perm-list {
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-perm-list .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;
}
}