sparkletown/sparkle

View on GitHub
src/components/atoms/ButtonNG/ButtonNG.scss

Summary

Maintainability
Test Coverage
@import "scss/constants.scss";

// order of elements:
// $modifier  - will be used as ButtonNG--modifier
// $color     - the same foreground color with :hover and without
// $normal-bg - the normal background color
// $hover-bg  - the background color when button is :hover-ed
$variants-enum: (
  ("primary", var(--content--over), var(--accent--under), $primary--live-hover),
  (
    "secondary",
    var(--content--over),
    var(--content--over-20a),
    var(--content--over-30a)
  ),
  ("white", var(--accent--under), var(--content--over), var(--content--over)),
  (
    "dark",
    var(--content--over),
    var(--content--under-40a),
    var(--content--under-60a)
  ),
  (
    "login-primary",
    var(--content--over),
    var(--accent--under),
    var(--primary--under-darker-10pp)
  ),
  (
    "login-outline",
    var(--content--over),
    transparent,
    var(--primary--under-darker-10pp)
  ),
  (
    "danger",
    var(--danger--over),
    var(--danger--under),
    var(--danger--under-lighter-10pp)
  )
);

@function calc-size-by-factor($factor) {
  @return calc(#{$factor} * 1em + 2 * #{$spacing--xs});
}

.ButtonNG {
  display: inline-block;

  padding: $spacing--md;
  margin: $spacing--xs;
  width: $button-width--normal;
  max-width: $button-width--max;

  border-radius: $border-radius--xl;
  border: none;
  background-image: none;

  font-style: normal;
  font-weight: $font-weight--500;
  text-align: center;
  text-decoration: none;
  vertical-align: middle;
  line-height: 1.5;

  transform: translateY(0);
  transition: transform 0.4s $transition-function;

  color: var(--content--over);
  text-shadow: $text-shadow--thin;
  background-color: var(--content--over-20a);
  backdrop-filter: blur(10px);
  box-shadow: box-shadow--medium(var(--content--under-25a));

  &:hover {
    color: currentColor;
    background-color: var(--content--over-25a);
    text-decoration: none;
  }

  &:focus,
  &:focus:hover {
    outline: none;
    box-shadow: box-shadow--input(var(--content--over-80a));
  }

  &:enabled:hover,
  &--enabled:hover {
    transform: translateY(-1px);
  }

  &--disabled,
  &--disabled:hover,
  &:disabled,
  &:disabled:hover {
    color: var(--content--over-40a);
    background: var(--content--over-10a);
    backdrop-filter: blur(10px);
    box-shadow: box-shadow--small(var(--content--under-25a));
    cursor: default;
  }

  &--icon-only {
    padding: $spacing--xs;
  }

  &__icon--icon-text {
    margin-right: 1em;
  }

  &__icon--loading {
    filter: $drop-shadow--outline;
  }

  &--1x {
    @include square-size(calc-size-by-factor(2.5));
  }

  &--2x {
    @include square-size(calc-size-by-factor(3));
  }

  &--3x {
    @include square-size(calc-size-by-factor(4));
  }

  @each $modifier, $color, $normal-bg, $hover-bg in $variants-enum {
    &--#{$modifier} {
      color: $color;
      background-color: $normal-bg;

      &:hover {
        color: $color;
        background-color: $hover-bg;
      }
    }
  }

  &--admin-gradient:enabled {
    background-image: $admin-gradient;
  }

  &--danger-gradient:enabled {
    background-image: $danger-gradient;
  }

  &--normal-gradient:enabled {
    background-image: $gradient;
  }

  &--login-gradient:enabled {
    background-image: $login-rainbox-gradient;
  }

  &--login-outline {
    box-shadow: inset box-shadow--input(var(--accent--under)),
      box-shadow--medium(var(--content--over-25a));

    &:focus,
    &:hover {
      opacity: 0.8;
      background-color: var(--primary--under-darker-10pp);
    }
  }
}