I have an SCSS map of colour names and values. I want to create CSS custom properties from them like so:
SCSS
$colours:(
  "gray-500":    #f7fafc,
  "red-500":     #f56565,
  "green-500":   #48bb78
);
Desired resultant CSS
--gray-500:  #f7fafc;
--red-500:   #f56565;
--green-500: #48bb78;
I know how to loop through the map, but where I'm getting caught up is how to use the key as a custom property name, and how to prepend -- to it.  All the examples I can find related to this topic involve manually typing out the custom property name - not gleaning it from the key of a map.
This is what I have so far:
@each $colour, $value in $colours {
    --#{$colour}:$value;
}
That generates an error: expected "{" with the caret pointing to the end of this line:
--#{$colour}:$value;
I'm using Dart Sass 1.23.7
On SCSS to CSS you can use the following:
:root {
  $colours:(
    "gray-500": #f7fafc,
    "red-500": #f56565,
    "green-500": #48bb78
  );
  @each $key_name, $value in $colours {
    --#{$key_name}: #{$value};
  }
}
demo on jsfiddle.net
On SASS to CSS you have to use the @each inside a :root element (or defining an element inside):
$colours:(
  "gray-500": #f7fafc,
  "red-500": #f56565,
  "green-500": #48bb78
);
:root {
  @each $key, $value in $colours {
    --#{$key}: #{$value};
  }
}
                        If you want to create CSS custom properties from nested sass map, you can do the following:
    @use "sass:meta";
    // create mixin
    @mixin map-scss-vars-into-css-vars($map, $prefix, $key: "") {
        @each $name, $value in $map {
            // copy the map key
            $key-copy: $key;
            // create name for CSS custom property that contains:
            // current key + child key from nested map
            $key: #{$key}-#{$name};
    
            @if meta.type-of($value) == "map" {
                // if value is a map, invoke it once more
                @include map-scss-vars-into-css-vars($value, $prefix, $key);
            } @else {
                --#{$prefix}#{$key}: #{$value};
            }
            // next iteration of loop should go with unchanged key
            $key: $key-copy;
        }
    }
How to use
// define your nested map
$config: (
    button: (
        primary: (
            color: red,
            background: blue,
        ),
        secondary: (
            color: yellow,
            background: green,
        ),
        tertiary: (
            color: white,
            background: black,
        ),
    ),
    input: (
        primary: (
            width: 100px,
        ),
    ),
);
// include magical mixin
:root {
    @include map-scss-vars-into-css-vars($config, 'my-cool-app');
}
// the result is astonishing
--my-cool-app-button-primary-color: red;
--my-cool-app-button-primary-background: blue;
--my-cool-app-button-secondary-color: yellow;
--my-cool-app-button-secondary-background: green;
--my-cool-app-button-tertiary-color: white;
--my-cool-app-button-tertiary-background: black;
--my-cool-app-input-primary-width: 100px;
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With