Add Sass functions to access color palette and semantic variables

in response to https://github.com/ankitects/anki/pull/2016#issuecomment-1220571076
This commit is contained in:
Matthias Metelka 2022-08-30 17:14:28 +02:00
parent bb172edf05
commit e9f75e1756
3 changed files with 123 additions and 76 deletions

View file

@ -63,7 +63,7 @@ for line in open(vars_scss):
if reached_colors: if reached_colors:
line = re.sub( line = re.sub(
r"color\((.+), (\d)\)", r"palette\((.+), (\d)\)",
lambda m: palette[m.group(1)][m.group(2)], lambda m: palette[m.group(1)][m.group(2)],
line, line,
) )

View file

@ -1,15 +1,10 @@
/* Copyright: Ankitects Pty Ltd and contributors /* Copyright: Ankitects Pty Ltd and contributors
* License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html */ * License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html */
@use "sass:map";
@use "colors" as *;
@function color($key, $shade) { @use "sass:map";
$color: map.get($colors, $key); @use "sass:list";
@return map.get($color, $shade);
}
@function vars-from-map($map, $theme, $name: "-", $output: ()) { @function create-vars-from-map($map, $theme, $name: "-", $output: ()) {
@each $key, $value in $map { @each $key, $value in $map {
@if $key == $theme { @if $key == $theme {
@return map.set($output, $name, map.get($map, $key)); @return map.set($output, $name, map.get($map, $key));
@ -17,9 +12,37 @@
@if type-of($value) == "map" { @if type-of($value) == "map" {
$output: map-merge( $output: map-merge(
$output, $output,
vars-from-map($value, $theme, #{$name}-#{$key}, $output) create-vars-from-map($value, $theme, #{$name}-#{$key}, $output)
); );
} }
} }
@return $output; @return $output;
} }
@function map-deep-get($map, $keys) {
@each $key in $keys {
$map: map-get($map, $key);
}
@return $map;
}
@function get-var-from-map($map, $keyword, $theme: default, $keys: ()) {
$i: str-index($keyword, "-");
@if $i {
@while $i {
$sub: str-slice($keyword, 0, $i - 1);
@if list.length($keys) == 0 {
$keys: ($sub);
} @else {
$keys: list.append($keys, $sub);
}
$keyword: str-slice($keyword, $i + 1, -1);
$i: str-index($keyword, "-");
}
}
$keys: list.join($keys, ($keyword, $theme));
@return map-deep-get($map, $keys);
}

View file

@ -3,6 +3,12 @@
@use "sass:map"; @use "sass:map";
@use "functions" as *; @use "functions" as *;
@use "colors" as *;
@function palette($key, $shade) {
$color: map.get($colors, $key);
@return map.get($color, $shade);
}
$vars: ( $vars: (
props: ( props: (
@ -13,142 +19,151 @@ $vars: (
colors: ( colors: (
canvas: ( canvas: (
default: ( default: (
light: color(gray, 0), light: palette(gray, 0),
dark: color(gray, 6), dark: palette(gray, 6),
), ),
outset: ( outset: (
light: white, light: white,
dark: color(gray, 5), dark: palette(gray, 5),
), ),
inset: ( inset: (
light: color(gray, 1), light: palette(gray, 1),
dark: color(gray, 7), dark: palette(gray, 7),
), ),
overlay: ( overlay: (
light: white, light: white,
dark: color(gray, 9), dark: palette(gray, 9),
), ),
), ),
border: ( border: (
default: ( default: (
light: color(gray, 3), light: palette(gray, 3),
dark: color(gray, 8), dark: palette(gray, 8),
), ),
subtle: ( subtle: (
light: color(gray, 3), light: palette(gray, 2),
dark: color(gray, 7), dark: palette(gray, 7),
), ),
focus: ( focus: (
light: color(indigo, 5), light: palette(indigo, 5),
dark: color(indigo, 5), dark: palette(indigo, 5),
),
),
button: (
focus: (
light: palette(cyan, 2),
dark: palette(cyan, 4),
), ),
), ),
fg: ( fg: (
default: ( default: (
light: color(gray, 9), light: palette(gray, 9),
dark: color(gray, 1), dark: palette(gray, 1),
), ),
subtle: ( subtle: (
light: color(gray, 7), light: palette(gray, 7),
dark: color(gray, 3), dark: palette(gray, 3),
), ),
disabled: ( disabled: (
light: color(gray, 5), light: palette(gray, 5),
dark: color(gray, 5), dark: palette(gray, 5),
), ),
faint: ( faint: (
light: color(gray, 2), light: palette(gray, 2),
dark: color(gray, 8), dark: palette(gray, 8),
), ),
), ),
shadow: ( shadow: (
default: ( default: (
light: color(gray, 3), light: palette(gray, 3),
dark: color(gray, 8), dark: palette(gray, 8),
), ),
inset: ( inset: (
light: color(gray, 2), light: palette(gray, 2),
dark: color(gray, 7), dark: palette(gray, 7),
),
focus: (
default: palette(indigo, 5),
), ),
), ),
accent: ( accent: (
card: ( card: (
light: color(blue, 5), light: palette(blue, 5),
dark: color(blue, 4), dark: palette(blue, 4),
), ),
note: ( note: (
light: color(green, 5), light: palette(green, 5),
dark: color(green, 4), dark: palette(green, 4),
), ),
link: ( link: (
light: color(blue, 9), light: palette(blue, 9),
dark: color(blue, 2), dark: palette(blue, 2),
), ),
danger: ( danger: (
light: color(red, 5), light: palette(red, 5),
dark: color(red, 4), dark: palette(red, 4),
), ),
), ),
flag: ( flag: (
1: ( 1: (
light: color(red, 6), light: palette(red, 6),
dark: color(red, 4), dark: palette(red, 4),
), ),
2: ( 2: (
light: color(orange, 5), light: palette(orange, 5),
dark: color(orange, 4), dark: palette(orange, 4),
), ),
3: ( 3: (
light: color(green, 5), light: palette(green, 5),
dark: color(green, 4), dark: palette(green, 4),
), ),
4: ( 4: (
light: color(blue, 6), light: palette(blue, 6),
dark: color(blue, 5), dark: palette(blue, 5),
), ),
5: ( 5: (
light: color(fuchsia, 5), light: palette(fuchsia, 5),
dark: color(fuchsia, 4), dark: palette(fuchsia, 4),
), ),
6: ( 6: (
light: color(teal, 5), light: palette(teal, 5),
dark: color(teal, 4), dark: palette(teal, 4),
), ),
7: ( 7: (
light: color(purple, 6), light: palette(purple, 6),
dark: color(purple, 5), dark: palette(purple, 5),
), ),
), ),
state: ( state: (
new: ( new: (
light: color(blue, 5), light: palette(blue, 5),
dark: color(blue, 3), dark: palette(blue, 3),
), ),
learn: ( learn: (
light: color(red, 6), light: palette(red, 6),
dark: color(red, 4), dark: palette(red, 4),
), ),
review: ( review: (
light: color(green, 6), light: palette(green, 6),
dark: color(green, 5), dark: palette(green, 5),
), ),
buried: ( buried: (
light: color(amber, 5), light: palette(amber, 5),
dark: color(amber, 8), dark: palette(amber, 8),
), ),
suspended: ( suspended: (
light: color(yellow, 4), light: palette(yellow, 4),
dark: color(yellow, 1), dark: palette(yellow, 1),
), ),
marked: ( marked: (
light: color(indigo, 2), light: palette(indigo, 2),
dark: color(purple, 5), dark: palette(purple, 5),
), ),
), ),
highlight: ( highlight: (
bg: ( bg: (
light: color(cyan, 4), light: palette(cyan, 4),
dark: color(cyan, 2), dark: palette(cyan, 2),
), ),
fg: ( fg: (
light: black, light: black,
@ -158,14 +173,24 @@ $vars: (
), ),
); );
@function color($keyword, $theme) {
$colors: map.get($vars, colors);
@return get-var-from-map($colors, $keyword, $theme);
}
@function prop($keyword, $theme) {
$props: map.get($vars, props);
@return get-var-from-map($props, $keyword, $theme);
}
:root { :root {
$colors: map.get($vars, colors); $colors: map.get($vars, colors);
@each $name, $val in vars-from-map($colors, light) { @each $name, $val in create-vars-from-map($colors, light) {
#{$name}: #{$val}; #{$name}: #{$val};
} }
color-scheme: light; color-scheme: light;
&.night-mode { &.night-mode {
@each $name, $val in vars-from-map($colors, dark) { @each $name, $val in create-vars-from-map($colors, dark) {
#{$name}: #{$val}; #{$name}: #{$val};
} }
color-scheme: dark; color-scheme: dark;
@ -174,15 +199,14 @@ $vars: (
:root { :root {
$props: map.get($vars, props); $props: map.get($vars, props);
@each $name, $val in create-vars-from-map($props, default) {
@each $name, $val in vars-from-map($props, default) {
#{$name}: #{$val}; #{$name}: #{$val};
} }
@each $name, $val in vars-from-map($props, light) { @each $name, $val in create-vars-from-map($props, light) {
#{$name}: #{$val}; #{$name}: #{$val};
} }
&.night-mode { &.night-mode {
@each $name, $val in vars-from-map($props, dark) { @each $name, $val in create-vars-from-map($props, dark) {
#{$name}: #{$val}; #{$name}: #{$val};
} }
} }