discourse/app/assets/stylesheets/common/base/discourse.scss

838 lines
14 KiB
SCSS

// Common
// global styles that apply to the Discourse application specifically
// BEWARE: changing these styles implies they take effect anywhere they are seen
// throughout the Discourse application
:root {
--d-input-bg-color: var(--secondary);
--d-input-text-color: var(--primary);
--d-input-border: 1px solid var(--primary-400);
--d-input-bg-color--disabled: var(--primary-low);
--d-input-text-color--disabled: var(--primary);
--d-input-border--disabled: 1px solid var(--primary-low);
--d-nav-color: var(--primary);
--d-nav-bg-color: transparent;
--d-nav-color--hover: var(--primary);
--d-nav-bg-color--hover: var(--d-hover);
--d-nav-color--active: var(--tertiary);
--d-nav-bg-color--active: transparent;
--d-nav-border-color--active: var(--d-nav-color--active);
--d-nav-underline-height: 0.125em;
--safe-area-inset-bottom: env(safe-area-inset-bottom);
}
// Animation Keyframes
@keyframes rotate-forever {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes background-fade-highlight {
0% {
background-color: var(--tertiary-low);
}
100% {
background-color: transparent;
}
}
// placeholder
@keyframes placeHolderShimmer {
0% {
background-position: -1000px 0;
}
100% {
background-position: 1100px 0;
}
}
@media (prefers-reduced-motion: no-preference) {
.placeholder-animation {
animation-duration: 4s;
animation-fill-mode: forwards;
animation-iteration-count: infinite;
animation-name: placeHolderShimmer;
animation-timing-function: linear;
background: var(--primary-very-low);
background: linear-gradient(
to right,
var(--primary-very-low) 10%,
var(--primary-low) 18%,
var(--primary-very-low) 33%
);
}
}
// Base Elements
html {
height: 100%;
}
body {
background-attachment: fixed;
background-size: cover;
min-height: 100%;
box-sizing: border-box;
@include clearfix;
}
// setting a static limit on big and small prevents nesting abuse
big {
font-size: var(--font-up-5);
}
small {
font-size: var(--font-down-2);
}
blockquote {
@include post-aside;
clear: both;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: var(--heading-font-family);
margin-top: 0;
margin-bottom: 0.5rem;
}
a.cancel {
margin-left: 1.25em;
line-height: normal;
color: var(--primary-high);
transition: var(--d-button-transition);
&:hover {
color: var(--danger);
}
}
ul.breadcrumb {
margin: 0 10px 0 10px;
}
a.no-href {
cursor: pointer;
}
img.avatar {
border-radius: 50%;
}
// don't wrap relative dates; we want Jul 26, '15, not: Jul
// 26,
// '15
span.relative-date {
white-space: nowrap;
}
legend {
color: var(--primary-high);
font-weight: bold;
}
label {
display: flex;
margin-bottom: 5px;
align-items: flex-start;
color: var(--primary-high);
&:not(.checkbox-label) {
font-weight: bold;
}
> .d-icon {
align-self: center;
margin-right: 4px;
}
a {
// flex removes whitespace characters between text nodes and elements
// so we need to add it back
margin: 0 0.25em;
}
}
input {
&[type="radio"],
&[type="checkbox"] {
margin-top: 0.17em;
margin-right: 0.43em;
margin-left: 0.1em;
line-height: var(--line-height-small);
cursor: pointer;
flex-shrink: 0; // Adding for safety, Safari will shrink checkboxes
}
&[type="submit"],
&[type="reset"],
&[type="button"],
&[type="radio"],
&[type="checkbox"] {
width: auto;
}
&.invalid {
background-color: var(--danger-low);
}
.radio &[type="radio"],
.checkbox &[type="checkbox"] {
float: left;
margin-left: -18px;
}
}
input {
&[type="text"],
&[type="password"],
&[type="datetime"],
&[type="datetime-local"],
&[type="date"],
&[type="month"],
&[type="time"],
&[type="week"],
&[type="number"],
&[type="email"],
&[type="url"],
&[type="search"],
&[type="tel"],
&[type="color"] {
@include appearance-none;
@include form-item-sizing;
display: inline-block;
margin-bottom: 9px;
color: var(--d-input-text-color);
background-color: var(--d-input-bg-color);
border: var(--d-input-border);
border-radius: var(--d-input-border-radius);
color-scheme: var(--scheme-type);
&:focus {
@include default-focus;
}
}
&[type="time"] {
max-width: 140px;
}
}
input[type="search"] {
&::-webkit-search-cancel-button,
&::-webkit-search-decoration {
-webkit-appearance: none;
appearance: none;
}
}
// Fixes Safari height inconsistency
::-webkit-datetime-edit {
display: inline;
}
// Fixes Webkit inconsistencies (Safari/Chrome)
::-webkit-datetime-edit-fields-wrapper,
::-webkit-datetime-edit-text,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-year-field {
padding-top: 0;
padding-bottom: 0;
}
::placeholder {
text-overflow: ellipsis;
}
textarea {
padding: $vpad $hpad;
box-sizing: border-box;
height: auto;
background-color: var(--secondary);
border: 1px solid var(--primary-400);
border-radius: 0;
&:focus {
@include default-focus;
}
}
select {
border: 1px solid var(--primary-low);
}
table {
th {
font-weight: normal;
color: var(--primary-medium);
text-align: left;
padding: 0.5em;
}
}
input,
select,
textarea {
color: var(--d-input-text-color);
caret-color: currentColor;
&[disabled],
&[readonly] {
cursor: not-allowed;
color: var(--d-input-text-color--disabled);
background-color: var(--d-input-bg-color--disabled);
border: var(--d-input-border--disabled);
}
&:focus:required:invalid {
color: var(--danger);
border-color: var(--danger);
outline: 1px solid var(--danger);
}
}
// Common Classes
.sortable {
white-space: nowrap;
.discourse-no-touch & {
&:hover,
&:focus {
background-color: var(--primary-low);
}
}
.d-icon {
margin-left: 0.25em;
}
@include unselectable;
cursor: pointer;
}
.radio,
.checkbox {
min-height: 18px;
padding-left: 18px;
.controls > &:first-child {
padding-top: 5px;
}
&.inline {
display: inline-block;
padding-top: 5px;
margin-bottom: 0;
vertical-align: middle;
}
}
.radio.inline .radio.inline,
.checkbox.inline .checkbox.inline {
margin-left: 0.67em;
}
.container {
@extend .clearfix;
}
.wrap {
--d-wrap-padding-h: 0.67em;
max-width: var(--d-max-width);
margin-right: auto;
margin-left: auto;
padding: 0 var(--d-wrap-padding-h);
.contents {
position: relative;
}
}
.boxed {
&.white {
background-color: var(--secondary);
}
}
.full-width {
margin-left: 12px;
}
.clear-transitions {
transition: none !important;
}
.tip {
display: inline-block;
&.good {
color: var(--success);
}
&.bad {
color: var(--danger);
}
}
.avatar-wrapper {
background-color: var(--secondary);
display: inline-block;
border-radius: 50%;
}
.unread-high-priority-notifications {
color: var(--secondary);
background: var(--success);
&.badge-notification[href] {
color: var(--secondary);
}
}
.d-header .header-dropdown-toggle .do-not-disturb-background {
position: absolute;
left: 0;
bottom: -1px;
}
.do-not-disturb-background {
display: flex;
align-items: center;
justify-content: center;
width: 1.25em;
background-color: var(--secondary);
border-radius: 50%;
height: 1.25em;
.d-icon.d-icon-discourse-dnd {
color: var(--header_primary-medium) !important;
font-size: 1em;
height: 1em;
width: 1em;
}
}
.d-header .header-dropdown-toggle .user-status-background {
position: absolute;
right: -3px;
bottom: -1px;
z-index: 1002;
}
.user-status-background {
display: flex;
align-items: center;
justify-content: center;
width: 1.25em;
height: 1.25em;
background-color: var(--secondary);
border-radius: 50%;
.emoji {
width: 14px;
height: 14px;
display: block;
}
}
.user-menu .quick-access-panel li.user-status .relative-date {
text-align: left;
font-size: var(--font-down-3);
padding-top: 0.45em;
margin-left: 0.75em;
color: var(--primary-medium);
}
.user-menu .quick-access-panel li.do-not-disturb {
display: flex;
flex: 0 0 100%;
flex-wrap: wrap;
align-items: center;
background: var(--secondary);
.do-not-disturb-inner-container {
display: flex;
width: 100%;
align-items: center;
.do-not-disturb-label {
display: flex;
align-items: center;
}
.relative-date {
text-align: left;
font-size: var(--font-down-3);
padding-top: 3px;
margin-left: 0.75em;
color: var(--primary-medium);
}
.d-icon-toggle-off,
.d-icon-toggle-on {
padding-top: 0;
}
.d-icon-toggle-on {
color: var(--tertiary);
}
}
}
.do-not-disturb-modal {
.do-not-disturb-choice {
display: grid;
grid-template-columns: 2em 1fr auto;
grid-template-rows: auto auto;
align-items: center;
cursor: pointer;
padding: 0.5em 0;
&:hover {
background-color: var(--tertiary-low);
}
label {
margin-bottom: 0;
}
}
}
.fade {
opacity: 0;
transition: opacity 0.15s linear;
&.in {
opacity: 1;
}
}
.inline-spinner {
display: inline-block;
margin: 0;
}
.spinner {
margin: 20px auto 20px auto;
position: relative;
-webkit-animation: rotate-forever 1s infinite linear;
animation: rotate-forever 1s infinite linear;
height: 30px;
width: 30px;
border: 4px solid var(--primary-low-mid);
border-right-color: transparent;
border-radius: 50%;
&.small {
width: 10px;
height: 10px;
margin: 0;
display: inline-block;
}
}
.content-list {
h3 {
color: var(--primary-medium);
font-size: var(--font-up-1);
padding-left: 5px;
margin-bottom: 10px;
}
ul {
list-style: none;
margin: 0;
li {
border-bottom: 1px solid var(--primary-low);
&:first-of-type {
border-top: 1px solid var(--primary-low);
}
a {
display: block;
padding: 10px;
color: var(--primary);
&:hover {
background-color: var(--primary-low);
color: var(--primary);
}
&.active {
font-weight: bold;
color: var(--primary);
background: var(--d-selected);
}
}
}
}
}
.form-vertical {
input,
textarea,
select {
display: inline-block;
margin-bottom: 0;
flex: 0 0 auto;
max-width: 100%;
}
.control-label:not(.checkbox-label) {
font-family: var(--heading-font-family);
font-weight: bold;
font-size: var(--font-up-2);
line-height: var(--line-height-large);
}
.control-group,
.controls {
margin-left: 0;
label {
font-weight: normal;
}
}
}
// Special elements
#main-outlet-wrapper {
box-sizing: border-box;
width: 100%;
display: grid;
grid-template-areas:
"sidebar content"
"sidebar below-content";
grid-template-rows: 1fr auto;
grid-template-columns: 0 minmax(0, 1fr); // 0 column width needs to be set for CSS transitions
gap: 0;
#main-outlet {
grid-area: content;
}
}
#main-outlet {
padding-top: 1.5em;
}
#main {
img.avatar {
&.header {
width: 45px;
height: 45px;
}
&.medium {
width: 32px;
height: 32px;
}
&.small {
width: 25px;
height: 25px;
}
&.tiny {
width: 20px;
height: 20px;
}
}
.user-list {
.user {
padding-bottom: 5px;
}
}
}
#loading-message {
position: absolute;
font-size: var(--font-up-5);
text-align: center;
top: 120px;
left: 500px;
color: var(--primary);
}
#footer {
.container {
height: 50px;
.contents {
padding-top: 10px;
a[href] {
color: var(--secondary);
}
}
}
}
.inline {
display: inline;
}
.pref-email {
display: grid;
grid-template-areas:
"title title"
"email email"
"instructions controls";
grid-template-columns: 1fr auto;
align-items: center;
gap: 0 0.5em;
.control-label {
grid-area: title;
}
.emails {
grid-area: email;
}
.instructions {
grid-area: instructions;
}
.controls {
margin-top: 0.5em;
grid-area: controls;
}
.resend-email-confirmation {
background: transparent;
border: none;
color: var(--tertiary);
padding: 0;
text-align: left;
}
.row {
border-bottom: 1px solid var(--primary-low);
padding: 0.25em 0;
display: grid;
grid-template-areas:
"email dropdown"
"meta dropdown";
grid-template-columns: 1fr auto;
grid-template-rows: 1fr auto;
}
.email-first {
grid-area: email;
align-self: center;
overflow-wrap: break-word;
min-width: 0;
}
.email-second {
grid-area: meta;
color: var(--primary-medium);
.primary {
color: var(--success);
}
.unconfirmed {
font-style: italic;
}
}
.email-dropdown {
grid-area: dropdown;
align-self: center;
justify-self: end;
summary {
background: transparent;
.d-icon {
color: var(--primary-high);
}
}
}
.dropdown-menu {
width: 120px;
}
}
.topic-statuses {
// avoid adding margin/padding on this parent; sometimes it appears as an empty container
float: left;
.topic-status {
margin: 0;
display: inline-flex;
color: var(--primary-medium);
margin-right: 0.2em;
.d-icon {
height: 0.74em;
width: 0.75em;
}
}
.topic-status-warning .d-icon-envelope {
color: var(--danger);
}
}
.broken-theme-alert-banner {
font-size: var(--base-font-size);
font-weight: bold;
padding: 5px 0;
background: var(--danger);
text-align: center;
z-index: z("max");
color: var(--secondary);
a {
color: var(--secondary);
text-decoration: underline;
}
.theme-error-suffix {
font-weight: normal;
}
}
.controls {
.grouped-control {
display: flex;
flex-direction: column;
.grouped-control-label {
padding: 0.25em 0;
}
.grouped-control-field {
flex: 1 0 auto;
display: flex;
padding-bottom: 0.25em;
label {
margin: 0;
}
}
}
}
a#user-nav-skip-link,
a#skip-link {
padding: 0.25em 0.5em;
position: fixed;
top: -50px;
left: 1em;
color: var(--secondary);
background: var(--tertiary);
transition: top 0.3s ease-out;
z-index: z("header") + 1;
&:focus {
top: 0px;
transition: top 0.15s ease-in;
}
}
.scroll-lock {
overflow: hidden !important;
margin-right: var(--scroll-gap, 0);
}