JSFiddle - React, Tailwind, and code Playground

by khamer

HTML

<div class="line n1">Line 100</div>
<div class="line n2">Line 200</div>
<div class="line n3">Line 300</div>
<div class="line n4">Line 400</div>
<div class="line n5">Line 500</div>
<div class="line n6">Line 600</div>
<div class="line n7">Line 700</div>
<div class="line n8">Line 800</div>
<div class="line n9">Line 900</div>

<div class="line m1">Stoplight 1</div>
<div class="line m2">Stoplight 2</div>
<div class="line m3">Stoplight 3</div>
<div class="line m4">Stoplight 4</div>
<div class="line m5">Stoplight 5</div>
<div class="line m6">Stoplight 6</div>
<div class="line m7">Stoplight 7</div>
<div class="line m8">Stoplight 8</div>
<div class="line m9">Stoplight 9</div>

SCSS

@function color-weight($color, $weight: 400, $mixing: true) {
  @if type-of($color) == 'map' {
    $last-shade: null;
    $last-weight: null;
    @each $w, $shade in $color {
      @if $weight == $w {
        @return $shade;
      } @else if $weight < $w {
        @if $last-shade != null {
          @if $mixing {
            @return mix($last-shade, $shade, 100% * ($w - $weight) / ($w - $last-weight));;
          } @else {
            @return $last-shade;
          }
        } @else {
          @return $shade;
        }
      }
      $last-shade: $shade;
      $last-weight: $w;
    }
    @return $last-shade;
    
  } @else if type-of($color) == 'list' {
    $index: min(max(1, ceil($weight / 900 * length($color))), length($color));
    @return nth($color, $index);
  } @else {
    @return $color;
  }
}

$brand-red: (
  400: #f00,
  700: #00f
);

@for $i from 1 through 9 {
  .n#{$i} {
    color: color-weight($brand-red, $i * 100);
  }
}

$stoplight: green yellow red;
@for $i from 1 through 9 {
  .m#{$i} {
    color: color-weight($stoplight, $i * 100);
  }
}