├── .gitignore
├── Gruntfile.js
├── README.md
├── checkwave
├── checkwave.png
├── index.html
└── style.css
├── cloudy-spiral
├── index.html
├── style.css
└── style.scss
├── device-loop
├── device-loop.png
├── index.html
├── style.css
└── style.scss
├── flexing-pagination
├── flexing-pagination.png
├── index.html
├── style.css
└── style.scss
├── flipside
├── index.html
├── script.js
├── style.css
└── style.scss
├── monocle
├── index.html
├── script.js
├── style.css
└── style.scss
├── package-lock.json
├── package.json
└── progress-nav
├── index.html
├── normalize.css
├── script.js
├── style.css
└── style.scss
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .svn
3 | log/*.log
4 | tmp/**
5 | node_modules/
6 | .sass-cache
--------------------------------------------------------------------------------
/Gruntfile.js:
--------------------------------------------------------------------------------
1 | const sass = require('node-sass');
2 |
3 | /* global module:false */
4 | module.exports = function(grunt) {
5 | var port = grunt.option('port') || 8000;
6 | // Project configuration
7 | grunt.initConfig({
8 | pkg: grunt.file.readJSON('package.json'),
9 | meta: {
10 | banner:
11 | '/*!\n' +
12 | ' * http://lab.hakim.se\n' +
13 | ' *\n' +
14 | ' * Copyright (C) 2015 Hakim El Hattab, http://hakim.se\n' +
15 | ' */'
16 | },
17 |
18 | cssmin: {
19 | compress: {
20 | files: {}
21 | }
22 | },
23 |
24 | sass: {
25 | options: {
26 | implementation: sass
27 | },
28 | main: {
29 | files: {
30 | 'device-loop/style.css': 'device-loop/style.scss',
31 | 'flexing-pagination/style.css': 'flexing-pagination/style.scss',
32 | 'cloudy-spiral/style.css': 'cloudy-spiral/style.scss',
33 | 'checkwave/style.css': 'checkwave/style.scss',
34 | 'monocle/style.css': 'monocle/style.scss',
35 | 'flipside/style.css': 'flipside/style.scss',
36 | 'progress-nav/style.css': 'progress-nav/style.scss'
37 | }
38 | }
39 | },
40 |
41 | autoprefixer: {
42 | dist: {
43 | files: [
44 | { src: 'flexing-pagination/style.css' },
45 | { src: 'flipside/style.css' },
46 | { src: 'progress-nav/style.css' }
47 | ]
48 | }
49 | },
50 |
51 | jshint: {
52 | options: {
53 | curly: false,
54 | eqeqeq: true,
55 | immed: true,
56 | latedef: true,
57 | newcap: true,
58 | noarg: true,
59 | sub: true,
60 | undef: true,
61 | eqnull: true,
62 | browser: true,
63 | expr: true,
64 | globals: {
65 | head: false,
66 | module: false,
67 | console: false
68 | }
69 | },
70 | files: [ 'Gruntfile.js', '**/*.js' ]
71 | },
72 |
73 | connect: {
74 | server: {
75 | options: {
76 | port: port,
77 | base: '.'
78 | }
79 | }
80 | },
81 |
82 | watch: {
83 | main: {
84 | files: [ 'Gruntfile.js', '*/*.js', '*/*.scss' ],
85 | tasks: 'default'
86 | },
87 | }
88 |
89 | });
90 |
91 | // Dependencies
92 | grunt.loadNpmTasks( 'grunt-contrib-jshint' );
93 | grunt.loadNpmTasks( 'grunt-contrib-uglify' );
94 | grunt.loadNpmTasks( 'grunt-contrib-watch' );
95 | grunt.loadNpmTasks( 'grunt-contrib-connect' );
96 | grunt.loadNpmTasks( 'grunt-autoprefixer' );
97 | grunt.loadNpmTasks( 'grunt-sass' );
98 |
99 | // Default task
100 | grunt.registerTask( 'default', [ 'sass', 'autoprefixer' ] );
101 |
102 | // Serve presentation locally
103 | grunt.registerTask( 'serve', [ 'connect', 'watch' ] );
104 |
105 | };
106 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Assorted CSS and UI experiments from [@hakimel](http://twitter.com/hakimel).
2 |
3 | Live demos:
4 | - Cloudy Spiral http://lab.hakim.se/cloudy-spiral/
5 | - Flexing Pagination http://lab.hakim.se/flexing-pagination/
6 | - Device Loop http://lab.hakim.se/device-loop/
7 | - Checkwave http://lab.hakim.se/checkwave/
8 | - Monocle List http://lab.hakim.se/monocle/
9 | - Flipside http://lab.hakim.se/flipside/
10 | - Progress Nav http://lab.hakim.se/progress-nav/
11 |
12 | Copyright (C) 2016 Hakim El Hattab, http://hakim.se
13 |
--------------------------------------------------------------------------------
/checkwave/checkwave.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hakimel/css/e1682cb1fec880e9bf740a36cf777a2eef9b2499/checkwave/checkwave.png
--------------------------------------------------------------------------------
/checkwave/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Checkwave
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
87 |
88 |
89 |
90 |
95 |
96 |
123 |
124 |
134 |
135 |
136 |
137 |
--------------------------------------------------------------------------------
/checkwave/style.css:
--------------------------------------------------------------------------------
1 | html, body {
2 | font-family: Helvetica, sans-serif;
3 | }
4 |
5 | .wrapper {
6 | position: absolute;
7 | top: 0;
8 | right: 0;
9 | bottom: 0;
10 | left: 0;
11 | margin: auto;
12 | zoom: 1.4;
13 | }
14 |
15 | input {
16 | position: absolute;
17 | will-change: transform;
18 | }
19 |
20 | input.grow {
21 | animation: grow 0.8s cubic-bezier(0.175, 0.885, 0.320, 1.275);
22 | }
23 |
24 | @keyframes grow {
25 | 0% { transform: scale(1); }
26 | 30% { transform: scale(2.5); }
27 | 100% { transform: scale(1); }
28 | }
--------------------------------------------------------------------------------
/cloudy-spiral/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Cloudy spiral animation with CSS3
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
31 |
32 |
60 |
61 |
71 |
72 |
79 |
80 |
81 |
82 |
--------------------------------------------------------------------------------
/cloudy-spiral/style.css:
--------------------------------------------------------------------------------
1 | @keyframes spin {
2 | from {
3 | opacity: 0.0; }
4 | to {
5 | opacity: 0.6;
6 | transform: translate3d(-4px, -4px, 570px); } }
7 |
8 | html, body {
9 | overflow: hidden;
10 | background: #3e6fa3;
11 | font-family: Helvetica, sans-serif; }
12 |
13 | .wrapper {
14 | position: absolute;
15 | top: 50%;
16 | left: 50%;
17 | z-index: 2;
18 | perspective: 500px; }
19 |
20 | i {
21 | display: block;
22 | position: absolute;
23 | width: 8px;
24 | height: 8px;
25 | border-radius: 8px;
26 | opacity: 0;
27 | background: rgba(255, 255, 255, 0.5);
28 | box-shadow: 0px 0px 10px white;
29 | animation-name: spin;
30 | animation-duration: 3s;
31 | animation-iteration-count: infinite;
32 | animation-timing-function: ease-in-out; }
33 |
34 | i:nth-child(1) {
35 | transform: rotate(11.6129032258deg) translate3d(80px, 0, 0);
36 | animation-delay: 0.0483870968s; }
37 |
38 | i:nth-child(2) {
39 | transform: rotate(23.2258064516deg) translate3d(80px, 0, 0);
40 | animation-delay: 0.0967741935s; }
41 |
42 | i:nth-child(3) {
43 | transform: rotate(34.8387096774deg) translate3d(80px, 0, 0);
44 | animation-delay: 0.1451612903s; }
45 |
46 | i:nth-child(4) {
47 | transform: rotate(46.4516129032deg) translate3d(80px, 0, 0);
48 | animation-delay: 0.1935483871s; }
49 |
50 | i:nth-child(5) {
51 | transform: rotate(58.064516129deg) translate3d(80px, 0, 0);
52 | animation-delay: 0.2419354839s; }
53 |
54 | i:nth-child(6) {
55 | transform: rotate(69.6774193548deg) translate3d(80px, 0, 0);
56 | animation-delay: 0.2903225806s; }
57 |
58 | i:nth-child(7) {
59 | transform: rotate(81.2903225806deg) translate3d(80px, 0, 0);
60 | animation-delay: 0.3387096774s; }
61 |
62 | i:nth-child(8) {
63 | transform: rotate(92.9032258065deg) translate3d(80px, 0, 0);
64 | animation-delay: 0.3870967742s; }
65 |
66 | i:nth-child(9) {
67 | transform: rotate(104.516129032deg) translate3d(80px, 0, 0);
68 | animation-delay: 0.435483871s; }
69 |
70 | i:nth-child(10) {
71 | transform: rotate(116.129032258deg) translate3d(80px, 0, 0);
72 | animation-delay: 0.4838709677s; }
73 |
74 | i:nth-child(11) {
75 | transform: rotate(127.741935484deg) translate3d(80px, 0, 0);
76 | animation-delay: 0.5322580645s; }
77 |
78 | i:nth-child(12) {
79 | transform: rotate(139.35483871deg) translate3d(80px, 0, 0);
80 | animation-delay: 0.5806451613s; }
81 |
82 | i:nth-child(13) {
83 | transform: rotate(150.967741935deg) translate3d(80px, 0, 0);
84 | animation-delay: 0.6290322581s; }
85 |
86 | i:nth-child(14) {
87 | transform: rotate(162.580645161deg) translate3d(80px, 0, 0);
88 | animation-delay: 0.6774193548s; }
89 |
90 | i:nth-child(15) {
91 | transform: rotate(174.193548387deg) translate3d(80px, 0, 0);
92 | animation-delay: 0.7258064516s; }
93 |
94 | i:nth-child(16) {
95 | transform: rotate(185.806451613deg) translate3d(80px, 0, 0);
96 | animation-delay: 0.7741935484s; }
97 |
98 | i:nth-child(17) {
99 | transform: rotate(197.419354839deg) translate3d(80px, 0, 0);
100 | animation-delay: 0.8225806452s; }
101 |
102 | i:nth-child(18) {
103 | transform: rotate(209.032258065deg) translate3d(80px, 0, 0);
104 | animation-delay: 0.8709677419s; }
105 |
106 | i:nth-child(19) {
107 | transform: rotate(220.64516129deg) translate3d(80px, 0, 0);
108 | animation-delay: 0.9193548387s; }
109 |
110 | i:nth-child(20) {
111 | transform: rotate(232.258064516deg) translate3d(80px, 0, 0);
112 | animation-delay: 0.9677419355s; }
113 |
114 | i:nth-child(21) {
115 | transform: rotate(243.870967742deg) translate3d(80px, 0, 0);
116 | animation-delay: 1.0161290323s; }
117 |
118 | i:nth-child(22) {
119 | transform: rotate(255.483870968deg) translate3d(80px, 0, 0);
120 | animation-delay: 1.064516129s; }
121 |
122 | i:nth-child(23) {
123 | transform: rotate(267.096774194deg) translate3d(80px, 0, 0);
124 | animation-delay: 1.1129032258s; }
125 |
126 | i:nth-child(24) {
127 | transform: rotate(278.709677419deg) translate3d(80px, 0, 0);
128 | animation-delay: 1.1612903226s; }
129 |
130 | i:nth-child(25) {
131 | transform: rotate(290.322580645deg) translate3d(80px, 0, 0);
132 | animation-delay: 1.2096774194s; }
133 |
134 | i:nth-child(26) {
135 | transform: rotate(301.935483871deg) translate3d(80px, 0, 0);
136 | animation-delay: 1.2580645161s; }
137 |
138 | i:nth-child(27) {
139 | transform: rotate(313.548387097deg) translate3d(80px, 0, 0);
140 | animation-delay: 1.3064516129s; }
141 |
142 | i:nth-child(28) {
143 | transform: rotate(325.161290323deg) translate3d(80px, 0, 0);
144 | animation-delay: 1.3548387097s; }
145 |
146 | i:nth-child(29) {
147 | transform: rotate(336.774193548deg) translate3d(80px, 0, 0);
148 | animation-delay: 1.4032258065s; }
149 |
150 | i:nth-child(30) {
151 | transform: rotate(348.387096774deg) translate3d(80px, 0, 0);
152 | animation-delay: 1.4516129032s; }
153 |
154 | i:nth-child(31) {
155 | transform: rotate(360deg) translate3d(80px, 0, 0);
156 | animation-delay: 1.5s; }
157 |
158 | i:nth-child(32) {
159 | transform: rotate(371.612903226deg) translate3d(80px, 0, 0);
160 | animation-delay: 1.5483870968s; }
161 |
162 | i:nth-child(33) {
163 | transform: rotate(383.225806452deg) translate3d(80px, 0, 0);
164 | animation-delay: 1.5967741935s; }
165 |
166 | i:nth-child(34) {
167 | transform: rotate(394.838709677deg) translate3d(80px, 0, 0);
168 | animation-delay: 1.6451612903s; }
169 |
170 | i:nth-child(35) {
171 | transform: rotate(406.451612903deg) translate3d(80px, 0, 0);
172 | animation-delay: 1.6935483871s; }
173 |
174 | i:nth-child(36) {
175 | transform: rotate(418.064516129deg) translate3d(80px, 0, 0);
176 | animation-delay: 1.7419354839s; }
177 |
178 | i:nth-child(37) {
179 | transform: rotate(429.677419355deg) translate3d(80px, 0, 0);
180 | animation-delay: 1.7903225806s; }
181 |
182 | i:nth-child(38) {
183 | transform: rotate(441.290322581deg) translate3d(80px, 0, 0);
184 | animation-delay: 1.8387096774s; }
185 |
186 | i:nth-child(39) {
187 | transform: rotate(452.903225806deg) translate3d(80px, 0, 0);
188 | animation-delay: 1.8870967742s; }
189 |
190 | i:nth-child(40) {
191 | transform: rotate(464.516129032deg) translate3d(80px, 0, 0);
192 | animation-delay: 1.935483871s; }
193 |
194 | i:nth-child(41) {
195 | transform: rotate(476.129032258deg) translate3d(80px, 0, 0);
196 | animation-delay: 1.9838709677s; }
197 |
198 | i:nth-child(42) {
199 | transform: rotate(487.741935484deg) translate3d(80px, 0, 0);
200 | animation-delay: 2.0322580645s; }
201 |
202 | i:nth-child(43) {
203 | transform: rotate(499.35483871deg) translate3d(80px, 0, 0);
204 | animation-delay: 2.0806451613s; }
205 |
206 | i:nth-child(44) {
207 | transform: rotate(510.967741935deg) translate3d(80px, 0, 0);
208 | animation-delay: 2.1290322581s; }
209 |
210 | i:nth-child(45) {
211 | transform: rotate(522.580645161deg) translate3d(80px, 0, 0);
212 | animation-delay: 2.1774193548s; }
213 |
214 | i:nth-child(46) {
215 | transform: rotate(534.193548387deg) translate3d(80px, 0, 0);
216 | animation-delay: 2.2258064516s; }
217 |
218 | i:nth-child(47) {
219 | transform: rotate(545.806451613deg) translate3d(80px, 0, 0);
220 | animation-delay: 2.2741935484s; }
221 |
222 | i:nth-child(48) {
223 | transform: rotate(557.419354839deg) translate3d(80px, 0, 0);
224 | animation-delay: 2.3225806452s; }
225 |
226 | i:nth-child(49) {
227 | transform: rotate(569.032258065deg) translate3d(80px, 0, 0);
228 | animation-delay: 2.3709677419s; }
229 |
230 | i:nth-child(50) {
231 | transform: rotate(580.64516129deg) translate3d(80px, 0, 0);
232 | animation-delay: 2.4193548387s; }
233 |
234 | i:nth-child(51) {
235 | transform: rotate(592.258064516deg) translate3d(80px, 0, 0);
236 | animation-delay: 2.4677419355s; }
237 |
238 | i:nth-child(52) {
239 | transform: rotate(603.870967742deg) translate3d(80px, 0, 0);
240 | animation-delay: 2.5161290323s; }
241 |
242 | i:nth-child(53) {
243 | transform: rotate(615.483870968deg) translate3d(80px, 0, 0);
244 | animation-delay: 2.564516129s; }
245 |
246 | i:nth-child(54) {
247 | transform: rotate(627.096774194deg) translate3d(80px, 0, 0);
248 | animation-delay: 2.6129032258s; }
249 |
250 | i:nth-child(55) {
251 | transform: rotate(638.709677419deg) translate3d(80px, 0, 0);
252 | animation-delay: 2.6612903226s; }
253 |
254 | i:nth-child(56) {
255 | transform: rotate(650.322580645deg) translate3d(80px, 0, 0);
256 | animation-delay: 2.7096774194s; }
257 |
258 | i:nth-child(57) {
259 | transform: rotate(661.935483871deg) translate3d(80px, 0, 0);
260 | animation-delay: 2.7580645161s; }
261 |
262 | i:nth-child(58) {
263 | transform: rotate(673.548387097deg) translate3d(80px, 0, 0);
264 | animation-delay: 2.8064516129s; }
265 |
266 | i:nth-child(59) {
267 | transform: rotate(685.161290323deg) translate3d(80px, 0, 0);
268 | animation-delay: 2.8548387097s; }
269 |
270 | i:nth-child(60) {
271 | transform: rotate(696.774193548deg) translate3d(80px, 0, 0);
272 | animation-delay: 2.9032258065s; }
273 |
274 | i:nth-child(61) {
275 | transform: rotate(708.387096774deg) translate3d(80px, 0, 0);
276 | animation-delay: 2.9516129032s; }
277 |
278 | i:nth-child(62) {
279 | transform: rotate(720deg) translate3d(80px, 0, 0);
280 | animation-delay: 3s; }
281 |
282 | #black {
283 | position: absolute;
284 | left: 15px;
285 | bottom: 15px;
286 | color: rgba(255, 255, 255, 0.6);
287 | text-decoration: none; }
288 | #black:after {
289 | content: 'Black & white'; }
290 |
291 | #black:target {
292 | top: 0;
293 | left: 0;
294 | width: 100%;
295 | height: 100%;
296 | z-index: 1;
297 | background: #111;
298 | cursor: default; }
299 | #black:target:after {
300 | content: ''; }
301 |
--------------------------------------------------------------------------------
/cloudy-spiral/style.scss:
--------------------------------------------------------------------------------
1 |
2 | $particles: 62; // has to match nodes in dom
3 | $particleSize: 8px;
4 | $radius: 80;
5 | $lapDuration: 3s;
6 |
7 |
8 | @keyframes spin {
9 | from {
10 | opacity: 0.0;
11 | }
12 | to {
13 | opacity: 0.6;
14 | transform: translate3d(-$particleSize/2, -$particleSize/2, 570px);
15 | }
16 | }
17 |
18 | html, body {
19 | overflow: hidden;
20 | background: #3e6fa3;
21 | font-family: Helvetica, sans-serif;
22 | }
23 |
24 | .wrapper {
25 | position: absolute;
26 | top: 50%;
27 | left: 50%;
28 | z-index: 2;
29 |
30 | perspective: 500px;
31 | }
32 |
33 | i {
34 | display: block;
35 | position: absolute;
36 | width: $particleSize;
37 | height: $particleSize;
38 | border-radius: $particleSize;
39 | opacity: 0;
40 | background: rgba(255,255,255,0.5);
41 | box-shadow: 0px 0px 10px rgba(255,255,255,1);
42 |
43 | animation-name: spin;
44 | animation-duration: $lapDuration;
45 | animation-iteration-count: infinite;
46 | animation-timing-function: ease-in-out;
47 | }
48 |
49 | @for $i from 1 through $particles {
50 | i:nth-child(#{$i}) {
51 | $angle: ( $i / $particles ) * 720;
52 |
53 | transform: rotate( #{$angle}deg ) translate3d( #{$radius}px, 0, 0 );
54 | animation-delay: $i * ($lapDuration / $particles);
55 | }
56 | }
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 | // background color controls
71 | #black {
72 | position: absolute;
73 | left: 15px;
74 | bottom: 15px;
75 | color: rgba(255,255,255,0.6);
76 | text-decoration: none;
77 |
78 | &:after { content: 'Black & white'; }
79 | }
80 |
81 | #black:target {
82 | top: 0;
83 | left: 0;
84 | width: 100%;
85 | height: 100%;
86 | z-index: 1;
87 | background: #111;
88 | cursor: default;
89 |
90 | &:after { content: ''; }
91 | }
--------------------------------------------------------------------------------
/device-loop/device-loop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hakimel/css/e1682cb1fec880e9bf740a36cf777a2eef9b2499/device-loop/device-loop.png
--------------------------------------------------------------------------------
/device-loop/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Device loop animation
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | A device loop animation as seen on slides.com
20 |
21 |
33 |
34 |
44 |
45 |
46 |
47 |
52 |
53 |
80 |
81 |
91 |
92 |
93 |
94 |
--------------------------------------------------------------------------------
/device-loop/style.css:
--------------------------------------------------------------------------------
1 | html, body {
2 | margin: 10px;
3 | text-align: center;
4 | font-family: Helvetica, sans-serif; }
5 |
6 | p {
7 | display: inline-block;
8 | color: #333;
9 | vertical-align: middle;
10 | font-size: 20px;
11 | text-align: right;
12 | line-height: 1.6; }
13 | p a {
14 | color: #333;
15 | padding: 2px 4px;
16 | border: 2px solid #aaa;
17 | border-radius: 2px;
18 | text-decoration: none; }
19 | p a:hover {
20 | border-color: #666;
21 | color: #000; }
22 |
23 | .animation {
24 | display: inline-block;
25 | position: relative;
26 | width: 460px;
27 | height: 377px;
28 | margin: 0 auto;
29 | vertical-align: middle; }
30 | .animation .device {
31 | position: absolute;
32 | width: 100%;
33 | height: 100%;
34 | left: 50%;
35 | top: 50%;
36 | background: #111;
37 | -webkit-transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
38 | -moz-transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
39 | -ms-transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
40 | transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
41 | -webkit-transform: translate(-50%, -50%);
42 | -moz-transform: translate(-50%, -50%);
43 | -ms-transform: translate(-50%, -50%);
44 | transform: translate(-50%, -50%); }
45 | .animation .device .phone-home-button,
46 | .animation .device .tablet-home-button {
47 | position: absolute;
48 | border-radius: 50%;
49 | background: #444;
50 | opacity: 0;
51 | z-index: 1;
52 | -webkit-transition: all 0.4s ease;
53 | -moz-transition: all 0.4s ease;
54 | -ms-transition: all 0.4s ease;
55 | transition: all 0.4s ease; }
56 | .animation .device .phone-home-button {
57 | width: 16px;
58 | height: 16px;
59 | margin-top: -8px;
60 | right: 11px;
61 | top: 50%; }
62 | .animation .device .tablet-home-button {
63 | width: 12px;
64 | height: 12px;
65 | margin-left: -6px;
66 | bottom: 7px;
67 | left: 50%; }
68 | .animation .device .screen-stand {
69 | position: absolute;
70 | width: 100%;
71 | margin-left: -10px;
72 | margin-top: -1px;
73 | top: 60%;
74 | opacity: 0;
75 | z-index: 1;
76 | -webkit-transition: all 0.4s ease-out;
77 | -moz-transition: all 0.4s ease-out;
78 | -ms-transition: all 0.4s ease-out;
79 | transition: all 0.4s ease-out; }
80 | .animation .device .screen-stand .leg {
81 | position: absolute;
82 | width: 12px;
83 | height: 16px;
84 | left: 50%;
85 | top: 0;
86 | margin-left: -6px;
87 | background: #111; }
88 | .animation .device .screen-stand .foot {
89 | position: absolute;
90 | width: 120px;
91 | height: 4px;
92 | left: 50%;
93 | top: 15px;
94 | margin-left: -60px;
95 | border-top-left-radius: 2px;
96 | border-top-right-radius: 2px;
97 | background: #111; }
98 | .animation .device .display {
99 | position: relative;
100 | width: 100%;
101 | height: 100%;
102 | overflow: hidden;
103 | background: #34495e;
104 | z-index: 3; }
105 | .animation .device .display div {
106 | position: absolute;
107 | width: 100%;
108 | height: 100%;
109 | left: 100%;
110 | white-space: nowrap;
111 | -webkit-transition: all 0.4s ease;
112 | -moz-transition: all 0.4s ease;
113 | -ms-transition: all 0.4s ease;
114 | transition: all 0.4s ease; }
115 | .animation .device .display div div {
116 | position: absolute;
117 | width: 100%;
118 | left: 0;
119 | top: 50%;
120 | margin-top: -14px;
121 | font-size: 1.1em;
122 | text-align: center;
123 | color: #fff; }
124 | .animation .device .display div div em {
125 | font-weight: bold; }
126 | .animation .device .display .slide1 {
127 | background: #34495e; }
128 | .animation .device .display .slide2 {
129 | background: #16a085; }
130 | .animation .device .display .slide3 {
131 | background: #3498db; }
132 | .animation[data-animation-step="1"] .device {
133 | width: 70%;
134 | height: 60%;
135 | padding: 10px;
136 | border-radius: 4px; }
137 | .animation[data-animation-step="1"] .device .slide1 {
138 | left: 0%; }
139 | .animation[data-animation-step="1"] .device .screen-stand {
140 | opacity: 1;
141 | top: 100%; }
142 | .animation[data-animation-step="2"] .device {
143 | width: 45%;
144 | height: 72%;
145 | padding: 24px;
146 | border-radius: 10px; }
147 | .animation[data-animation-step="2"] .device .slide1 {
148 | left: -100%; }
149 | .animation[data-animation-step="2"] .device .slide2 {
150 | left: 0%; }
151 | .animation[data-animation-step="2"] .device .tablet-home-button {
152 | opacity: 1; }
153 | .animation[data-animation-step="3"] .device {
154 | width: 54%;
155 | height: 38%;
156 | padding: 10px 36px;
157 | border-radius: 6px; }
158 | .animation[data-animation-step="3"] .device .slide1,
159 | .animation[data-animation-step="3"] .device .slide2 {
160 | left: -100%; }
161 | .animation[data-animation-step="3"] .device .slide3 {
162 | left: 0%; }
163 | .animation[data-animation-step="3"] .device .phone-home-button {
164 | opacity: 1; }
165 |
--------------------------------------------------------------------------------
/device-loop/style.scss:
--------------------------------------------------------------------------------
1 |
2 | $width: 460px;
3 | $height: 377px;
4 |
5 | $deviceTransitionDuration: 0.4s;
6 |
7 | $screenWidth: 70%;
8 | $screenHeight: 60%;
9 |
10 | $tabletWidth: 45%;
11 | $tabletHeight: 72%;
12 |
13 | $phoneWidth: 54%;
14 | $phoneHeight: 38%;
15 |
16 | @mixin transition( $value ) {
17 | -webkit-transition: $value;
18 | -moz-transition: $value;
19 | -ms-transition: $value;
20 | transition: $value;
21 | }
22 |
23 | @mixin transform( $value ) {
24 | -webkit-transform: $value;
25 | -moz-transform: $value;
26 | -ms-transform: $value;
27 | transform: $value;
28 | }
29 |
30 | html, body {
31 | margin: 10px;
32 | text-align: center;
33 | font-family: Helvetica, sans-serif;
34 | }
35 |
36 | p {
37 | display: inline-block;
38 | color: #333;
39 | vertical-align: middle;
40 | font-size: 20px;
41 | text-align: right;
42 | line-height: 1.6;
43 |
44 | a {
45 | color: #333;
46 | padding: 2px 4px;
47 | border: 2px solid #aaa;
48 | border-radius: 2px;
49 | text-decoration: none;
50 |
51 | &:hover {
52 | border-color: #666;
53 | color: #000;
54 | }
55 | }
56 | }
57 |
58 | .animation {
59 | display: inline-block;
60 | position: relative;
61 | width: $width;
62 | height: $height;
63 | margin: 0 auto;
64 | vertical-align: middle;
65 |
66 | .device {
67 | position: absolute;
68 | width: 100%;
69 | height: 100%;
70 | left: 50%;
71 | top: 50%;
72 | background: #111;
73 |
74 | @include transition( all $deviceTransitionDuration cubic-bezier(0.175, 0.885, 0.320, 1.275) );
75 | @include transform( translate(-50%, -50%) );
76 |
77 | .phone-home-button,
78 | .tablet-home-button {
79 | position: absolute;
80 | border-radius: 50%;
81 | background: #444;
82 | opacity: 0;
83 | z-index: 1;
84 |
85 | @include transition( all $deviceTransitionDuration ease );
86 | }
87 |
88 | .phone-home-button {
89 | width: 16px;
90 | height: 16px;
91 | margin-top: -8px;
92 | right: 11px;
93 | top: 50%;
94 | }
95 |
96 | .tablet-home-button {
97 | width: 12px;
98 | height: 12px;
99 | margin-left: -6px;
100 | bottom: 7px;
101 | left: 50%;
102 | }
103 |
104 | .screen-stand {
105 | position: absolute;
106 | width: 100%;
107 | margin-left: -10px;
108 | margin-top: -1px;
109 | top: 60%;
110 | opacity: 0;
111 | z-index: 1;
112 |
113 | .leg {
114 | position: absolute;
115 | width: 12px;
116 | height: 16px;
117 | left: 50%;
118 | top: 0;
119 | margin-left: -6px;
120 |
121 | background: #111;
122 | }
123 |
124 | .foot {
125 | position: absolute;
126 | width: 120px;
127 | height: 4px;
128 | left: 50%;
129 | top: 15px;
130 | margin-left: -60px;
131 | border-top-left-radius: 2px;
132 | border-top-right-radius: 2px;
133 |
134 | background: #111;
135 | }
136 |
137 | @include transition( all $deviceTransitionDuration ease-out );
138 | }
139 |
140 | .display {
141 | position: relative;
142 | width: 100%;
143 | height: 100%;
144 | overflow: hidden;
145 | background: #34495e;
146 | z-index: 3;
147 |
148 | div {
149 | position: absolute;
150 | width: 100%;
151 | height: 100%;
152 | left: 100%;
153 | white-space: nowrap;
154 |
155 | @include transition( all $deviceTransitionDuration ease );
156 |
157 | div {
158 | position: absolute;
159 | width: 100%;
160 | left: 0;
161 | top: 50%;
162 | margin-top: -14px;
163 | font-size: 1.1em;
164 | text-align: center;
165 | color: #fff;
166 |
167 | em {
168 | font-weight: bold;
169 | }
170 | }
171 | }
172 |
173 | .slide1 { background: #34495e; }
174 | .slide2 { background: #16a085; }
175 | .slide3 { background: #3498db; }
176 | }
177 | }
178 |
179 | &[data-animation-step="1"] .device {
180 | width: $screenWidth;
181 | height: $screenHeight;
182 | padding: 10px;
183 | border-radius: 4px;
184 |
185 | .slide1 {
186 | left: 0%;
187 | }
188 |
189 | .screen-stand {
190 | opacity: 1;
191 | top: 100%;
192 | }
193 | }
194 |
195 | &[data-animation-step="2"] .device {
196 | width: $tabletWidth;
197 | height: $tabletHeight;
198 | padding: 24px;
199 | border-radius: 10px;
200 |
201 | .slide1 {
202 | left: -100%;
203 | }
204 |
205 | .slide2 {
206 | left: 0%;
207 | }
208 |
209 | .tablet-home-button {
210 | opacity: 1;
211 | }
212 | }
213 |
214 | &[data-animation-step="3"] .device {
215 | width: $phoneWidth;
216 | height: $phoneHeight;
217 | padding: 10px 36px;
218 | border-radius: 6px;
219 |
220 | .slide1,
221 | .slide2 {
222 | left: -100%;
223 | }
224 |
225 | .slide3 {
226 | left: 0%;
227 | }
228 |
229 | .phone-home-button {
230 | opacity: 1;
231 | }
232 | }
233 | }
--------------------------------------------------------------------------------
/flexing-pagination/flexing-pagination.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hakimel/css/e1682cb1fec880e9bf740a36cf777a2eef9b2499/flexing-pagination/flexing-pagination.png
--------------------------------------------------------------------------------
/flexing-pagination/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Flexing pagination arrows
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | Flexing pagination arrows
20 |
21 |
22 |
23 |
24 |
25 |
26 |
49 |
50 |
51 |
52 |
57 |
58 |
93 |
94 |
104 |
105 |
106 |
107 |
--------------------------------------------------------------------------------
/flexing-pagination/style.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | background: #33ab83;
4 | font-family: Helvetica, sans-serif; }
5 |
6 | button {
7 | -webkit-appearance: none;
8 | background: transparent;
9 | border: 0;
10 | outline: 0; }
11 |
12 | .paginate {
13 | position: relative;
14 | margin: 10px;
15 | width: 50px;
16 | height: 50px;
17 | cursor: pointer;
18 | transform: translate3d(0, 0, 0);
19 | position: absolute;
20 | top: 50%;
21 | margin-top: -20px;
22 | -webkit-filter: drop-shadow(0 2px 0px rgba(0, 0, 0, 0.2)); }
23 | .paginate i {
24 | position: absolute;
25 | top: 40%;
26 | left: 0;
27 | width: 50px;
28 | height: 5px;
29 | border-radius: 2.5px;
30 | background: #fff;
31 | transition: all 0.15s ease; }
32 | .paginate.left {
33 | right: 58%; }
34 | .paginate.left i {
35 | transform-origin: 0% 50%; }
36 | .paginate.left i:first-child {
37 | transform: translate(0, -1px) rotate(40deg); }
38 | .paginate.left i:last-child {
39 | transform: translate(0, 1px) rotate(-40deg); }
40 | .paginate.left:hover i:first-child {
41 | transform: translate(0, -1px) rotate(30deg); }
42 | .paginate.left:hover i:last-child {
43 | transform: translate(0, 1px) rotate(-30deg); }
44 | .paginate.left:active i:first-child {
45 | transform: translate(1px, -1px) rotate(25deg); }
46 | .paginate.left:active i:last-child {
47 | transform: translate(1px, 1px) rotate(-25deg); }
48 | .paginate.left[data-state=disabled] i:first-child {
49 | transform: translate(-5px, 0) rotate(0deg); }
50 | .paginate.left[data-state=disabled] i:last-child {
51 | transform: translate(-5px, 0) rotate(0deg); }
52 | .paginate.left[data-state=disabled]:hover i:first-child {
53 | transform: translate(-5px, 0) rotate(0deg); }
54 | .paginate.left[data-state=disabled]:hover i:last-child {
55 | transform: translate(-5px, 0) rotate(0deg); }
56 | .paginate.right {
57 | left: 58%; }
58 | .paginate.right i {
59 | transform-origin: 100% 50%; }
60 | .paginate.right i:first-child {
61 | transform: translate(0, 1px) rotate(40deg); }
62 | .paginate.right i:last-child {
63 | transform: translate(0, -1px) rotate(-40deg); }
64 | .paginate.right:hover i:first-child {
65 | transform: translate(0, 1px) rotate(30deg); }
66 | .paginate.right:hover i:last-child {
67 | transform: translate(0, -1px) rotate(-30deg); }
68 | .paginate.right:active i:first-child {
69 | transform: translate(1px, 1px) rotate(25deg); }
70 | .paginate.right:active i:last-child {
71 | transform: translate(1px, -1px) rotate(-25deg); }
72 | .paginate.right[data-state=disabled] i:first-child {
73 | transform: translate(5px, 0) rotate(0deg); }
74 | .paginate.right[data-state=disabled] i:last-child {
75 | transform: translate(5px, 0) rotate(0deg); }
76 | .paginate.right[data-state=disabled]:hover i:first-child {
77 | transform: translate(5px, 0) rotate(0deg); }
78 | .paginate.right[data-state=disabled]:hover i:last-child {
79 | transform: translate(5px, 0) rotate(0deg); }
80 | .paginate[data-state=disabled] {
81 | opacity: 0.3;
82 | cursor: default; }
83 |
84 | .counter {
85 | text-align: center;
86 | position: absolute;
87 | width: 100%;
88 | top: 50%;
89 | margin-top: -15px;
90 | font-size: 30px;
91 | text-shadow: 0px 2px 0px rgba(0, 0, 0, 0.2);
92 | color: #fff; }
93 |
--------------------------------------------------------------------------------
/flexing-pagination/style.scss:
--------------------------------------------------------------------------------
1 | $size: 50px;
2 | $thickness: 5px;
3 | $angle: 40deg;
4 | $angleHover: 30deg;
5 | $angleActive: 25deg;
6 |
7 | @mixin transition( $value ) {
8 | transition: $value;
9 | }
10 |
11 | @mixin transform( $value ) {
12 | transform: $value;
13 | }
14 |
15 | @mixin transform-origin( $value ) {
16 | transform-origin: $value;
17 | }
18 |
19 | @mixin arrowTransform( $angle, $x: 0, $y: 0 ) {
20 | i:first-child {
21 | @include transform( translate( $x, $y ) rotate( $angle ) );
22 | }
23 |
24 | i:last-child {
25 | @include transform( translate( $x, -$y ) rotate( -$angle ) );
26 | }
27 | }
28 |
29 | body {
30 | margin: 0;
31 | background: #33ab83;
32 | font-family: Helvetica, sans-serif;
33 | }
34 |
35 | button {
36 | -webkit-appearance: none;
37 | background: transparent;
38 | border: 0;
39 | outline: 0;
40 | }
41 |
42 | .paginate {
43 | position: relative;
44 | margin: 10px;
45 | width: $size;
46 | height: $size;
47 | cursor: pointer;
48 | @include transform( translate3d(0,0,0) ); // fixes flicker in webkit
49 |
50 | position: absolute;
51 | top: 50%;
52 | margin-top: -20px;
53 | -webkit-filter: drop-shadow( 0 2px 0px rgba(0,0,0,0.2) );
54 |
55 | i {
56 | position: absolute;
57 | top: 40%;
58 | left: 0;
59 | width: $size;
60 | height: $thickness;
61 | border-radius: $thickness / 2;
62 | background: #fff;
63 |
64 | @include transition( all 0.15s ease );
65 | }
66 |
67 | &.left {
68 | right: 58%;
69 |
70 | i {
71 | @include transform-origin( 0% 50% );
72 | }
73 |
74 | @include arrowTransform( $angle, 0, -1px );
75 |
76 | &:hover {
77 | @include arrowTransform( $angleHover, 0, -1px );
78 | }
79 |
80 | &:active {
81 | @include arrowTransform( $angleActive, 1px, -1px );
82 | }
83 |
84 | &[data-state=disabled] {
85 | @include arrowTransform( 0deg, -5px, 0 );
86 |
87 | &:hover {
88 | @include arrowTransform( 0deg, -5px, 0 );
89 | }
90 | }
91 | }
92 |
93 | &.right {
94 | left: 58%;
95 |
96 | i {
97 | @include transform-origin( 100% 50% );
98 | }
99 |
100 | @include arrowTransform( $angle, 0, 1px );
101 |
102 | &:hover {
103 | @include arrowTransform( $angleHover, 0, 1px );
104 | }
105 |
106 | &:active {
107 | @include arrowTransform( $angleActive, 1px, 1px );
108 | }
109 |
110 | &[data-state=disabled] {
111 | @include arrowTransform( 0deg, 5px, 0 );
112 |
113 | &:hover {
114 | @include arrowTransform( 0deg, 5px, 0 );
115 | }
116 | }
117 | }
118 |
119 | &[data-state=disabled] {
120 | opacity: 0.3;
121 | cursor: default;
122 | }
123 | }
124 |
125 |
126 |
127 | .counter {
128 | text-align: center;
129 | position: absolute;
130 | width: 100%;
131 | top: 50%;
132 | margin-top: -15px;
133 | font-size: 30px;
134 | text-shadow: 0px 2px 0px rgba( 0, 0, 0, 0.2 );
135 | color: #fff;
136 | }
--------------------------------------------------------------------------------
/flipside/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Flipside
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
Are you sure you want to do that?
25 |
Yes
26 |
No
27 |
28 |
Delete
29 |
30 |
31 | Try clicking different sides of the button
32 |
33 |
34 |
35 |
36 |
37 | Flipside – A button that seamlessly transitions from action to confirmation
38 |
39 |
44 |
45 |
103 |
104 |
114 |
115 |
116 |
117 |
--------------------------------------------------------------------------------
/flipside/script.js:
--------------------------------------------------------------------------------
1 | window.onload = function() {
2 |
3 | var btn = document.querySelector( '.btn' );
4 |
5 | var btnFront = btn.querySelector( '.btn-front' ),
6 | btnYes = btn.querySelector( '.btn-back .yes' ),
7 | btnNo = btn.querySelector( '.btn-back .no' );
8 |
9 | btnFront.addEventListener( 'click', function( event ) {
10 | var mx = event.clientX - btn.offsetLeft,
11 | my = event.clientY - btn.offsetTop;
12 |
13 | var w = btn.offsetWidth,
14 | h = btn.offsetHeight;
15 |
16 | var directions = [
17 | { id: 'top', x: w/2, y: 0 },
18 | { id: 'right', x: w, y: h/2 },
19 | { id: 'bottom', x: w/2, y: h },
20 | { id: 'left', x: 0, y: h/2 }
21 | ];
22 |
23 | directions.sort( function( a, b ) {
24 | return distance( mx, my, a.x, a.y ) - distance( mx, my, b.x, b.y );
25 | } );
26 |
27 | btn.setAttribute( 'data-direction', directions.shift().id );
28 | btn.classList.add( 'is-open' );
29 | } );
30 |
31 | btnYes.addEventListener( 'click', function( event ) {
32 | btn.classList.remove( 'is-open' );
33 | } );
34 |
35 | btnNo.addEventListener( 'click', function( event ) {
36 | btn.classList.remove( 'is-open' );
37 | } );
38 |
39 | function distance( x1, y1, x2, y2 ) {
40 | var dx = x1-x2;
41 | var dy = y1-y2;
42 | return Math.sqrt( dx*dx + dy*dy );
43 | }
44 |
45 | };
--------------------------------------------------------------------------------
/flipside/style.css:
--------------------------------------------------------------------------------
1 | @import url(https://fonts.googleapis.com/css?family=Roboto:400,700);
2 | html, body {
3 | width: 100%;
4 | height: 100%;
5 | margin: 0;
6 | -webkit-user-select: none;
7 | -moz-user-select: none;
8 | -ms-user-select: none;
9 | user-select: none; }
10 |
11 | body {
12 | display: -ms-flexbox;
13 | display: flex;
14 | font-family: Roboto, "Helvetica Neue", sans-serif;
15 | font-size: 18px;
16 | perspective: 1000px;
17 | background-color: #f5f5f5;
18 | -ms-flex-direction: column;
19 | flex-direction: column;
20 | -ms-flex-pack: center;
21 | justify-content: center;
22 | -ms-flex-align: center;
23 | align-items: center; }
24 |
25 | .description {
26 | margin-top: 50px;
27 | text-align: center;
28 | color: #999;
29 | transition: opacity 0.3s ease; }
30 |
31 | .description a {
32 | color: #4A9DF6;
33 | text-decoration: none; }
34 |
35 | .btn.is-open ~ .description {
36 | opacity: 0; }
37 |
38 | .btn {
39 | display: block;
40 | position: relative;
41 | width: 200px;
42 | height: 80px;
43 | transition: width 0.8s cubic-bezier(0.23, 1, 0.32, 1), height 0.8s cubic-bezier(0.23, 1, 0.32, 1), transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275);
44 | transform-style: preserve-3d;
45 | transform-origin: 50% 50%;
46 | text-align: center; }
47 |
48 | .btn-front {
49 | position: absolute;
50 | display: block;
51 | width: 100%;
52 | height: 100%;
53 | line-height: 80px;
54 | background-color: #F44336;
55 | color: #fff;
56 | cursor: pointer;
57 | backface-visibility: hidden;
58 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
59 | transition: background 0.15s ease, line-height 0.8s cubic-bezier(0.23, 1, 0.32, 1); }
60 | .btn-front:hover {
61 | background-color: #f77066; }
62 |
63 | .btn-back {
64 | position: absolute;
65 | width: 100%;
66 | height: 100%;
67 | background-color: #eee;
68 | color: #222;
69 | transform: translateZ(-2px) rotateX(180deg);
70 | overflow: hidden;
71 | transition: box-shadow 0.8s ease; }
72 | .btn-back p {
73 | margin-top: 27px;
74 | margin-bottom: 25px; }
75 | .btn-back button {
76 | padding: 12px 20px;
77 | width: 30%;
78 | margin: 0 5px;
79 | background-color: transparent;
80 | border: 0;
81 | border-radius: 2px;
82 | font-size: 1em;
83 | cursor: pointer;
84 | -webkit-appearance: none;
85 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
86 | transition: background 0.15s ease; }
87 | .btn-back button:focus {
88 | outline: 0; }
89 | .btn-back button.yes {
90 | background-color: #2196F3;
91 | color: #fff; }
92 | .btn-back button.yes:hover {
93 | background-color: #51adf6; }
94 | .btn-back button.no {
95 | color: #2196F3; }
96 | .btn-back button.no:hover {
97 | background-color: #ddd; }
98 |
99 | .btn[data-direction="left"] .btn-back,
100 | .btn[data-direction="right"] .btn-back {
101 | transform: translateZ(-2px) rotateY(180deg); }
102 |
103 | .btn.is-open {
104 | width: 400px;
105 | height: 160px; }
106 | .btn.is-open .btn-front {
107 | pointer-events: none;
108 | line-height: 160px; }
109 | .btn.is-open .btn-back {
110 | box-shadow: 0 8px 25px rgba(0, 0, 0, 0.4); }
111 |
112 | .btn[data-direction="top"].is-open {
113 | transform: rotateX(180deg); }
114 |
115 | .btn[data-direction="right"].is-open {
116 | transform: rotateY(180deg); }
117 |
118 | .btn[data-direction="bottom"].is-open {
119 | transform: rotateX(-180deg); }
120 |
121 | .btn[data-direction="left"].is-open {
122 | transform: rotateY(-180deg); }
123 |
--------------------------------------------------------------------------------
/flipside/style.scss:
--------------------------------------------------------------------------------
1 | $transition-duration: 0.8s;
2 | $transition-easing: cubic-bezier(0.230, 1.000, 0.320, 1.000);
3 | $bounce-easing: cubic-bezier(0.175, 0.885, 0.320, 1.275);
4 | $closed-width: 200px;
5 | $closed-height: 80px;
6 | $opened-width: 400px;
7 | $opened-height: 160px;
8 |
9 | @import url(https://fonts.googleapis.com/css?family=Roboto:400,700);
10 |
11 | html, body {
12 | width: 100%;
13 | height: 100%;
14 | margin: 0;
15 | user-select: none;
16 | }
17 |
18 | body {
19 | display: flex;
20 | font-family: Roboto, "Helvetica Neue", sans-serif;
21 | font-size: 18px;
22 | perspective: 1000px;
23 | background-color: #f5f5f5;
24 | flex-direction: column;
25 | justify-content: center;
26 | align-items: center;
27 | }
28 |
29 | .description {
30 | margin-top: 50px;
31 | text-align: center;
32 | color: #999;
33 | transition: opacity 0.3s ease;
34 | }
35 |
36 | .description a {
37 | color: #4A9DF6;
38 | text-decoration: none;
39 | }
40 |
41 | .btn.is-open ~ .description {
42 | opacity: 0;
43 | }
44 |
45 | .btn {
46 | display: block;
47 | position: relative;
48 | width: $closed-width;
49 | height: $closed-height;
50 | transition: width $transition-duration $transition-easing,
51 | height $transition-duration $transition-easing,
52 | transform $transition-duration $bounce-easing;
53 | transform-style: preserve-3d;
54 | transform-origin: 50% 50%;
55 | text-align: center;
56 | }
57 |
58 | .btn-front {
59 | position: absolute;
60 | display: block;
61 | width: 100%;
62 | height: 100%;
63 | line-height: $closed-height;
64 | background-color: #F44336;
65 | color: #fff;
66 | cursor: pointer;
67 | backface-visibility: hidden;
68 | -webkit-tap-highlight-color: rgba( 0, 0, 0, 0 );
69 | transition: background 0.15s ease,
70 | line-height $transition-duration $transition-easing;
71 |
72 | &:hover {
73 | background-color: lighten(#F44336, 10%);
74 | }
75 | }
76 |
77 | .btn-back {
78 | position: absolute;
79 | width: 100%;
80 | height: 100%;
81 | background-color: #eee;
82 | color: #222;
83 | transform: translateZ(-2px) rotateX(180deg);
84 | overflow: hidden;
85 | transition: box-shadow $transition-duration ease;
86 |
87 | p {
88 | margin-top: 27px;
89 | margin-bottom: 25px;
90 | }
91 |
92 | button {
93 | padding: 12px 20px;
94 | width: 30%;
95 | margin: 0 5px;
96 | background-color: transparent;
97 | border: 0;
98 | border-radius: 2px;
99 | font-size: 1em;
100 | cursor: pointer;
101 | -webkit-appearance: none;
102 | -webkit-tap-highlight-color: rgba( 0, 0, 0, 0 );
103 | transition: background 0.15s ease;
104 | }
105 |
106 | button:focus {
107 | outline: 0;
108 | }
109 |
110 | button.yes {
111 | background-color: #2196F3;
112 | color: #fff;
113 |
114 | &:hover {
115 | background-color: lighten(#2196F3, 10%);
116 | }
117 | }
118 |
119 | button.no {
120 | color: #2196F3;
121 |
122 | &:hover {
123 | background-color: #ddd;
124 | }
125 | }
126 | }
127 |
128 | .btn[data-direction="left"] .btn-back,
129 | .btn[data-direction="right"] .btn-back {
130 | transform: translateZ(-2px) rotateY(180deg);
131 | }
132 |
133 | .btn.is-open {
134 | width: $opened-width;
135 | height: $opened-height;
136 |
137 | .btn-front {
138 | pointer-events: none;
139 | line-height: $opened-height;
140 | }
141 |
142 | .btn-back {
143 | box-shadow: 0 8px 25px rgba(0,0,0,0.4);
144 | }
145 | }
146 |
147 | .btn[data-direction="top"].is-open {
148 | transform: rotateX(180deg);
149 | }
150 |
151 | .btn[data-direction="right"].is-open {
152 | transform: rotateY(180deg);
153 | }
154 |
155 | .btn[data-direction="bottom"].is-open {
156 | transform: rotateX(-180deg);
157 | }
158 |
159 | .btn[data-direction="left"].is-open {
160 | transform: rotateY(-180deg);
161 | }
162 |
--------------------------------------------------------------------------------
/monocle/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Monocle
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
136 |
137 |
138 |
139 |
140 |
141 |
146 |
147 |
188 |
189 |
199 |
200 |
201 |
202 |
--------------------------------------------------------------------------------
/monocle/script.js:
--------------------------------------------------------------------------------
1 | window.onload = () => {
2 |
3 | const wrapper = document.querySelector( '.page-wrapper' );
4 |
5 | const originalList = document.querySelector( '.list-wrapper' );
6 | const originalListItems = originalList.innerHTML;
7 | originalList.parentNode.removeChild( originalList );
8 |
9 | // Top list
10 | const listA = document.createElement( 'div' );
11 | listA.className = 'list-wrapper list-a';
12 | listA.innerHTML = originalListItems;
13 | wrapper.appendChild( listA );
14 |
15 | // Monocle list
16 | const listB = document.createElement( 'div' );
17 | listB.className = 'list-wrapper list-b';
18 | listB.innerHTML = originalListItems;
19 | wrapper.appendChild( listB );
20 |
21 | // Bottom list
22 | const listC = document.createElement( 'div' );
23 | listC.className = 'list-wrapper list-c';
24 | listC.innerHTML = originalListItems;
25 | wrapper.appendChild( listC );
26 |
27 | const listAInner = listA.querySelector( '.list' );
28 | const listCInner = listC.querySelector( '.list' );
29 | const listBInner = listB.querySelector( '.list' );
30 |
31 | const rowHeight = listA.querySelector( '.list-item' ).offsetHeight;
32 | const listAScrollheight = listAInner.scrollHeight;
33 | const listBScrollheight = listBInner.scrollHeight;
34 |
35 | let listAHeight = 0,
36 | listBHeight = rowHeight * 2,
37 | listCHeight = 0;
38 |
39 | let scrollPosition = 0;
40 |
41 | function init() {
42 |
43 | window.addEventListener( 'resize', layout );
44 | window.addEventListener( 'scroll', syncScrollPosition );
45 |
46 | wrapper.style.visibility = '';
47 |
48 | layout();
49 |
50 | syncScrollPosition();
51 |
52 | }
53 |
54 | function layout() {
55 |
56 | let height = window.innerHeight;
57 |
58 | listAHeight = ( height - listBHeight ) / 2;
59 | listAHeight = Math.floor( listAHeight / rowHeight ) * rowHeight;
60 |
61 | listCHeight = height - ( listAHeight + listBHeight );
62 |
63 | listA.style.height = listAHeight + 'px';
64 | listB.style.height = listBHeight + 'px';
65 | listB.style.top = listAHeight + 'px';
66 | listC.style.height = listCHeight + 'px';
67 |
68 | sync();
69 |
70 | }
71 |
72 | function sync() {
73 |
74 | listAInner.style.top = ( listAHeight + ( -scrollPosition * ( listAScrollheight ) ) ) + 'px';
75 | listBInner.style.top = ( -scrollPosition * ( listBScrollheight - listBHeight ) ) + 'px';
76 | listCInner.style.top = ( -scrollPosition * listAScrollheight ) + 'px';
77 |
78 | }
79 |
80 | function syncScrollPosition( event ) {
81 |
82 | let scrollRange = document.documentElement.scrollHeight - document.documentElement.offsetHeight;
83 |
84 | scrollPosition = window.scrollY / scrollRange;
85 | scrollPosition = Math.max( 0, Math.min( 1, scrollPosition ) );
86 |
87 | sync();
88 |
89 | }
90 |
91 | init();
92 |
93 | };
--------------------------------------------------------------------------------
/monocle/style.css:
--------------------------------------------------------------------------------
1 | * {
2 | box-sizing: border-box;
3 | margin: 0;
4 | padding: 0; }
5 |
6 | html, body {
7 | height: 100%;
8 | width: 100%;
9 | font-family: 'Roboto', Helvetica, sans-serif;
10 | background-color: #222;
11 | color: #222; }
12 |
13 | html {
14 | overflow: auto; }
15 |
16 | body {
17 | height: 500%; }
18 |
19 | .page-wrapper {
20 | position: fixed;
21 | width: 840px;
22 | height: 100%;
23 | left: 50%;
24 | top: 0;
25 | margin-left: -420px;
26 | font-size: 16px;
27 | z-index: 2; }
28 |
29 | .list-wrapper {
30 | position: absolute;
31 | width: 100%;
32 | height: 100%;
33 | overflow: hidden; }
34 |
35 | .list {
36 | position: relative;
37 | width: 420px;
38 | margin: 0 auto;
39 | padding: 0;
40 | list-style: none; }
41 | .list .list-item {
42 | width: 100%;
43 | height: 150px;
44 | padding: 2.1em 1em;
45 | display: flex;
46 | flex-direction: row;
47 | align-items: center;
48 | background-color: #eee;
49 | color: inherit;
50 | text-decoration: none;
51 | cursor: default; }
52 | .list .list-item:nth-child(even) {
53 | background-color: #e5e5e5; }
54 | .list .list-item:nth-child(odd) {
55 | background-color: #f5f5f5; }
56 | .list .list-item:first-child {
57 | border-top-left-radius: 6px;
58 | border-top-right-radius: 6px; }
59 | .list .list-item:last-child {
60 | border-bottom-left-radius: 6px;
61 | border-bottom-right-radius: 6px; }
62 | .list .project-figure {
63 | width: 30%;
64 | flex-shrink: 0;
65 | margin-right: 1em; }
66 | .list .project-figure img {
67 | display: block;
68 | max-width: 100%;
69 | max-height: 100%; }
70 | .list h3 {
71 | margin-bottom: 4px; }
72 | .list h3, .list img, .list p {
73 | cursor: pointer; }
74 |
75 | .list-a {
76 | top: 0; }
77 | .list-a .list-item:last-child {
78 | display: none; }
79 |
80 | .list-b {
81 | z-index: 10;
82 | font-size: 2em;
83 | box-shadow: 0 0 30px rgba(0, 0, 0, 0.6);
84 | border-radius: 6px; }
85 | .list-b .list {
86 | width: 840px; }
87 | .list-b .list-item {
88 | height: 300px; }
89 |
90 | .list-c {
91 | bottom: 0; }
92 | .list-c .list-item:first-child {
93 | display: none; }
94 |
--------------------------------------------------------------------------------
/monocle/style.scss:
--------------------------------------------------------------------------------
1 | $textColor: #222;
2 | $rowWidth: 420px;
3 | $rowHeight: 150px;
4 | $rounding: 6px;
5 |
6 | * {
7 | box-sizing: border-box;
8 | margin: 0;
9 | padding: 0;
10 | }
11 |
12 | html, body {
13 | height: 100%;
14 | width: 100%;
15 | font-family: 'Roboto', Helvetica, sans-serif;
16 | background-color: #222;
17 | color: $textColor;
18 | }
19 |
20 | html {
21 | overflow: auto;
22 | }
23 |
24 | body {
25 | height: 500%;
26 | }
27 |
28 | .page-wrapper {
29 | position: fixed;
30 | width: $rowWidth * 2;
31 | height: 100%;
32 | left: 50%;
33 | top: 0;
34 | margin-left: -$rowWidth;
35 | font-size: 16px;
36 | z-index: 2;
37 | }
38 |
39 | .list-wrapper {
40 | position: absolute;
41 | width: 100%;
42 | height: 100%;
43 | overflow: hidden;
44 | }
45 |
46 | .list {
47 | position: relative;
48 | width: $rowWidth;
49 | margin: 0 auto;
50 | padding: 0;
51 | list-style: none;
52 |
53 | .list-item {
54 | width: 100%;
55 | height: $rowHeight;
56 | padding: 2.1em 1em;
57 | display: flex;
58 | flex-direction: row;
59 | align-items: center;
60 | background-color: #eee;
61 | color: inherit;
62 | text-decoration: none;
63 | cursor: default;
64 | }
65 |
66 | .list-item:nth-child(even) {
67 | background-color: #e5e5e5;
68 | }
69 | .list-item:nth-child(odd) {
70 | background-color: #f5f5f5;
71 | }
72 |
73 | .list-item:first-child {
74 | border-top-left-radius: $rounding;
75 | border-top-right-radius: $rounding;
76 | }
77 |
78 | .list-item:last-child {
79 | border-bottom-left-radius: $rounding;
80 | border-bottom-right-radius: $rounding;
81 | }
82 |
83 | .project-figure {
84 | width: 30%;
85 | flex-shrink: 0;
86 | margin-right: 1em;
87 | }
88 |
89 | .project-figure img {
90 | display: block;
91 | max-width: 100%;
92 | max-height: 100%;
93 | }
94 |
95 | h3 {
96 | margin-bottom: 4px;
97 | }
98 |
99 | h3, img, p {
100 | cursor: pointer;
101 | }
102 | }
103 |
104 | .list-a {
105 | top: 0;
106 |
107 | .list-item:last-child {
108 | display: none;
109 | }
110 | }
111 |
112 | .list-b {
113 | z-index: 10;
114 | font-size: 2em;
115 | box-shadow: 0 0 30px rgba( 0, 0, 0, 0.6 );
116 | border-radius: $rounding;
117 |
118 | .list {
119 | width: $rowWidth * 2;
120 | }
121 |
122 | .list-item {
123 | height: $rowHeight * 2;
124 | }
125 | }
126 |
127 | .list-c {
128 | bottom: 0;
129 |
130 | .list-item:first-child {
131 | display: none;
132 | }
133 | }
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "css",
3 | "version": "0.0.1",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "abbrev": {
8 | "version": "1.0.9",
9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
10 | "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
11 | "dev": true
12 | },
13 | "ajv": {
14 | "version": "6.10.2",
15 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
16 | "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
17 | "dev": true,
18 | "requires": {
19 | "fast-deep-equal": "^2.0.1",
20 | "fast-json-stable-stringify": "^2.0.0",
21 | "json-schema-traverse": "^0.4.1",
22 | "uri-js": "^4.2.2"
23 | }
24 | },
25 | "align-text": {
26 | "version": "0.1.4",
27 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
28 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
29 | "dev": true,
30 | "requires": {
31 | "kind-of": "^3.0.2",
32 | "longest": "^1.0.1",
33 | "repeat-string": "^1.5.2"
34 | }
35 | },
36 | "amdefine": {
37 | "version": "1.0.1",
38 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
39 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
40 | "dev": true
41 | },
42 | "ansi-regex": {
43 | "version": "2.1.1",
44 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
45 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
46 | "dev": true
47 | },
48 | "ansi-styles": {
49 | "version": "2.2.1",
50 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
51 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
52 | "dev": true
53 | },
54 | "aproba": {
55 | "version": "1.2.0",
56 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
57 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
58 | "dev": true
59 | },
60 | "are-we-there-yet": {
61 | "version": "1.1.5",
62 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
63 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
64 | "dev": true,
65 | "requires": {
66 | "delegates": "^1.0.0",
67 | "readable-stream": "^2.0.6"
68 | }
69 | },
70 | "argparse": {
71 | "version": "1.0.9",
72 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
73 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
74 | "dev": true,
75 | "requires": {
76 | "sprintf-js": "~1.0.2"
77 | }
78 | },
79 | "array-find-index": {
80 | "version": "1.0.2",
81 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
82 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
83 | "dev": true
84 | },
85 | "asn1": {
86 | "version": "0.2.4",
87 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
88 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
89 | "dev": true,
90 | "requires": {
91 | "safer-buffer": "~2.1.0"
92 | }
93 | },
94 | "assert-plus": {
95 | "version": "1.0.0",
96 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
97 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
98 | "dev": true
99 | },
100 | "async": {
101 | "version": "1.5.2",
102 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
103 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
104 | "dev": true
105 | },
106 | "async-foreach": {
107 | "version": "0.1.3",
108 | "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
109 | "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
110 | "dev": true
111 | },
112 | "asynckit": {
113 | "version": "0.4.0",
114 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
115 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
116 | "dev": true
117 | },
118 | "autoprefixer-core": {
119 | "version": "5.2.1",
120 | "resolved": "https://registry.npmjs.org/autoprefixer-core/-/autoprefixer-core-5.2.1.tgz",
121 | "integrity": "sha1-5kDEFK5Bmq4hwa1DyOoPPbgqVm0=",
122 | "dev": true,
123 | "requires": {
124 | "browserslist": "~0.4.0",
125 | "caniuse-db": "^1.0.30000214",
126 | "num2fraction": "^1.1.0",
127 | "postcss": "~4.1.12"
128 | }
129 | },
130 | "aws-sign2": {
131 | "version": "0.7.0",
132 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
133 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
134 | "dev": true
135 | },
136 | "aws4": {
137 | "version": "1.8.0",
138 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
139 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
140 | "dev": true
141 | },
142 | "balanced-match": {
143 | "version": "0.4.2",
144 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
145 | "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
146 | "dev": true
147 | },
148 | "bcrypt-pbkdf": {
149 | "version": "1.0.2",
150 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
151 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
152 | "dev": true,
153 | "requires": {
154 | "tweetnacl": "^0.14.3"
155 | }
156 | },
157 | "block-stream": {
158 | "version": "0.0.9",
159 | "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
160 | "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
161 | "dev": true,
162 | "requires": {
163 | "inherits": "~2.0.0"
164 | }
165 | },
166 | "brace-expansion": {
167 | "version": "1.1.6",
168 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz",
169 | "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=",
170 | "dev": true,
171 | "requires": {
172 | "balanced-match": "^0.4.1",
173 | "concat-map": "0.0.1"
174 | }
175 | },
176 | "browserify-zlib": {
177 | "version": "0.1.4",
178 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
179 | "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
180 | "dev": true,
181 | "requires": {
182 | "pako": "~0.2.0"
183 | }
184 | },
185 | "browserslist": {
186 | "version": "0.4.0",
187 | "resolved": "http://registry.npmjs.org/browserslist/-/browserslist-0.4.0.tgz",
188 | "integrity": "sha1-O9SrkZncG5FQ1NbbpNnTqrvIbdQ=",
189 | "dev": true,
190 | "requires": {
191 | "caniuse-db": "^1.0.30000153"
192 | }
193 | },
194 | "buffer-from": {
195 | "version": "1.1.1",
196 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
197 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
198 | "dev": true
199 | },
200 | "buffer-shims": {
201 | "version": "1.0.0",
202 | "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
203 | "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=",
204 | "dev": true
205 | },
206 | "builtin-modules": {
207 | "version": "1.1.1",
208 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
209 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
210 | "dev": true
211 | },
212 | "camelcase": {
213 | "version": "2.1.1",
214 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
215 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
216 | "dev": true
217 | },
218 | "camelcase-keys": {
219 | "version": "2.1.0",
220 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
221 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
222 | "dev": true,
223 | "requires": {
224 | "camelcase": "^2.0.0",
225 | "map-obj": "^1.0.0"
226 | }
227 | },
228 | "caniuse-db": {
229 | "version": "1.0.30000885",
230 | "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000885.tgz",
231 | "integrity": "sha512-Hy1a+UIXooG+tRlt3WnT9avMf+l999bR9J1MqlQdYKgbsYjKxV4a4rgcmiyMmdCLPBFsiRoDxdl9tnNyaq2RXw==",
232 | "dev": true
233 | },
234 | "caseless": {
235 | "version": "0.12.0",
236 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
237 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
238 | "dev": true
239 | },
240 | "center-align": {
241 | "version": "0.1.3",
242 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
243 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
244 | "dev": true,
245 | "requires": {
246 | "align-text": "^0.1.3",
247 | "lazy-cache": "^1.0.3"
248 | }
249 | },
250 | "chalk": {
251 | "version": "1.1.3",
252 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
253 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
254 | "dev": true,
255 | "requires": {
256 | "ansi-styles": "^2.2.1",
257 | "escape-string-regexp": "^1.0.2",
258 | "has-ansi": "^2.0.0",
259 | "strip-ansi": "^3.0.0",
260 | "supports-color": "^2.0.0"
261 | }
262 | },
263 | "clean-css": {
264 | "version": "3.4.28",
265 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz",
266 | "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=",
267 | "dev": true,
268 | "requires": {
269 | "commander": "2.8.x",
270 | "source-map": "0.4.x"
271 | },
272 | "dependencies": {
273 | "commander": {
274 | "version": "2.8.1",
275 | "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
276 | "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
277 | "dev": true,
278 | "requires": {
279 | "graceful-readlink": ">= 1.0.0"
280 | }
281 | }
282 | }
283 | },
284 | "cliui": {
285 | "version": "3.2.0",
286 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
287 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
288 | "dev": true,
289 | "requires": {
290 | "string-width": "^1.0.1",
291 | "strip-ansi": "^3.0.1",
292 | "wrap-ansi": "^2.0.0"
293 | }
294 | },
295 | "code-point-at": {
296 | "version": "1.1.0",
297 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
298 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
299 | "dev": true
300 | },
301 | "coffee-script": {
302 | "version": "1.10.0",
303 | "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz",
304 | "integrity": "sha1-EpOLz5vhlI+gBvkuDEyegXBRCMA=",
305 | "dev": true
306 | },
307 | "colors": {
308 | "version": "1.1.2",
309 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
310 | "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
311 | "dev": true
312 | },
313 | "combined-stream": {
314 | "version": "1.0.8",
315 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
316 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
317 | "dev": true,
318 | "requires": {
319 | "delayed-stream": "~1.0.0"
320 | }
321 | },
322 | "concat-map": {
323 | "version": "0.0.1",
324 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
325 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
326 | "dev": true
327 | },
328 | "concat-stream": {
329 | "version": "1.6.2",
330 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
331 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
332 | "dev": true,
333 | "requires": {
334 | "buffer-from": "^1.0.0",
335 | "inherits": "^2.0.3",
336 | "readable-stream": "^2.2.2",
337 | "typedarray": "^0.0.6"
338 | }
339 | },
340 | "console-browserify": {
341 | "version": "1.1.0",
342 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
343 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
344 | "dev": true,
345 | "requires": {
346 | "date-now": "^0.1.4"
347 | }
348 | },
349 | "console-control-strings": {
350 | "version": "1.1.0",
351 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
352 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
353 | "dev": true
354 | },
355 | "core-util-is": {
356 | "version": "1.0.2",
357 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
358 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
359 | "dev": true
360 | },
361 | "cross-spawn": {
362 | "version": "3.0.1",
363 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
364 | "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
365 | "dev": true,
366 | "requires": {
367 | "lru-cache": "^4.0.1",
368 | "which": "^1.2.9"
369 | }
370 | },
371 | "currently-unhandled": {
372 | "version": "0.4.1",
373 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
374 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
375 | "dev": true,
376 | "requires": {
377 | "array-find-index": "^1.0.1"
378 | }
379 | },
380 | "dashdash": {
381 | "version": "1.14.1",
382 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
383 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
384 | "dev": true,
385 | "requires": {
386 | "assert-plus": "^1.0.0"
387 | }
388 | },
389 | "date-now": {
390 | "version": "0.1.4",
391 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
392 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
393 | "dev": true
394 | },
395 | "dateformat": {
396 | "version": "1.0.12",
397 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
398 | "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
399 | "dev": true,
400 | "requires": {
401 | "get-stdin": "^4.0.1",
402 | "meow": "^3.3.0"
403 | }
404 | },
405 | "debug": {
406 | "version": "2.2.0",
407 | "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
408 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
409 | "dev": true,
410 | "requires": {
411 | "ms": "0.7.1"
412 | }
413 | },
414 | "decamelize": {
415 | "version": "1.2.0",
416 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
417 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
418 | "dev": true
419 | },
420 | "delayed-stream": {
421 | "version": "1.0.0",
422 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
423 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
424 | "dev": true
425 | },
426 | "delegates": {
427 | "version": "1.0.0",
428 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
429 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
430 | "dev": true
431 | },
432 | "ecc-jsbn": {
433 | "version": "0.1.2",
434 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
435 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
436 | "dev": true,
437 | "requires": {
438 | "jsbn": "~0.1.0",
439 | "safer-buffer": "^2.1.0"
440 | }
441 | },
442 | "entities": {
443 | "version": "1.0.0",
444 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
445 | "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=",
446 | "dev": true
447 | },
448 | "error-ex": {
449 | "version": "1.3.0",
450 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz",
451 | "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=",
452 | "dev": true,
453 | "requires": {
454 | "is-arrayish": "^0.2.1"
455 | }
456 | },
457 | "es6-promise": {
458 | "version": "2.3.0",
459 | "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz",
460 | "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=",
461 | "dev": true
462 | },
463 | "escape-string-regexp": {
464 | "version": "1.0.5",
465 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
466 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
467 | "dev": true
468 | },
469 | "esprima": {
470 | "version": "2.7.3",
471 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
472 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
473 | "dev": true
474 | },
475 | "eventemitter2": {
476 | "version": "0.4.14",
477 | "resolved": "http://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
478 | "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
479 | "dev": true
480 | },
481 | "exit": {
482 | "version": "0.1.2",
483 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
484 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
485 | "dev": true
486 | },
487 | "extend": {
488 | "version": "3.0.2",
489 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
490 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
491 | "dev": true
492 | },
493 | "extsprintf": {
494 | "version": "1.3.0",
495 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
496 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
497 | "dev": true
498 | },
499 | "fast-deep-equal": {
500 | "version": "2.0.1",
501 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
502 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
503 | "dev": true
504 | },
505 | "fast-json-stable-stringify": {
506 | "version": "2.0.0",
507 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
508 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
509 | "dev": true
510 | },
511 | "faye-websocket": {
512 | "version": "0.4.4",
513 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz",
514 | "integrity": "sha1-wUxbO/FNdBf/v9mQwKdJXNnzN7w=",
515 | "dev": true
516 | },
517 | "figures": {
518 | "version": "1.7.0",
519 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
520 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
521 | "dev": true,
522 | "requires": {
523 | "escape-string-regexp": "^1.0.5",
524 | "object-assign": "^4.1.0"
525 | }
526 | },
527 | "find-up": {
528 | "version": "1.1.2",
529 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
530 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
531 | "dev": true,
532 | "requires": {
533 | "path-exists": "^2.0.0",
534 | "pinkie-promise": "^2.0.0"
535 | }
536 | },
537 | "findup-sync": {
538 | "version": "0.3.0",
539 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
540 | "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
541 | "dev": true,
542 | "requires": {
543 | "glob": "~5.0.0"
544 | },
545 | "dependencies": {
546 | "glob": {
547 | "version": "5.0.15",
548 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
549 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
550 | "dev": true,
551 | "requires": {
552 | "inflight": "^1.0.4",
553 | "inherits": "2",
554 | "minimatch": "2 || 3",
555 | "once": "^1.3.0",
556 | "path-is-absolute": "^1.0.0"
557 | }
558 | }
559 | }
560 | },
561 | "forever-agent": {
562 | "version": "0.6.1",
563 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
564 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
565 | "dev": true
566 | },
567 | "form-data": {
568 | "version": "2.3.3",
569 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
570 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
571 | "dev": true,
572 | "requires": {
573 | "asynckit": "^0.4.0",
574 | "combined-stream": "^1.0.6",
575 | "mime-types": "^2.1.12"
576 | }
577 | },
578 | "fs.realpath": {
579 | "version": "1.0.0",
580 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
581 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
582 | "dev": true
583 | },
584 | "fstream": {
585 | "version": "1.0.12",
586 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
587 | "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
588 | "dev": true,
589 | "requires": {
590 | "graceful-fs": "^4.1.2",
591 | "inherits": "~2.0.0",
592 | "mkdirp": ">=0.5 0",
593 | "rimraf": "2"
594 | }
595 | },
596 | "gauge": {
597 | "version": "2.7.4",
598 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
599 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
600 | "dev": true,
601 | "requires": {
602 | "aproba": "^1.0.3",
603 | "console-control-strings": "^1.0.0",
604 | "has-unicode": "^2.0.0",
605 | "object-assign": "^4.1.0",
606 | "signal-exit": "^3.0.0",
607 | "string-width": "^1.0.1",
608 | "strip-ansi": "^3.0.1",
609 | "wide-align": "^1.1.0"
610 | }
611 | },
612 | "gaze": {
613 | "version": "1.1.3",
614 | "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
615 | "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
616 | "dev": true,
617 | "requires": {
618 | "globule": "^1.0.0"
619 | }
620 | },
621 | "get-caller-file": {
622 | "version": "1.0.3",
623 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
624 | "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
625 | "dev": true
626 | },
627 | "get-stdin": {
628 | "version": "4.0.1",
629 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
630 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
631 | "dev": true
632 | },
633 | "getobject": {
634 | "version": "0.1.0",
635 | "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz",
636 | "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=",
637 | "dev": true
638 | },
639 | "getpass": {
640 | "version": "0.1.7",
641 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
642 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
643 | "dev": true,
644 | "requires": {
645 | "assert-plus": "^1.0.0"
646 | }
647 | },
648 | "glob": {
649 | "version": "7.0.6",
650 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
651 | "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
652 | "dev": true,
653 | "requires": {
654 | "fs.realpath": "^1.0.0",
655 | "inflight": "^1.0.4",
656 | "inherits": "2",
657 | "minimatch": "^3.0.2",
658 | "once": "^1.3.0",
659 | "path-is-absolute": "^1.0.0"
660 | }
661 | },
662 | "globule": {
663 | "version": "1.2.1",
664 | "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
665 | "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
666 | "dev": true,
667 | "requires": {
668 | "glob": "~7.1.1",
669 | "lodash": "~4.17.10",
670 | "minimatch": "~3.0.2"
671 | },
672 | "dependencies": {
673 | "balanced-match": {
674 | "version": "1.0.0",
675 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
676 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
677 | "dev": true
678 | },
679 | "brace-expansion": {
680 | "version": "1.1.11",
681 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
682 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
683 | "dev": true,
684 | "requires": {
685 | "balanced-match": "^1.0.0",
686 | "concat-map": "0.0.1"
687 | }
688 | },
689 | "glob": {
690 | "version": "7.1.4",
691 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
692 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
693 | "dev": true,
694 | "requires": {
695 | "fs.realpath": "^1.0.0",
696 | "inflight": "^1.0.4",
697 | "inherits": "2",
698 | "minimatch": "^3.0.4",
699 | "once": "^1.3.0",
700 | "path-is-absolute": "^1.0.0"
701 | },
702 | "dependencies": {
703 | "minimatch": {
704 | "version": "3.0.4",
705 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
706 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
707 | "dev": true,
708 | "requires": {
709 | "brace-expansion": "^1.1.7"
710 | }
711 | }
712 | }
713 | },
714 | "lodash": {
715 | "version": "4.17.15",
716 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
717 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
718 | "dev": true
719 | }
720 | }
721 | },
722 | "graceful-fs": {
723 | "version": "4.1.11",
724 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
725 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
726 | "dev": true
727 | },
728 | "graceful-readlink": {
729 | "version": "1.0.1",
730 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
731 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
732 | "dev": true
733 | },
734 | "grunt": {
735 | "version": "1.0.1",
736 | "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.1.tgz",
737 | "integrity": "sha1-6HeHZOlEsY8yuw8QuQeEdcnftWs=",
738 | "dev": true,
739 | "requires": {
740 | "coffee-script": "~1.10.0",
741 | "dateformat": "~1.0.12",
742 | "eventemitter2": "~0.4.13",
743 | "exit": "~0.1.1",
744 | "findup-sync": "~0.3.0",
745 | "glob": "~7.0.0",
746 | "grunt-cli": "~1.2.0",
747 | "grunt-known-options": "~1.1.0",
748 | "grunt-legacy-log": "~1.0.0",
749 | "grunt-legacy-util": "~1.0.0",
750 | "iconv-lite": "~0.4.13",
751 | "js-yaml": "~3.5.2",
752 | "minimatch": "~3.0.0",
753 | "nopt": "~3.0.6",
754 | "path-is-absolute": "~1.0.0",
755 | "rimraf": "~2.2.8"
756 | },
757 | "dependencies": {
758 | "grunt-cli": {
759 | "version": "1.2.0",
760 | "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
761 | "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=",
762 | "dev": true,
763 | "requires": {
764 | "findup-sync": "~0.3.0",
765 | "grunt-known-options": "~1.1.0",
766 | "nopt": "~3.0.6",
767 | "resolve": "~1.1.0"
768 | }
769 | }
770 | }
771 | },
772 | "grunt-autoprefixer": {
773 | "version": "3.0.3",
774 | "resolved": "https://registry.npmjs.org/grunt-autoprefixer/-/grunt-autoprefixer-3.0.3.tgz",
775 | "integrity": "sha1-p11Ta2dgTbYukAr+lerhStDxHxo=",
776 | "dev": true,
777 | "requires": {
778 | "autoprefixer-core": "^5.1.7",
779 | "chalk": "~1.0.0",
780 | "diff": "~1.3.0",
781 | "postcss": "^4.1.11"
782 | },
783 | "dependencies": {
784 | "ansi-regex": {
785 | "version": "1.1.1",
786 | "resolved": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz",
787 | "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=",
788 | "dev": true
789 | },
790 | "chalk": {
791 | "version": "1.0.0",
792 | "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.0.0.tgz",
793 | "integrity": "sha1-s89O0P9Tl8mcdbj2edsvUoMfltw=",
794 | "dev": true,
795 | "requires": {
796 | "ansi-styles": "^2.0.1",
797 | "escape-string-regexp": "^1.0.2",
798 | "has-ansi": "^1.0.3",
799 | "strip-ansi": "^2.0.1",
800 | "supports-color": "^1.3.0"
801 | }
802 | },
803 | "diff": {
804 | "version": "1.3.2",
805 | "resolved": "https://registry.npmjs.org/diff/-/diff-1.3.2.tgz",
806 | "integrity": "sha1-/Qeh8fiRUZ2ZBaTJqJ3PWnC2YDc=",
807 | "dev": true
808 | },
809 | "has-ansi": {
810 | "version": "1.0.3",
811 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-1.0.3.tgz",
812 | "integrity": "sha1-wLWxYV2eOCsP9nFp2We0JeSMpTg=",
813 | "dev": true,
814 | "requires": {
815 | "ansi-regex": "^1.1.0",
816 | "get-stdin": "^4.0.1"
817 | }
818 | },
819 | "strip-ansi": {
820 | "version": "2.0.1",
821 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz",
822 | "integrity": "sha1-32LBqpTtLxFOHQ8h/R1QSCt5pg4=",
823 | "dev": true,
824 | "requires": {
825 | "ansi-regex": "^1.0.0"
826 | }
827 | },
828 | "supports-color": {
829 | "version": "1.3.1",
830 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.3.1.tgz",
831 | "integrity": "sha1-FXWN8J2P87SswwdTn6vicJXhBC0=",
832 | "dev": true
833 | }
834 | }
835 | },
836 | "grunt-contrib-connect": {
837 | "version": "0.11.2",
838 | "resolved": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-0.11.2.tgz",
839 | "integrity": "sha1-HAoHB9OzKNnPO0tJDrhMSV2Tau0=",
840 | "dev": true,
841 | "requires": {
842 | "async": "^0.9.0",
843 | "connect": "^3.4.0",
844 | "connect-livereload": "^0.5.0",
845 | "morgan": "^1.6.1",
846 | "opn": "^1.0.0",
847 | "portscanner": "^1.0.0",
848 | "serve-index": "^1.7.1",
849 | "serve-static": "^1.10.0"
850 | },
851 | "dependencies": {
852 | "async": {
853 | "version": "0.9.2",
854 | "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
855 | "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=",
856 | "dev": true
857 | },
858 | "connect": {
859 | "version": "3.4.0",
860 | "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.0.tgz",
861 | "integrity": "sha1-7oeJo71GBL/aOdvPHTu0gt/mzyQ=",
862 | "dev": true,
863 | "requires": {
864 | "debug": "~2.2.0",
865 | "finalhandler": "0.4.0",
866 | "parseurl": "~1.3.0",
867 | "utils-merge": "1.0.0"
868 | },
869 | "dependencies": {
870 | "finalhandler": {
871 | "version": "0.4.0",
872 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz",
873 | "integrity": "sha1-llpS2ejQXSuFdUhUH7ibU6JJfZs=",
874 | "dev": true,
875 | "requires": {
876 | "debug": "~2.2.0",
877 | "escape-html": "1.0.2",
878 | "on-finished": "~2.3.0",
879 | "unpipe": "~1.0.0"
880 | },
881 | "dependencies": {
882 | "escape-html": {
883 | "version": "1.0.2",
884 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz",
885 | "integrity": "sha1-130y+pjjjC9BroXpJ44ODmuhAiw=",
886 | "dev": true
887 | },
888 | "on-finished": {
889 | "version": "2.3.0",
890 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
891 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
892 | "dev": true,
893 | "requires": {
894 | "ee-first": "1.1.1"
895 | },
896 | "dependencies": {
897 | "ee-first": {
898 | "version": "1.1.1",
899 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
900 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
901 | "dev": true
902 | }
903 | }
904 | },
905 | "unpipe": {
906 | "version": "1.0.0",
907 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
908 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
909 | "dev": true
910 | }
911 | }
912 | },
913 | "parseurl": {
914 | "version": "1.3.0",
915 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.0.tgz",
916 | "integrity": "sha1-tYBG20Ij4UWvp2AJ5hush8wigbM=",
917 | "dev": true
918 | },
919 | "utils-merge": {
920 | "version": "1.0.0",
921 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz",
922 | "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=",
923 | "dev": true
924 | }
925 | }
926 | },
927 | "connect-livereload": {
928 | "version": "0.5.3",
929 | "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.3.tgz",
930 | "integrity": "sha1-zSBAqVmx2cr5T+xsBad1uBO0P24=",
931 | "dev": true
932 | },
933 | "morgan": {
934 | "version": "1.6.1",
935 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.6.1.tgz",
936 | "integrity": "sha1-X9gYOYxoGcuiinzWZk8pL+HAu/I=",
937 | "dev": true,
938 | "requires": {
939 | "basic-auth": "~1.0.3",
940 | "debug": "~2.2.0",
941 | "depd": "~1.0.1",
942 | "on-finished": "~2.3.0",
943 | "on-headers": "~1.0.0"
944 | },
945 | "dependencies": {
946 | "basic-auth": {
947 | "version": "1.0.3",
948 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.3.tgz",
949 | "integrity": "sha1-QfVVI+WJQFA47jVnlYxipe1wVRo=",
950 | "dev": true
951 | },
952 | "depd": {
953 | "version": "1.0.1",
954 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz",
955 | "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=",
956 | "dev": true
957 | },
958 | "on-finished": {
959 | "version": "2.3.0",
960 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
961 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
962 | "dev": true,
963 | "requires": {
964 | "ee-first": "1.1.1"
965 | },
966 | "dependencies": {
967 | "ee-first": {
968 | "version": "1.1.1",
969 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
970 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
971 | "dev": true
972 | }
973 | }
974 | },
975 | "on-headers": {
976 | "version": "1.0.1",
977 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
978 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
979 | "dev": true
980 | }
981 | }
982 | },
983 | "portscanner": {
984 | "version": "1.0.0",
985 | "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-1.0.0.tgz",
986 | "integrity": "sha1-O1z+OTgotRYKvGAOYnDrwvFZBVg=",
987 | "dev": true,
988 | "requires": {
989 | "async": "0.1.15"
990 | },
991 | "dependencies": {
992 | "async": {
993 | "version": "0.1.15",
994 | "resolved": "https://registry.npmjs.org/async/-/async-0.1.15.tgz",
995 | "integrity": "sha1-IYDqyizypspSgNQcBYW+ybPkm9M=",
996 | "dev": true
997 | }
998 | }
999 | },
1000 | "serve-index": {
1001 | "version": "1.7.2",
1002 | "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.7.2.tgz",
1003 | "integrity": "sha1-mhVdnE+dOR5GOXDntOsWx2chQcA=",
1004 | "dev": true,
1005 | "requires": {
1006 | "accepts": "~1.2.12",
1007 | "batch": "0.5.2",
1008 | "debug": "~2.2.0",
1009 | "escape-html": "1.0.2",
1010 | "http-errors": "~1.3.1",
1011 | "mime-types": "~2.1.4",
1012 | "parseurl": "~1.3.0"
1013 | },
1014 | "dependencies": {
1015 | "accepts": {
1016 | "version": "1.2.13",
1017 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz",
1018 | "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=",
1019 | "dev": true,
1020 | "requires": {
1021 | "mime-types": "~2.1.6",
1022 | "negotiator": "0.5.3"
1023 | },
1024 | "dependencies": {
1025 | "negotiator": {
1026 | "version": "0.5.3",
1027 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz",
1028 | "integrity": "sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g=",
1029 | "dev": true
1030 | }
1031 | }
1032 | },
1033 | "batch": {
1034 | "version": "0.5.2",
1035 | "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.2.tgz",
1036 | "integrity": "sha1-VGVD2+MhGMg8fHyjOh9cXV6pY+k=",
1037 | "dev": true
1038 | },
1039 | "escape-html": {
1040 | "version": "1.0.2",
1041 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz",
1042 | "integrity": "sha1-130y+pjjjC9BroXpJ44ODmuhAiw=",
1043 | "dev": true
1044 | },
1045 | "http-errors": {
1046 | "version": "1.3.1",
1047 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz",
1048 | "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=",
1049 | "dev": true,
1050 | "requires": {
1051 | "inherits": "~2.0.1",
1052 | "statuses": "1"
1053 | }
1054 | },
1055 | "mime-types": {
1056 | "version": "2.1.7",
1057 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz",
1058 | "integrity": "sha1-/2A5cOPHMe9vf03zyaD0Y6E8J1U=",
1059 | "dev": true,
1060 | "requires": {
1061 | "mime-db": "~1.19.0"
1062 | },
1063 | "dependencies": {
1064 | "mime-db": {
1065 | "version": "1.19.0",
1066 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.19.0.tgz",
1067 | "integrity": "sha1-SWoYGYp86CRFNOJbsQK3T7Qg/VY=",
1068 | "dev": true
1069 | }
1070 | }
1071 | },
1072 | "parseurl": {
1073 | "version": "1.3.0",
1074 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.0.tgz",
1075 | "integrity": "sha1-tYBG20Ij4UWvp2AJ5hush8wigbM=",
1076 | "dev": true
1077 | }
1078 | }
1079 | },
1080 | "serve-static": {
1081 | "version": "1.10.0",
1082 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.0.tgz",
1083 | "integrity": "sha1-vmMvqmhYIOSkPtPfE3kTXMTzcNc=",
1084 | "dev": true,
1085 | "requires": {
1086 | "escape-html": "1.0.2",
1087 | "parseurl": "~1.3.0",
1088 | "send": "0.13.0"
1089 | },
1090 | "dependencies": {
1091 | "escape-html": {
1092 | "version": "1.0.2",
1093 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz",
1094 | "integrity": "sha1-130y+pjjjC9BroXpJ44ODmuhAiw=",
1095 | "dev": true
1096 | },
1097 | "parseurl": {
1098 | "version": "1.3.0",
1099 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.0.tgz",
1100 | "integrity": "sha1-tYBG20Ij4UWvp2AJ5hush8wigbM=",
1101 | "dev": true
1102 | },
1103 | "send": {
1104 | "version": "0.13.0",
1105 | "resolved": "https://registry.npmjs.org/send/-/send-0.13.0.tgz",
1106 | "integrity": "sha1-UY+SGusFYK7H3KspkLFM9vPM5d4=",
1107 | "dev": true,
1108 | "requires": {
1109 | "debug": "~2.2.0",
1110 | "depd": "~1.0.1",
1111 | "destroy": "1.0.3",
1112 | "escape-html": "1.0.2",
1113 | "etag": "~1.7.0",
1114 | "fresh": "0.3.0",
1115 | "http-errors": "~1.3.1",
1116 | "mime": "1.3.4",
1117 | "ms": "0.7.1",
1118 | "on-finished": "~2.3.0",
1119 | "range-parser": "~1.0.2",
1120 | "statuses": "~1.2.1"
1121 | },
1122 | "dependencies": {
1123 | "depd": {
1124 | "version": "1.0.1",
1125 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz",
1126 | "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=",
1127 | "dev": true
1128 | },
1129 | "destroy": {
1130 | "version": "1.0.3",
1131 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz",
1132 | "integrity": "sha1-tDO0ck5x/YVR2YhRdIUcX8N34sk=",
1133 | "dev": true
1134 | },
1135 | "etag": {
1136 | "version": "1.7.0",
1137 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz",
1138 | "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=",
1139 | "dev": true
1140 | },
1141 | "fresh": {
1142 | "version": "0.3.0",
1143 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz",
1144 | "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=",
1145 | "dev": true
1146 | },
1147 | "http-errors": {
1148 | "version": "1.3.1",
1149 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz",
1150 | "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=",
1151 | "dev": true,
1152 | "requires": {
1153 | "inherits": "~2.0.1",
1154 | "statuses": "1"
1155 | }
1156 | },
1157 | "ms": {
1158 | "version": "0.7.1",
1159 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
1160 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
1161 | "dev": true
1162 | },
1163 | "on-finished": {
1164 | "version": "2.3.0",
1165 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1166 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
1167 | "dev": true,
1168 | "requires": {
1169 | "ee-first": "1.1.1"
1170 | },
1171 | "dependencies": {
1172 | "ee-first": {
1173 | "version": "1.1.1",
1174 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
1175 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
1176 | "dev": true
1177 | }
1178 | }
1179 | }
1180 | }
1181 | },
1182 | "statuses": {
1183 | "version": "1.2.1",
1184 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz",
1185 | "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=",
1186 | "dev": true
1187 | }
1188 | }
1189 | }
1190 | }
1191 | },
1192 | "grunt-contrib-cssmin": {
1193 | "version": "0.14.0",
1194 | "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-0.14.0.tgz",
1195 | "integrity": "sha1-iLCpJTaWm7VmKBxcYexQYtgz87c=",
1196 | "dev": true,
1197 | "requires": {
1198 | "chalk": "^1.0.0",
1199 | "clean-css": "~3.4.2",
1200 | "maxmin": "^1.1.0"
1201 | }
1202 | },
1203 | "grunt-contrib-jshint": {
1204 | "version": "0.11.3",
1205 | "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-0.11.3.tgz",
1206 | "integrity": "sha1-gDaBgdzNVRGG5bg4XAEc7iTWQKA=",
1207 | "dev": true,
1208 | "requires": {
1209 | "hooker": "^0.2.3",
1210 | "jshint": "~2.8.0"
1211 | },
1212 | "dependencies": {
1213 | "glob": {
1214 | "version": "3.2.11",
1215 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz",
1216 | "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=",
1217 | "dev": true,
1218 | "requires": {
1219 | "inherits": "2",
1220 | "minimatch": "0.3"
1221 | }
1222 | },
1223 | "isarray": {
1224 | "version": "0.0.1",
1225 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
1226 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
1227 | "dev": true
1228 | },
1229 | "jshint": {
1230 | "version": "2.8.0",
1231 | "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.8.0.tgz",
1232 | "integrity": "sha1-HQmjvZE8TK36gb8Y1YK9hb/+DUQ=",
1233 | "dev": true,
1234 | "requires": {
1235 | "cli": "0.6.x",
1236 | "console-browserify": "1.1.x",
1237 | "exit": "0.1.x",
1238 | "htmlparser2": "3.8.x",
1239 | "lodash": "3.7.x",
1240 | "minimatch": "2.0.x",
1241 | "shelljs": "0.3.x",
1242 | "strip-json-comments": "1.0.x"
1243 | },
1244 | "dependencies": {
1245 | "cli": {
1246 | "version": "0.6.6",
1247 | "resolved": "https://registry.npmjs.org/cli/-/cli-0.6.6.tgz",
1248 | "integrity": "sha1-Aq1Eo4Cr8nraxebwzdewQ9dMU+M=",
1249 | "dev": true,
1250 | "requires": {
1251 | "exit": "0.1.2",
1252 | "glob": "~ 3.2.1"
1253 | }
1254 | },
1255 | "htmlparser2": {
1256 | "version": "3.8.3",
1257 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
1258 | "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
1259 | "dev": true,
1260 | "requires": {
1261 | "domelementtype": "1",
1262 | "domhandler": "2.3",
1263 | "domutils": "1.5",
1264 | "entities": "1.0",
1265 | "readable-stream": "1.1"
1266 | },
1267 | "dependencies": {
1268 | "domelementtype": {
1269 | "version": "1.3.0",
1270 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
1271 | "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
1272 | "dev": true
1273 | },
1274 | "domhandler": {
1275 | "version": "2.3.0",
1276 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
1277 | "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
1278 | "dev": true,
1279 | "requires": {
1280 | "domelementtype": "1"
1281 | }
1282 | },
1283 | "domutils": {
1284 | "version": "1.5.1",
1285 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
1286 | "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
1287 | "dev": true,
1288 | "requires": {
1289 | "dom-serializer": "0",
1290 | "domelementtype": "1"
1291 | },
1292 | "dependencies": {
1293 | "dom-serializer": {
1294 | "version": "0.1.0",
1295 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
1296 | "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
1297 | "dev": true,
1298 | "requires": {
1299 | "domelementtype": "~1.1.1",
1300 | "entities": "~1.1.1"
1301 | },
1302 | "dependencies": {
1303 | "domelementtype": {
1304 | "version": "1.1.3",
1305 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
1306 | "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
1307 | "dev": true
1308 | },
1309 | "entities": {
1310 | "version": "1.1.1",
1311 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
1312 | "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
1313 | "dev": true
1314 | }
1315 | }
1316 | }
1317 | }
1318 | }
1319 | }
1320 | },
1321 | "lodash": {
1322 | "version": "3.7.0",
1323 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz",
1324 | "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=",
1325 | "dev": true
1326 | },
1327 | "minimatch": {
1328 | "version": "2.0.10",
1329 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
1330 | "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
1331 | "dev": true,
1332 | "requires": {
1333 | "brace-expansion": "^1.0.0"
1334 | }
1335 | },
1336 | "strip-json-comments": {
1337 | "version": "1.0.4",
1338 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
1339 | "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=",
1340 | "dev": true
1341 | }
1342 | }
1343 | },
1344 | "lru-cache": {
1345 | "version": "2.7.3",
1346 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
1347 | "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
1348 | "dev": true
1349 | },
1350 | "minimatch": {
1351 | "version": "0.3.0",
1352 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz",
1353 | "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=",
1354 | "dev": true,
1355 | "requires": {
1356 | "lru-cache": "2",
1357 | "sigmund": "~1.0.0"
1358 | }
1359 | },
1360 | "readable-stream": {
1361 | "version": "1.1.14",
1362 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
1363 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
1364 | "dev": true,
1365 | "requires": {
1366 | "core-util-is": "~1.0.0",
1367 | "inherits": "~2.0.1",
1368 | "isarray": "0.0.1",
1369 | "string_decoder": "~0.10.x"
1370 | }
1371 | }
1372 | }
1373 | },
1374 | "grunt-contrib-uglify": {
1375 | "version": "0.9.2",
1376 | "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.9.2.tgz",
1377 | "integrity": "sha1-GmHG8hJBDkq7T3yJFTcXsQFWAmA=",
1378 | "dev": true,
1379 | "requires": {
1380 | "chalk": "^1.0.0",
1381 | "lodash": "^3.2.0",
1382 | "maxmin": "^1.0.0",
1383 | "uglify-js": "^2.4.24",
1384 | "uri-path": "0.0.2"
1385 | },
1386 | "dependencies": {
1387 | "lodash": {
1388 | "version": "3.10.1",
1389 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
1390 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
1391 | "dev": true
1392 | },
1393 | "uri-path": {
1394 | "version": "0.0.2",
1395 | "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-0.0.2.tgz",
1396 | "integrity": "sha1-gD6wHy/rF5J9zOD2GH5yt19T9VQ=",
1397 | "dev": true
1398 | }
1399 | }
1400 | },
1401 | "grunt-contrib-watch": {
1402 | "version": "0.6.1",
1403 | "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-0.6.1.tgz",
1404 | "integrity": "sha1-ZP3LolpjX1tNobbOb5DaCutuPxU=",
1405 | "dev": true,
1406 | "requires": {
1407 | "async": "~0.2.9",
1408 | "gaze": "~0.5.1",
1409 | "lodash": "~2.4.1",
1410 | "tiny-lr-fork": "0.0.5"
1411 | },
1412 | "dependencies": {
1413 | "async": {
1414 | "version": "0.2.10",
1415 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
1416 | "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
1417 | "dev": true
1418 | },
1419 | "debug": {
1420 | "version": "0.7.4",
1421 | "resolved": "http://registry.npmjs.org/debug/-/debug-0.7.4.tgz",
1422 | "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=",
1423 | "dev": true
1424 | },
1425 | "gaze": {
1426 | "version": "0.5.2",
1427 | "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz",
1428 | "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=",
1429 | "dev": true,
1430 | "requires": {
1431 | "globule": "~0.1.0"
1432 | }
1433 | },
1434 | "glob": {
1435 | "version": "3.1.21",
1436 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz",
1437 | "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
1438 | "dev": true,
1439 | "requires": {
1440 | "graceful-fs": "~1.2.0",
1441 | "inherits": "1",
1442 | "minimatch": "~0.2.11"
1443 | }
1444 | },
1445 | "globule": {
1446 | "version": "0.1.0",
1447 | "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz",
1448 | "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=",
1449 | "dev": true,
1450 | "requires": {
1451 | "glob": "~3.1.21",
1452 | "lodash": "~1.0.1",
1453 | "minimatch": "~0.2.11"
1454 | },
1455 | "dependencies": {
1456 | "lodash": {
1457 | "version": "1.0.2",
1458 | "resolved": "http://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz",
1459 | "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=",
1460 | "dev": true
1461 | }
1462 | }
1463 | },
1464 | "graceful-fs": {
1465 | "version": "1.2.3",
1466 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
1467 | "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
1468 | "dev": true
1469 | },
1470 | "inherits": {
1471 | "version": "1.0.2",
1472 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz",
1473 | "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=",
1474 | "dev": true
1475 | },
1476 | "lodash": {
1477 | "version": "2.4.2",
1478 | "resolved": "http://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
1479 | "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
1480 | "dev": true
1481 | },
1482 | "lru-cache": {
1483 | "version": "2.7.3",
1484 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
1485 | "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
1486 | "dev": true
1487 | },
1488 | "minimatch": {
1489 | "version": "0.2.14",
1490 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
1491 | "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
1492 | "dev": true,
1493 | "requires": {
1494 | "lru-cache": "2",
1495 | "sigmund": "~1.0.0"
1496 | }
1497 | },
1498 | "qs": {
1499 | "version": "0.5.6",
1500 | "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz",
1501 | "integrity": "sha1-MbGtBYVnZRxSaSFQa5qHk5EaA4Q=",
1502 | "dev": true
1503 | },
1504 | "tiny-lr-fork": {
1505 | "version": "0.0.5",
1506 | "resolved": "https://registry.npmjs.org/tiny-lr-fork/-/tiny-lr-fork-0.0.5.tgz",
1507 | "integrity": "sha1-Hpnh4qhGm3NquX2X7vqYxx927Qo=",
1508 | "dev": true,
1509 | "requires": {
1510 | "debug": "~0.7.0",
1511 | "faye-websocket": "~0.4.3",
1512 | "noptify": "~0.0.3",
1513 | "qs": "~0.5.2"
1514 | }
1515 | }
1516 | }
1517 | },
1518 | "grunt-known-options": {
1519 | "version": "1.1.0",
1520 | "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz",
1521 | "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=",
1522 | "dev": true
1523 | },
1524 | "grunt-legacy-log": {
1525 | "version": "1.0.0",
1526 | "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.0.tgz",
1527 | "integrity": "sha1-+4bxgJhHvAfcR4Q/ns1srLYt8tU=",
1528 | "dev": true,
1529 | "requires": {
1530 | "colors": "~1.1.2",
1531 | "grunt-legacy-log-utils": "~1.0.0",
1532 | "hooker": "~0.2.3",
1533 | "lodash": "~3.10.1",
1534 | "underscore.string": "~3.2.3"
1535 | }
1536 | },
1537 | "grunt-legacy-log-utils": {
1538 | "version": "1.0.0",
1539 | "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz",
1540 | "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=",
1541 | "dev": true,
1542 | "requires": {
1543 | "chalk": "~1.1.1",
1544 | "lodash": "~4.3.0"
1545 | },
1546 | "dependencies": {
1547 | "lodash": {
1548 | "version": "4.3.0",
1549 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz",
1550 | "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=",
1551 | "dev": true
1552 | }
1553 | }
1554 | },
1555 | "grunt-legacy-util": {
1556 | "version": "1.0.0",
1557 | "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz",
1558 | "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=",
1559 | "dev": true,
1560 | "requires": {
1561 | "async": "~1.5.2",
1562 | "exit": "~0.1.1",
1563 | "getobject": "~0.1.0",
1564 | "hooker": "~0.2.3",
1565 | "lodash": "~4.3.0",
1566 | "underscore.string": "~3.2.3",
1567 | "which": "~1.2.1"
1568 | },
1569 | "dependencies": {
1570 | "lodash": {
1571 | "version": "4.3.0",
1572 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz",
1573 | "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=",
1574 | "dev": true
1575 | }
1576 | }
1577 | },
1578 | "grunt-sass": {
1579 | "version": "3.1.0",
1580 | "resolved": "https://registry.npmjs.org/grunt-sass/-/grunt-sass-3.1.0.tgz",
1581 | "integrity": "sha512-90s27H7FoCDcA8C8+R0GwC+ntYD3lG6S/jqcavWm3bn9RiJTmSfOvfbFa1PXx4NbBWuiGQMLfQTj/JvvqT5w6A==",
1582 | "dev": true
1583 | },
1584 | "gzip-size": {
1585 | "version": "1.0.0",
1586 | "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz",
1587 | "integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=",
1588 | "dev": true,
1589 | "requires": {
1590 | "browserify-zlib": "^0.1.4",
1591 | "concat-stream": "^1.4.1"
1592 | }
1593 | },
1594 | "har-schema": {
1595 | "version": "2.0.0",
1596 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
1597 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
1598 | "dev": true
1599 | },
1600 | "har-validator": {
1601 | "version": "5.1.3",
1602 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
1603 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
1604 | "dev": true,
1605 | "requires": {
1606 | "ajv": "^6.5.5",
1607 | "har-schema": "^2.0.0"
1608 | }
1609 | },
1610 | "has-ansi": {
1611 | "version": "2.0.0",
1612 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
1613 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
1614 | "dev": true,
1615 | "requires": {
1616 | "ansi-regex": "^2.0.0"
1617 | }
1618 | },
1619 | "has-unicode": {
1620 | "version": "2.0.1",
1621 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
1622 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
1623 | "dev": true
1624 | },
1625 | "hooker": {
1626 | "version": "0.2.3",
1627 | "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
1628 | "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
1629 | "dev": true
1630 | },
1631 | "hosted-git-info": {
1632 | "version": "2.1.5",
1633 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz",
1634 | "integrity": "sha1-C6gdkNouJas0ozLm7HeTbhWYEYs=",
1635 | "dev": true
1636 | },
1637 | "http-signature": {
1638 | "version": "1.2.0",
1639 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
1640 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
1641 | "dev": true,
1642 | "requires": {
1643 | "assert-plus": "^1.0.0",
1644 | "jsprim": "^1.2.2",
1645 | "sshpk": "^1.7.0"
1646 | }
1647 | },
1648 | "iconv-lite": {
1649 | "version": "0.4.15",
1650 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
1651 | "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=",
1652 | "dev": true
1653 | },
1654 | "in-publish": {
1655 | "version": "2.0.0",
1656 | "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
1657 | "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
1658 | "dev": true
1659 | },
1660 | "indent-string": {
1661 | "version": "2.1.0",
1662 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
1663 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
1664 | "dev": true,
1665 | "requires": {
1666 | "repeating": "^2.0.0"
1667 | }
1668 | },
1669 | "inflight": {
1670 | "version": "1.0.6",
1671 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1672 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1673 | "dev": true,
1674 | "requires": {
1675 | "once": "^1.3.0",
1676 | "wrappy": "1"
1677 | }
1678 | },
1679 | "inherits": {
1680 | "version": "2.0.3",
1681 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1682 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
1683 | "dev": true
1684 | },
1685 | "invert-kv": {
1686 | "version": "1.0.0",
1687 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
1688 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
1689 | "dev": true
1690 | },
1691 | "is-arrayish": {
1692 | "version": "0.2.1",
1693 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
1694 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
1695 | "dev": true
1696 | },
1697 | "is-buffer": {
1698 | "version": "1.1.6",
1699 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
1700 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
1701 | "dev": true
1702 | },
1703 | "is-builtin-module": {
1704 | "version": "1.0.0",
1705 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
1706 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
1707 | "dev": true,
1708 | "requires": {
1709 | "builtin-modules": "^1.0.0"
1710 | }
1711 | },
1712 | "is-finite": {
1713 | "version": "1.0.2",
1714 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
1715 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
1716 | "dev": true,
1717 | "requires": {
1718 | "number-is-nan": "^1.0.0"
1719 | }
1720 | },
1721 | "is-fullwidth-code-point": {
1722 | "version": "1.0.0",
1723 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
1724 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
1725 | "dev": true,
1726 | "requires": {
1727 | "number-is-nan": "^1.0.0"
1728 | }
1729 | },
1730 | "is-typedarray": {
1731 | "version": "1.0.0",
1732 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
1733 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
1734 | "dev": true
1735 | },
1736 | "is-utf8": {
1737 | "version": "0.2.1",
1738 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
1739 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
1740 | "dev": true
1741 | },
1742 | "isarray": {
1743 | "version": "1.0.0",
1744 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1745 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
1746 | "dev": true
1747 | },
1748 | "isexe": {
1749 | "version": "1.1.2",
1750 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz",
1751 | "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=",
1752 | "dev": true
1753 | },
1754 | "isstream": {
1755 | "version": "0.1.2",
1756 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
1757 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
1758 | "dev": true
1759 | },
1760 | "js-base64": {
1761 | "version": "2.1.9",
1762 | "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz",
1763 | "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=",
1764 | "dev": true
1765 | },
1766 | "js-yaml": {
1767 | "version": "3.5.5",
1768 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz",
1769 | "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=",
1770 | "dev": true,
1771 | "requires": {
1772 | "argparse": "^1.0.2",
1773 | "esprima": "^2.6.0"
1774 | }
1775 | },
1776 | "jsbn": {
1777 | "version": "0.1.1",
1778 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
1779 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
1780 | "dev": true
1781 | },
1782 | "json-schema": {
1783 | "version": "0.2.3",
1784 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
1785 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
1786 | "dev": true
1787 | },
1788 | "json-schema-traverse": {
1789 | "version": "0.4.1",
1790 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1791 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1792 | "dev": true
1793 | },
1794 | "json-stringify-safe": {
1795 | "version": "5.0.1",
1796 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
1797 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
1798 | "dev": true
1799 | },
1800 | "jsprim": {
1801 | "version": "1.4.1",
1802 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
1803 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
1804 | "dev": true,
1805 | "requires": {
1806 | "assert-plus": "1.0.0",
1807 | "extsprintf": "1.3.0",
1808 | "json-schema": "0.2.3",
1809 | "verror": "1.10.0"
1810 | }
1811 | },
1812 | "kind-of": {
1813 | "version": "3.2.2",
1814 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1815 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1816 | "dev": true,
1817 | "requires": {
1818 | "is-buffer": "^1.1.5"
1819 | }
1820 | },
1821 | "lazy-cache": {
1822 | "version": "1.0.4",
1823 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
1824 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
1825 | "dev": true
1826 | },
1827 | "lcid": {
1828 | "version": "1.0.0",
1829 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
1830 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
1831 | "dev": true,
1832 | "requires": {
1833 | "invert-kv": "^1.0.0"
1834 | }
1835 | },
1836 | "load-json-file": {
1837 | "version": "1.1.0",
1838 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
1839 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
1840 | "dev": true,
1841 | "requires": {
1842 | "graceful-fs": "^4.1.2",
1843 | "parse-json": "^2.2.0",
1844 | "pify": "^2.0.0",
1845 | "pinkie-promise": "^2.0.0",
1846 | "strip-bom": "^2.0.0"
1847 | }
1848 | },
1849 | "lodash": {
1850 | "version": "3.10.1",
1851 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
1852 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
1853 | "dev": true
1854 | },
1855 | "longest": {
1856 | "version": "1.0.1",
1857 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
1858 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
1859 | "dev": true
1860 | },
1861 | "loud-rejection": {
1862 | "version": "1.6.0",
1863 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
1864 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
1865 | "dev": true,
1866 | "requires": {
1867 | "currently-unhandled": "^0.4.1",
1868 | "signal-exit": "^3.0.0"
1869 | }
1870 | },
1871 | "lru-cache": {
1872 | "version": "4.1.5",
1873 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
1874 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
1875 | "dev": true,
1876 | "requires": {
1877 | "pseudomap": "^1.0.2",
1878 | "yallist": "^2.1.2"
1879 | }
1880 | },
1881 | "map-obj": {
1882 | "version": "1.0.1",
1883 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
1884 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
1885 | "dev": true
1886 | },
1887 | "maxmin": {
1888 | "version": "1.1.0",
1889 | "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz",
1890 | "integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=",
1891 | "dev": true,
1892 | "requires": {
1893 | "chalk": "^1.0.0",
1894 | "figures": "^1.0.1",
1895 | "gzip-size": "^1.0.0",
1896 | "pretty-bytes": "^1.0.0"
1897 | }
1898 | },
1899 | "meow": {
1900 | "version": "3.7.0",
1901 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
1902 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
1903 | "dev": true,
1904 | "requires": {
1905 | "camelcase-keys": "^2.0.0",
1906 | "decamelize": "^1.1.2",
1907 | "loud-rejection": "^1.0.0",
1908 | "map-obj": "^1.0.1",
1909 | "minimist": "^1.1.3",
1910 | "normalize-package-data": "^2.3.4",
1911 | "object-assign": "^4.0.1",
1912 | "read-pkg-up": "^1.0.1",
1913 | "redent": "^1.0.0",
1914 | "trim-newlines": "^1.0.0"
1915 | }
1916 | },
1917 | "mime": {
1918 | "version": "1.3.4",
1919 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
1920 | "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=",
1921 | "dev": true
1922 | },
1923 | "mime-db": {
1924 | "version": "1.40.0",
1925 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
1926 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
1927 | "dev": true
1928 | },
1929 | "mime-types": {
1930 | "version": "2.1.24",
1931 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
1932 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
1933 | "dev": true,
1934 | "requires": {
1935 | "mime-db": "1.40.0"
1936 | }
1937 | },
1938 | "minimatch": {
1939 | "version": "3.0.3",
1940 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
1941 | "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=",
1942 | "dev": true,
1943 | "requires": {
1944 | "brace-expansion": "^1.0.0"
1945 | }
1946 | },
1947 | "minimist": {
1948 | "version": "1.2.0",
1949 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
1950 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
1951 | "dev": true
1952 | },
1953 | "mkdirp": {
1954 | "version": "0.5.1",
1955 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1956 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1957 | "dev": true,
1958 | "requires": {
1959 | "minimist": "0.0.8"
1960 | },
1961 | "dependencies": {
1962 | "minimist": {
1963 | "version": "0.0.8",
1964 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1965 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
1966 | "dev": true
1967 | }
1968 | }
1969 | },
1970 | "ms": {
1971 | "version": "0.7.1",
1972 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
1973 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
1974 | "dev": true
1975 | },
1976 | "nan": {
1977 | "version": "2.14.0",
1978 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
1979 | "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
1980 | "dev": true
1981 | },
1982 | "node-gyp": {
1983 | "version": "3.8.0",
1984 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
1985 | "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
1986 | "dev": true,
1987 | "requires": {
1988 | "fstream": "^1.0.0",
1989 | "glob": "^7.0.3",
1990 | "graceful-fs": "^4.1.2",
1991 | "mkdirp": "^0.5.0",
1992 | "nopt": "2 || 3",
1993 | "npmlog": "0 || 1 || 2 || 3 || 4",
1994 | "osenv": "0",
1995 | "request": "^2.87.0",
1996 | "rimraf": "2",
1997 | "semver": "~5.3.0",
1998 | "tar": "^2.0.0",
1999 | "which": "1"
2000 | }
2001 | },
2002 | "node-sass": {
2003 | "version": "4.12.0",
2004 | "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz",
2005 | "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==",
2006 | "dev": true,
2007 | "requires": {
2008 | "async-foreach": "^0.1.3",
2009 | "chalk": "^1.1.1",
2010 | "cross-spawn": "^3.0.0",
2011 | "gaze": "^1.0.0",
2012 | "get-stdin": "^4.0.1",
2013 | "glob": "^7.0.3",
2014 | "in-publish": "^2.0.0",
2015 | "lodash": "^4.17.11",
2016 | "meow": "^3.7.0",
2017 | "mkdirp": "^0.5.1",
2018 | "nan": "^2.13.2",
2019 | "node-gyp": "^3.8.0",
2020 | "npmlog": "^4.0.0",
2021 | "request": "^2.88.0",
2022 | "sass-graph": "^2.2.4",
2023 | "stdout-stream": "^1.4.0",
2024 | "true-case-path": "^1.0.2"
2025 | },
2026 | "dependencies": {
2027 | "lodash": {
2028 | "version": "4.17.15",
2029 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
2030 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
2031 | "dev": true
2032 | }
2033 | }
2034 | },
2035 | "nopt": {
2036 | "version": "3.0.6",
2037 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
2038 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
2039 | "dev": true,
2040 | "requires": {
2041 | "abbrev": "1"
2042 | }
2043 | },
2044 | "noptify": {
2045 | "version": "0.0.3",
2046 | "resolved": "https://registry.npmjs.org/noptify/-/noptify-0.0.3.tgz",
2047 | "integrity": "sha1-WPZUpz2XU98MUdlobckhBKZ/S7s=",
2048 | "dev": true,
2049 | "requires": {
2050 | "nopt": "~2.0.0"
2051 | },
2052 | "dependencies": {
2053 | "nopt": {
2054 | "version": "2.0.0",
2055 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.0.0.tgz",
2056 | "integrity": "sha1-ynQW8gpeP5w7hhgPlilfo9C1Lg0=",
2057 | "dev": true,
2058 | "requires": {
2059 | "abbrev": "1"
2060 | }
2061 | }
2062 | }
2063 | },
2064 | "normalize-package-data": {
2065 | "version": "2.3.5",
2066 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz",
2067 | "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=",
2068 | "dev": true,
2069 | "requires": {
2070 | "hosted-git-info": "^2.1.4",
2071 | "is-builtin-module": "^1.0.0",
2072 | "semver": "2 || 3 || 4 || 5",
2073 | "validate-npm-package-license": "^3.0.1"
2074 | }
2075 | },
2076 | "npmlog": {
2077 | "version": "4.1.2",
2078 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
2079 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
2080 | "dev": true,
2081 | "requires": {
2082 | "are-we-there-yet": "~1.1.2",
2083 | "console-control-strings": "~1.1.0",
2084 | "gauge": "~2.7.3",
2085 | "set-blocking": "~2.0.0"
2086 | }
2087 | },
2088 | "num2fraction": {
2089 | "version": "1.2.2",
2090 | "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
2091 | "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
2092 | "dev": true
2093 | },
2094 | "number-is-nan": {
2095 | "version": "1.0.1",
2096 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
2097 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
2098 | "dev": true
2099 | },
2100 | "oauth-sign": {
2101 | "version": "0.9.0",
2102 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
2103 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
2104 | "dev": true
2105 | },
2106 | "object-assign": {
2107 | "version": "4.1.0",
2108 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz",
2109 | "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=",
2110 | "dev": true
2111 | },
2112 | "once": {
2113 | "version": "1.4.0",
2114 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2115 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
2116 | "dev": true,
2117 | "requires": {
2118 | "wrappy": "1"
2119 | }
2120 | },
2121 | "opn": {
2122 | "version": "1.0.2",
2123 | "resolved": "https://registry.npmjs.org/opn/-/opn-1.0.2.tgz",
2124 | "integrity": "sha1-uQlkM0bQChq8l3qLlvPOPFPVz18=",
2125 | "dev": true
2126 | },
2127 | "os-homedir": {
2128 | "version": "1.0.2",
2129 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
2130 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
2131 | "dev": true
2132 | },
2133 | "os-locale": {
2134 | "version": "1.4.0",
2135 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
2136 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
2137 | "dev": true,
2138 | "requires": {
2139 | "lcid": "^1.0.0"
2140 | }
2141 | },
2142 | "os-tmpdir": {
2143 | "version": "1.0.2",
2144 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
2145 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
2146 | "dev": true
2147 | },
2148 | "osenv": {
2149 | "version": "0.1.5",
2150 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
2151 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
2152 | "dev": true,
2153 | "requires": {
2154 | "os-homedir": "^1.0.0",
2155 | "os-tmpdir": "^1.0.0"
2156 | }
2157 | },
2158 | "pako": {
2159 | "version": "0.2.9",
2160 | "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
2161 | "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
2162 | "dev": true
2163 | },
2164 | "parse-json": {
2165 | "version": "2.2.0",
2166 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
2167 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
2168 | "dev": true,
2169 | "requires": {
2170 | "error-ex": "^1.2.0"
2171 | }
2172 | },
2173 | "path-exists": {
2174 | "version": "2.1.0",
2175 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
2176 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
2177 | "dev": true,
2178 | "requires": {
2179 | "pinkie-promise": "^2.0.0"
2180 | }
2181 | },
2182 | "path-is-absolute": {
2183 | "version": "1.0.1",
2184 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
2185 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
2186 | "dev": true
2187 | },
2188 | "path-type": {
2189 | "version": "1.1.0",
2190 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
2191 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
2192 | "dev": true,
2193 | "requires": {
2194 | "graceful-fs": "^4.1.2",
2195 | "pify": "^2.0.0",
2196 | "pinkie-promise": "^2.0.0"
2197 | }
2198 | },
2199 | "performance-now": {
2200 | "version": "2.1.0",
2201 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
2202 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
2203 | "dev": true
2204 | },
2205 | "pify": {
2206 | "version": "2.3.0",
2207 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2208 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
2209 | "dev": true
2210 | },
2211 | "pinkie": {
2212 | "version": "2.0.4",
2213 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
2214 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
2215 | "dev": true
2216 | },
2217 | "pinkie-promise": {
2218 | "version": "2.0.1",
2219 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
2220 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
2221 | "dev": true,
2222 | "requires": {
2223 | "pinkie": "^2.0.0"
2224 | }
2225 | },
2226 | "postcss": {
2227 | "version": "4.1.16",
2228 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-4.1.16.tgz",
2229 | "integrity": "sha1-TESbTIr53zyvbTf44eV10DYXWNw=",
2230 | "dev": true,
2231 | "requires": {
2232 | "es6-promise": "~2.3.0",
2233 | "js-base64": "~2.1.8",
2234 | "source-map": "~0.4.2"
2235 | }
2236 | },
2237 | "pretty-bytes": {
2238 | "version": "1.0.4",
2239 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz",
2240 | "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=",
2241 | "dev": true,
2242 | "requires": {
2243 | "get-stdin": "^4.0.1",
2244 | "meow": "^3.1.0"
2245 | }
2246 | },
2247 | "process-nextick-args": {
2248 | "version": "1.0.7",
2249 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
2250 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
2251 | "dev": true
2252 | },
2253 | "pseudomap": {
2254 | "version": "1.0.2",
2255 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
2256 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
2257 | "dev": true
2258 | },
2259 | "psl": {
2260 | "version": "1.4.0",
2261 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz",
2262 | "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==",
2263 | "dev": true
2264 | },
2265 | "punycode": {
2266 | "version": "2.1.1",
2267 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
2268 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
2269 | "dev": true
2270 | },
2271 | "qs": {
2272 | "version": "6.5.2",
2273 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
2274 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
2275 | "dev": true
2276 | },
2277 | "range-parser": {
2278 | "version": "1.0.3",
2279 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz",
2280 | "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=",
2281 | "dev": true
2282 | },
2283 | "read-pkg": {
2284 | "version": "1.1.0",
2285 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
2286 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
2287 | "dev": true,
2288 | "requires": {
2289 | "load-json-file": "^1.0.0",
2290 | "normalize-package-data": "^2.3.2",
2291 | "path-type": "^1.0.0"
2292 | }
2293 | },
2294 | "read-pkg-up": {
2295 | "version": "1.0.1",
2296 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
2297 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
2298 | "dev": true,
2299 | "requires": {
2300 | "find-up": "^1.0.0",
2301 | "read-pkg": "^1.0.0"
2302 | }
2303 | },
2304 | "readable-stream": {
2305 | "version": "2.2.2",
2306 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.2.tgz",
2307 | "integrity": "sha1-qeb+w8fdqF+LsbO6cChgRVb8gl4=",
2308 | "dev": true,
2309 | "requires": {
2310 | "buffer-shims": "^1.0.0",
2311 | "core-util-is": "~1.0.0",
2312 | "inherits": "~2.0.1",
2313 | "isarray": "~1.0.0",
2314 | "process-nextick-args": "~1.0.6",
2315 | "string_decoder": "~0.10.x",
2316 | "util-deprecate": "~1.0.1"
2317 | }
2318 | },
2319 | "redent": {
2320 | "version": "1.0.0",
2321 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
2322 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
2323 | "dev": true,
2324 | "requires": {
2325 | "indent-string": "^2.1.0",
2326 | "strip-indent": "^1.0.1"
2327 | }
2328 | },
2329 | "repeat-string": {
2330 | "version": "1.6.1",
2331 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
2332 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
2333 | "dev": true
2334 | },
2335 | "repeating": {
2336 | "version": "2.0.1",
2337 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
2338 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
2339 | "dev": true,
2340 | "requires": {
2341 | "is-finite": "^1.0.0"
2342 | }
2343 | },
2344 | "request": {
2345 | "version": "2.88.0",
2346 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
2347 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
2348 | "dev": true,
2349 | "requires": {
2350 | "aws-sign2": "~0.7.0",
2351 | "aws4": "^1.8.0",
2352 | "caseless": "~0.12.0",
2353 | "combined-stream": "~1.0.6",
2354 | "extend": "~3.0.2",
2355 | "forever-agent": "~0.6.1",
2356 | "form-data": "~2.3.2",
2357 | "har-validator": "~5.1.0",
2358 | "http-signature": "~1.2.0",
2359 | "is-typedarray": "~1.0.0",
2360 | "isstream": "~0.1.2",
2361 | "json-stringify-safe": "~5.0.1",
2362 | "mime-types": "~2.1.19",
2363 | "oauth-sign": "~0.9.0",
2364 | "performance-now": "^2.1.0",
2365 | "qs": "~6.5.2",
2366 | "safe-buffer": "^5.1.2",
2367 | "tough-cookie": "~2.4.3",
2368 | "tunnel-agent": "^0.6.0",
2369 | "uuid": "^3.3.2"
2370 | }
2371 | },
2372 | "require-directory": {
2373 | "version": "2.1.1",
2374 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
2375 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
2376 | "dev": true
2377 | },
2378 | "require-main-filename": {
2379 | "version": "1.0.1",
2380 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
2381 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
2382 | "dev": true
2383 | },
2384 | "resolve": {
2385 | "version": "1.1.7",
2386 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
2387 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
2388 | "dev": true
2389 | },
2390 | "right-align": {
2391 | "version": "0.1.3",
2392 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
2393 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
2394 | "dev": true,
2395 | "requires": {
2396 | "align-text": "^0.1.1"
2397 | }
2398 | },
2399 | "rimraf": {
2400 | "version": "2.2.8",
2401 | "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
2402 | "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
2403 | "dev": true
2404 | },
2405 | "safe-buffer": {
2406 | "version": "5.2.0",
2407 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
2408 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
2409 | "dev": true
2410 | },
2411 | "safer-buffer": {
2412 | "version": "2.1.2",
2413 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
2414 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
2415 | "dev": true
2416 | },
2417 | "sass-graph": {
2418 | "version": "2.2.4",
2419 | "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
2420 | "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
2421 | "dev": true,
2422 | "requires": {
2423 | "glob": "^7.0.0",
2424 | "lodash": "^4.0.0",
2425 | "scss-tokenizer": "^0.2.3",
2426 | "yargs": "^7.0.0"
2427 | },
2428 | "dependencies": {
2429 | "lodash": {
2430 | "version": "4.17.15",
2431 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
2432 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
2433 | "dev": true
2434 | }
2435 | }
2436 | },
2437 | "scss-tokenizer": {
2438 | "version": "0.2.3",
2439 | "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
2440 | "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
2441 | "dev": true,
2442 | "requires": {
2443 | "js-base64": "^2.1.8",
2444 | "source-map": "^0.4.2"
2445 | }
2446 | },
2447 | "semver": {
2448 | "version": "5.3.0",
2449 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
2450 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
2451 | "dev": true
2452 | },
2453 | "set-blocking": {
2454 | "version": "2.0.0",
2455 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
2456 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
2457 | "dev": true
2458 | },
2459 | "shelljs": {
2460 | "version": "0.3.0",
2461 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz",
2462 | "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=",
2463 | "dev": true
2464 | },
2465 | "sigmund": {
2466 | "version": "1.0.1",
2467 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
2468 | "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
2469 | "dev": true
2470 | },
2471 | "signal-exit": {
2472 | "version": "3.0.2",
2473 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
2474 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
2475 | "dev": true
2476 | },
2477 | "source-map": {
2478 | "version": "0.4.4",
2479 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
2480 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
2481 | "dev": true,
2482 | "requires": {
2483 | "amdefine": ">=0.0.4"
2484 | }
2485 | },
2486 | "spdx-correct": {
2487 | "version": "1.0.2",
2488 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
2489 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
2490 | "dev": true,
2491 | "requires": {
2492 | "spdx-license-ids": "^1.0.2"
2493 | }
2494 | },
2495 | "spdx-expression-parse": {
2496 | "version": "1.0.4",
2497 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
2498 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
2499 | "dev": true
2500 | },
2501 | "spdx-license-ids": {
2502 | "version": "1.2.2",
2503 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
2504 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
2505 | "dev": true
2506 | },
2507 | "sprintf-js": {
2508 | "version": "1.0.3",
2509 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
2510 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
2511 | "dev": true
2512 | },
2513 | "sshpk": {
2514 | "version": "1.16.1",
2515 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
2516 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
2517 | "dev": true,
2518 | "requires": {
2519 | "asn1": "~0.2.3",
2520 | "assert-plus": "^1.0.0",
2521 | "bcrypt-pbkdf": "^1.0.0",
2522 | "dashdash": "^1.12.0",
2523 | "ecc-jsbn": "~0.1.1",
2524 | "getpass": "^0.1.1",
2525 | "jsbn": "~0.1.0",
2526 | "safer-buffer": "^2.0.2",
2527 | "tweetnacl": "~0.14.0"
2528 | }
2529 | },
2530 | "statuses": {
2531 | "version": "1.5.0",
2532 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
2533 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
2534 | "dev": true
2535 | },
2536 | "stdout-stream": {
2537 | "version": "1.4.1",
2538 | "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
2539 | "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
2540 | "dev": true,
2541 | "requires": {
2542 | "readable-stream": "^2.0.1"
2543 | }
2544 | },
2545 | "string-width": {
2546 | "version": "1.0.2",
2547 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
2548 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
2549 | "dev": true,
2550 | "requires": {
2551 | "code-point-at": "^1.0.0",
2552 | "is-fullwidth-code-point": "^1.0.0",
2553 | "strip-ansi": "^3.0.0"
2554 | }
2555 | },
2556 | "string_decoder": {
2557 | "version": "0.10.31",
2558 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
2559 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
2560 | "dev": true
2561 | },
2562 | "strip-ansi": {
2563 | "version": "3.0.1",
2564 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
2565 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
2566 | "dev": true,
2567 | "requires": {
2568 | "ansi-regex": "^2.0.0"
2569 | }
2570 | },
2571 | "strip-bom": {
2572 | "version": "2.0.0",
2573 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
2574 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
2575 | "dev": true,
2576 | "requires": {
2577 | "is-utf8": "^0.2.0"
2578 | }
2579 | },
2580 | "strip-indent": {
2581 | "version": "1.0.1",
2582 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
2583 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
2584 | "dev": true,
2585 | "requires": {
2586 | "get-stdin": "^4.0.1"
2587 | }
2588 | },
2589 | "supports-color": {
2590 | "version": "2.0.0",
2591 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
2592 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
2593 | "dev": true
2594 | },
2595 | "tar": {
2596 | "version": "2.2.2",
2597 | "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
2598 | "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
2599 | "dev": true,
2600 | "requires": {
2601 | "block-stream": "*",
2602 | "fstream": "^1.0.12",
2603 | "inherits": "2"
2604 | }
2605 | },
2606 | "tough-cookie": {
2607 | "version": "2.4.3",
2608 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
2609 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
2610 | "dev": true,
2611 | "requires": {
2612 | "psl": "^1.1.24",
2613 | "punycode": "^1.4.1"
2614 | },
2615 | "dependencies": {
2616 | "punycode": {
2617 | "version": "1.4.1",
2618 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
2619 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
2620 | "dev": true
2621 | }
2622 | }
2623 | },
2624 | "trim-newlines": {
2625 | "version": "1.0.0",
2626 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
2627 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
2628 | "dev": true
2629 | },
2630 | "true-case-path": {
2631 | "version": "1.0.3",
2632 | "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
2633 | "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
2634 | "dev": true,
2635 | "requires": {
2636 | "glob": "^7.1.2"
2637 | },
2638 | "dependencies": {
2639 | "balanced-match": {
2640 | "version": "1.0.0",
2641 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
2642 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
2643 | "dev": true
2644 | },
2645 | "brace-expansion": {
2646 | "version": "1.1.11",
2647 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
2648 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
2649 | "dev": true,
2650 | "requires": {
2651 | "balanced-match": "^1.0.0",
2652 | "concat-map": "0.0.1"
2653 | }
2654 | },
2655 | "glob": {
2656 | "version": "7.1.4",
2657 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
2658 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
2659 | "dev": true,
2660 | "requires": {
2661 | "fs.realpath": "^1.0.0",
2662 | "inflight": "^1.0.4",
2663 | "inherits": "2",
2664 | "minimatch": "^3.0.4",
2665 | "once": "^1.3.0",
2666 | "path-is-absolute": "^1.0.0"
2667 | }
2668 | },
2669 | "minimatch": {
2670 | "version": "3.0.4",
2671 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2672 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
2673 | "dev": true,
2674 | "requires": {
2675 | "brace-expansion": "^1.1.7"
2676 | }
2677 | }
2678 | }
2679 | },
2680 | "tunnel-agent": {
2681 | "version": "0.6.0",
2682 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
2683 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
2684 | "dev": true,
2685 | "requires": {
2686 | "safe-buffer": "^5.0.1"
2687 | }
2688 | },
2689 | "tweetnacl": {
2690 | "version": "0.14.5",
2691 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
2692 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
2693 | "dev": true
2694 | },
2695 | "typedarray": {
2696 | "version": "0.0.6",
2697 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
2698 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
2699 | "dev": true
2700 | },
2701 | "uglify-js": {
2702 | "version": "2.8.29",
2703 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
2704 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
2705 | "dev": true,
2706 | "requires": {
2707 | "source-map": "~0.5.1",
2708 | "uglify-to-browserify": "~1.0.0",
2709 | "yargs": "~3.10.0"
2710 | },
2711 | "dependencies": {
2712 | "camelcase": {
2713 | "version": "1.2.1",
2714 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
2715 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
2716 | "dev": true
2717 | },
2718 | "cliui": {
2719 | "version": "2.1.0",
2720 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
2721 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
2722 | "dev": true,
2723 | "requires": {
2724 | "center-align": "^0.1.1",
2725 | "right-align": "^0.1.1",
2726 | "wordwrap": "0.0.2"
2727 | }
2728 | },
2729 | "source-map": {
2730 | "version": "0.5.7",
2731 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
2732 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
2733 | "dev": true
2734 | },
2735 | "window-size": {
2736 | "version": "0.1.0",
2737 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
2738 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
2739 | "dev": true
2740 | },
2741 | "yargs": {
2742 | "version": "3.10.0",
2743 | "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
2744 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
2745 | "dev": true,
2746 | "requires": {
2747 | "camelcase": "^1.0.2",
2748 | "cliui": "^2.1.0",
2749 | "decamelize": "^1.0.0",
2750 | "window-size": "0.1.0"
2751 | }
2752 | }
2753 | }
2754 | },
2755 | "uglify-to-browserify": {
2756 | "version": "1.0.2",
2757 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
2758 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
2759 | "dev": true,
2760 | "optional": true
2761 | },
2762 | "underscore.string": {
2763 | "version": "3.2.3",
2764 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz",
2765 | "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=",
2766 | "dev": true
2767 | },
2768 | "uri-js": {
2769 | "version": "4.2.2",
2770 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
2771 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
2772 | "dev": true,
2773 | "requires": {
2774 | "punycode": "^2.1.0"
2775 | }
2776 | },
2777 | "util-deprecate": {
2778 | "version": "1.0.2",
2779 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2780 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
2781 | "dev": true
2782 | },
2783 | "uuid": {
2784 | "version": "3.3.3",
2785 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
2786 | "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==",
2787 | "dev": true
2788 | },
2789 | "validate-npm-package-license": {
2790 | "version": "3.0.1",
2791 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
2792 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
2793 | "dev": true,
2794 | "requires": {
2795 | "spdx-correct": "~1.0.0",
2796 | "spdx-expression-parse": "~1.0.0"
2797 | }
2798 | },
2799 | "verror": {
2800 | "version": "1.10.0",
2801 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
2802 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
2803 | "dev": true,
2804 | "requires": {
2805 | "assert-plus": "^1.0.0",
2806 | "core-util-is": "1.0.2",
2807 | "extsprintf": "^1.2.0"
2808 | }
2809 | },
2810 | "which": {
2811 | "version": "1.2.12",
2812 | "resolved": "https://registry.npmjs.org/which/-/which-1.2.12.tgz",
2813 | "integrity": "sha1-3me15FAmnxlJCe8j7OTr5Bb6EZI=",
2814 | "dev": true,
2815 | "requires": {
2816 | "isexe": "^1.1.1"
2817 | }
2818 | },
2819 | "which-module": {
2820 | "version": "1.0.0",
2821 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
2822 | "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
2823 | "dev": true
2824 | },
2825 | "wide-align": {
2826 | "version": "1.1.3",
2827 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
2828 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
2829 | "dev": true,
2830 | "requires": {
2831 | "string-width": "^1.0.2 || 2"
2832 | }
2833 | },
2834 | "wordwrap": {
2835 | "version": "0.0.2",
2836 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
2837 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
2838 | "dev": true
2839 | },
2840 | "wrap-ansi": {
2841 | "version": "2.1.0",
2842 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
2843 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
2844 | "dev": true,
2845 | "requires": {
2846 | "string-width": "^1.0.1",
2847 | "strip-ansi": "^3.0.1"
2848 | }
2849 | },
2850 | "wrappy": {
2851 | "version": "1.0.2",
2852 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2853 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2854 | "dev": true
2855 | },
2856 | "y18n": {
2857 | "version": "3.2.1",
2858 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
2859 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
2860 | "dev": true
2861 | },
2862 | "yallist": {
2863 | "version": "2.1.2",
2864 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
2865 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
2866 | "dev": true
2867 | },
2868 | "yargs": {
2869 | "version": "7.1.0",
2870 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
2871 | "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
2872 | "dev": true,
2873 | "requires": {
2874 | "camelcase": "^3.0.0",
2875 | "cliui": "^3.2.0",
2876 | "decamelize": "^1.1.1",
2877 | "get-caller-file": "^1.0.1",
2878 | "os-locale": "^1.4.0",
2879 | "read-pkg-up": "^1.0.1",
2880 | "require-directory": "^2.1.1",
2881 | "require-main-filename": "^1.0.1",
2882 | "set-blocking": "^2.0.0",
2883 | "string-width": "^1.0.2",
2884 | "which-module": "^1.0.0",
2885 | "y18n": "^3.2.1",
2886 | "yargs-parser": "^5.0.0"
2887 | },
2888 | "dependencies": {
2889 | "camelcase": {
2890 | "version": "3.0.0",
2891 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
2892 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
2893 | "dev": true
2894 | }
2895 | }
2896 | },
2897 | "yargs-parser": {
2898 | "version": "5.0.0",
2899 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
2900 | "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
2901 | "dev": true,
2902 | "requires": {
2903 | "camelcase": "^3.0.0"
2904 | },
2905 | "dependencies": {
2906 | "camelcase": {
2907 | "version": "3.0.0",
2908 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
2909 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
2910 | "dev": true
2911 | }
2912 | }
2913 | }
2914 | }
2915 | }
2916 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "css",
3 | "version": "0.0.1",
4 | "description": "Assorted CSS and UI experiments",
5 | "homepage": "http://lab.hakim.se/",
6 | "author": {
7 | "name": "Hakim El Hattab",
8 | "email": "hakim.elhattab@gmail.com",
9 | "web": "http://hakim.se"
10 | },
11 | "repository": {
12 | "type": "git",
13 | "url": "git://github.com/hakimel/css.js.git"
14 | },
15 | "dependencies": {},
16 | "devDependencies": {
17 | "grunt-contrib-jshint": "~0.11.3",
18 | "grunt-contrib-cssmin": "~0.14.0",
19 | "grunt-contrib-uglify": "~0.9.2",
20 | "grunt-contrib-watch": "~0.6.1",
21 | "grunt-contrib-connect": "~0.11.2",
22 | "grunt-autoprefixer": "~3.0.3",
23 | "grunt-sass": "~3.1.0",
24 | "node-sass": "~4.12.0",
25 | "grunt": "~1.0.1"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/progress-nav/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Progress Nav
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | Progress Nav
52 |
53 | This page demonstrates an idea for how progress can be visualized inside of a standard page nav. Scroll the page and note how the marker animates to highlight all of the sections that are currently on screen.
54 |
55 |
56 | The rest of the content below is taken from slides.com/developers . Take a look at that to see how the progress nav looks on a real page.
57 |
58 |
59 | Created by Hakim El Hattab | hakim.se | @hakimel
60 |
61 | Slides for Developers
62 |
63 | We strive to make Slides a great and flexible tool for developers. Presentations created on Slides are HTML documents under the hood, so generally anything that HTML can do, Slides can do. We make it easy to access and edit the underlying HTML and CSS through the Developer Mode .
64 |
65 |
66 | There's also an API for creating new presentations with preset content and we're aiming to add additional APIs in the future.
67 |
68 |
69 |
70 |
71 |
72 |
Developer Mode
73 |
74 | The Slides editor has a developer mode which is useful if you know a bit of HTML and CSS. With this mode active you will be able to modify the underlying HTML of your deck, allowing you to make adjustments that the Slides editor does not provide interface options for.
75 |
76 |
77 | To enable the developer mode open the editor settings in the bottom left corner:
78 |
79 |
80 |
81 |
82 |
83 |
84 |
Editing HTML
85 |
86 | The per-slide HTML editor can be accessed from the slide options area. It gives you raw access to the current slide's HTML, allowing you to change anything you like. Note that some elements, such as <script> and <link>, are not allowed for security reasons.
87 |
88 |
89 |
90 |
91 |
92 |
93 |
Element Classes
94 |
95 | As a paying Slides customer you have access to the CSS editor which allows you to add custom styles to your deck. By turning on the developer mode a new "class name" field will appear for any block that you focus. This allows you to easily target a specific element with your CSS.
96 |
97 |
98 | Here's an example that defines an "upside-down" class using custom CSS and applies it to a text block.
99 |
100 |
.upside-down {
101 | transform: scale( 1, -1 );
102 | }
103 |
104 |
105 |
106 |
107 |
108 |
Slide Classes
109 |
110 | Just like you can add custom classes to individual elements it's also possible to add custom classes at the slide level. This can used to apply broader changes to the whole slide like inverting text and icon colors or changing the slide transition.
111 |
112 |
113 |
114 | Under the hood the slide background element is separate from the slide itself. Here are two examples showing how you'd target the slide contents or slide background using a custom class called "night-sky":
115 |
116 |
117 |
// Targets the slide contents
118 | .slides .night-sky svg path {
119 | fill: yellow;
120 | }
121 |
122 | // Target the slide background
123 | .backgrounds .night-sky {
124 | background: linear-gradient(0deg, #141528, #0b1bb2);
125 | }
126 |
127 |
128 |
129 |
130 |
131 |
Export HTML
132 |
133 | You can access the complete HTML for all slides in your deck inside of the export panel, under "Export to reveal.js". This provides a way of exporting your deck markup and the core Slides styles to reveal.js. There are a few limitations with exporting this way but it should provide a good starting point.
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
CSS Editor
144 |
145 | The CSS editor lets you author custom styles for your presentation with a real-time preview of the result. It's available as an option inside of the Style panel of the presentation editor.
146 |
147 |
148 | The editor preprocesses styles using LESS , though you're free to write plain CSS as well. We apply the styles in real-time as you type so there's no need to leave the editor or even press a refresh button to see what you're getting. Note that when your styles are saved they will be automatically wrapped in a ".reveal {}" selector to avoid conflicts with other page styles.
149 |
150 |
151 |
152 |
Custom Fonts
153 |
154 | You can load custom fonts from Typekit and Google fonts and apply them using custom CSS. Find out more .
155 |
156 |
157 |
158 |
Developer Mode
159 |
160 | If you turn on the developer mode you can also add custom classes to any focused element. This is a convenient way to easily apply your CSS to specific elements.
161 |
162 |
163 |
164 |
165 |
Examples
166 |
// Change presentation background
167 | & {
168 | background: #a83239;
169 | }
170 |
171 | // Change color of body text
172 | .slides {
173 | color: #009999;
174 | }
175 |
176 | // Turn text white if the slide has a dark background
177 | .has-dark-background {
178 | color: #fff;
179 | }
180 |
181 | // Add a blue border to all slides (each slide is a <section>)
182 | .slides section {
183 | outline: 1px solid blue;
184 | }
185 |
186 | // Add a red border to all vertical stacks of slides
187 | .slides section.stack {
188 | outline: 1px solid red;
189 | }
190 | // Include a custom font @font-face { font-family: "Cabin Sketch"; src: url("https://s3.amazonaws.com/static.slid.es/fonts/cabinsketch/cabinsketch-regular.woff") format("woff"), url("https://s3.amazonaws.com/static.slid.es/fonts/cabinsketch/cabinsketch-regular.ttf") format("truetype"); }
191 | .slides h1, .slides h2, .slides h3 { font-family: "Cabin Sketch"; }
192 |
193 |
194 | // Change color of controls and progress bar
195 | @interactiveColor: rgb(200,105,119);
196 |
197 | .progress span {
198 | background: @interactiveColor !important;
199 | }
200 |
201 | .controls .navigate-left {
202 | border-right-color: @interactiveColor !important;
203 | }
204 | .controls .navigate-right {
205 | border-left-color: @interactiveColor !important;
206 | }
207 | .controls .navigate-up {
208 | border-bottom-color: @interactiveColor !important;
209 | }
210 | .controls .navigate-down {
211 | border-top-color: @interactiveColor !important;
212 | }
213 |
214 |
215 | Here's where you can access the CSS editor from inside of the Style panel:
216 |
217 |
218 | A screenshot of the editor:
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
233 |
234 |
269 |
270 |
280 |
281 |
282 |
283 |
--------------------------------------------------------------------------------
/progress-nav/normalize.css:
--------------------------------------------------------------------------------
1 | /*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */
2 |
3 | /**
4 | * 1. Change the default font family in all browsers (opinionated).
5 | * 2. Correct the line height in all browsers.
6 | * 3. Prevent adjustments of font size after orientation changes in
7 | * IE on Windows Phone and in iOS.
8 | */
9 |
10 | /* Document
11 | ========================================================================== */
12 |
13 | html {
14 | font-family: sans-serif; /* 1 */
15 | line-height: 1.15; /* 2 */
16 | -ms-text-size-adjust: 100%; /* 3 */
17 | -webkit-text-size-adjust: 100%; /* 3 */
18 | }
19 |
20 | /* Sections
21 | ========================================================================== */
22 |
23 | /**
24 | * Remove the margin in all browsers (opinionated).
25 | */
26 |
27 | body {
28 | margin: 0;
29 | }
30 |
31 | /**
32 | * Add the correct display in IE 9-.
33 | */
34 |
35 | article,
36 | aside,
37 | footer,
38 | header,
39 | nav,
40 | section {
41 | display: block;
42 | }
43 |
44 | /**
45 | * Correct the font size and margin on `h1` elements within `section` and
46 | * `article` contexts in Chrome, Firefox, and Safari.
47 | */
48 |
49 | h1 {
50 | font-size: 2em;
51 | margin: 0.67em 0;
52 | }
53 |
54 | /* Grouping content
55 | ========================================================================== */
56 |
57 | /**
58 | * Add the correct display in IE 9-.
59 | * 1. Add the correct display in IE.
60 | */
61 |
62 | figcaption,
63 | figure,
64 | main { /* 1 */
65 | display: block;
66 | }
67 |
68 | /**
69 | * Add the correct margin in IE 8.
70 | */
71 |
72 | figure {
73 | margin: 1em 40px;
74 | }
75 |
76 | /**
77 | * 1. Add the correct box sizing in Firefox.
78 | * 2. Show the overflow in Edge and IE.
79 | */
80 |
81 | hr {
82 | box-sizing: content-box; /* 1 */
83 | height: 0; /* 1 */
84 | overflow: visible; /* 2 */
85 | }
86 |
87 | /**
88 | * 1. Correct the inheritance and scaling of font size in all browsers.
89 | * 2. Correct the odd `em` font sizing in all browsers.
90 | */
91 |
92 | pre {
93 | font-family: monospace, monospace; /* 1 */
94 | font-size: 1em; /* 2 */
95 | }
96 |
97 | /* Text-level semantics
98 | ========================================================================== */
99 |
100 | /**
101 | * 1. Remove the gray background on active links in IE 10.
102 | * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
103 | */
104 |
105 | a {
106 | background-color: transparent; /* 1 */
107 | -webkit-text-decoration-skip: objects; /* 2 */
108 | }
109 |
110 | /**
111 | * Remove the outline on focused links when they are also active or hovered
112 | * in all browsers (opinionated).
113 | */
114 |
115 | a:active,
116 | a:hover {
117 | outline-width: 0;
118 | }
119 |
120 | /**
121 | * 1. Remove the bottom border in Firefox 39-.
122 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
123 | */
124 |
125 | abbr[title] {
126 | border-bottom: none; /* 1 */
127 | text-decoration: underline; /* 2 */
128 | text-decoration: underline dotted; /* 2 */
129 | }
130 |
131 | /**
132 | * Prevent the duplicate application of `bolder` by the next rule in Safari 6.
133 | */
134 |
135 | b,
136 | strong {
137 | font-weight: inherit;
138 | }
139 |
140 | /**
141 | * Add the correct font weight in Chrome, Edge, and Safari.
142 | */
143 |
144 | b,
145 | strong {
146 | font-weight: bolder;
147 | }
148 |
149 | /**
150 | * 1. Correct the inheritance and scaling of font size in all browsers.
151 | * 2. Correct the odd `em` font sizing in all browsers.
152 | */
153 |
154 | code,
155 | kbd,
156 | samp {
157 | font-family: monospace, monospace; /* 1 */
158 | font-size: 1em; /* 2 */
159 | }
160 |
161 | /**
162 | * Add the correct font style in Android 4.3-.
163 | */
164 |
165 | dfn {
166 | font-style: italic;
167 | }
168 |
169 | /**
170 | * Add the correct background and color in IE 9-.
171 | */
172 |
173 | mark {
174 | background-color: #ff0;
175 | color: #000;
176 | }
177 |
178 | /**
179 | * Add the correct font size in all browsers.
180 | */
181 |
182 | small {
183 | font-size: 80%;
184 | }
185 |
186 | /**
187 | * Prevent `sub` and `sup` elements from affecting the line height in
188 | * all browsers.
189 | */
190 |
191 | sub,
192 | sup {
193 | font-size: 75%;
194 | line-height: 0;
195 | position: relative;
196 | vertical-align: baseline;
197 | }
198 |
199 | sub {
200 | bottom: -0.25em;
201 | }
202 |
203 | sup {
204 | top: -0.5em;
205 | }
206 |
207 | /* Embedded content
208 | ========================================================================== */
209 |
210 | /**
211 | * Add the correct display in IE 9-.
212 | */
213 |
214 | audio,
215 | video {
216 | display: inline-block;
217 | }
218 |
219 | /**
220 | * Add the correct display in iOS 4-7.
221 | */
222 |
223 | audio:not([controls]) {
224 | display: none;
225 | height: 0;
226 | }
227 |
228 | /**
229 | * Remove the border on images inside links in IE 10-.
230 | */
231 |
232 | img {
233 | border-style: none;
234 | }
235 |
236 | /**
237 | * Hide the overflow in IE.
238 | */
239 |
240 | svg:not(:root) {
241 | overflow: hidden;
242 | }
243 |
244 | /* Forms
245 | ========================================================================== */
246 |
247 | /**
248 | * 1. Change the font styles in all browsers (opinionated).
249 | * 2. Remove the margin in Firefox and Safari.
250 | */
251 |
252 | button,
253 | input,
254 | optgroup,
255 | select,
256 | textarea {
257 | font-family: sans-serif; /* 1 */
258 | font-size: 100%; /* 1 */
259 | line-height: 1.15; /* 1 */
260 | margin: 0; /* 2 */
261 | }
262 |
263 | /**
264 | * Show the overflow in IE.
265 | * 1. Show the overflow in Edge.
266 | */
267 |
268 | button,
269 | input { /* 1 */
270 | overflow: visible;
271 | }
272 |
273 | /**
274 | * Remove the inheritance of text transform in Edge, Firefox, and IE.
275 | * 1. Remove the inheritance of text transform in Firefox.
276 | */
277 |
278 | button,
279 | select { /* 1 */
280 | text-transform: none;
281 | }
282 |
283 | /**
284 | * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
285 | * controls in Android 4.
286 | * 2. Correct the inability to style clickable types in iOS and Safari.
287 | */
288 |
289 | button,
290 | html [type="button"], /* 1 */
291 | [type="reset"],
292 | [type="submit"] {
293 | -webkit-appearance: button; /* 2 */
294 | }
295 |
296 | /**
297 | * Remove the inner border and padding in Firefox.
298 | */
299 |
300 | button::-moz-focus-inner,
301 | [type="button"]::-moz-focus-inner,
302 | [type="reset"]::-moz-focus-inner,
303 | [type="submit"]::-moz-focus-inner {
304 | border-style: none;
305 | padding: 0;
306 | }
307 |
308 | /**
309 | * Restore the focus styles unset by the previous rule.
310 | */
311 |
312 | button:-moz-focusring,
313 | [type="button"]:-moz-focusring,
314 | [type="reset"]:-moz-focusring,
315 | [type="submit"]:-moz-focusring {
316 | outline: 1px dotted ButtonText;
317 | }
318 |
319 | /**
320 | * Change the border, margin, and padding in all browsers (opinionated).
321 | */
322 |
323 | fieldset {
324 | border: 1px solid #c0c0c0;
325 | margin: 0 2px;
326 | padding: 0.35em 0.625em 0.75em;
327 | }
328 |
329 | /**
330 | * 1. Correct the text wrapping in Edge and IE.
331 | * 2. Correct the color inheritance from `fieldset` elements in IE.
332 | * 3. Remove the padding so developers are not caught out when they zero out
333 | * `fieldset` elements in all browsers.
334 | */
335 |
336 | legend {
337 | box-sizing: border-box; /* 1 */
338 | color: inherit; /* 2 */
339 | display: table; /* 1 */
340 | max-width: 100%; /* 1 */
341 | padding: 0; /* 3 */
342 | white-space: normal; /* 1 */
343 | }
344 |
345 | /**
346 | * 1. Add the correct display in IE 9-.
347 | * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.
348 | */
349 |
350 | progress {
351 | display: inline-block; /* 1 */
352 | vertical-align: baseline; /* 2 */
353 | }
354 |
355 | /**
356 | * Remove the default vertical scrollbar in IE.
357 | */
358 |
359 | textarea {
360 | overflow: auto;
361 | }
362 |
363 | /**
364 | * 1. Add the correct box sizing in IE 10-.
365 | * 2. Remove the padding in IE 10-.
366 | */
367 |
368 | [type="checkbox"],
369 | [type="radio"] {
370 | box-sizing: border-box; /* 1 */
371 | padding: 0; /* 2 */
372 | }
373 |
374 | /**
375 | * Correct the cursor style of increment and decrement buttons in Chrome.
376 | */
377 |
378 | [type="number"]::-webkit-inner-spin-button,
379 | [type="number"]::-webkit-outer-spin-button {
380 | height: auto;
381 | }
382 |
383 | /**
384 | * 1. Correct the odd appearance in Chrome and Safari.
385 | * 2. Correct the outline style in Safari.
386 | */
387 |
388 | [type="search"] {
389 | -webkit-appearance: textfield; /* 1 */
390 | outline-offset: -2px; /* 2 */
391 | }
392 |
393 | /**
394 | * Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
395 | */
396 |
397 | [type="search"]::-webkit-search-cancel-button,
398 | [type="search"]::-webkit-search-decoration {
399 | -webkit-appearance: none;
400 | }
401 |
402 | /**
403 | * 1. Correct the inability to style clickable types in iOS and Safari.
404 | * 2. Change font properties to `inherit` in Safari.
405 | */
406 |
407 | ::-webkit-file-upload-button {
408 | -webkit-appearance: button; /* 1 */
409 | font: inherit; /* 2 */
410 | }
411 |
412 | /* Interactive
413 | ========================================================================== */
414 |
415 | /*
416 | * Add the correct display in IE 9-.
417 | * 1. Add the correct display in Edge, IE, and Firefox.
418 | */
419 |
420 | details, /* 1 */
421 | menu {
422 | display: block;
423 | }
424 |
425 | /*
426 | * Add the correct display in all browsers.
427 | */
428 |
429 | summary {
430 | display: list-item;
431 | }
432 |
433 | /* Scripting
434 | ========================================================================== */
435 |
436 | /**
437 | * Add the correct display in IE 9-.
438 | */
439 |
440 | canvas {
441 | display: inline-block;
442 | }
443 |
444 | /**
445 | * Add the correct display in IE.
446 | */
447 |
448 | template {
449 | display: none;
450 | }
451 |
452 | /* Hidden
453 | ========================================================================== */
454 |
455 | /**
456 | * Add the correct display in IE 10-.
457 | */
458 |
459 | [hidden] {
460 | display: none;
461 | }
--------------------------------------------------------------------------------
/progress-nav/script.js:
--------------------------------------------------------------------------------
1 | window.onload = function() {
2 |
3 | var toc = document.querySelector( '.toc' );
4 | var tocPath = document.querySelector( '.toc-marker path' );
5 | var tocItems;
6 |
7 | // Factor of screen size that the element must cross
8 | // before it's considered visible
9 | var TOP_MARGIN = 0.1,
10 | BOTTOM_MARGIN = 0.2;
11 |
12 | var pathLength;
13 |
14 | var lastPathStart,
15 | lastPathEnd;
16 |
17 | window.addEventListener( 'resize', drawPath, false );
18 | window.addEventListener( 'scroll', sync, false );
19 |
20 | drawPath();
21 |
22 | function drawPath() {
23 |
24 | tocItems = [].slice.call( toc.querySelectorAll( 'li' ) );
25 |
26 | // Cache element references and measurements
27 | tocItems = tocItems.map( function( item ) {
28 | var anchor = item.querySelector( 'a' );
29 | var target = document.getElementById( anchor.getAttribute( 'href' ).slice( 1 ) );
30 |
31 | return {
32 | listItem: item,
33 | anchor: anchor,
34 | target: target
35 | };
36 | } );
37 |
38 | // Remove missing targets
39 | tocItems = tocItems.filter( function( item ) {
40 | return !!item.target;
41 | } );
42 |
43 | var path = [];
44 | var pathIndent;
45 |
46 | tocItems.forEach( function( item, i ) {
47 |
48 | var x = item.anchor.offsetLeft - 5,
49 | y = item.anchor.offsetTop,
50 | height = item.anchor.offsetHeight;
51 |
52 | if( i === 0 ) {
53 | path.push( 'M', x, y, 'L', x, y + height );
54 | item.pathStart = 0;
55 | }
56 | else {
57 | // Draw an additional line when there's a change in
58 | // indent levels
59 | if( pathIndent !== x ) path.push( 'L', pathIndent, y );
60 |
61 | path.push( 'L', x, y );
62 |
63 | // Set the current path so that we can measure it
64 | tocPath.setAttribute( 'd', path.join( ' ' ) );
65 | item.pathStart = tocPath.getTotalLength() || 0;
66 |
67 | path.push( 'L', x, y + height );
68 | }
69 |
70 | pathIndent = x;
71 |
72 | tocPath.setAttribute( 'd', path.join( ' ' ) );
73 | item.pathEnd = tocPath.getTotalLength();
74 |
75 | } );
76 |
77 | pathLength = tocPath.getTotalLength();
78 |
79 | sync();
80 |
81 | }
82 |
83 | function sync() {
84 |
85 | var windowHeight = window.innerHeight;
86 |
87 | var pathStart = pathLength,
88 | pathEnd = 0;
89 |
90 | var visibleItems = 0;
91 |
92 | tocItems.forEach( function( item ) {
93 |
94 | var targetBounds = item.target.getBoundingClientRect();
95 |
96 | if( targetBounds.bottom > windowHeight * TOP_MARGIN && targetBounds.top < windowHeight * ( 1 - BOTTOM_MARGIN ) ) {
97 | pathStart = Math.min( item.pathStart, pathStart );
98 | pathEnd = Math.max( item.pathEnd, pathEnd );
99 |
100 | visibleItems += 1;
101 |
102 | item.listItem.classList.add( 'visible' );
103 | }
104 | else {
105 | item.listItem.classList.remove( 'visible' );
106 | }
107 |
108 | } );
109 |
110 | // Specify the visible path or hide the path altogether
111 | // if there are no visible items
112 | if( visibleItems > 0 && pathStart < pathEnd ) {
113 | if( pathStart !== lastPathStart || pathEnd !== lastPathEnd ) {
114 | tocPath.setAttribute( 'stroke-dashoffset', '1' );
115 | tocPath.setAttribute( 'stroke-dasharray', '1, '+ pathStart +', '+ ( pathEnd - pathStart ) +', ' + pathLength );
116 | tocPath.setAttribute( 'opacity', 1 );
117 | }
118 | }
119 | else {
120 | tocPath.setAttribute( 'opacity', 0 );
121 | }
122 |
123 | lastPathStart = pathStart;
124 | lastPathEnd = pathEnd;
125 |
126 | }
127 |
128 | };
--------------------------------------------------------------------------------
/progress-nav/style.css:
--------------------------------------------------------------------------------
1 | * {
2 | box-sizing: border-box; }
3 |
4 | body {
5 | width: 100vw;
6 | height: 100vh;
7 | overflow: auto; }
8 |
9 | body {
10 | padding: 1em 2em 2em 17em;
11 | font-size: 16px;
12 | line-height: 1.6;
13 | font-family: 'Roboto', sans-serif; }
14 |
15 | .toc {
16 | position: fixed;
17 | left: 3em;
18 | top: 5em;
19 | padding: 1em;
20 | width: 14em;
21 | line-height: 2; }
22 | .toc ul {
23 | list-style: none;
24 | padding: 0;
25 | margin: 0; }
26 | .toc ul ul {
27 | padding-left: 2em; }
28 | .toc li a {
29 | display: inline-block;
30 | color: #aaa;
31 | text-decoration: none;
32 | transition: all 0.3s cubic-bezier(0.23, 1, 0.32, 1); }
33 | .toc li.visible > a {
34 | color: #111;
35 | transform: translate(5px); }
36 |
37 | .toc-marker {
38 | position: absolute;
39 | top: 0;
40 | left: 0;
41 | width: 100%;
42 | height: 100%;
43 | z-index: -1; }
44 | .toc-marker path {
45 | transition: all 0.3s ease; }
46 |
47 | .contents {
48 | padding: 1em;
49 | max-width: 800px;
50 | font-size: 1.2em;
51 | font-family: 'Frank Ruhl Libre', sans-serif; }
52 | .contents img {
53 | max-width: 100%; }
54 | .contents .code-block {
55 | white-space: pre;
56 | overflow: auto;
57 | max-width: 100%; }
58 | .contents .code-block code {
59 | display: block;
60 | background-color: #f9f9f9;
61 | padding: 10px; }
62 | .contents .code-inline {
63 | background-color: #f9f9f9;
64 | padding: 4px; }
65 | .contents h2
66 | h3 {
67 | padding-top: 1em; }
68 | .contents h2 {
69 | margin-top: 1.2em; }
70 |
71 | @media screen and (max-width: 1200px) {
72 | body {
73 | font-size: 14px; } }
74 |
--------------------------------------------------------------------------------
/progress-nav/style.scss:
--------------------------------------------------------------------------------
1 | $menuWidth: 14em;
2 | $menuPaddingLeft: 3em;
3 |
4 | * {
5 | box-sizing: border-box;
6 | }
7 |
8 | body {
9 | width: 100vw;
10 | height: 100vh;
11 | overflow: auto;
12 | }
13 |
14 | body {
15 | padding: 1em 2em 2em $menuWidth+$menuPaddingLeft;
16 | font-size: 16px;
17 | line-height: 1.6;
18 |
19 | font-family: 'Roboto', sans-serif;
20 | }
21 |
22 | .toc {
23 | position: fixed;
24 | left: $menuPaddingLeft;
25 | top: 5em;
26 | padding: 1em;
27 | width: $menuWidth;
28 | line-height: 2;
29 |
30 | ul {
31 | list-style: none;
32 | padding: 0;
33 | margin: 0;
34 | }
35 |
36 | ul ul {
37 | padding-left: 2em;
38 | }
39 |
40 | li a {
41 | display: inline-block;
42 | color: #aaa;
43 | text-decoration: none;
44 | transition: all 0.3s cubic-bezier(0.230, 1.000, 0.320, 1.000);
45 | }
46 |
47 | li.visible>a {
48 | color: #111;
49 | transform: translate( 5px );
50 | }
51 | }
52 |
53 | .toc-marker {
54 | position: absolute;
55 | top: 0;
56 | left: 0;
57 | width: 100%;
58 | height: 100%;
59 | z-index: -1;
60 |
61 | path {
62 | transition: all 0.3s ease;
63 | }
64 | }
65 |
66 | .contents {
67 | padding: 1em;
68 | max-width: 800px;
69 | font-size: 1.2em;
70 | font-family: 'Frank Ruhl Libre', sans-serif;
71 |
72 | img {
73 | max-width: 100%;
74 | }
75 |
76 | .code-block {
77 | white-space: pre;
78 | overflow: auto;
79 | max-width: 100%;
80 |
81 | code {
82 | display: block;
83 | background-color: #f9f9f9;
84 | padding: 10px;
85 | }
86 | }
87 |
88 | .code-inline {
89 | background-color: #f9f9f9;
90 | padding: 4px;
91 | }
92 |
93 | h2
94 | h3 {
95 | padding-top: 1em;
96 | }
97 |
98 |
99 | h2 {
100 | margin-top: 1.2em;
101 | }
102 | }
103 |
104 |
105 | @media screen and (max-width: 1200px) {
106 |
107 | body {
108 | font-size: 14px;
109 | }
110 |
111 | }
--------------------------------------------------------------------------------