| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 | // Scaling Variables$golden:           1.618;$minor-second:     1.067;$major-second:     1.125;$minor-third:      1.2;$major-third:      1.25;$perfect-fourth:   1.333;$augmented-fourth: 1.414;$perfect-fifth:    1.5;$minor-sixth:      1.6;$major-sixth:      1.667;$minor-seventh:    1.778;$major-seventh:    1.875;$octave:           2;$major-tenth:      2.5;$major-eleventh:   2.667;$major-twelfth:    3;$double-octave:    4;@function modular-scale($value, $increment, $ratio) {  $v1: nth($value, 1);  $v2: nth($value, length($value));  $value: $v1;  // scale $v2 to just above $v1  @while $v2 > $v1 {    $v2: ($v2 / $ratio); // will be off-by-1  }  @while $v2 < $v1 {    $v2: ($v2 * $ratio); // will fix off-by-1  }  // check AFTER scaling $v2 to prevent double-counting corner-case  $double-stranded: $v2 > $v1;  @if $increment > 0 {    @for $i from 1 through $increment {      @if $double-stranded and ($v1 * $ratio) > $v2 {        $value: $v2;        $v2: ($v2 * $ratio);      } @else {        $v1: ($v1 * $ratio);        $value: $v1;      }    }  }  @if $increment < 0 {    // adjust $v2 to just below $v1    @if $double-stranded {      $v2: ($v2 / $ratio);    }    @for $i from $increment through -1 {      @if $double-stranded and ($v1 / $ratio) < $v2 {        $value: $v2;        $v2: ($v2 / $ratio);      } @else {        $v1: ($v1 / $ratio);        $value: $v1;      }    }  }  @return $value;}
 |