123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- // Remove the unit of a length
- // @param {Number} $number - Number to remove unit from
- // @return {Number} - Unitless number
- @function strip-unit($number) {
- @if type-of($number) == 'number' and not unitless($number) {
- @return $number / ($number * 0 + 1);
- }
- @return $number;
- }
- // ----
- // Sass (v3.3.14)
- // Compass (v1.0.0.rc.1)
- // ----
- @function pow($x, $y) {
- $ret: 1;
- @if $y > 0 {
- @for $i from 1 through $y {
- $ret: $ret * $x;
- }
- }
- @else {
- @for $i from $y to 0 {
- $ret: $ret / $x;
- }
- }
- @return $ret;
- }
- // Map deep get
- // @author Hugo Giraudel
- // @access public
- // @param {Map} $map - Map
- // @param {Arglist} $keys - Key chain
- // @return {*} - Desired value
- //
- // Example:
- // $m-breakpoint: map-deep-get($__prefix-default-config, "layouts", "M");
- @function map-deep-get($map, $keys...) {
- @each $key in $keys {
- $map: map-get($map, $key);
- }
- @return $map;
- }
- // ep set function to set a value in nested maps
- // uthor Hugo Giraudel
- // ccess public
- // aram {Map} $map - Map
- // aram {List} $keys - Key chaine
- // aram {*} $value - Value to assign
- // eturn {Map}
- //
- // ample:
- // _prefix-default-config: map-deep-set($__prefix-default-config, "layouts" "M", 650px);
- @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 type-of(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 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 length($keys) - 1 {
- $current-key: nth($keys, $i);
- $current-map: nth($maps, -1);
- $current-get: map-get($current-map, $current-key);
- @if $current-get == null {
- @error "Key `#{$key}` doesn't exist at current level in map.";
- }
- $maps: append($maps, $current-get);
- }
- // Loop from the last map to the first one
- // Merge it with the previous one
- @for $i from length($maps) through 1 {
- $current-map: nth($maps, $i);
- $current-key: nth($keys, $i);
- $current-val: if($i == length($maps), $value, $result);
- $result: map-merge($current-map, ($current-key: $current-val));
- }
- // Return result
- @return $result;
- }
- // jQuery-style extend function
- // - Child themes can use this function to `reset` the values in
- // config maps without editing the `master` Sass files.
- // - src: https://www.sitepoint.com/extra-map-functions-sass/
- // - About `map-merge()`:
- // - - only takes 2 arguments
- // - - is not recursive
- // @param {Map} $map - first map
- // @param {ArgList} $maps - other maps
- // @param {Bool} $deep - recursive mode
- // @return {Map}
- // Examples:
- // $grid-configuration-default: (
- // 'columns': 12,
- // 'layouts': (
- // 'small': 800px,
- // 'medium': 1000px,
- // 'large': 1200px,
- // ),
- // );
- // $grid-configuration-custom: (
- // 'layouts': (
- // 'large': 1300px,
- // 'huge': 1500px
- // ),
- // );
- // $grid-configuration-user: (
- // 'direction': 'ltr',
- // 'columns': 16,
- // 'layouts': (
- // 'large': 1300px,
- // 'huge': 1500px
- // ),
- // );
- // $deep: false
- // $grid-configuration: map-extend($grid-configuration-default, $grid-configuration-custom, $grid-configuration-user);
- // --> ("columns": 16, "layouts": (("large": 1300px, "huge": 1500px)), "direction": "ltr")
- // $deep: true
- // $grid-configuration: map-extend($grid-configuration-default, $grid-configuration-custom, $grid-configuration-user, true);
- // --> ("columns": 16, "layouts": (("small": 800px, "medium": 1000px, "large": 1300px, "huge": 1500px)), "direction": "ltr")
- @function map-extend($map, $maps.../*, $deep */) {
- $last: nth($maps, -1);
- $deep: $last == true;
- $max: if($deep, length($maps) - 1, length($maps));
- // Loop through all maps in $maps...
- @for $i from 1 through $max {
- // Store current map
- $current: nth($maps, $i);
- // If not in deep mode, simply merge current map with map
- @if not $deep {
- $map: map-merge($map, $current);
- } @else {
- // If in deep mode, loop through all tuples in current map
- @each $key, $value in $current {
- // If value is a nested map and same key from map is a nested map as well
- @if type-of($value) == "map" and type-of(map-get($map, $key)) == "map" {
- // Recursive extend
- $value: map-extend(map-get($map, $key), $value, true);
- }
- // Merge current tuple with map
- $map: map-merge($map, ($key: $value));
- }
- }
- }
- @return $map;
- }
|