83 lines
2.6 KiB
Sass
83 lines
2.6 KiB
Sass
@use 'sass:list'
|
|
@use 'sass:map'
|
|
@use 'sass:math'
|
|
@use 'sass:meta'
|
|
|
|
@function map-deep-set($map, $keys, $value)
|
|
$maps: ($map,)
|
|
$result: null
|
|
|
|
// If the last key is a map already
|
|
// Warn the user we will be overriding it with $value
|
|
@if meta.type-of(list.nth($keys, -1)) == "map"
|
|
@warn "The last key you specified is a map; it will be overrided with `#{$value}`."
|
|
|
|
// If $keys is a single key
|
|
// Just merge and return
|
|
@if list.length($keys) == 1
|
|
@return map.merge($map, ( $keys: $value ))
|
|
|
|
// Loop from the first to the second to last key from $keys
|
|
// Store the associated map to this key in the $maps list
|
|
// If the key doesn't exist, throw an error
|
|
@for $i from 1 through list.length($keys) - 1
|
|
$current-key: list.nth($keys, $i)
|
|
$current-map: list.nth($maps, -1)
|
|
$current-get: map.get($current-map, $current-key)
|
|
|
|
@if $current-get == null
|
|
@error "Key `#{$current-key}` doesn't exist at current level in map."
|
|
|
|
$maps: list.append($maps, $current-get)
|
|
|
|
// Loop from the last map to the first one
|
|
// Merge it with the previous one
|
|
@for $i from list.length($maps) through 1
|
|
$current-map: list.nth($maps, $i)
|
|
$current-key: list.nth($keys, $i)
|
|
$current-val: if($i == list.length($maps), $value, $result)
|
|
$result: map.merge($current-map, ($current-key: $current-val))
|
|
|
|
// Return result
|
|
@return $result
|
|
|
|
@function map-deep-get($map, $keys...)
|
|
@each $key in $keys
|
|
$map: map.get($map, $key)
|
|
|
|
@return $map
|
|
|
|
@function breakpoint-min($name, $breakpoints)
|
|
$min: map.get($breakpoints, $name)
|
|
@return if($min != 0, $min, null)
|
|
|
|
@function breakpoint-infix($name, $breakpoints)
|
|
@return if(breakpoint-min($name, $breakpoints) == null, "", "-#{$name}")
|
|
|
|
// Adapted from https://gist.github.com/pentzzsolt/4949bbd7691d43d00616dc4f1451cae9#file-non-destructive-map-merge-4-scss
|
|
@function map-deep-merge($parent-map, $child-map)
|
|
$result: $parent-map
|
|
|
|
@each $key, $child in $child-map
|
|
$parent-has-key: map.has-key($result, $key)
|
|
$parent-value: map.get($result, $key)
|
|
$parent-type: meta.type-of($parent-value)
|
|
$child-type: meta.type-of($child)
|
|
$parent-is-map: $parent-type == map
|
|
$child-is-map: $child-type == map
|
|
|
|
@if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map))
|
|
$result: map.merge($result, ( $key: $child ))
|
|
|
|
@else
|
|
$result: map.merge($result, ( $key: map-deep-merge($parent-value, $child) ))
|
|
|
|
@return $result
|
|
|
|
@function theme-color($color, $opacity: 1)
|
|
$color: rgba(var(--v-theme-#{$color}), $opacity)
|
|
@return $color
|
|
|
|
@function roundEven($val)
|
|
@return 2 * math.round($val * .5)
|