sass-aleksi 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +44 -0
  3. data/lib/sass-aleksi.rb +31 -0
  4. data/stylesheets/_aleksi.scss +23 -0
  5. data/stylesheets/aleksi/_colors.scss +0 -0
  6. data/stylesheets/aleksi/_config.scss +11 -0
  7. data/stylesheets/aleksi/_general.scss +11 -0
  8. data/stylesheets/aleksi/_lengths.scss +8 -0
  9. data/stylesheets/aleksi/_lists.scss +16 -0
  10. data/stylesheets/aleksi/_maps.scss +21 -0
  11. data/stylesheets/aleksi/_math.scss +10 -0
  12. data/stylesheets/aleksi/_sides.scss +11 -0
  13. data/stylesheets/aleksi/config/_constants.scss +73 -0
  14. data/stylesheets/aleksi/general/_apply.scss +42 -0
  15. data/stylesheets/aleksi/general/_css-rule.scss +88 -0
  16. data/stylesheets/aleksi/general/_default-to.scss +35 -0
  17. data/stylesheets/aleksi/general/_is-of-type.scss +72 -0
  18. data/stylesheets/aleksi/general/_throw.scss +125 -0
  19. data/stylesheets/aleksi/lengths/_convert.scss +100 -0
  20. data/stylesheets/aleksi/lengths/_strip-unit.scss +37 -0
  21. data/stylesheets/aleksi/lists/_contained-in.scss +34 -0
  22. data/stylesheets/aleksi/lists/_depth.scss +46 -0
  23. data/stylesheets/aleksi/lists/_get-nth.scss +44 -0
  24. data/stylesheets/aleksi/lists/_is-list.scss +35 -0
  25. data/stylesheets/aleksi/lists/_list-filter.scss +48 -0
  26. data/stylesheets/aleksi/lists/_next.scss +47 -0
  27. data/stylesheets/aleksi/lists/_prepend.scss +40 -0
  28. data/stylesheets/aleksi/lists/_previous.scss +47 -0
  29. data/stylesheets/aleksi/lists/_set-list-separator.scss +173 -0
  30. data/stylesheets/aleksi/lists/_walk.scss +96 -0
  31. data/stylesheets/aleksi/lists/_wrap-in-list.scss +42 -0
  32. data/stylesheets/aleksi/maps/_debug-map.scss +39 -0
  33. data/stylesheets/aleksi/maps/_is-map.scss +31 -0
  34. data/stylesheets/aleksi/maps/_map-clean.scss +45 -0
  35. data/stylesheets/aleksi/maps/_map-depth.scss +46 -0
  36. data/stylesheets/aleksi/maps/_map-extend.scss +50 -0
  37. data/stylesheets/aleksi/maps/_map-filter.scss +84 -0
  38. data/stylesheets/aleksi/maps/_map-find.scss +95 -0
  39. data/stylesheets/aleksi/maps/_map-get-tuple.scss +33 -0
  40. data/stylesheets/aleksi/maps/_map-has-keys.scss +92 -0
  41. data/stylesheets/aleksi/maps/_map-merge-deep.scss +54 -0
  42. data/stylesheets/aleksi/maps/_map-select.scss +56 -0
  43. data/stylesheets/aleksi/maps/_map-sort.scss +125 -0
  44. data/stylesheets/aleksi/maps/_map-unique.scss +46 -0
  45. data/stylesheets/aleksi/maps/_map-walk.scss +79 -0
  46. data/stylesheets/aleksi/maps/_map-zip.scss +64 -0
  47. data/stylesheets/aleksi/math/_add.scss +66 -0
  48. data/stylesheets/aleksi/math/_divide.scss +66 -0
  49. data/stylesheets/aleksi/math/_multiply.scss +66 -0
  50. data/stylesheets/aleksi/math/_subtract.scss +66 -0
  51. data/stylesheets/aleksi/sides/_output-sides.scss +71 -0
  52. data/stylesheets/aleksi/sides/_reduce-sides.scss +74 -0
  53. data/stylesheets/aleksi/sides/_side-name.scss +48 -0
  54. data/stylesheets/aleksi/sides/_side-value.scss +83 -0
  55. data/stylesheets/aleksi/sides/_sides-shorthand.scss +64 -0
  56. data/stylesheets/aleksi/sides/_to-sides-list.scss +63 -0
  57. data/stylesheets/aleksi/sides/_to-sides-map.scss +57 -0
  58. metadata +199 -0
@@ -0,0 +1,100 @@
1
+ // =============================================================================
2
+ // =ALEKSI - CONVERT-LENGTH
3
+ // =============================================================================
4
+ //// @group aleksi-lengths
5
+ //// @author [Chris Eppstein](http://chriseppstein.github.io/)
6
+
7
+ // Base font size in pixels, if not already defined.
8
+ // Should be the same as the font-size of the html element.
9
+ $base-font-size: 16px !default;
10
+
11
+ // =convert-length( $length, $to-unit[, $from-context, $to-context ])
12
+ // -----------------------------------------------------------------------------
13
+ /// Convert any CSS <length> or <percentage> value to any another.
14
+ ///
15
+ /// @param {number} $length - A css <length> or <percentage> value
16
+ /// @param {string} $to-unit - A css unit keyword, e.g. 'em', '%', 'px', etc.
17
+ /// @param {number} $from-context [$base-font-size] - The absolute length (in px) to which `$length` refers
18
+ /// @param {number} $to-context [$from-context] - the absolute length in px to which the output value will refer.
19
+ ///
20
+ /// @return {type|...} - Description
21
+ /// @throw Description
22
+ ///
23
+ /// @access public
24
+ /// @since 0.1.0
25
+
26
+ @function convert-length(
27
+ $length,
28
+ $to-unit,
29
+ $from-context: $base-font-size,
30
+ $to-context: $from-context
31
+ ) {
32
+ $from-unit: unit($length);
33
+
34
+ // Optimize for cases where `from` and `to` units are accidentally the same.
35
+ @if $from-unit == $to-unit { @return $length; }
36
+
37
+ // Context values must be in px so we can determine a conversion ratio for
38
+ // relative units.
39
+ @if unit($from-context) != 'px' { @warn "Paremeter $from-context must resolve to a value in pixel units."; }
40
+ @if unit($to-context) != 'px' { @warn "Parameter $to-context must resolve to a value in pixel units."; }
41
+
42
+ // Convert input length to pixels
43
+ $px-length: $length;
44
+
45
+ @if $from-unit != 'px' {
46
+ // Convert relative units using the from-context parameter.
47
+ @if $from-unit == 'em' { $px-length: $length * $from-context / 1em }
48
+ @else if $from-unit == 'rem' { $px-length: $length * $base-font-size / 1rem }
49
+ @else if $from-unit == '%' { $px-length: $length * $from-context / 100% }
50
+ @else if $from-unit == 'ex' { $px-length: $length * $from-context / 2ex }
51
+ // Convert absolute units using Sass' conversion table.
52
+ @else if $from-unit == 'in' or
53
+ $from-unit == 'mm' or
54
+ $from-unit == 'cm' or
55
+ $from-unit == 'pt' or
56
+ $from-unit == 'pc' { $px-length: 0px + $length }
57
+ // Certain units can't be converted.
58
+ @else if $from-unit == 'ch' or
59
+ $from-unit == 'vw' or
60
+ $from-unit == 'vh' or
61
+ $from-unit == 'vmin' {
62
+ @warn "#{$from-unit} units can't be reliably converted; Returning original value.";
63
+ @return $length;
64
+ }
65
+ @else {
66
+ @warn "#{$from-unit} is an unknown length unit. Returning original value.";
67
+ @return $length;
68
+ }
69
+ }
70
+
71
+ // Convert length in pixels to the output unit
72
+ $output-length: $px-length;
73
+ @if $to-unit != 'px' {
74
+ // Relative units
75
+ @if $to-unit == 'em' { $output-length: $px-length * 1em / $to-context }
76
+ @else if $to-unit == 'rem' { $output-length: $px-length * 1rem / $base-font-size }
77
+ @else if $to-unit == '%' { $output-length: $px-length * 100% / $to-context }
78
+ @else if $to-unit == 'ex' { $output-length: $px-length * 2ex / $to-context }
79
+ // Absolute units
80
+ @else if $to-unit == 'in' { $output-length: 0in + $px-length }
81
+ @else if $to-unit == 'mm' { $output-length: 0mm + $px-length }
82
+ @else if $to-unit == 'cm' { $output-length: 0cm + $px-length }
83
+ @else if $to-unit == 'pt' { $output-length: 0pt + $px-length }
84
+ @else if $to-unit == 'pc' { $output-length: 0pc + $px-length }
85
+ // Non-convertible units
86
+ @else if $to-unit == 'ch' or
87
+ $to-unit == 'vw' or
88
+ $to-unit == 'vh' or
89
+ $to-unit == 'vmin' {
90
+ @warn "#{$to-unit} units can't be reliably converted; Returning original value.";
91
+ @return $length;
92
+ }
93
+ @else {
94
+ @warn "#{$to-unit} is an unknown length unit. Returning original value.";
95
+ @return $length;
96
+ }
97
+ }
98
+
99
+ @return $output-length;
100
+ }
@@ -0,0 +1,37 @@
1
+ // =============================================================================
2
+ // =ALEKSI - STRIP-UNIT
3
+ // =============================================================================
4
+ //// @group aleksi-units
5
+ //// @author [Yoannis Jamar](http://yoannis.me)
6
+
7
+ // =strip-unit( $number )
8
+ // -----------------------------------------------------------------------------
9
+ /// Removes the unit of a given number.
10
+ /// @author [Hugo Giraudel](http://hugogiraudel.com)
11
+ ///
12
+ /// @param {number} $number - Number from which to strip the unit.
13
+ ///
14
+ /// @return {number} - Unitless `$number`.
15
+ /// @throw Error if `$number` is not a number.
16
+ ///
17
+ /// @example scss
18
+ /// $foo: strip-unit(10px);
19
+ /// // => 10
20
+ /// $bar: strip-unit(1.5em);
21
+ /// // => 1.5
22
+ /// $baz: strip-unit(50%);
23
+ /// // => 50
24
+ ///
25
+ /// @access public
26
+ /// @since 0.1.0
27
+ ///
28
+ /// @todo Unit test the 'strip-unit' function
29
+
30
+ @function strip-unit($number)
31
+ {
32
+ @if type-of($number) != number {
33
+ @return throw-error("strip-unit():: $number must be a number. Was #{inspect($number)}.");
34
+ }
35
+
36
+ @return $number / ($number * 0 + 1);
37
+ }
@@ -0,0 +1,34 @@
1
+ // =============================================================================
2
+ // =ALEKSI - IS-CONTAINED
3
+ // =============================================================================
4
+
5
+ // =contained-in( $value, $list )
6
+ // -----------------------------------------------------------------------------
7
+ /// Checks if the given value is contained in a list. Behaves like `sl-contain`,
8
+ /// but with the value as first argument. Useful to check for specific values
9
+ /// when walking over a list or map.
10
+ ///
11
+ /// @param {type|...} $name [default] - Description
12
+ ///
13
+ /// @return {type|...} - Description
14
+ /// @throw Description
15
+ ///
16
+ /// @example scss
17
+ /// $foo: contained-in(10px 'foo', 10px);
18
+ /// // => true
19
+ /// $bar: contained-in(10px 'foo', 'bar');
20
+ /// // => false
21
+ /// $baz: sl-every('a' 'b' 'c' 'd', 'contained-in', 'a' 'b' 'c');
22
+ /// // => false
23
+ /// $wiz: sl-every('a' 'b' 'c', 'contained-in', 'a' 'b' 'c');
24
+ /// // => true
25
+ ///
26
+ /// @access public
27
+ /// @since version
28
+ ///
29
+ /// @todo Test the 'contained-in' function
30
+
31
+ @function contained-in( $value, $list )
32
+ {
33
+ @return (index($list, $value) != null);
34
+ }
@@ -0,0 +1,46 @@
1
+ // =============================================================================
2
+ // =ALEKSI - DEPTH
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-lists
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "aleksi/maps/map-depth";
9
+
10
+ // =depth( $list )
11
+ // -----------------------------------------------------------------------------
12
+ /// Returns the depth level of a list. If a single value is passed, it will
13
+ /// return 1.
14
+ /// **Note**: also accepts maps, which delegates to `map-depth()`.
15
+ ///
16
+ /// @param {list|map} $list - The list to analyze.
17
+ ///
18
+ /// @return {number} - The depth of `$list`.
19
+ ///
20
+ /// @example scss
21
+ /// $foo: depth(10 true 'foo' ('bar' 'baz') );
22
+ /// // => 2
23
+ /// $bar: depth(10 true 'foo');
24
+ /// // => 1
25
+ /// $baz: depth('foo');
26
+ /// // => 1
27
+ ///
28
+ /// @access public
29
+ /// @since 0.1.0
30
+
31
+ @function depth( $list )
32
+ {
33
+ @if type-of($list) == 'map' {
34
+ @return map-depth($list);
35
+ }
36
+
37
+ $lvl: 1;
38
+
39
+ @each $item in $list {
40
+ @if type-of($item) == 'list' {
41
+ $lvl: max(depth($item) + 1, $lvl);
42
+ }
43
+ }
44
+
45
+ @return $lvl;
46
+ }
@@ -0,0 +1,44 @@
1
+ // =============================================================================
2
+ // =ALEKSI - GET-NTH
3
+ // =============================================================================
4
+
5
+ // =get-nth( $list, $index )
6
+ // -----------------------------------------------------------------------------
7
+ /// Retreives the item at a given index in a list. Differs from Sass's native
8
+ /// `nth` function by returning `null` if the index is out of scope instead of
9
+ /// throwing an error. In this way it behaves more like `map-get()`.
10
+ ///
11
+ /// @param {list} $list - The list from which to retreive an item.
12
+ /// @param {number} $index - The index of the item to retreive
13
+ ///
14
+ /// @return {any} - The item found at $index in $list, or `null` if none was found.
15
+ ///
16
+ /// @example scss
17
+ /// $foo: get-nth(10px 'foo' false, 2);
18
+ /// // => 'foo'
19
+ /// $bar: get-nth(10px 'foo' false, 4);
20
+ /// // => null
21
+ ///
22
+ /// @access public
23
+ /// @since 01.0
24
+
25
+ @function get-nth( $list, $index )
26
+ {
27
+ @if $index <= length($list) {
28
+ @return nth($list, $index);
29
+ }
30
+
31
+ @return null;
32
+ }
33
+
34
+ // =list-get( $list, $index )
35
+ // -----------------------------------------------------------------------------
36
+ /// @alias get-nth
37
+ ///
38
+ /// @acces public
39
+ /// @since 0.1.0
40
+
41
+ @function list-get( $list, $index )
42
+ {
43
+ @return get-nth($list, $index);
44
+ }
@@ -0,0 +1,35 @@
1
+ // =============================================================================
2
+ // =ALEKSI - IS-LIST
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-lists
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ // =is-list( $value )
9
+ // -----------------------------------------------------------------------------
10
+ /// Checks whether the given value is a number. Also accepts argument lists,
11
+ /// contrary to manually testing `type-of($args) == list`.
12
+ ///
13
+ /// @param {any} $value - The value to test.
14
+ ///
15
+ /// @return {bool} - Whether `$value` is a list.
16
+ ///
17
+ /// @example scss
18
+ /// $foo: is-list(10 true 'foo');
19
+ /// // => true
20
+ ///
21
+ /// @example scss - Testing an arglist
22
+ /// @function arglist-is-list($args...) {
23
+ /// @return is-list($args);
24
+ /// }
25
+ /// $foo: arglist-is-list(10, true, 'foo');
26
+ /// // => true
27
+ /// $bar: arglist-is-list(10);
28
+ /// // => true
29
+ ///
30
+ /// @access public
31
+ /// @since 0.1.0
32
+
33
+ @function is-list( $value ) {
34
+ @return (type-of($value) == 'list' or type-of($value) == 'arglist');
35
+ }
@@ -0,0 +1,48 @@
1
+ // =============================================================================
2
+ // =ALEKSI - FILTER
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-lists
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "aleksi/maps/map-filter";
9
+
10
+ // =list-filter( $list, $test[, $args... ])
11
+ // -----------------------------------------------------------------------------
12
+ /// Removes items in a list that don't pass the given test function. The current
13
+ /// list item will be passed as first argument to the test function.
14
+ /// **Note**: to pass the test, the test function must return a truethy value —
15
+ /// not per se the boolean `true`.
16
+ ///
17
+ /// @param {list|map} $list - The list of items to test.
18
+ /// @param {string} $test - The name of the test function to run on each item.
19
+ /// @param {arglist} $args... - Additional arguments for `$test`.
20
+ ///
21
+ /// @return {list} - `$list` without the items that didn't pass the `$test` function.
22
+ ///
23
+ /// @example scss
24
+ /// $foo: list-filter( 10 5px 7 3, 'unitless');
25
+ /// // => 10 7 3
26
+ /// $bar: list-filter( 10px 2.5 4px 8em, 'comparable', 1px);
27
+ /// // => 10px 2.5 4px
28
+ ///
29
+ /// @access public
30
+ /// @since 0.1.0
31
+
32
+ @function list-filter( $list, $test, $args... )
33
+ {
34
+ // delegate to 'map-filter' if filtering a map
35
+ @if type-of($list) == 'map' {
36
+ @return map-filter($list, $test, $args...);
37
+ }
38
+
39
+ $res: ();
40
+
41
+ @each $item in $list {
42
+ @if call($test, $item, $args...) {
43
+ $res: append($res, $item);
44
+ }
45
+ }
46
+
47
+ @return $res;
48
+ }
@@ -0,0 +1,47 @@
1
+ // =============================================================================
2
+ // =ALEKSI - NEXT
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-lists
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "aleksi/general/throw";
9
+
10
+ // =next( $list, $value )
11
+ // -----------------------------------------------------------------------------
12
+ /// Returns the item sitting next to the given value in alist. If the value is
13
+ /// found multiple times, it will use the first one. If the value was not found
14
+ /// or is in last position in the list, it will return `null`.
15
+ ///
16
+ /// @param {list} $list - The list in which to search.
17
+ /// @param {list} $value - The value to search in `$list`.
18
+ ///
19
+ /// @return {any} - The value sitting previous to `$value` in `$list`.
20
+ /// @throw Warning if `$value` was not found in `$list`.
21
+ /// @throw Warning if `$value` is the last value in `$list`.
22
+ ///
23
+ /// @example scss
24
+ /// $foo: next( 'foo' 'bar' 'baz', 'bar');
25
+ /// // => 'baz'
26
+ /// $bar: next( 'foo' 'bar' 'baz', 'baz');
27
+ /// // => null
28
+ /// $baz: next( 'foo' 'bar' 'baz', 'wiz');
29
+ /// // => null
30
+ ///
31
+ /// @access public
32
+ /// @since 0.1.0
33
+
34
+ @function next( $list, $value )
35
+ {
36
+ $index: index($list, $value);
37
+
38
+ @if $index == null {
39
+ @return throw-warning('next():: #{inspect($value)} could not be found in #{inspect($list)}.');
40
+ }
41
+
42
+ @else if $index == length($list) {
43
+ @return throw-warning('next():: #{inspect($value)} is the last item in #{inspect($list)}.');
44
+ }
45
+
46
+ @return nth($list, $index + 1);
47
+ }
@@ -0,0 +1,40 @@
1
+ // =============================================================================
2
+ // =ALESKI - PREPEND
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-lists
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ // =prepend( $list, $value[, $separator ])
9
+ // -----------------------------------------------------------------------------
10
+ /// A simple function to prepend an item to any other value.
11
+ /// **Note**: SassyLists provides a similar 'sl-prepend()' function, but passing
12
+ /// it a list or a map will return a flattened list instead of nested.
13
+ /// Aleksi's `prepend()` function will instead behave like sass's native
14
+ /// `append()` function by nesting lists and maps (unless the $separator
15
+ /// argument suggests otherwise).
16
+ ///
17
+ /// @param {list} $list - The list to which $value shoudl be prepended.
18
+ /// @param {list} $value - The value to prepend to $list.
19
+ /// @param {string} $separator (list-separator($list))- The list separator to use when prepending.
20
+ ///
21
+ /// @return {list} - A copy of $list, with $value added in first position.
22
+ /// @throw Error if $separator is neither 'space' nor 'comma'.
23
+ ///
24
+ /// @example scss
25
+ /// $foo: prepend('bar', 5);
26
+ /// // => 5 'bar'
27
+ /// $bar: prepend( 10 false 'baz', null 'wiz');
28
+ /// // => 'baz' null 'wiz' 10 false;
29
+ /// $baz: prepend( 10 false 'baz', ('en': 'hello', 'es': 'ola'));
30
+ /// // => ('en': 'hello', 'es': 'ola') 10 false 'baz';
31
+ /// $wiz: prepend( (10, false, 'baz'), ('en': 'hello', 'es': 'ola'));
32
+ /// // => ('en': 'hello', 'es': 'ola'), 10, false, 'baz';
33
+ ///
34
+ /// @access public
35
+ /// @since 0.1.0
36
+
37
+ @function prepend( $list, $value, $separator: list-separator($list) )
38
+ {
39
+ @return append($value, $list, $separator);
40
+ }
@@ -0,0 +1,47 @@
1
+ // =============================================================================
2
+ // =ALEKSI - PREVIOUS
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-lists
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "aleksi/general/throw";
9
+
10
+ // =previous( $list, $value )
11
+ // -----------------------------------------------------------------------------
12
+ /// Returns the item sitting previous to the given value in alist. If the value
13
+ /// is found multiple times, it will use the first one. If the value was not
14
+ /// found or is in first position in the list, it will return `null`.
15
+ ///
16
+ /// @param {list} $list - The list in which to search.
17
+ /// @param {list} $value - The value to search in `$list`.
18
+ ///
19
+ /// @return {any} - The value sitting next to `$value` in `$list`.
20
+ /// @throw Warning if `$value` was not found in `$list`.
21
+ /// @throw Warning if `$value` is the first value in `$list`.
22
+ ///
23
+ /// @example scss
24
+ /// $foo: next( 'foo' 'bar' 'baz', 'bar');
25
+ /// // => 'foo'
26
+ /// $bar: next( 'foo' 'bar' 'baz', 'foo');
27
+ /// // => null
28
+ /// $baz: next( 'foo' 'bar' 'baz', 'wiz');
29
+ /// // => null
30
+ ///
31
+ /// @access public
32
+ /// @since 0.1.0
33
+
34
+ @function previous( $list, $value )
35
+ {
36
+ $index: index($list, $value);
37
+
38
+ @if $index == null {
39
+ @return throw-warning('previous():: #{inspect($value)} could not be found in #{inspect($list)}.');
40
+ }
41
+
42
+ @else if $index == 1 {
43
+ @return throw-warning('previous():: #{inspect($value)} is the first item in #{inspect($list)}.');
44
+ }
45
+
46
+ @return nth($list, $index - 1);
47
+ }
@@ -0,0 +1,173 @@
1
+ // =============================================================================
2
+ // =ALEKSI - SET-LIST-SEPARATOR
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-lists
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+ ////
8
+ //// @todo Move 'shortcut' functions to separate files ?
9
+
10
+ @import "aleksi/general/throw";
11
+ @import "aleksi/lists/is-list";
12
+
13
+ // =set-list-separator( $list, $separator )
14
+ // -----------------------------------------------------------------------------
15
+ /// Converts a list to the given lists separator.
16
+ /// **Note**: Because maps can only use the comma separator a map is passed,
17
+ /// passing a map will throw a warning and return the map as is.
18
+ ///
19
+ /// @param {list} $list - The list on which to set the separator.
20
+ /// @param {list} $separator - The separator to set on `$list`
21
+ ///
22
+ /// @return {list} - The version of `$list` using the given separator
23
+ ///
24
+ /// @example scss
25
+ /// $foo: set-list-separator( 10 true 'foo', 'space');
26
+ /// // => 10 true 'foo'
27
+ /// $bar: set-list-separator( 10 true 'foo', 'comma');
28
+ /// // => 10, true, 'foo'
29
+ /// $baz: set-list-separator( 10, 'comma');
30
+ /// // => (10,)
31
+ /// type-of($baz);
32
+ /// // => 'list'
33
+ /// list-separator($baz)
34
+ /// // => 'comma'
35
+ ///
36
+ /// @access public
37
+ /// @since 0.1.0
38
+
39
+ @function set-list-separator( $list, $separator )
40
+ {
41
+ // optimization: return list that are already comma-separated as is
42
+ @if is-list($list) and list-separator($list) == $separator {
43
+ @return $list;
44
+ }
45
+
46
+ @else if type-of($list) == 'map' {
47
+ $e: throw-warning('set-list-separator():: Can not change the separator of a map.');
48
+ @return $list;
49
+ }
50
+
51
+ $res: ();
52
+
53
+ @each $item in $list {
54
+ $res: append($res, $item, $separator);
55
+ }
56
+
57
+ @return $res;
58
+ }
59
+
60
+ // =to-separator( $list, $separator )
61
+ // -----------------------------------------------------------------------------
62
+ /// @alias set-list-separator
63
+ ///
64
+ /// @access public
65
+ /// @since 0.1.0
66
+
67
+ @function to-separator( $list, $separator )
68
+ {
69
+ @return set-list-separator( $list, $separator );
70
+ }
71
+
72
+ // =to-comma-list( $list )
73
+ // -----------------------------------------------------------------------------
74
+ /// Converts a list into a comma-separated list. If the list is already comma-
75
+ /// separated, then it will be returned as is.
76
+ ///
77
+ /// @param {list} $list - The list to convert
78
+ ///
79
+ /// @return {list} - The modified list with comma separation.
80
+ ///
81
+ /// @example scss
82
+ /// $foo: to-comma-list( 10 true 'foo' );
83
+ /// // => 10, true, 'foo'
84
+ /// $bar: to-comma-list( (10, true, 'foo') );
85
+ /// // => 10, true, 'foo'
86
+ /// $baz: to-comma-list(10);
87
+ /// // => (10,)
88
+ /// type-of($baz);
89
+ /// // => 'list'
90
+ /// list-separator($baz)
91
+ /// // => 'comma'
92
+ ///
93
+ /// @access public
94
+ /// @since 0.1.0
95
+
96
+ @function to-comma-list( $list )
97
+ {
98
+ @return set-list-separator($list, 'comma');
99
+ }
100
+
101
+ // =to-comma-list( $list )
102
+ // -----------------------------------------------------------------------------
103
+ /// Converts a list into a space-separated list. If the list is already space-
104
+ /// separated, then it will be returned as is.
105
+ ///
106
+ /// @param {list} $list - The list to convert
107
+ ///
108
+ /// @return {list} - The modified list with space separation.
109
+ ///
110
+ /// @example scss
111
+ /// $foo: to-space-list( (10, true, 'foo') );
112
+ /// // => 10 true 'foo'
113
+ /// $bar: to-space-list( (10, true, 'foo') );
114
+ /// // => 10 true 'foo'
115
+ /// $baz: to-space-list(10);
116
+ /// // => (10)
117
+ /// type-of($baz);
118
+ /// // => 'list'
119
+ /// list-separator($baz)
120
+ /// // => 'space'
121
+ ///
122
+ /// @access public
123
+ /// @since 0.1.0
124
+
125
+ @function to-space-list( $list )
126
+ {
127
+ @return set-list-separator($list, 'space');
128
+ }
129
+
130
+ // =switch-list-separator( $list )
131
+ // -----------------------------------------------------------------------------
132
+ /// Changes the separator of a given list, from 'space' to 'comma', and from
133
+ /// 'comma' to space.
134
+ /// **Note**: simple values are considered to be space-separated lists, as for
135
+ /// all native sass list functions.
136
+ /// **Note**: map values are considered to be comma-separated lists, as for
137
+ /// all native sass list functions.
138
+ ///
139
+ /// @param {list} $list - The list on which to switch separator.
140
+ ///
141
+ /// @return {list} - The space-separated version of `$list` if it is comma-separated, and vice-versa.
142
+ ///
143
+ /// @example scss
144
+ /// $foo: switch-list-separator(10 true 'foo');
145
+ /// // => 10, true 'foo'
146
+ /// $bar: switch-list-separator((10, true, 'foo'));
147
+ /// // => 10 true 'foo'
148
+ /// $baz: switch-list-separator(false);
149
+ /// // => (false,)
150
+ /// type-of($baz);
151
+ /// // => 'list'
152
+ /// list-separator($baz)
153
+ /// // => 'comma'
154
+ ///
155
+ /// @access public
156
+ /// @since 0.1.0
157
+
158
+ @function switch-list-separator( $list )
159
+ {
160
+ @return if(list-separator($list) == 'comma', to-space-list($list), to-comma-list($list));
161
+ }
162
+
163
+ // =switch-separator( $list )
164
+ // -----------------------------------------------------------------------------
165
+ /// @alias switch-list-separator
166
+ ///
167
+ /// @access public
168
+ /// @since 0.1.0
169
+
170
+ @function switch-separator( $list )
171
+ {
172
+ @return switch-list-separator($list);
173
+ }