tutorbookapp/tutorbook

View on GitHub
styles/theme.scss

Summary

Maintainability
Test Coverage
@use 'sass:string';
@use 'sass:color';

$baseline: #0070f3;
$highlight: #79ffe1;

@mixin light {
  $primary: $baseline;
  $background: #fff;
  $error: #b00020;
  $on-primary: #fff;
  $on-background: #000;
  $on-error: #fff;

  --primary: #{$primary};
  --background: #{$background};
  --error: #{$error};
  --on-primary: #{$on-primary};
  --on-background: #{$on-background};
  --on-error: #{$on-error};

  --accents-1: #fafafa;
  --accents-2: #eaeaea;
  --accents-3: #999;
  --accents-4: #888;
  --accents-5: #666;
  --accents-6: #444;

  --selection: #{$highlight};

  --background-rgb: 255, 255, 255;
  --on-background-rgb: 0, 0, 0;

  --on-background-6: #{rgba($on-background, 0.87)};
  --on-background-5: #{rgba($on-background, 0.6)};
  --on-background-4: #{rgba($on-background, 0.54)};
  --on-background-3: #{rgba($on-background, 0.38)};
  --on-background-2: var(--accents-2);
  --on-background-1: #{rgba($on-background, 0.06)};

  --primary-6: #{rgba($primary, 0.87)};
  --primary-5: #{rgba($primary, 0.6)};
  --primary-3: #{rgba($primary, 0.38)};

  --snackbar-on-background: #{rgba($background, 0.87)};
  --snackbar-background: #{color.mix($on-background, $background, 80%)};
  --chip-background: #{color.mix($on-background, $background, 12%)};

  --title-left: #{color.adjust($primary, $hue: 20)};
  --title-right: #{color.adjust($primary, $hue: -20)};

  --header-background: #{rgba($background, 0.8)};
  --shadow-large: 0 30px 60px rgba(0, 0, 0, 0.12);

  .mdc-select__dropdown-icon {
    background: url('data:image/svg+xml,%3Csvg%20width%3D%2210px%22%20height%3D%225px%22%20viewBox%3D%227%2010%2010%205%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0A%20%20%20%20%3Cpolygon%20id%3D%22Shape%22%20stroke%3D%22none%22%20fill%3D%22%23#{string.slice(string.unquote("#{$on-background}"), 2)}%22%20fill-rule%3D%22evenodd%22%20opacity%3D%220.54%22%20points%3D%227%2010%2012%2015%2017%2010%22%3E%3C%2Fpolygon%3E%0A%3C%2Fsvg%3E')
      no-repeat center;
  }

  .mdc-select--focused .mdc-select__dropdown-icon {
    background: url('data:image/svg+xml,%3Csvg%20width%3D%2210px%22%20height%3D%225px%22%20viewBox%3D%227%2010%2010%205%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0A%20%20%20%20%3Cpolygon%20id%3D%22Shape%22%20stroke%3D%22none%22%20fill%3D%22%23#{string.slice(string.unquote("#{$primary}"), 2)}%22%20fill-rule%3D%22evenodd%22%20opacity%3D%221%22%20points%3D%227%2010%2012%2015%2017%2010%22%3E%3C%2Fpolygon%3E%0A%3C%2Fsvg%3E')
      no-repeat center;
  }

  .mdc-dialog__surface {
    border-radius: 12px;
    border: none;
  }
}

@mixin dark {
  $primary: color.adjust($baseline, $lightness: 20%);
  $background: #121212;
  $error: #cf6679;
  $on-primary: #000;
  $on-background: #fff;
  $on-error: #000;

  --primary: #{$primary};
  --background: #{$background};
  --error: #{$error};
  --on-primary: #{$on-primary};
  --on-background: #{$on-background};
  --on-error: #{$on-error};

  --accents-1: #181818;
  --accents-2: #333;
  --accents-3: #444;
  --accents-4: #666;
  --accents-5: #888;
  --accents-6: #999;

  --selection: #{color.adjust($highlight, $saturation: -10%, $lightness: -40%)};

  --background-rgb: 18, 18, 18;
  --on-background-rgb: 255, 255, 255;

  --on-background-6: #{rgba($on-background, 0.87)};
  --on-background-5: #{rgba($on-background, 0.6)};
  --on-background-4: #{rgba($on-background, 0.54)};
  --on-background-3: #{rgba($on-background, 0.38)};
  --on-background-2: var(--accents-2);
  --on-background-1: #{rgba($on-background, 0.06)};

  --primary-6: #{rgba($primary, 0.87)};
  --primary-5: #{rgba($primary, 0.6)};
  --primary-3: #{rgba($primary, 0.38)};

  --snackbar-on-background: #{rgba($background, 0.87)};
  --snackbar-background: #{$on-background};
  --chip-background: #{color.mix($on-background, $background, 12%)};

  --title-left: #{color.adjust($primary, $hue: 20)};
  --title-right: #{color.adjust($primary, $hue: -20)};

  --header-background: #{rgba($background, 0.8)};
  --shadow-large: 0 0 0 1px var(--accents-2);

  .mdc-select__dropdown-icon {
    background: url('data:image/svg+xml,%3Csvg%20width%3D%2210px%22%20height%3D%225px%22%20viewBox%3D%227%2010%2010%205%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0A%20%20%20%20%3Cpolygon%20id%3D%22Shape%22%20stroke%3D%22none%22%20fill%3D%22%23#{string.slice(string.unquote("#{$on-background}"), 2)}%22%20fill-rule%3D%22evenodd%22%20opacity%3D%220.54%22%20points%3D%227%2010%2012%2015%2017%2010%22%3E%3C%2Fpolygon%3E%0A%3C%2Fsvg%3E')
      no-repeat center;
  }

  .mdc-select--focused .mdc-select__dropdown-icon {
    background: url('data:image/svg+xml,%3Csvg%20width%3D%2210px%22%20height%3D%225px%22%20viewBox%3D%227%2010%2010%205%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0A%20%20%20%20%3Cpolygon%20id%3D%22Shape%22%20stroke%3D%22none%22%20fill%3D%22%23#{string.slice(string.unquote("#{$primary}"), 2)}%22%20fill-rule%3D%22evenodd%22%20opacity%3D%221%22%20points%3D%227%2010%2012%2015%2017%2010%22%3E%3C%2Fpolygon%3E%0A%3C%2Fsvg%3E')
      no-repeat center;
  }

  .mdc-dialog__surface {
    border: 1px solid var(--accents-2);
  }
}

:root {
  @include light();
  @media (prefers-color-scheme: light) {
    @include light();
  }
  @media (prefers-color-scheme: dark) {
    @include dark();
  }
}
.light {
  @include light();
}
.dark {
  @include dark();
}