Автоматически сгенерированные sass карты

Я пытаюсь создать автоматизированную систему для определения цветов в SASS.

У меня есть карта цветов с именем $brand-colors, и я хотел бы, чтобы цвета этой карты использовались для создания оттенков и оттенков на второй карте, независимо от того, сколько цветов в $ brand-colors.

Это точка, где я прибыл:

$brand-colors: (
  brand-color: (
    primary-color:        #0096d6,
    secondary-color:      #1a4760,
  ),
) !default;

@function generate-map($map) {
  @each $item, $colors in $map {
    @each $color-name, $value in $colors {
      @return(
        $color-name: (
          light-30:   mix(white, $value, 30%),
          light-20:   mix(white, $value, 20%),
          light-10:   mix(white, $value, 10%),
          base:       $value,
          dark-10:    mix(black, $value, 10%),
          dark-20:    mix(black, $value, 20%),
          dark-30:    mix(black, $value, 30%),
        ),
      );
    };
  };
};

$brand-palette: (
  brand-palette:(
    generate-map($_new-brand-colors)
  ),
) !default;

С помощью приведенного выше кода я получаю этот результат из терминала:

brand-palette:(
  primary-color:(
    light-30: #4db6e2,
    light-20: #33abde,
    light-10: #1aa1da,
    base: #0096d6,
    dark-10: #0087c1,
    dark-20: #0078ab,
    dark-30: #006996
  )
)

Короче говоря, берется только первая пара ключ-значение, и я не могу понять, почему. Может кто-нибудь дать мне ответ?

1 ответ

Решение

Функции и операторы возврата

@return оператор сообщает функции, чтобы остановить все и вернуть значение.

@function myFunction() {
    @each $item in [a, b, c, d] {
        @return $item;
    }
}

myFunction() вернется только a, Несмотря на то, что у нас есть цикл с четырьмя элементами, он будет запущен только один раз (в первый раз), потому что он сразу попадет в @return заявление.


Лучшая практика, чтобы вернуться один раз в конце функции

Один из лучших методов работы с функциями - это иметь $result переменная, и только вызов @return $result один раз в конце функции

@function myFunctionFixed() {
    $result;
    @each $item in [a, b, c, d] {
        $result: $result + a;
    }
    @return $result;
}

myFunctionFixed() вернусь abcd потому что мы позволяем циклу выполняться от начала до конца, не прерывая его @returnи мы возвращаемся только в конце функции после завершения цикла.


С помощью map-merge постепенно строить карту

Применяя лучшие методы, описанные выше, мы можем переместить @return заявление до конца вашей функции и использования map-merge постепенно построить $result-map переменная.

@function generate-map($map) {
    $result-map: () !default;
    @each $item, $colors in $map {
        @each $color-name, $value in $colors {
            $result-map: map-merge($result-map, 
                ($color-name: (
                  light-30:   mix(white, $value, 30%),
                  light-20:   mix(white, $value, 20%),
                  light-10:   mix(white, $value, 10%),
                  base:       $value,
                  dark-10:    mix(black, $value, 10%),
                  dark-20:    mix(black, $value, 20%),
                  dark-30:    mix(black, $value, 30%),
                ))
            );
        };
    };
    @return $result-map;
};
Другие вопросы по тегам