├── .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 |
91 | Source on GitHub 92 | Follow @hakimel 93 | Tweet this 94 |
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 |
27 | Source on GitHub 28 | Follow @hakimel 29 | Tweet this 30 |
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 |
22 |
23 |
24 |
25 |
26 |
27 |
Works on desktops
28 |
Works on tablets
29 |
Works on phones
30 |
31 |
32 |
33 | 34 | 44 | 45 | 46 | 47 |
48 | Source on GitHub 49 | Follow @hakimel 50 | Tweet this 51 |
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 |
53 | Source on GitHub 54 | Follow @hakimel 55 | Tweet this 56 |
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 | 26 | 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 |
40 | Source on GitHub 41 | Tweet this 42 | Follow @hakimel 43 |
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 |
142 | Source on GitHub 143 | Follow @hakimel 144 | Tweet this 145 |
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 | 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 (Requires Pro)

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 (Requires Pro)

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 (Requires Pro)

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 |
229 | Follow @hakimel 230 | Source on GitHub 231 | More at hakim.se 232 |
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 | } --------------------------------------------------------------------------------