discourse/app/assets/stylesheets/common/components/buttons.scss
Jarek Radosz be513ed9a3
DEV: Fix all mixed-decls sass deprecations (#31343)
```
WARNING: Sass's behavior for declarations that appear after nested
rules will be changing to match the behavior specified by CSS in an upcoming
version. To keep the existing behavior, move the declaration above the nested
rule. To opt into the new behavior, wrap the declaration in `& {}`.

More info: https://sass-lang.com/d/mixed-decls
```
2025-02-13 23:58:19 +01:00

499 lines
8.5 KiB
SCSS
Vendored

// --------------------------------------------------
// Buttons
// --------------------------------------------------
// Base
// --------------------------------------------------
@mixin btn(
$text-color: var(--primary),
$bg-color: var(--primary-low),
$icon-color: var(--primary-high),
$hover-text-color: var(--secondary),
$hover-bg-color: var(--primary-medium),
$hover-icon-color: var(--primary-low)
) {
display: inline-flex;
align-items: center;
justify-content: center;
margin: 0;
font-weight: normal;
color: $text-color;
background-color: $bg-color;
background-image: linear-gradient(
to bottom,
rgba(0, 0, 0, 0),
rgba(0, 0, 0, 0)
);
border-radius: var(--d-button-border-radius);
transition: var(--d-button-transition);
cursor: pointer;
@include form-item-sizing;
&:visited {
// covers cases where we add button classes to links
color: $text-color;
}
.d-icon {
color: $icon-color;
margin-right: 0.45em;
transition: var(--d-button-transition);
// For Windows High Contrast (see whcm.scss for more)
@media (forced-colors: active) {
color: ButtonText;
}
}
.d-button-label + .d-icon {
margin-left: 0.45em;
margin-right: 0;
}
&.no-text {
.d-icon {
margin-right: 0;
}
}
@include hover {
background-color: $hover-bg-color;
color: $hover-text-color;
.d-icon {
color: $hover-icon-color;
// For Windows High Contrast (see whcm.scss for more)
@media (forced-colors: active) {
color: Highlight;
}
}
}
&:focus-visible {
outline: none;
background-color: $hover-bg-color;
color: $hover-text-color;
.d-icon {
color: $hover-icon-color;
@media (forced-colors: active) {
color: Highlight;
}
}
}
.discourse-no-touch &:active:not(:hover, :focus),
.discourse-no-touch &.btn-active:not(:hover, :focus),
&:active:not(:hover, :focus),
&.btn-active:not(:hover, :focus) {
@include darken-background($bg-color, 0.6);
color: $hover-text-color;
.d-icon {
color: $hover-icon-color;
}
}
.discourse-no-touch &:active,
.discourse-no-touch &.btn-active,
&:active,
&.btn-active {
@include darken-background($bg-color, 0.3);
color: $hover-text-color;
.d-icon {
color: $hover-icon-color;
}
}
&[disabled],
&.disabled {
cursor: not-allowed;
&:not(.is-loading) {
opacity: 0.4;
}
&:hover {
color: $text-color;
background: $bg-color;
.d-icon {
color: $icon-color;
}
}
}
.loading-container {
display: none;
margin: 0 6.75px 0 0;
}
&.is-loading {
&.btn-text {
&.btn-small {
.loading-icon {
font-size: var(--font-down-1);
margin-right: 0.2em;
}
}
}
.loading-icon {
animation: rotate-forever 1s infinite linear, fadein 1s;
}
}
}
.btn.hidden {
display: none;
}
// Default button
// --------------------------------------------------
.btn {
@include btn;
}
// Primary button
// --------------------------------------------------
.btn-primary {
@include btn(
$text-color: var(--secondary),
$bg-color: var(--tertiary),
$icon-color: var(--secondary),
$hover-bg-color: var(--tertiary-hover),
$hover-icon-color: var(--secondary)
);
}
// Danger button
// --------------------------------------------------
.btn-danger {
@include btn(
$text-color: var(--secondary),
$bg-color: var(--danger),
$icon-color: var(--danger-low),
$hover-bg-color: var(--danger-hover),
$hover-icon-color: var(--danger-low)
);
}
// ✘ and ✔ buttons
// --------------------------------------------------
.btn.cancel {
@include btn(
$text-color: var(--secondary),
$bg-color: var(--danger),
$icon-color: var(--secondary),
$hover-bg-color: var(--danger-hover),
$hover-icon-color: var(--secondary)
);
}
.btn.ok {
@include btn(
$text-color: var(--secondary),
$bg-color: var(--success),
$icon-color: var(--secondary),
$hover-bg-color: var(--success-hover),
$hover-icon-color: var(--secondary)
);
}
// Social buttons
// --------------------------------------------------
.btn-social {
color: #000;
background: #fff;
border-radius: var(--d-border-radius);
&:focus-visible {
outline: 1px solid #000;
}
&[href] {
color: var(--secondary);
}
&::before {
margin-right: 9px;
font-size: var(--font-0);
}
.d-icon,
&.btn:hover .d-icon {
color: #000;
}
&.cas {
.d-icon {
color: var(--cas);
}
&:hover {
.d-icon {
color: var(--cas);
}
}
}
&.twitter {
.d-icon {
color: var(--twitter);
}
&:hover {
.d-icon {
color: var(--twitter);
}
}
}
&.github {
.d-icon {
color: var(--github);
}
&:hover {
.d-icon {
color: var(--github);
}
}
}
&.discord {
.d-icon {
color: var(--discord);
}
&:hover {
.d-icon {
color: var(--discord);
}
}
}
// https://developers.facebook.com/docs/facebook-login/userexperience/#buttondesign
// if you are unable to use Facebook blue, revert to black and white.
}
// Button Sizes
// --------------------------------------------------
// Small
.btn-small {
font-size: var(--font-down-1);
min-height: 20px;
}
// Large
.btn-large {
font-size: var(--font-up-1);
}
// Bonus Buttons
// --------------------------------------------------
.btn-flat {
background: transparent;
border: 0;
line-height: var(--line-height-small);
transition: var(--d-button-transition);
.d-icon {
color: var(--primary-low-mid);
transition: var(--d-button-transition);
}
.discourse-no-touch & {
&:hover,
&:focus-visible {
color: var(--primary);
.d-icon {
color: var(--primary);
}
}
&:hover {
background: transparent;
}
&:focus-visible {
background: var(--primary-low);
}
}
&.close {
background: transparent;
font-size: var(--font-up-2);
.d-icon {
color: var(--primary-high);
}
.discourse-no-touch & {
&:hover,
&:focus-visible {
background: transparent;
.d-icon {
color: var(--primary);
}
}
}
&:focus-visible {
background: transparent;
.d-icon {
color: var(--primary);
}
}
}
&.btn-text {
color: var(--tertiary);
&[disabled] {
&,
.discourse-no-touch & {
&:hover,
&.btn-hover,
&:focus-visible {
color: var(--primary);
}
}
.discourse-no-touch & {
&:not([disabled]) {
&:hover,
&.btn-hover,
&:focus-visible {
color: var(--tertiary-hover);
}
}
&:active,
&.btn-active {
@include darken-background(transparent, 0.2);
}
}
}
}
&:focus-visible {
outline: none;
background: var(--primary-low);
.d-icon {
color: var(--primary);
}
}
&.back-button {
margin-bottom: 1em;
}
}
.btn-link {
background: transparent;
border: 0;
padding: 0;
color: var(--tertiary);
.discourse-no-touch & {
&:hover {
color: var(--tertiary);
background: transparent;
}
}
&:focus-visible {
color: var(--tertiary);
background: transparent;
@include default-focus;
}
}
@mixin btn-colors($btn-color) {
color: var(--#{$btn-color});
.d-icon {
color: inherit;
}
&:focus-visible {
color: var(--#{$btn-color}-hover);
}
.discourse-no-touch & {
&:hover {
color: var(--#{$btn-color}-hover);
}
}
}
.btn-transparent {
&,
&.btn-default,
&.btn-text,
&.btn-icon,
&.no-text {
background: transparent;
border: 0;
color: var(--primary);
.d-icon {
color: var(--primary-high);
}
&:focus-visible {
background: transparent;
color: var(--tertiary-hover);
.d-icon {
color: inherit;
}
}
.discourse-no-touch & {
&:hover {
background: transparent;
color: var(--tertiary-hover);
.d-icon {
color: inherit;
}
}
}
}
&.btn-primary {
@include btn-colors("tertiary");
}
&.btn-danger {
@include btn-colors("danger");
}
&.btn-success {
@include btn-colors("success");
}
}
.btn-mini-toggle {
border-radius: var(--d-border-radius);
padding: 0.4em 0.467em;
.d-icon {
color: var(--primary-medium);
}
@include hover {
.d-icon {
color: var(--primary);
}
}
}