sass-aleksi 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
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,54 @@
1
+ // =============================================================================
2
+ // =ALEKSI - MAP-MERGE-DEEP
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-maps
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "sassy-maps";
9
+ @import "aleksi/general/throw";
10
+ @import "aleksi/maps/is-map";
11
+
12
+ // =map-merge-deep( $map-a, $map-b )
13
+ // -----------------------------------------------------------------------------
14
+ /// Deeply merges two maps together. Works with nested maps.
15
+ ///
16
+ /// @param {map} $map-a - The first map to merge.
17
+ /// @param {map} $map-b - The map to merge into `$map-a`.
18
+ ///
19
+ /// @return {map} - A new map with nested maps merged
20
+ /// @throw Error if `$map-a` or `$map-b` is not a map
21
+ ///
22
+ /// @example scss
23
+ /// $foo: map-merge-deep('a': 10, 'b': ('ba': false, 'bb': 'bar'), 'c': 'foo'), ('a': 20, 'b': ('bb': 'baz', 'bc': 'wiz')));
24
+ /// // => ('a': 20, 'b': ('ba': false, 'bb': 'baz', 'bc': 'wiz'), 'c': 'foo')
25
+ ///
26
+ /// @access public
27
+ /// @since 0.1.0
28
+
29
+ @function map-merge-deep( $map-a, $map-b )
30
+ {
31
+ @if not is-map($map-a) {
32
+ @return throw-error('map-merge-deep():: `$map-a` must be a map. Was #{inspect($map-a)}.');
33
+ }
34
+
35
+ @if not is-map($map-b) {
36
+ @return throw-error('map-merge-deep():: `$map-b` must be a map. Was #{inspect($map-b)}.');
37
+ }
38
+
39
+ $res: $map-a;
40
+
41
+ @each $key, $value in $map-b {
42
+ // if we are merging a nested map
43
+ // ('map-get()' will return'null' if $res does not have $key so it
44
+ // is safe not to verify)
45
+ @if type-of($value) == 'map' and type-of(map-get($res, $key)) == 'map' {
46
+ // merge nested maps before setting the value
47
+ $value: map-merge-deep(map-get($res, $key), $value);
48
+ }
49
+
50
+ $res: map-set($res, $key, $value);
51
+ }
52
+
53
+ @return $res;
54
+ }
@@ -0,0 +1,56 @@
1
+ // =============================================================================
2
+ // =ALEKSI - MAP-SELECT
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-maps
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "sassy-maps/map-set";
9
+ @import "aleksi/general/throw";
10
+ @import "aleksi/maps/is-map";
11
+
12
+ // =map-select( $map, $keys )
13
+ // -----------------------------------------------------------------------------
14
+ /// Reduces a map's by selecting some of its keys only.
15
+ ///
16
+ /// @param {map} $map - The map to reduce.
17
+ /// @param {list} $keys - The keys to keep in the resulting map.
18
+ ///
19
+ /// @return {map} - `$map` with only the keys present in `$keys`.
20
+ /// @throw Error if `$map` is not a map.
21
+ ///
22
+ /// @example scss
23
+ /// $foo: map-select( ('a': 'foo', 'b': 'bar', 'c': 'baz'), 'a' 'c');
24
+ /// // => ('a': 'foo', 'c': 'baz')
25
+ ///
26
+ /// @access public
27
+ /// @since 0.1.0
28
+
29
+ @function map-select-keys( $map, $keys )
30
+ {
31
+ @if not is-map($map) {
32
+ @return throw-error('map-select():: $map must be a map, was #{inspect($map)}.');
33
+ }
34
+
35
+ $res: ();
36
+
37
+ @each $key, $value in $map {
38
+ @if index($keys, $key) {
39
+ $res: map-set($res, $key, $value);
40
+ }
41
+ }
42
+
43
+ @return $res;
44
+ }
45
+
46
+ // =map-select( $map, $keys )
47
+ // -----------------------------------------------------------------------------
48
+ /// @alias map-select-keys
49
+ ///
50
+ /// @access public
51
+ /// @since 0.1.0
52
+
53
+ @function map-select( $map, $keys )
54
+ {
55
+ @return map-select-keys( $map, $keys );
56
+ }
@@ -0,0 +1,125 @@
1
+ // =============================================================================
2
+ // =ALEKSI - MAP-SORT
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-maps
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "SassyLists";
9
+ @import "sassy-maps";
10
+ @import "aleksi/general/throw";
11
+ @import "aleksi/general/default-to";
12
+ @import "aleksi/maps/is-map";
13
+
14
+ // =map-sort-values( $map[, $order ])
15
+ // -----------------------------------------------------------------------------
16
+ /// Orders a map's keys according to a given, ordered list of values. If no
17
+ /// order is specified, the alphabetic order of the map's values will be used.
18
+ /// **Note**: items with a value that is not in the ordered list will be added
19
+ /// at the end of the resulting map, in the same order as in the original map.
20
+ ///
21
+ /// @param {type|...} $name [default] - Description
22
+ ///
23
+ /// @return {type|...} - Description
24
+ /// @throw Error if `$map` is not a map
25
+ ///
26
+ /// @access public
27
+ /// @since 0.1.0
28
+ ///
29
+ /// @todo Manage duplicated values.
30
+
31
+ @function map-sort-values( $map, $order: null )
32
+ {
33
+ @if not is-map($map) {
34
+ @return throw-error('map-sort-keys():: $map must be a map, was #{inspect($map)}.');
35
+ }
36
+
37
+ $keys: map-keys($map);
38
+ $values: map-values($map);
39
+ $order: default-to($order, sl-sort($values));
40
+
41
+ @each $val in $order {
42
+ $i: index($values, $val);
43
+
44
+ @if index($values, $val) {
45
+ $res: map-set( $res, nth($keys, $i), $val);
46
+ $keys: sl-remove-nth($keys, $i);
47
+ }
48
+ }
49
+
50
+ // include leftovers at the end
51
+ @each $key in $keys {
52
+ $res: map-set($res, $key, map-get($map, $key));
53
+ }
54
+
55
+ @return $res;
56
+ }
57
+
58
+ // =map-sort-keys( $map[, $order ])
59
+ // -----------------------------------------------------------------------------
60
+ /// Orders a map's keys according to a given, ordered list of keys. If no order
61
+ /// is specified, the keys will be ordered alphabetically.
62
+ /// **Note**: keys that are not in the ordered list will be added at the end of
63
+ /// the resulting map, in the same order as in the original map.
64
+ ///
65
+ /// @param {map} $map - The map to order.
66
+ /// @param {list} $order (alphabetic order) - An ordered list of key names.
67
+ ///
68
+ /// @return {type|...} - The map with it's keys in the same order as `$order`.
69
+ /// @throw Error if `$map` is not a map.
70
+ /// @throw Error if `$order` is not a list, a string, null or false.
71
+ ///
72
+ /// @access public
73
+ /// @since 0.1.0
74
+
75
+ @function map-sort-keys( $map, $order: null )
76
+ {
77
+ @if not is-map($map) {
78
+ @return throw-error('map-sort-keys():: $map must be a map, was #{inspect($map)}.');
79
+ }
80
+
81
+ // allow lists and single strings for `$order`
82
+ @if not is-of-type($order, 'list' 'string' 'null') {
83
+ @return throw-error('map-sort-keys():: $order must be a list or a single string. Was #{inspect($order)}.');
84
+ }
85
+
86
+ $keys: map-keys($map);
87
+ $order: default-to($order, sl-sort($keys));
88
+ $res: ();
89
+
90
+ @each $key in $order {
91
+ @if index($keys, $key) {
92
+ $res: map-set($res, $key, map-get($map, $key));
93
+ }
94
+ }
95
+
96
+ // include leftovers at the end
97
+ @if length($res) < length($map) {
98
+ $res: map-merge($res, $map);
99
+ }
100
+
101
+ @return $res;
102
+ }
103
+
104
+ // =map-sort( $map[, $order ])
105
+ // -----------------------------------------------------------------------------
106
+ /// @alias map-sort-keys
107
+ ///
108
+ /// @access public
109
+ /// @since 0.1.0
110
+
111
+ @function map-sort($map, $order: null)
112
+ {
113
+ @if type-of($map) != 'map' {
114
+ @return throw-error('map-sort():: $map must be a map, was #{inspect($map)}.');
115
+ }
116
+
117
+ $keys: sl-sort(map-keys($map));
118
+ $res: ();
119
+
120
+ @each $key in $keys {
121
+ $res: map-set($res, $key, map-get($map, $key));
122
+ }
123
+
124
+ @return $res;
125
+ }
@@ -0,0 +1,46 @@
1
+ // =============================================================================
2
+ // =ALEKSI - MAP-UNIQUE
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-maps
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "SassyLists";
9
+ @import "sassy-maps";
10
+ @import "aleksi/general/throw";
11
+ @import "aleksi/maps/is-map";
12
+
13
+ // =map-unique( $map )
14
+ // -----------------------------------------------------------------------------
15
+ /// removes all duplicate values inside a map.
16
+ ///
17
+ /// @param {map} $map - The map from which to remove duplicate values
18
+ ///
19
+ /// @return {map} - New map without duplicates
20
+ /// @throw Error if `$map` is not a map.
21
+ ///
22
+ /// @example scss
23
+ /// $foo: map-unique('a': 'foo', 'b': 'bar', 'c': 'foo', 'd': 'baz');
24
+ /// // => ('a': 'foo', 'b': 'bar', 'd': 'baz')
25
+ ///
26
+ /// @access public
27
+ /// @since 0.1.0
28
+
29
+ @function map-unique( $map )
30
+ {
31
+ @if not is-map($map) {
32
+ @return throw-error('map-unique():: $map must be a map, was #{inspect($map)}.');
33
+ }
34
+
35
+ $unique-values: ();
36
+ $res: ();
37
+
38
+ @each $key, $val in $map {
39
+ @if not sl-contain($unique-values, $val) {
40
+ $unique-values: append($unique-values, $val);
41
+ $res: map-set($res, $key, $val);
42
+ }
43
+ }
44
+
45
+ @return $res;
46
+ }
@@ -0,0 +1,79 @@
1
+ // =============================================================================
2
+ // =ALEKSI - MAP-WALK
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-maps
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "sassy-maps";
9
+ @import "aleksi/general/throw";
10
+ @import "aleksi/maps/is-map";
11
+
12
+ // =map-walk( $map, $func[, $args... ])
13
+ // -----------------------------------------------------------------------------
14
+ /// Applies the given function to all values inside a map. The map's current
15
+ /// value is passed as first argument to the function.
16
+ ///
17
+ /// @param {map} $map - The map to walk over.
18
+ /// @param {string} $func - The name of the function to apply to each value.
19
+ /// @param {arglist} $args... - Additional arguments passed to '$func`.
20
+ ///
21
+ /// @return {map} - The map with modified values.
22
+ /// @throw Error `$map` must be a map.
23
+ ///
24
+ /// @example scss
25
+ /// $foo: map-walk(('foo': 'bar', 'bar': 'baz'), 'to-upper-case');
26
+ /// // => ('foo': 'BAR', 'bar': 'BAZ')
27
+ ///
28
+ /// @access public
29
+ /// @since 0.1.0
30
+
31
+ @function map-walk( $map, $func, $args... )
32
+ {
33
+ @if not is-map($map) {
34
+ $e: throw-error('map-walk():: $map must be a map, was #{inspect($map)}.');
35
+ }
36
+
37
+ $res: ();
38
+
39
+ @each $key, $val in $map {
40
+ $new: if( length($args) == 0, call($func, $val), call($func, $val, $args...) );
41
+ $res: map-set($res, $key, $new);
42
+ }
43
+
44
+ @return $res;
45
+ }
46
+
47
+ // =map-walk-keys( $map, $func[, $args... ])
48
+ // -----------------------------------------------------------------------------
49
+ /// Applies the given function to all keys inside a map. The map's current
50
+ /// key is passed as first argument to the function.
51
+ ///
52
+ /// @param {map} $map - The map to walk over.
53
+ /// @param {string} $func - The name of the function to apply to each key.
54
+ /// @param {arglist} $args... - Additional arguments passed to '$func`.
55
+ ///
56
+ /// @return {map} - The map with modified keys.
57
+ /// @throw Error `$map` must be a map.
58
+ ///
59
+ /// @example scss
60
+ /// $foo: map-walk(('foo': 'bar', 'bar': 'baz'), 'to-upper-case');
61
+ /// // => ('FOO': 'bar', 'BAR': 'baz')
62
+ ///
63
+ /// @access public
64
+ /// @since 0.1.0
65
+
66
+ @function map-walk-keys( $map, $func, $args... )
67
+ {
68
+ @if not is-map($map) {
69
+ $e: throw-error('map-walk-keys():: $map must be a map, was #{inspect($map)}.');
70
+ }
71
+
72
+ $res: ();
73
+
74
+ @each $key, $val in $map {
75
+ $res: map-set($res, call($func, $key, $args...), $val);
76
+ }
77
+
78
+ @return $res;
79
+ }
@@ -0,0 +1,64 @@
1
+ // =============================================================================
2
+ // =ALEKSI - MAP_ZIP
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-maps
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "aleksi/general/throw";
9
+ @import "aleksi/lists/wrap-in-list";
10
+ @import "aleksi/maps/is-map";
11
+
12
+ // =map-zip( $keys, $values)
13
+ // -----------------------------------------------------------------------------
14
+ /// Builds a map based on a list of keys, and a list of values. Equivalent of
15
+ /// sass's native `zip` function but for maps.
16
+ /// **Note**: in case `$keys` and `$values` are not the same length, additional
17
+ /// values will be discarded and it will throw a warning.
18
+ /// @author [Hugo Giraudel](http://hugogiraudel.com)
19
+ ///
20
+ /// @param {list} $keys - The keys for the built map.
21
+ /// @param {list} $values - The values for the built map, in same order.
22
+ ///
23
+ /// @return {map} - A new map pairing `$keys` with `$values`.
24
+ ///
25
+ /// @example scss
26
+ /// $foo: map-zip('a' 'b' 'c', 10 true 'foo');
27
+ /// // => ('a': 10, 'b': true, 'c': 'foo')
28
+ /// $bar: map-zip('a' 'b' 'c', 10 'foo');
29
+ /// // => ('a': 10, 'b': 'foo')
30
+ /// $baz: map-zip('a', 'b', 10 true 'foo');
31
+ /// // => ('a': 10, 'b': true)
32
+ ///
33
+ /// @see http://sass-lang.com/documentation/Sass/Script/Functions.html#zip-instance_method
34
+ ///
35
+ /// @access public
36
+ /// @since 0.1.0
37
+
38
+ @function map-zip($keys, $values)
39
+ {
40
+ // allow creating a single-item map with a nested map
41
+ @if is-map($values) and length($keys) == 1 {
42
+ $values: wrap-in-list($values);
43
+ }
44
+
45
+ $l-keys: length($keys);
46
+ $l-values: length($values);
47
+ $min: min($l-keys, $l-values);
48
+ $map: ();
49
+
50
+ @if $l-keys != $l-values {
51
+ $e: throw-warning('map-zip():: Received #{$l-keys} key(s) for #{$l-values} value(s). Resulting map will only have #{$min} pairs.');
52
+ }
53
+
54
+ // return empty map if one of the passed lists is empty
55
+ @if $min == 0 {
56
+ @return $map;
57
+ }
58
+
59
+ @for $i from 1 through $min {
60
+ $map: map-merge($map, (nth($keys, $i): nth($values, $i)));
61
+ }
62
+
63
+ @return $map;
64
+ }
@@ -0,0 +1,66 @@
1
+ // =============================================================================
2
+ // =ALEKSI - ADD
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-math
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "SassyLists";
9
+ @import "aleksi/general/throw";
10
+ @import "aleksi/general/is-of-type";
11
+
12
+ // =add( $terms... )
13
+ // -----------------------------------------------------------------------------
14
+ /// Calculates the sum between two or more numbers. Usefull when relying on
15
+ /// `call()`, `walk()` or `apply()` for mathematical operations.
16
+ /// **Note**: passing more then 2 arguments will add them successively.
17
+ /// **Note**: if one of the terms is not a number, it will return `null`.
18
+ ///
19
+ /// @param {arglist} $terms - The operators in the addition.
20
+ ///
21
+ /// @return {number|null} - The sum resulting from adding `$terms`.
22
+ /// @throw Warning if one of the terms is not a number.
23
+ ///
24
+ /// @example scss
25
+ /// $foo: add(10, 5);
26
+ /// // => 15
27
+ /// $bar: add(10, 'hello')
28
+ /// // => null
29
+ /// $baz: add(10 5, 3)
30
+ /// // => null
31
+ /// $wiz: add(10, 5, 3)
32
+ /// // => 18
33
+ ///
34
+ /// @access public
35
+ /// @since 0.1.0
36
+
37
+ @function add( $terms... )
38
+ {
39
+ @if not sl-every($terms, 'is-of-type', 'number') {
40
+ @return throw-warning('add():: all $terms must be numbers — returning null.');
41
+ }
42
+
43
+ @if length($terms) < 2 {
44
+ @return thow-error('add():: wrong number of arguments, 1 instead of 2 or more.');
45
+ }
46
+
47
+ $sum: nth($terms, 1);
48
+
49
+ @each $term in sl-slice($terms, 2) {
50
+ $sum: $sum + $term;
51
+ }
52
+
53
+ @return $sum;
54
+ }
55
+
56
+ // =sum( $terms... )
57
+ // -----------------------------------------------------------------------------
58
+ /// @alias add
59
+ ///
60
+ /// @access public
61
+ /// @since 0.1.0
62
+
63
+ @function sum( $terms... )
64
+ {
65
+ @return add($terms...);
66
+ }
@@ -0,0 +1,66 @@
1
+ // =============================================================================
2
+ // =ALEKSI - DIVIDE
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-math
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "SassyLists";
9
+ @import "aleksi/general/throw";
10
+ @import "aleksi/general/is-of-type";
11
+
12
+ // =divide( $terms... )
13
+ // -----------------------------------------------------------------------------
14
+ /// Calculates the quotient between two or more numbers. Usefull when relying on
15
+ /// `call()`, `walk()` or `apply()` for mathematical operations.
16
+ /// **Note**: passing more then 2 arguments will divide them successively.
17
+ /// **Note**: if one of the terms is not a number, it will return `null`.
18
+ ///
19
+ /// @param {arglist} $terms - The operators in the division.
20
+ ///
21
+ /// @return {number|null} - The quotient resulting from dividing `$terms`.
22
+ /// @throw Warning if one of the terms is not a number.
23
+ ///
24
+ /// @example scss
25
+ /// $foo: divide(10, 5);
26
+ /// // => 50
27
+ /// $bar: divide(10, 'hello')
28
+ /// // => null
29
+ /// $baz: divide(10 5, 3)
30
+ /// // => null
31
+ /// $wiz: divide(10, 5, 3)
32
+ /// // => 0.66667
33
+ ///
34
+ /// @access public
35
+ /// @since 0.1.0
36
+
37
+ @function divide( $terms... )
38
+ {
39
+ @if not sl-every($terms, 'is-of-type', 'number') {
40
+ @return throw-warning('divide():: all $terms must be numbers — returning null.');
41
+ }
42
+
43
+ @if length($terms) < 2 {
44
+ @return thow-error('divide():: wrong number of arguments, 1 instead of 2 or more.');
45
+ }
46
+
47
+ $quot: nth($terms, 1);
48
+
49
+ @each $term in sl-slice($terms, 2) {
50
+ $quot: $quot / $term;
51
+ }
52
+
53
+ @return $quot;
54
+ }
55
+
56
+ // =div( $terms... )
57
+ // -----------------------------------------------------------------------------
58
+ /// @alias divide
59
+ ///
60
+ /// @access public
61
+ /// @since 0.1.0
62
+
63
+ @function div( $terms... )
64
+ {
65
+ @return divide( $terms... );
66
+ }
@@ -0,0 +1,66 @@
1
+ // =============================================================================
2
+ // =ALEKSI - MULTIPLY
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-math
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "SassyLists";
9
+ @import "aleksi/general/throw";
10
+ @import "aleksi/general/is-of-type";
11
+
12
+ // =multiply( $terms... )
13
+ // -----------------------------------------------------------------------------
14
+ /// Calculates the product between two or more numbers. Usefull when relying on
15
+ /// `call()`, `walk()` or `apply()` for mathematical operations.
16
+ /// **Note**: passing more then 2 arguments will multiply them successively.
17
+ /// **Note**: if one of the terms is not a number, it will return `null`.
18
+ ///
19
+ /// @param {arglist} $terms - The operators in the multiplication.
20
+ ///
21
+ /// @return {number|null} - The product resulting from multiplying `$terms`.
22
+ /// @throw Warning if one of the terms is not a number.
23
+ ///
24
+ /// @example scss
25
+ /// $foo: multiply(10, 5);
26
+ /// // => 50
27
+ /// $bar: multiply(10, 'hello')
28
+ /// // => null
29
+ /// $baz: multiply(10 5, 3)
30
+ /// // => null
31
+ /// $wiz: multiply(10, 5, 3)
32
+ /// // => 150
33
+ ///
34
+ /// @access public
35
+ /// @since 0.1.0
36
+
37
+ @function multiply( $terms... )
38
+ {
39
+ @if not sl-every($terms, 'is-of-type', 'number') {
40
+ @return throw-warning('multiply():: all $terms must be numbers — returning null.');
41
+ }
42
+
43
+ @if length($terms) < 2 {
44
+ @return thow-error('multiply():: wrong number of arguments, 1 instead of 2 or more.');
45
+ }
46
+
47
+ $prod: nth($terms, 1);
48
+
49
+ @each $term in sl-slice($terms, 2) {
50
+ $prod: $prod * $term;
51
+ }
52
+
53
+ @return $prod;
54
+ }
55
+
56
+ // =mult( $terms... )
57
+ // -----------------------------------------------------------------------------
58
+ /// @alias multiply
59
+ ///
60
+ /// @access public
61
+ /// @since 0.1.0
62
+
63
+ @function mult( $terms... )
64
+ {
65
+ @return multiply( $terms... );
66
+ }