dashy 0.0.1

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.
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
+ }