dashy 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f00a1bf21b2a312b22a76c281eb8baefab10e532
4
+ data.tar.gz: f2c80c1c86bdf524bcbe639a2fdd4a3e54fdfa28
5
+ SHA512:
6
+ metadata.gz: 2c86ae1d952fbfd586dca71b94f97cca13342704ba10b9618a6f6082c81963fd4c16bd113ffa39ea9c3c0388cb7b6984071073ecb28e208b0b40ff10f7ea3f1f
7
+ data.tar.gz: e187aaa08aca674ef10379dd8d4a896f77b32353b1af1d334922e5b07f0867aa0d64903b53c745b014419ed1b258b52b5016ea9e64e8d2cbace59634c2dd3b7b
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+ .sass-cache
16
+ *gem
17
+ *swp
data/.npmignore ADDED
@@ -0,0 +1,12 @@
1
+ .gitignore
2
+ app/
3
+ bin/
4
+ dashy.gemspec
5
+ bower.json
6
+ CONTRIBUTING.md
7
+ features/
8
+ LICENSE.md
9
+ lib/
10
+ Gemfile
11
+ Gemfile.lock
12
+ Rakefile
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in dashy.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 tosyx
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # Dashy
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'dashy'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install dashy
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it ( https://github.com/[my-github-username]/dashy/fork )
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+ require 'rubygems'
3
+ require 'bundler'
4
+ require 'cucumber/rake/task'
5
+
6
+ Bundler::GemHelper.install_tasks
7
+ Cucumber::Rake::Task.new
8
+
9
+ task :default => :cucumber
@@ -0,0 +1,14 @@
1
+ @import "dash/color";
2
+ @import "dash/corner";
3
+ @import "dash/default";
4
+ @import "dash/define";
5
+ @import "dash/direction";
6
+ @import "dash/font-family";
7
+ @import "dash/is";
8
+ @import "dash/line-height";
9
+ @import "dash/list";
10
+ @import "dash/number";
11
+ @import "dash/opposite";
12
+ @import "dash/select";
13
+ @import "dash/set";
14
+ @import "dash/side";
@@ -0,0 +1,5 @@
1
+ $color-red: #fab668 !default;
2
+ $color-teal: #0090b5 !default;
3
+ $color-black: #31302f !default;
4
+ $color-white: #fcfcfc !default;
5
+ $color-orange: #fa8608 !default;
@@ -0,0 +1,15 @@
1
+ @import "dashy/list";
2
+
3
+ $corners: top-left top-right bottom-right bottom-left;
4
+
5
+ $corners-moz:
6
+ (top-left topleft)
7
+ (top-right topright)
8
+ (bottom-left bottomleft)
9
+ (bottom-right bottomright)
10
+ ;
11
+
12
+ @function corner-moz($corner)
13
+ {
14
+ @return list-lookup($corners-moz, $corner);
15
+ }
@@ -0,0 +1,14 @@
1
+ $default-font-size: 16px !default;
2
+ $default-line-height: 1.618 !default;
3
+ $default-text-align: left !default;
4
+ $default-vertical-align: top !default;
5
+
6
+ $default-grid-gutter-width: 2.5% !default;
7
+ $default-grid-gutter-widths: default !default;
8
+ $default-grid-gutter-height-ratio: "0" !default;
9
+ $default-grid-gutter-height-ratios: default "1/1" "1/2" "1/3" "1/4" !default;
10
+
11
+ $default-limit-odd: 19 !default;
12
+ $default-limit-even: 20 !default;
13
+
14
+ $default-page-width: 840px !default;
@@ -0,0 +1,157 @@
1
+ @mixin define-box($selector, $position:(), $top:(), $left:(), $right:(), $bottom:(), $width:(), $height:$width)
2
+ {
3
+ #{ $selector }
4
+ {
5
+ @if is($top) { top : $top ; }
6
+ @if is($left) { top : $left ; }
7
+ @if is($right) { top : $right ; }
8
+ @if is($bottom) { top : $bottom ; }
9
+ @if is($position) { position : $position ; }
10
+ @if is($height) { height : $height ; }
11
+ @if is($width) { width : $width ; }
12
+ }
13
+ }
14
+
15
+ @mixin define-bar($selector, $width:(), $height:())
16
+ {
17
+ #{ select($selector) }
18
+ {
19
+ @if is($height) { height : $height ; }
20
+ @if is($width) { width : $width ; }
21
+ }
22
+ }
23
+
24
+ @mixin define-positioned-bar($selector, $top:(), $left:(), $right:(), $bottom:(), $width:(), $height:())
25
+ {
26
+ @include define-bar($selector:$selector, $width:$width, $height:$height)
27
+ {
28
+ @if is($top) { top : $top ; }
29
+ @if is($left) { top : $left ; }
30
+ @if is($right) { top : $right ; }
31
+ @if is($bottom) { top : $bottom ; }
32
+ }
33
+ }
34
+
35
+ @mixin define-fixed-position-bar($selector, $top:(), $left:(), $right:(), $bottom:(), $width:(), $height:())
36
+ {
37
+ @include define-positioned-bar($selector, $top:$top, $left:$left, $right:$right, $bottom:$bottom, $width:$width, $height:$height)
38
+ {
39
+ position:fixed;
40
+ }
41
+ @if 100% == $width
42
+ {
43
+ @if is-zero($top) body { margin-top : $height ; }
44
+ @else if is-zero($bottom) body { margin-bottom : $height ; }
45
+ }
46
+ @if 100% == $height
47
+ {
48
+ @if is-zero($left) body { margin-left : $width ; }
49
+ @else if is-zero($right) body { margin-right : $width ; }
50
+ }
51
+ }
52
+
53
+ @mixin define-sticky-bar()
54
+ {
55
+
56
+ }
57
+
58
+ @mixin define-sticky-footer($height:0)
59
+ {
60
+ body
61
+ {
62
+ margin-top:$header-toolbar-height; margin-bottom:$footer-toolbar-height;
63
+ }
64
+ }
65
+
66
+ @mixin define-grid($gutter-widths:$default-grid-gutter-widths, $gutter-height-ratios:$default-grid-gutter-height-ratios)
67
+ {
68
+ @each $gutter-width in $gutter-widths
69
+ {
70
+ $gutter-width-name: $gutter-width;
71
+ @if default == $gutter-width { $gutter-width: $default-grid-gutter-width; }
72
+
73
+ @each $gutter-height-ratio in $gutter-height-ratios
74
+ {
75
+ $gutter-height-ratio-name: $gutter-height-ratio;
76
+ @if default == $gutter-height-ratio { $gutter-height-ratio: $default-grid-gutter-height-ratio; }
77
+ $gutter-height-ratio: number-from-fraction($gutter-height-ratio);
78
+ $gutter-height: $gutter-height-ratio * $gutter-width;
79
+
80
+ #{ select-grids($gutter-width:$gutter-width-name, $gutter-height-ratio:$gutter-height-ratio-name) }
81
+ {
82
+ margin-top: - $gutter-height;
83
+ > *
84
+ {
85
+ margin-top: $gutter-height;
86
+ &.gutter-overflow-top { margin-top: - $gutter-height; } // these should be part of select-grid-cells
87
+ &.gutter-overflow-bottom { margin-bottom: - $gutter-height; } // these should be part of select-grid-cells
88
+ }
89
+ }
90
+ }
91
+
92
+ #{ select-grids($gutter-width:$gutter-width-name) }
93
+ {
94
+ @each $span-width in $define-grid-span-widths
95
+ {
96
+ $nominal-width: nth($span-width, 1);
97
+ $actual-width: $nominal-width + ($nominal-width * $gutter-width)/100% - $gutter-width;
98
+ $fractions: nth($span-width, 2);
99
+ $cell: select-class(width $fractions); // these should be part of select-grid-cells
100
+ $overflow-left: select-class(gutter-overflow left); // these should be part of select-grid-cells
101
+ $overflow-right: select-class(gutter-overflow right); // these should be part of select-grid-cells
102
+
103
+ #{ select-children( $cell ) } { width: $actual-width; }
104
+ #{ select-children(select($cell $overflow-left) ) } { width: $actual-width + $gutter-width; margin-left: - $gutter-width; }
105
+ #{ select-children(select($cell $overflow-right) ) } { width: $actual-width + $gutter-width; margin-right: - $gutter-width; }
106
+ #{ select-children(select($cell $overflow-left $overflow-right) ) } { width: $actual-width + $gutter-width * 2; }
107
+ }
108
+ }
109
+ }
110
+ }
111
+
112
+ $define-grid-span-widths:
113
+ (008.33% ("1/12"))
114
+ (009.09% ("1/11"))
115
+ (011.11% ("1/9"))
116
+ (012.50% ("1/8"))
117
+ (014.29% ("1/7"))
118
+ (016.67% ("1/6" "2/12"))
119
+ (018.18% ("2/11"))
120
+ (020.00% ("2/10" "1/5"))
121
+ (022.22% ("2/9"))
122
+ (025.00% ("3/12" "2/8" "1/4"))
123
+ (027.27% ("3/11"))
124
+ (028.57% ("2/7"))
125
+ (030.00% ("3/10"))
126
+ (033.33% ("1/3" "2/6" "4/12" "3/9"))
127
+ (036.36% ("4/11"))
128
+ (037.50% ("3/8"))
129
+ (040.00% ("4/10" "2/5"))
130
+ (041.67% ("5/12"))
131
+ (042.86% ("3/7"))
132
+ (044.44% ("4/9"))
133
+ (045.45% ("5/11"))
134
+ (050.00% ("4/8" "2/4" "1/2" "5/10" "6/12" "3/6"))
135
+ (054.55% ("6/11"))
136
+ (055.56% ("5/9"))
137
+ (057.14% ("4/7"))
138
+ (058.33% ("7/12"))
139
+ (060.00% ("6/10" "3/5"))
140
+ (062.50% ("5/8"))
141
+ (063.64% ("7/11"))
142
+ (066.67% ("6/9" "8/12" "4/6" "2/3"))
143
+ (070.00% ("7/10"))
144
+ (071.43% ("5/7"))
145
+ (072.73% ("8/11"))
146
+ (075.00% ("3/4" "6/8" "9/12"))
147
+ (077.78% ("7/9"))
148
+ (080.00% ("4/5" "8/10"))
149
+ (081.82% ("9/11"))
150
+ (083.33% ("5/6" "10/12"))
151
+ (085.71% ("6/7"))
152
+ (087.50% ("7/8"))
153
+ (088.89% ("8/9"))
154
+ (090.00% ("9/10"))
155
+ (090.91% ("10/11"))
156
+ (091.67% ("11/12"))
157
+ (100.00% ("6/6" "10/10" "9/9" "8/8" "7/7" "11/11" "5/5" "2/2" "1/1" "4/4" "3/3" "12/12"));
@@ -0,0 +1,36 @@
1
+ @import "dashy/list";
2
+
3
+ $directions-horizontal:
4
+ up
5
+ down
6
+ ;
7
+
8
+ $directions-vertical:
9
+ left
10
+ right
11
+ ;
12
+
13
+ $directions-vectors:
14
+ (up (+0.0 -1.0))
15
+ (down (+0.0 +1.0))
16
+ (left (-1.0 +0.0))
17
+ (right (+1.0 +0.0))
18
+ ;
19
+
20
+ $directions: join($directions-horizontal, $directions-vertical);
21
+
22
+ $directions-sides:
23
+ (up top)
24
+ (down bottom)
25
+ (left left)
26
+ (right right);
27
+
28
+ @function direction-vector($dir)
29
+ {
30
+ @return list-lookup($directions-vectors, $dir);
31
+ }
32
+
33
+ @function direction-of-side($side)
34
+ {
35
+ @return list-lookup($directions-sides, $side);
36
+ }
@@ -0,0 +1,36 @@
1
+ $font-family-garamond: "Garamond", "Baskerville", "Baskerville Old Face", "Hoefler Text", "Times New Roman", "serif";
2
+ $font-family-lucida-bright: "Lucida Bright", "Georgia", "serif";
3
+ $font-family-palatino: "Palatino", "Palatino Linotype", "Palatino LT STD", "Book Antiqua", "Georgia", "serif";
4
+ $font-family-big-caslon: "Big Caslon", "Book Antiqua", "Palatino Linotype", "Georgia", "serif";
5
+ $font-family-didot: "Didot", "Didot LT STD", "Hoefler Text", "Garamond", "Times New Roman", "serif";
6
+ $font-family-baskerville: "Baskerville", "Baskerville old face", "Hoefler Text", "Garamond", "Times New Roman", "serif";
7
+ $font-family-hoefler-text: "Hoefler Text", "Baskerville old face", "Garamond", "Times New Roman", "serif";
8
+ $font-family-bodoni: "Bodoni MT", "Didot", "Didot LT STD", "Hoefler Text", "Garamond", "Times New Roman", "serif";
9
+ $font-family-goudy-old-style: "Goudy Old Style", "Garamond", "Big Caslon", "Times New Roman", "serif";
10
+ $font-family-constantia: "Constantia", "Palatino", "Palatino Linotype", "Palatino LT STD", "Georgia", "serif";
11
+ $font-family-cambria: "Cambria", "Georgia", "serif";
12
+ $font-family-book-antiqua: "Book Antiqua", "Palatino", "Palatino Linotype", "Palatino LT STD", "Georgia", "serif";
13
+
14
+ $font-family-optima: "Optima", "Segoe", "Segoe UI", "Candara", "Calibri", "Arial", "sans-serif";
15
+ $font-family-futura: "Futura", "Trebuchet MS", "Arial", "sans-serif";
16
+ $font-family-gill-sans: "Gill Sans", "Gill Sans MT", "Calibri", "sans-serif";
17
+ $font-family-trebuchet: "Trebuchet MS", "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", "Tahoma", "sans-serif";
18
+ $font-family-helvetica: "Helvetica Neue", "Arial", "sans-serif";
19
+ $font-family-verdana: "Verdana", "Geneva", "sans-serif";
20
+ $font-family-lucida: "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", "Geneva", "Verdana", "sans-serif";
21
+ $font-family-geneva: "Geneva", "Tahoma", "Verdana", "sans-serif";
22
+ $font-family-segoe: "Segoe", "Segoe UI", "Helvetica Neue", "Arial", "sans-serif";
23
+ $font-family-candara: "Candara", "Calibri", "Segoe", "Segoe UI", "Optima", "Arial", "sans-serif";
24
+ $font-family-calibri: "Calibri", "Candara", "Segoe", "Segoe UI", "Optima", "Arial", "sans-serif";
25
+ $font-family-franklin-gothic: "Franklin Gothic Medium", "Arial", "sans-serif";
26
+ $font-family-tahoma: "Tahoma", "Geneva", "Verdana", "sans-serif";
27
+
28
+ $font-family-proxima-nova: "Proxima Nova" /* adobe */, "Montserrat" /* google */, "sans-serif";
29
+ $font-family-gill-sans: "Gill Sans" /* adobe */, "Lato" /* google */, "sans-serif";
30
+
31
+ $font-family-headings: $font-family-hoefler-text;
32
+ $font-family-body: $font-family-optima;
33
+ $font-family-labels: $font-family-optima;
34
+ $font-family-fine-print: $font-family-optima;
35
+
36
+ $font-family-avenir: "Avenir", "Nunito" /* google */;
@@ -0,0 +1,81 @@
1
+ @function is($val)
2
+ {
3
+ @return not is-null($val);
4
+ }
5
+
6
+ @function is-null($val)
7
+ {
8
+ @return is-blank($val) or is-empty($val);
9
+ }
10
+
11
+ @function is-blank($val)
12
+ {
13
+ @if is-string($val) { @return $val == ""; }
14
+ @return false;
15
+ }
16
+
17
+ @function is-empty($val)
18
+ {
19
+ @if is-list($val) { @return list-length($val) == 0; }
20
+ @return false;
21
+ }
22
+
23
+ @function is-unitless($val)
24
+ {
25
+ @return unitless($val);
26
+ }
27
+
28
+ @function is-unitful($val)
29
+ {
30
+ @return is-number($val) and not is-blank(unit($val));
31
+ }
32
+
33
+ @function is-unit($unit, $val)
34
+ {
35
+ @return is-number($val) and $unit == unit($val);
36
+ }
37
+
38
+ @function is-px($val)
39
+ {
40
+ @return is-unit(px, $val);
41
+ }
42
+
43
+ @function is-em($val)
44
+ {
45
+ @return is-unit(em, $val);
46
+ }
47
+
48
+ @function is-ex($val)
49
+ {
50
+ @return is-unit(ex, $val);
51
+ }
52
+
53
+ @function is-percent($val)
54
+ {
55
+ @return is-unit("%", $val);
56
+ }
57
+
58
+ @function is-number($val)
59
+ {
60
+ @return type-of($val) == number;
61
+ }
62
+
63
+ @function is-string($val)
64
+ {
65
+ @return type-of($val) == string;
66
+ }
67
+
68
+ @function is-color($val)
69
+ {
70
+ @return type-of($val) == color;
71
+ }
72
+
73
+ @function is-boolean($val)
74
+ {
75
+ @return type-of($val) == bool;
76
+ }
77
+
78
+ @function is-list($val)
79
+ {
80
+ @return type-of($val) == list;
81
+ }
@@ -0,0 +1,10 @@
1
+ @function line-height-ideal($font-size)
2
+ {
3
+ @return $number-golden-ratio * $font-size;
4
+ }
5
+
6
+ @function line-height-optimal($font-size, $line-width)
7
+ {
8
+ @return $number-golden-ratio - (1 / $number-golden-ratio-doubled) * (1 - $line-width / number-squared(line-height-ideal($font-size)));
9
+ }
10
+
@@ -0,0 +1,161 @@
1
+ @function list-append($list, $value, $separator:comma)
2
+ {
3
+ @return append($list, $value, $separator);
4
+ }
5
+
6
+ @function list-length($list)
7
+ {
8
+ @return length($list);
9
+ }
10
+
11
+ @function list-nth($list, $index)
12
+ {
13
+ @return nth($list, $index);
14
+ }
15
+
16
+ @function list-first($list)
17
+ {
18
+ @return list-nth($list, 1);
19
+ }
20
+
21
+ @function list-second($list)
22
+ {
23
+ @return list-nth($list, 2);
24
+ }
25
+
26
+ @function list-last($list)
27
+ {
28
+ @return list-nth($list, list-length($list));
29
+ }
30
+
31
+ @function list-head ($list)
32
+ {
33
+ @return list-first($list);
34
+ }
35
+
36
+ @function list-tail($list)
37
+ {
38
+ $result: ();
39
+ @for $i from 2 through list-length($list)
40
+ {
41
+ $result: list-append($result, list-nth($list, $i));
42
+ }
43
+ @return $result;
44
+ }
45
+
46
+ @function list-maybe-nth($list, $i)
47
+ {
48
+ @if is-list($list)
49
+ {
50
+ @if list-length($list) < $i { @return (); }
51
+ @return list-nth($list, $i);
52
+ }
53
+ }
54
+
55
+ @function list-maybe-first($list)
56
+ {
57
+ @return list-maybe-nth($list, 1);
58
+ }
59
+
60
+ @function list-maybe-second($list)
61
+ {
62
+ @return list-maybe-nth($list, 2);
63
+ }
64
+
65
+ @function list-compact($list)
66
+ {
67
+ $result: ();
68
+ @each $item in $list
69
+ {
70
+ @if not is-empty($item) and not is-blank($item)
71
+ {
72
+ $result: append($result, $item);
73
+ }
74
+ }
75
+ @return $result;
76
+ }
77
+
78
+ @function list-flatten($values)
79
+ {
80
+ $result: ();
81
+ @each $value in $values
82
+ {
83
+ @if is-list($value)
84
+ {
85
+ @each $x in list-flatten($value) { $result: list-append($result, $x); }
86
+ }
87
+ @else
88
+ {
89
+ $result: list-append($result, $value);
90
+ }
91
+ }
92
+ @return $result;
93
+ }
94
+
95
+ // search //////////////////////////////////////////////////////////////////
96
+
97
+ @function list-contains-none($items, $these)
98
+ {
99
+ @return not list-contains-any($items, $these);
100
+ }
101
+
102
+ @function list-contains-any($items, $these)
103
+ {
104
+ @each $item in $items
105
+ {
106
+ @if list-contains($these, $item) { @return true; }
107
+ }
108
+ @return false;
109
+ }
110
+
111
+ @function list-contains($items, $this)
112
+ {
113
+ @each $item in $items
114
+ {
115
+ @if $this == $item { @return true; }
116
+ }
117
+ @return false;
118
+ }
119
+
120
+ @function list-find-by-nth($lists, $i, $val)
121
+ {
122
+ @each $list in $lists
123
+ {
124
+ @if $val == list-nth($list, $i) { @return $list; }
125
+ }
126
+ @return ();
127
+ }
128
+
129
+ @function list-find-by-first($pairs, $first)
130
+ {
131
+ @return list-find-by-nth($pairs, 1, $first);
132
+ }
133
+
134
+ @function list-find-by-second($pairs, $second)
135
+ {
136
+ @return list-find-by-nth($pairs, 2, $second);
137
+ }
138
+
139
+ @function list-lookup($pairs, $first)
140
+ {
141
+ @return list-second(list-find-by-first($pairs, $first));
142
+ }
143
+
144
+ @function list-reverse-lookup($pairs, $second)
145
+ {
146
+ @return list-first(list-find-by-second($pairs, $second));
147
+ }
148
+
149
+ @function list-find-opposite($pairs, $first-or-second)
150
+ {
151
+ @return list-find-either(list-lookup($pairs, $first-or-second), list-reverse-lookup($pairs, $first-or-second));
152
+ }
153
+
154
+ @function list-find-either($possibilities)
155
+ {
156
+ @each $possibility in $possibilities
157
+ {
158
+ @if not is-null($possibility) { @return $possibility; }
159
+ }
160
+ @return ();
161
+ }