При работе с темами, не основанными на переменных CSS, вы можете сделать:
Пример использования карты функций
// –––––––––––––––––––––––––––––-
// _theme.colors.scss
// –––––––––––––––––––––––––––––-
// default theme
$theme: light !default;
// theme colors
$theme-colors: (
light: (
text: black,
back: white
),
dark: (
text: white,
back: black
)
);
// color function returning the color value
// based on color name and theme
@function color($name, $theme: $theme){
@return map-get(map-get($theme-colors, $theme), $name);
}
// –––––––––––––––––––––––––––––-
// _my.component.scss
// –––––––––––––––––––––––––––––-
@import '_theme.colors.scss';
.class {
color: color(text); // black (using the default light theme)
background: color(back); // white (using the default light theme)
}
.class {
color: color(text, dark); // white (using the passed dark theme)
background: color(back, dark); // black (using the passed dark theme)
}
// switching global theme will take effect in all
// classes after the point of change
$theme: dark;
.class {
color: color(text); // white (using the now default dark theme)
background: color(back); // black (using the now default dark theme)
}
Пример использования темы mixin
// –––––––––––––––––––––––––––––-
// _theme.colors.scss
// –––––––––––––––––––––––––––––-
// default theme
$theme: light !default;
@mixin theme($theme: $theme){
@if $theme == light {
$color-text: silver !global;
$color-back: white !global;
}
@if $theme == dark {
$color-text: black !global;
$color-back: white !global;
}
// passed content (classes)
@content;
}
// –––––––––––––––––––––––––––––-
// _my.component.scss
// –––––––––––––––––––––––––––––-
@import '_theme.colors.scss';
@include theme {
.class {
color: $color-text; // black (using the default light theme)
background: $color-back; // white (using the default light theme)
}
}
@include theme(dark) {
.class {
color: $color-text; // white (using the passed dark theme)
background: $color-back; // black (using the passed dark theme)
}
}
// switching global theme will take effect in all
// classes after the point of change
$theme: dark;
@include theme {
.class {
color: $color-text; // white (using the now default dark theme)
background: $color-back; // black (using the now default dark theme)
}
}
Внимание!
Изменение темы на глобальном уровне может привести к непредвиденным проблемам (например, при изменении порядка импорта) - почему вы можете не открывать ее, задав значение по умолчанию внутри функции и mixin
@function color($name, $theme: light){ ... }
@mixin theme($theme: $theme: light){ ...}