├── .babelrc ├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── timepicker.css ├── timepicker.es6.js ├── timepicker.js └── timepicker.png /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | [ 4 | "transform-react-remove-prop-types", 5 | { 6 | "mode": "wrap" 7 | } 8 | ] 9 | ], 10 | "presets": [ 11 | "env", 12 | "react" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![npm](https://nodei.co/npm/react-timepicker.png?downloads=true)](https://www.npmjs.com/package/react-timepicker) 2 | 3 | # react-timepicker 4 | `Timepicker` is a [React](https://facebook.github.io/react/) timepicker component that looks like Android KitKat one. 5 | 6 | ### Example 7 | [![Timepicker](https://raw.githubusercontent.com/radekmie/react-timepicker/master/timepicker.png)](https://jsfiddle.net/radekm/o7syg3q9/embedded/result/) 8 | 9 | ### Install 10 | From [npm](https://www.npmjs.com/package/react-timepicker) 11 | 12 | ```sh 13 | npm install react-timepicker --save 14 | ``` 15 | 16 | ### Quick Start 17 | ```javascript 18 | 'use strict'; 19 | 20 | import React from 'react'; 21 | import ReactDOM from 'react-dom'; 22 | import {Timepicker} from 'react-timepicker'; 23 | 24 | // Remember to include timepicker.css 25 | // If you can import CSS in JS: 26 | import 'react-timepicker/timepicker.css'; 27 | 28 | class TimepickerExample extends React.Component { 29 | onChange (hours, minutes) { 30 | // ... 31 | }, 32 | 33 | render () { 34 | return ( 35 | 36 | ); 37 | } 38 | } 39 | 40 | ReactDOM.render(, document.getElementById('timepicker-example')); 41 | ``` 42 | 43 | ### Prop Values 44 | #### mode 45 | `React.PropTypes.bool` 46 | 47 | Initial mode - `Timepicker.HOURS` or `Timepicker.MINUTES` **(default: `Timepicker.HOURS`)**. 48 | 49 | #### size 50 | `React.PropTypes.number` 51 | 52 | Clock size in pixels **(default: 300)**. 53 | 54 | #### radius 55 | `React.PropTypes.number` 56 | 57 | Clock radius in pixels **(default: 125)**. 58 | 59 | #### hours 60 | `React.PropTypes.number` 61 | 62 | Initial hours **(default: 0)**. 63 | 64 | #### minutes 65 | `React.PropTypes.number` 66 | 67 | Initial minutes **(default: 0)**. 68 | 69 | #### formatNumber 70 | `React.PropTypes.func.isRequired` 71 | 72 | Function `(number, 'info' | 'clock') => string` formatting numbers **(default: left pad with 0)** 73 | 74 | #### militaryTime 75 | `React.PropTypes.bool` 76 | 77 | Military (24-hour) time switch **(default: `true`)**. 78 | 79 | #### onChange 80 | `React.PropTypes.func` 81 | 82 | Callback function when a hour or a minute is changed. Passes 2 parameters: new hours and minutes. 83 | 84 | #### onChangeMode 85 | `React.PropTypes.func` 86 | 87 | Callback function when mode is changed. Passes 1 parameter: new mode. 88 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-timepicker", 3 | "version": "2.0.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-regex": { 8 | "version": "2.1.1", 9 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 10 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 11 | "dev": true 12 | }, 13 | "ansi-styles": { 14 | "version": "2.2.1", 15 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 16 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 17 | "dev": true 18 | }, 19 | "anymatch": { 20 | "version": "1.3.2", 21 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", 22 | "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", 23 | "dev": true, 24 | "optional": true, 25 | "requires": { 26 | "micromatch": "2.3.11", 27 | "normalize-path": "2.1.1" 28 | } 29 | }, 30 | "arr-diff": { 31 | "version": "2.0.0", 32 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 33 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", 34 | "dev": true, 35 | "optional": true, 36 | "requires": { 37 | "arr-flatten": "1.1.0" 38 | } 39 | }, 40 | "arr-flatten": { 41 | "version": "1.1.0", 42 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 43 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 44 | "dev": true, 45 | "optional": true 46 | }, 47 | "array-unique": { 48 | "version": "0.2.1", 49 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 50 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", 51 | "dev": true, 52 | "optional": true 53 | }, 54 | "async-each": { 55 | "version": "1.0.1", 56 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", 57 | "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", 58 | "dev": true, 59 | "optional": true 60 | }, 61 | "babel-cli": { 62 | "version": "6.26.0", 63 | "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", 64 | "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", 65 | "dev": true, 66 | "requires": { 67 | "babel-core": "6.26.0", 68 | "babel-polyfill": "6.26.0", 69 | "babel-register": "6.26.0", 70 | "babel-runtime": "6.26.0", 71 | "chokidar": "1.7.0", 72 | "commander": "2.11.0", 73 | "convert-source-map": "1.5.0", 74 | "fs-readdir-recursive": "1.0.0", 75 | "glob": "7.1.2", 76 | "lodash": "4.17.4", 77 | "output-file-sync": "1.1.2", 78 | "path-is-absolute": "1.0.1", 79 | "slash": "1.0.0", 80 | "source-map": "0.5.7", 81 | "v8flags": "2.1.1" 82 | } 83 | }, 84 | "babel-code-frame": { 85 | "version": "6.26.0", 86 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 87 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 88 | "dev": true, 89 | "requires": { 90 | "chalk": "1.1.3", 91 | "esutils": "2.0.2", 92 | "js-tokens": "3.0.2" 93 | } 94 | }, 95 | "babel-core": { 96 | "version": "6.26.0", 97 | "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", 98 | "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", 99 | "dev": true, 100 | "requires": { 101 | "babel-code-frame": "6.26.0", 102 | "babel-generator": "6.26.0", 103 | "babel-helpers": "6.24.1", 104 | "babel-messages": "6.23.0", 105 | "babel-register": "6.26.0", 106 | "babel-runtime": "6.26.0", 107 | "babel-template": "6.26.0", 108 | "babel-traverse": "6.26.0", 109 | "babel-types": "6.26.0", 110 | "babylon": "6.18.0", 111 | "convert-source-map": "1.5.0", 112 | "debug": "2.6.9", 113 | "json5": "0.5.1", 114 | "lodash": "4.17.4", 115 | "minimatch": "3.0.4", 116 | "path-is-absolute": "1.0.1", 117 | "private": "0.1.8", 118 | "slash": "1.0.0", 119 | "source-map": "0.5.7" 120 | } 121 | }, 122 | "babel-generator": { 123 | "version": "6.26.0", 124 | "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", 125 | "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", 126 | "dev": true, 127 | "requires": { 128 | "babel-messages": "6.23.0", 129 | "babel-runtime": "6.26.0", 130 | "babel-types": "6.26.0", 131 | "detect-indent": "4.0.0", 132 | "jsesc": "1.3.0", 133 | "lodash": "4.17.4", 134 | "source-map": "0.5.7", 135 | "trim-right": "1.0.1" 136 | } 137 | }, 138 | "babel-helper-builder-binary-assignment-operator-visitor": { 139 | "version": "6.24.1", 140 | "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", 141 | "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", 142 | "dev": true, 143 | "requires": { 144 | "babel-helper-explode-assignable-expression": "6.24.1", 145 | "babel-runtime": "6.26.0", 146 | "babel-types": "6.26.0" 147 | } 148 | }, 149 | "babel-helper-builder-react-jsx": { 150 | "version": "6.26.0", 151 | "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", 152 | "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", 153 | "dev": true, 154 | "requires": { 155 | "babel-runtime": "6.26.0", 156 | "babel-types": "6.26.0", 157 | "esutils": "2.0.2" 158 | } 159 | }, 160 | "babel-helper-call-delegate": { 161 | "version": "6.24.1", 162 | "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", 163 | "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", 164 | "dev": true, 165 | "requires": { 166 | "babel-helper-hoist-variables": "6.24.1", 167 | "babel-runtime": "6.26.0", 168 | "babel-traverse": "6.26.0", 169 | "babel-types": "6.26.0" 170 | } 171 | }, 172 | "babel-helper-define-map": { 173 | "version": "6.26.0", 174 | "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", 175 | "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", 176 | "dev": true, 177 | "requires": { 178 | "babel-helper-function-name": "6.24.1", 179 | "babel-runtime": "6.26.0", 180 | "babel-types": "6.26.0", 181 | "lodash": "4.17.4" 182 | } 183 | }, 184 | "babel-helper-explode-assignable-expression": { 185 | "version": "6.24.1", 186 | "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", 187 | "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", 188 | "dev": true, 189 | "requires": { 190 | "babel-runtime": "6.26.0", 191 | "babel-traverse": "6.26.0", 192 | "babel-types": "6.26.0" 193 | } 194 | }, 195 | "babel-helper-function-name": { 196 | "version": "6.24.1", 197 | "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", 198 | "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", 199 | "dev": true, 200 | "requires": { 201 | "babel-helper-get-function-arity": "6.24.1", 202 | "babel-runtime": "6.26.0", 203 | "babel-template": "6.26.0", 204 | "babel-traverse": "6.26.0", 205 | "babel-types": "6.26.0" 206 | } 207 | }, 208 | "babel-helper-get-function-arity": { 209 | "version": "6.24.1", 210 | "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", 211 | "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", 212 | "dev": true, 213 | "requires": { 214 | "babel-runtime": "6.26.0", 215 | "babel-types": "6.26.0" 216 | } 217 | }, 218 | "babel-helper-hoist-variables": { 219 | "version": "6.24.1", 220 | "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", 221 | "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", 222 | "dev": true, 223 | "requires": { 224 | "babel-runtime": "6.26.0", 225 | "babel-types": "6.26.0" 226 | } 227 | }, 228 | "babel-helper-optimise-call-expression": { 229 | "version": "6.24.1", 230 | "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", 231 | "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", 232 | "dev": true, 233 | "requires": { 234 | "babel-runtime": "6.26.0", 235 | "babel-types": "6.26.0" 236 | } 237 | }, 238 | "babel-helper-regex": { 239 | "version": "6.26.0", 240 | "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", 241 | "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", 242 | "dev": true, 243 | "requires": { 244 | "babel-runtime": "6.26.0", 245 | "babel-types": "6.26.0", 246 | "lodash": "4.17.4" 247 | } 248 | }, 249 | "babel-helper-remap-async-to-generator": { 250 | "version": "6.24.1", 251 | "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", 252 | "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", 253 | "dev": true, 254 | "requires": { 255 | "babel-helper-function-name": "6.24.1", 256 | "babel-runtime": "6.26.0", 257 | "babel-template": "6.26.0", 258 | "babel-traverse": "6.26.0", 259 | "babel-types": "6.26.0" 260 | } 261 | }, 262 | "babel-helper-replace-supers": { 263 | "version": "6.24.1", 264 | "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", 265 | "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", 266 | "dev": true, 267 | "requires": { 268 | "babel-helper-optimise-call-expression": "6.24.1", 269 | "babel-messages": "6.23.0", 270 | "babel-runtime": "6.26.0", 271 | "babel-template": "6.26.0", 272 | "babel-traverse": "6.26.0", 273 | "babel-types": "6.26.0" 274 | } 275 | }, 276 | "babel-helpers": { 277 | "version": "6.24.1", 278 | "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", 279 | "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", 280 | "dev": true, 281 | "requires": { 282 | "babel-runtime": "6.26.0", 283 | "babel-template": "6.26.0" 284 | } 285 | }, 286 | "babel-messages": { 287 | "version": "6.23.0", 288 | "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", 289 | "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", 290 | "dev": true, 291 | "requires": { 292 | "babel-runtime": "6.26.0" 293 | } 294 | }, 295 | "babel-plugin-check-es2015-constants": { 296 | "version": "6.22.0", 297 | "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", 298 | "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", 299 | "dev": true, 300 | "requires": { 301 | "babel-runtime": "6.26.0" 302 | } 303 | }, 304 | "babel-plugin-syntax-async-functions": { 305 | "version": "6.13.0", 306 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", 307 | "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", 308 | "dev": true 309 | }, 310 | "babel-plugin-syntax-exponentiation-operator": { 311 | "version": "6.13.0", 312 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", 313 | "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", 314 | "dev": true 315 | }, 316 | "babel-plugin-syntax-flow": { 317 | "version": "6.18.0", 318 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", 319 | "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", 320 | "dev": true 321 | }, 322 | "babel-plugin-syntax-jsx": { 323 | "version": "6.18.0", 324 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", 325 | "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", 326 | "dev": true 327 | }, 328 | "babel-plugin-syntax-trailing-function-commas": { 329 | "version": "6.22.0", 330 | "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", 331 | "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", 332 | "dev": true 333 | }, 334 | "babel-plugin-transform-async-to-generator": { 335 | "version": "6.24.1", 336 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", 337 | "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", 338 | "dev": true, 339 | "requires": { 340 | "babel-helper-remap-async-to-generator": "6.24.1", 341 | "babel-plugin-syntax-async-functions": "6.13.0", 342 | "babel-runtime": "6.26.0" 343 | } 344 | }, 345 | "babel-plugin-transform-es2015-arrow-functions": { 346 | "version": "6.22.0", 347 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", 348 | "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", 349 | "dev": true, 350 | "requires": { 351 | "babel-runtime": "6.26.0" 352 | } 353 | }, 354 | "babel-plugin-transform-es2015-block-scoped-functions": { 355 | "version": "6.22.0", 356 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", 357 | "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", 358 | "dev": true, 359 | "requires": { 360 | "babel-runtime": "6.26.0" 361 | } 362 | }, 363 | "babel-plugin-transform-es2015-block-scoping": { 364 | "version": "6.26.0", 365 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", 366 | "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", 367 | "dev": true, 368 | "requires": { 369 | "babel-runtime": "6.26.0", 370 | "babel-template": "6.26.0", 371 | "babel-traverse": "6.26.0", 372 | "babel-types": "6.26.0", 373 | "lodash": "4.17.4" 374 | } 375 | }, 376 | "babel-plugin-transform-es2015-classes": { 377 | "version": "6.24.1", 378 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", 379 | "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", 380 | "dev": true, 381 | "requires": { 382 | "babel-helper-define-map": "6.26.0", 383 | "babel-helper-function-name": "6.24.1", 384 | "babel-helper-optimise-call-expression": "6.24.1", 385 | "babel-helper-replace-supers": "6.24.1", 386 | "babel-messages": "6.23.0", 387 | "babel-runtime": "6.26.0", 388 | "babel-template": "6.26.0", 389 | "babel-traverse": "6.26.0", 390 | "babel-types": "6.26.0" 391 | } 392 | }, 393 | "babel-plugin-transform-es2015-computed-properties": { 394 | "version": "6.24.1", 395 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", 396 | "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", 397 | "dev": true, 398 | "requires": { 399 | "babel-runtime": "6.26.0", 400 | "babel-template": "6.26.0" 401 | } 402 | }, 403 | "babel-plugin-transform-es2015-destructuring": { 404 | "version": "6.23.0", 405 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", 406 | "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", 407 | "dev": true, 408 | "requires": { 409 | "babel-runtime": "6.26.0" 410 | } 411 | }, 412 | "babel-plugin-transform-es2015-duplicate-keys": { 413 | "version": "6.24.1", 414 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", 415 | "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", 416 | "dev": true, 417 | "requires": { 418 | "babel-runtime": "6.26.0", 419 | "babel-types": "6.26.0" 420 | } 421 | }, 422 | "babel-plugin-transform-es2015-for-of": { 423 | "version": "6.23.0", 424 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", 425 | "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", 426 | "dev": true, 427 | "requires": { 428 | "babel-runtime": "6.26.0" 429 | } 430 | }, 431 | "babel-plugin-transform-es2015-function-name": { 432 | "version": "6.24.1", 433 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", 434 | "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", 435 | "dev": true, 436 | "requires": { 437 | "babel-helper-function-name": "6.24.1", 438 | "babel-runtime": "6.26.0", 439 | "babel-types": "6.26.0" 440 | } 441 | }, 442 | "babel-plugin-transform-es2015-literals": { 443 | "version": "6.22.0", 444 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", 445 | "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", 446 | "dev": true, 447 | "requires": { 448 | "babel-runtime": "6.26.0" 449 | } 450 | }, 451 | "babel-plugin-transform-es2015-modules-amd": { 452 | "version": "6.24.1", 453 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", 454 | "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", 455 | "dev": true, 456 | "requires": { 457 | "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", 458 | "babel-runtime": "6.26.0", 459 | "babel-template": "6.26.0" 460 | } 461 | }, 462 | "babel-plugin-transform-es2015-modules-commonjs": { 463 | "version": "6.26.0", 464 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", 465 | "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", 466 | "dev": true, 467 | "requires": { 468 | "babel-plugin-transform-strict-mode": "6.24.1", 469 | "babel-runtime": "6.26.0", 470 | "babel-template": "6.26.0", 471 | "babel-types": "6.26.0" 472 | } 473 | }, 474 | "babel-plugin-transform-es2015-modules-systemjs": { 475 | "version": "6.24.1", 476 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", 477 | "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", 478 | "dev": true, 479 | "requires": { 480 | "babel-helper-hoist-variables": "6.24.1", 481 | "babel-runtime": "6.26.0", 482 | "babel-template": "6.26.0" 483 | } 484 | }, 485 | "babel-plugin-transform-es2015-modules-umd": { 486 | "version": "6.24.1", 487 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", 488 | "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", 489 | "dev": true, 490 | "requires": { 491 | "babel-plugin-transform-es2015-modules-amd": "6.24.1", 492 | "babel-runtime": "6.26.0", 493 | "babel-template": "6.26.0" 494 | } 495 | }, 496 | "babel-plugin-transform-es2015-object-super": { 497 | "version": "6.24.1", 498 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", 499 | "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", 500 | "dev": true, 501 | "requires": { 502 | "babel-helper-replace-supers": "6.24.1", 503 | "babel-runtime": "6.26.0" 504 | } 505 | }, 506 | "babel-plugin-transform-es2015-parameters": { 507 | "version": "6.24.1", 508 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", 509 | "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", 510 | "dev": true, 511 | "requires": { 512 | "babel-helper-call-delegate": "6.24.1", 513 | "babel-helper-get-function-arity": "6.24.1", 514 | "babel-runtime": "6.26.0", 515 | "babel-template": "6.26.0", 516 | "babel-traverse": "6.26.0", 517 | "babel-types": "6.26.0" 518 | } 519 | }, 520 | "babel-plugin-transform-es2015-shorthand-properties": { 521 | "version": "6.24.1", 522 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", 523 | "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", 524 | "dev": true, 525 | "requires": { 526 | "babel-runtime": "6.26.0", 527 | "babel-types": "6.26.0" 528 | } 529 | }, 530 | "babel-plugin-transform-es2015-spread": { 531 | "version": "6.22.0", 532 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", 533 | "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", 534 | "dev": true, 535 | "requires": { 536 | "babel-runtime": "6.26.0" 537 | } 538 | }, 539 | "babel-plugin-transform-es2015-sticky-regex": { 540 | "version": "6.24.1", 541 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", 542 | "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", 543 | "dev": true, 544 | "requires": { 545 | "babel-helper-regex": "6.26.0", 546 | "babel-runtime": "6.26.0", 547 | "babel-types": "6.26.0" 548 | } 549 | }, 550 | "babel-plugin-transform-es2015-template-literals": { 551 | "version": "6.22.0", 552 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", 553 | "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", 554 | "dev": true, 555 | "requires": { 556 | "babel-runtime": "6.26.0" 557 | } 558 | }, 559 | "babel-plugin-transform-es2015-typeof-symbol": { 560 | "version": "6.23.0", 561 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", 562 | "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", 563 | "dev": true, 564 | "requires": { 565 | "babel-runtime": "6.26.0" 566 | } 567 | }, 568 | "babel-plugin-transform-es2015-unicode-regex": { 569 | "version": "6.24.1", 570 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", 571 | "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", 572 | "dev": true, 573 | "requires": { 574 | "babel-helper-regex": "6.26.0", 575 | "babel-runtime": "6.26.0", 576 | "regexpu-core": "2.0.0" 577 | } 578 | }, 579 | "babel-plugin-transform-exponentiation-operator": { 580 | "version": "6.24.1", 581 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", 582 | "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", 583 | "dev": true, 584 | "requires": { 585 | "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", 586 | "babel-plugin-syntax-exponentiation-operator": "6.13.0", 587 | "babel-runtime": "6.26.0" 588 | } 589 | }, 590 | "babel-plugin-transform-flow-strip-types": { 591 | "version": "6.22.0", 592 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", 593 | "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", 594 | "dev": true, 595 | "requires": { 596 | "babel-plugin-syntax-flow": "6.18.0", 597 | "babel-runtime": "6.26.0" 598 | } 599 | }, 600 | "babel-plugin-transform-react-display-name": { 601 | "version": "6.25.0", 602 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", 603 | "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", 604 | "dev": true, 605 | "requires": { 606 | "babel-runtime": "6.26.0" 607 | } 608 | }, 609 | "babel-plugin-transform-react-jsx": { 610 | "version": "6.24.1", 611 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", 612 | "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", 613 | "dev": true, 614 | "requires": { 615 | "babel-helper-builder-react-jsx": "6.26.0", 616 | "babel-plugin-syntax-jsx": "6.18.0", 617 | "babel-runtime": "6.26.0" 618 | } 619 | }, 620 | "babel-plugin-transform-react-jsx-self": { 621 | "version": "6.22.0", 622 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", 623 | "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", 624 | "dev": true, 625 | "requires": { 626 | "babel-plugin-syntax-jsx": "6.18.0", 627 | "babel-runtime": "6.26.0" 628 | } 629 | }, 630 | "babel-plugin-transform-react-jsx-source": { 631 | "version": "6.22.0", 632 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", 633 | "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", 634 | "dev": true, 635 | "requires": { 636 | "babel-plugin-syntax-jsx": "6.18.0", 637 | "babel-runtime": "6.26.0" 638 | } 639 | }, 640 | "babel-plugin-transform-react-remove-prop-types": { 641 | "version": "0.4.10", 642 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.10.tgz", 643 | "integrity": "sha512-JlT+Bsnuk5gRroIm2Wl4k0e84bVCtqPEfbijvF3Gl8o5+CTrs/lwRiXhZh2cVeHt/KLA89sU9tCkawY8gLoizA==", 644 | "dev": true 645 | }, 646 | "babel-plugin-transform-regenerator": { 647 | "version": "6.26.0", 648 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", 649 | "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", 650 | "dev": true, 651 | "requires": { 652 | "regenerator-transform": "0.10.1" 653 | } 654 | }, 655 | "babel-plugin-transform-strict-mode": { 656 | "version": "6.24.1", 657 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", 658 | "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", 659 | "dev": true, 660 | "requires": { 661 | "babel-runtime": "6.26.0", 662 | "babel-types": "6.26.0" 663 | } 664 | }, 665 | "babel-polyfill": { 666 | "version": "6.26.0", 667 | "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", 668 | "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", 669 | "dev": true, 670 | "requires": { 671 | "babel-runtime": "6.26.0", 672 | "core-js": "2.5.1", 673 | "regenerator-runtime": "0.10.5" 674 | }, 675 | "dependencies": { 676 | "regenerator-runtime": { 677 | "version": "0.10.5", 678 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", 679 | "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", 680 | "dev": true 681 | } 682 | } 683 | }, 684 | "babel-preset-env": { 685 | "version": "1.6.1", 686 | "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", 687 | "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", 688 | "dev": true, 689 | "requires": { 690 | "babel-plugin-check-es2015-constants": "6.22.0", 691 | "babel-plugin-syntax-trailing-function-commas": "6.22.0", 692 | "babel-plugin-transform-async-to-generator": "6.24.1", 693 | "babel-plugin-transform-es2015-arrow-functions": "6.22.0", 694 | "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", 695 | "babel-plugin-transform-es2015-block-scoping": "6.26.0", 696 | "babel-plugin-transform-es2015-classes": "6.24.1", 697 | "babel-plugin-transform-es2015-computed-properties": "6.24.1", 698 | "babel-plugin-transform-es2015-destructuring": "6.23.0", 699 | "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", 700 | "babel-plugin-transform-es2015-for-of": "6.23.0", 701 | "babel-plugin-transform-es2015-function-name": "6.24.1", 702 | "babel-plugin-transform-es2015-literals": "6.22.0", 703 | "babel-plugin-transform-es2015-modules-amd": "6.24.1", 704 | "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", 705 | "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", 706 | "babel-plugin-transform-es2015-modules-umd": "6.24.1", 707 | "babel-plugin-transform-es2015-object-super": "6.24.1", 708 | "babel-plugin-transform-es2015-parameters": "6.24.1", 709 | "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", 710 | "babel-plugin-transform-es2015-spread": "6.22.0", 711 | "babel-plugin-transform-es2015-sticky-regex": "6.24.1", 712 | "babel-plugin-transform-es2015-template-literals": "6.22.0", 713 | "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", 714 | "babel-plugin-transform-es2015-unicode-regex": "6.24.1", 715 | "babel-plugin-transform-exponentiation-operator": "6.24.1", 716 | "babel-plugin-transform-regenerator": "6.26.0", 717 | "browserslist": "2.5.1", 718 | "invariant": "2.2.2", 719 | "semver": "5.4.1" 720 | } 721 | }, 722 | "babel-preset-flow": { 723 | "version": "6.23.0", 724 | "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", 725 | "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", 726 | "dev": true, 727 | "requires": { 728 | "babel-plugin-transform-flow-strip-types": "6.22.0" 729 | } 730 | }, 731 | "babel-preset-react": { 732 | "version": "6.24.1", 733 | "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", 734 | "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", 735 | "dev": true, 736 | "requires": { 737 | "babel-plugin-syntax-jsx": "6.18.0", 738 | "babel-plugin-transform-react-display-name": "6.25.0", 739 | "babel-plugin-transform-react-jsx": "6.24.1", 740 | "babel-plugin-transform-react-jsx-self": "6.22.0", 741 | "babel-plugin-transform-react-jsx-source": "6.22.0", 742 | "babel-preset-flow": "6.23.0" 743 | } 744 | }, 745 | "babel-register": { 746 | "version": "6.26.0", 747 | "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", 748 | "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", 749 | "dev": true, 750 | "requires": { 751 | "babel-core": "6.26.0", 752 | "babel-runtime": "6.26.0", 753 | "core-js": "2.5.1", 754 | "home-or-tmp": "2.0.0", 755 | "lodash": "4.17.4", 756 | "mkdirp": "0.5.1", 757 | "source-map-support": "0.4.18" 758 | } 759 | }, 760 | "babel-runtime": { 761 | "version": "6.26.0", 762 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 763 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 764 | "dev": true, 765 | "requires": { 766 | "core-js": "2.5.1", 767 | "regenerator-runtime": "0.11.0" 768 | } 769 | }, 770 | "babel-template": { 771 | "version": "6.26.0", 772 | "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", 773 | "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", 774 | "dev": true, 775 | "requires": { 776 | "babel-runtime": "6.26.0", 777 | "babel-traverse": "6.26.0", 778 | "babel-types": "6.26.0", 779 | "babylon": "6.18.0", 780 | "lodash": "4.17.4" 781 | } 782 | }, 783 | "babel-traverse": { 784 | "version": "6.26.0", 785 | "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", 786 | "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", 787 | "dev": true, 788 | "requires": { 789 | "babel-code-frame": "6.26.0", 790 | "babel-messages": "6.23.0", 791 | "babel-runtime": "6.26.0", 792 | "babel-types": "6.26.0", 793 | "babylon": "6.18.0", 794 | "debug": "2.6.9", 795 | "globals": "9.18.0", 796 | "invariant": "2.2.2", 797 | "lodash": "4.17.4" 798 | } 799 | }, 800 | "babel-types": { 801 | "version": "6.26.0", 802 | "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", 803 | "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", 804 | "dev": true, 805 | "requires": { 806 | "babel-runtime": "6.26.0", 807 | "esutils": "2.0.2", 808 | "lodash": "4.17.4", 809 | "to-fast-properties": "1.0.3" 810 | } 811 | }, 812 | "babylon": { 813 | "version": "6.18.0", 814 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", 815 | "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", 816 | "dev": true 817 | }, 818 | "balanced-match": { 819 | "version": "1.0.0", 820 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 821 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 822 | "dev": true 823 | }, 824 | "binary-extensions": { 825 | "version": "1.10.0", 826 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", 827 | "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", 828 | "dev": true, 829 | "optional": true 830 | }, 831 | "brace-expansion": { 832 | "version": "1.1.8", 833 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 834 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 835 | "dev": true, 836 | "requires": { 837 | "balanced-match": "1.0.0", 838 | "concat-map": "0.0.1" 839 | } 840 | }, 841 | "braces": { 842 | "version": "1.8.5", 843 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 844 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", 845 | "dev": true, 846 | "optional": true, 847 | "requires": { 848 | "expand-range": "1.8.2", 849 | "preserve": "0.2.0", 850 | "repeat-element": "1.1.2" 851 | } 852 | }, 853 | "browserslist": { 854 | "version": "2.5.1", 855 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.5.1.tgz", 856 | "integrity": "sha512-jAvM2ku7YDJ+leAq3bFH1DE0Ylw+F+EQDq4GkqZfgPEqpWYw9ofQH85uKSB9r3Tv7XDbfqVtE+sdvKJW7IlPJA==", 857 | "dev": true, 858 | "requires": { 859 | "caniuse-lite": "1.0.30000748", 860 | "electron-to-chromium": "1.3.26" 861 | } 862 | }, 863 | "caniuse-lite": { 864 | "version": "1.0.30000748", 865 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000748.tgz", 866 | "integrity": "sha1-RMjW2lKtZaXXudyk7+vQvdmCugk=", 867 | "dev": true 868 | }, 869 | "chalk": { 870 | "version": "1.1.3", 871 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 872 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 873 | "dev": true, 874 | "requires": { 875 | "ansi-styles": "2.2.1", 876 | "escape-string-regexp": "1.0.5", 877 | "has-ansi": "2.0.0", 878 | "strip-ansi": "3.0.1", 879 | "supports-color": "2.0.0" 880 | } 881 | }, 882 | "chokidar": { 883 | "version": "1.7.0", 884 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", 885 | "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", 886 | "dev": true, 887 | "optional": true, 888 | "requires": { 889 | "anymatch": "1.3.2", 890 | "async-each": "1.0.1", 891 | "glob-parent": "2.0.0", 892 | "inherits": "2.0.3", 893 | "is-binary-path": "1.0.1", 894 | "is-glob": "2.0.1", 895 | "path-is-absolute": "1.0.1", 896 | "readdirp": "2.1.0" 897 | } 898 | }, 899 | "commander": { 900 | "version": "2.11.0", 901 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 902 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 903 | "dev": true 904 | }, 905 | "concat-map": { 906 | "version": "0.0.1", 907 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 908 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 909 | "dev": true 910 | }, 911 | "convert-source-map": { 912 | "version": "1.5.0", 913 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", 914 | "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", 915 | "dev": true 916 | }, 917 | "core-js": { 918 | "version": "2.5.1", 919 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", 920 | "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", 921 | "dev": true 922 | }, 923 | "core-util-is": { 924 | "version": "1.0.2", 925 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 926 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 927 | "dev": true, 928 | "optional": true 929 | }, 930 | "debug": { 931 | "version": "2.6.9", 932 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 933 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 934 | "dev": true, 935 | "requires": { 936 | "ms": "2.0.0" 937 | } 938 | }, 939 | "detect-indent": { 940 | "version": "4.0.0", 941 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", 942 | "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", 943 | "dev": true, 944 | "requires": { 945 | "repeating": "2.0.1" 946 | } 947 | }, 948 | "electron-to-chromium": { 949 | "version": "1.3.26", 950 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.26.tgz", 951 | "integrity": "sha1-mWQnKUhhp02cfIK5Jg6jAejALWY=", 952 | "dev": true 953 | }, 954 | "escape-string-regexp": { 955 | "version": "1.0.5", 956 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 957 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 958 | "dev": true 959 | }, 960 | "esutils": { 961 | "version": "2.0.2", 962 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 963 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 964 | "dev": true 965 | }, 966 | "expand-brackets": { 967 | "version": "0.1.5", 968 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 969 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", 970 | "dev": true, 971 | "optional": true, 972 | "requires": { 973 | "is-posix-bracket": "0.1.1" 974 | } 975 | }, 976 | "expand-range": { 977 | "version": "1.8.2", 978 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 979 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", 980 | "dev": true, 981 | "optional": true, 982 | "requires": { 983 | "fill-range": "2.2.3" 984 | } 985 | }, 986 | "extglob": { 987 | "version": "0.3.2", 988 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 989 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", 990 | "dev": true, 991 | "optional": true, 992 | "requires": { 993 | "is-extglob": "1.0.0" 994 | } 995 | }, 996 | "filename-regex": { 997 | "version": "2.0.1", 998 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 999 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", 1000 | "dev": true, 1001 | "optional": true 1002 | }, 1003 | "fill-range": { 1004 | "version": "2.2.3", 1005 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", 1006 | "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", 1007 | "dev": true, 1008 | "optional": true, 1009 | "requires": { 1010 | "is-number": "2.1.0", 1011 | "isobject": "2.1.0", 1012 | "randomatic": "1.1.7", 1013 | "repeat-element": "1.1.2", 1014 | "repeat-string": "1.6.1" 1015 | } 1016 | }, 1017 | "for-in": { 1018 | "version": "1.0.2", 1019 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 1020 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 1021 | "dev": true, 1022 | "optional": true 1023 | }, 1024 | "for-own": { 1025 | "version": "0.1.5", 1026 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 1027 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 1028 | "dev": true, 1029 | "optional": true, 1030 | "requires": { 1031 | "for-in": "1.0.2" 1032 | } 1033 | }, 1034 | "fs-readdir-recursive": { 1035 | "version": "1.0.0", 1036 | "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz", 1037 | "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=", 1038 | "dev": true 1039 | }, 1040 | "fs.realpath": { 1041 | "version": "1.0.0", 1042 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1043 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1044 | "dev": true 1045 | }, 1046 | "glob": { 1047 | "version": "7.1.2", 1048 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 1049 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 1050 | "dev": true, 1051 | "requires": { 1052 | "fs.realpath": "1.0.0", 1053 | "inflight": "1.0.6", 1054 | "inherits": "2.0.3", 1055 | "minimatch": "3.0.4", 1056 | "once": "1.4.0", 1057 | "path-is-absolute": "1.0.1" 1058 | } 1059 | }, 1060 | "glob-base": { 1061 | "version": "0.3.0", 1062 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 1063 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", 1064 | "dev": true, 1065 | "optional": true, 1066 | "requires": { 1067 | "glob-parent": "2.0.0", 1068 | "is-glob": "2.0.1" 1069 | } 1070 | }, 1071 | "glob-parent": { 1072 | "version": "2.0.0", 1073 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 1074 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", 1075 | "dev": true, 1076 | "requires": { 1077 | "is-glob": "2.0.1" 1078 | } 1079 | }, 1080 | "globals": { 1081 | "version": "9.18.0", 1082 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", 1083 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", 1084 | "dev": true 1085 | }, 1086 | "graceful-fs": { 1087 | "version": "4.1.11", 1088 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 1089 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 1090 | "dev": true 1091 | }, 1092 | "has-ansi": { 1093 | "version": "2.0.0", 1094 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1095 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1096 | "dev": true, 1097 | "requires": { 1098 | "ansi-regex": "2.1.1" 1099 | } 1100 | }, 1101 | "home-or-tmp": { 1102 | "version": "2.0.0", 1103 | "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", 1104 | "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", 1105 | "dev": true, 1106 | "requires": { 1107 | "os-homedir": "1.0.2", 1108 | "os-tmpdir": "1.0.2" 1109 | } 1110 | }, 1111 | "inflight": { 1112 | "version": "1.0.6", 1113 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1114 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1115 | "dev": true, 1116 | "requires": { 1117 | "once": "1.4.0", 1118 | "wrappy": "1.0.2" 1119 | } 1120 | }, 1121 | "inherits": { 1122 | "version": "2.0.3", 1123 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1124 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 1125 | "dev": true 1126 | }, 1127 | "invariant": { 1128 | "version": "2.2.2", 1129 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", 1130 | "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", 1131 | "dev": true, 1132 | "requires": { 1133 | "loose-envify": "1.3.1" 1134 | } 1135 | }, 1136 | "is-binary-path": { 1137 | "version": "1.0.1", 1138 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", 1139 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", 1140 | "dev": true, 1141 | "optional": true, 1142 | "requires": { 1143 | "binary-extensions": "1.10.0" 1144 | } 1145 | }, 1146 | "is-buffer": { 1147 | "version": "1.1.5", 1148 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", 1149 | "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", 1150 | "dev": true 1151 | }, 1152 | "is-dotfile": { 1153 | "version": "1.0.3", 1154 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 1155 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", 1156 | "dev": true, 1157 | "optional": true 1158 | }, 1159 | "is-equal-shallow": { 1160 | "version": "0.1.3", 1161 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 1162 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", 1163 | "dev": true, 1164 | "optional": true, 1165 | "requires": { 1166 | "is-primitive": "2.0.0" 1167 | } 1168 | }, 1169 | "is-extendable": { 1170 | "version": "0.1.1", 1171 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1172 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 1173 | "dev": true, 1174 | "optional": true 1175 | }, 1176 | "is-extglob": { 1177 | "version": "1.0.0", 1178 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 1179 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 1180 | "dev": true 1181 | }, 1182 | "is-finite": { 1183 | "version": "1.0.2", 1184 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 1185 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 1186 | "dev": true, 1187 | "requires": { 1188 | "number-is-nan": "1.0.1" 1189 | } 1190 | }, 1191 | "is-glob": { 1192 | "version": "2.0.1", 1193 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 1194 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 1195 | "dev": true, 1196 | "requires": { 1197 | "is-extglob": "1.0.0" 1198 | } 1199 | }, 1200 | "is-number": { 1201 | "version": "2.1.0", 1202 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 1203 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", 1204 | "dev": true, 1205 | "optional": true, 1206 | "requires": { 1207 | "kind-of": "3.2.2" 1208 | } 1209 | }, 1210 | "is-posix-bracket": { 1211 | "version": "0.1.1", 1212 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 1213 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", 1214 | "dev": true, 1215 | "optional": true 1216 | }, 1217 | "is-primitive": { 1218 | "version": "2.0.0", 1219 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 1220 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", 1221 | "dev": true, 1222 | "optional": true 1223 | }, 1224 | "isarray": { 1225 | "version": "1.0.0", 1226 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1227 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1228 | "dev": true 1229 | }, 1230 | "isobject": { 1231 | "version": "2.1.0", 1232 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 1233 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 1234 | "dev": true, 1235 | "optional": true, 1236 | "requires": { 1237 | "isarray": "1.0.0" 1238 | } 1239 | }, 1240 | "js-tokens": { 1241 | "version": "3.0.2", 1242 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1243 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1244 | "dev": true 1245 | }, 1246 | "jsesc": { 1247 | "version": "1.3.0", 1248 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", 1249 | "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", 1250 | "dev": true 1251 | }, 1252 | "json5": { 1253 | "version": "0.5.1", 1254 | "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", 1255 | "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", 1256 | "dev": true 1257 | }, 1258 | "kind-of": { 1259 | "version": "3.2.2", 1260 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1261 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1262 | "dev": true, 1263 | "requires": { 1264 | "is-buffer": "1.1.5" 1265 | } 1266 | }, 1267 | "lodash": { 1268 | "version": "4.17.4", 1269 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 1270 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 1271 | "dev": true 1272 | }, 1273 | "loose-envify": { 1274 | "version": "1.3.1", 1275 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", 1276 | "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", 1277 | "dev": true, 1278 | "requires": { 1279 | "js-tokens": "3.0.2" 1280 | } 1281 | }, 1282 | "micromatch": { 1283 | "version": "2.3.11", 1284 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 1285 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", 1286 | "dev": true, 1287 | "optional": true, 1288 | "requires": { 1289 | "arr-diff": "2.0.0", 1290 | "array-unique": "0.2.1", 1291 | "braces": "1.8.5", 1292 | "expand-brackets": "0.1.5", 1293 | "extglob": "0.3.2", 1294 | "filename-regex": "2.0.1", 1295 | "is-extglob": "1.0.0", 1296 | "is-glob": "2.0.1", 1297 | "kind-of": "3.2.2", 1298 | "normalize-path": "2.1.1", 1299 | "object.omit": "2.0.1", 1300 | "parse-glob": "3.0.4", 1301 | "regex-cache": "0.4.4" 1302 | } 1303 | }, 1304 | "minimatch": { 1305 | "version": "3.0.4", 1306 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1307 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1308 | "dev": true, 1309 | "requires": { 1310 | "brace-expansion": "1.1.8" 1311 | } 1312 | }, 1313 | "minimist": { 1314 | "version": "0.0.8", 1315 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1316 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1317 | "dev": true 1318 | }, 1319 | "mkdirp": { 1320 | "version": "0.5.1", 1321 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1322 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1323 | "dev": true, 1324 | "requires": { 1325 | "minimist": "0.0.8" 1326 | } 1327 | }, 1328 | "ms": { 1329 | "version": "2.0.0", 1330 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1331 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1332 | "dev": true 1333 | }, 1334 | "normalize-path": { 1335 | "version": "2.1.1", 1336 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1337 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 1338 | "dev": true, 1339 | "requires": { 1340 | "remove-trailing-separator": "1.1.0" 1341 | } 1342 | }, 1343 | "number-is-nan": { 1344 | "version": "1.0.1", 1345 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1346 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 1347 | "dev": true 1348 | }, 1349 | "object-assign": { 1350 | "version": "4.1.1", 1351 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1352 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1353 | "dev": true 1354 | }, 1355 | "object.omit": { 1356 | "version": "2.0.1", 1357 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 1358 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", 1359 | "dev": true, 1360 | "optional": true, 1361 | "requires": { 1362 | "for-own": "0.1.5", 1363 | "is-extendable": "0.1.1" 1364 | } 1365 | }, 1366 | "once": { 1367 | "version": "1.4.0", 1368 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1369 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1370 | "dev": true, 1371 | "requires": { 1372 | "wrappy": "1.0.2" 1373 | } 1374 | }, 1375 | "os-homedir": { 1376 | "version": "1.0.2", 1377 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1378 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1379 | "dev": true 1380 | }, 1381 | "os-tmpdir": { 1382 | "version": "1.0.2", 1383 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1384 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1385 | "dev": true 1386 | }, 1387 | "output-file-sync": { 1388 | "version": "1.1.2", 1389 | "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", 1390 | "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", 1391 | "dev": true, 1392 | "requires": { 1393 | "graceful-fs": "4.1.11", 1394 | "mkdirp": "0.5.1", 1395 | "object-assign": "4.1.1" 1396 | } 1397 | }, 1398 | "parse-glob": { 1399 | "version": "3.0.4", 1400 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 1401 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", 1402 | "dev": true, 1403 | "optional": true, 1404 | "requires": { 1405 | "glob-base": "0.3.0", 1406 | "is-dotfile": "1.0.3", 1407 | "is-extglob": "1.0.0", 1408 | "is-glob": "2.0.1" 1409 | } 1410 | }, 1411 | "path-is-absolute": { 1412 | "version": "1.0.1", 1413 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1414 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1415 | "dev": true 1416 | }, 1417 | "preserve": { 1418 | "version": "0.2.0", 1419 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 1420 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", 1421 | "dev": true, 1422 | "optional": true 1423 | }, 1424 | "private": { 1425 | "version": "0.1.8", 1426 | "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", 1427 | "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", 1428 | "dev": true 1429 | }, 1430 | "process-nextick-args": { 1431 | "version": "1.0.7", 1432 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1433 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1434 | "dev": true, 1435 | "optional": true 1436 | }, 1437 | "randomatic": { 1438 | "version": "1.1.7", 1439 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", 1440 | "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", 1441 | "dev": true, 1442 | "optional": true, 1443 | "requires": { 1444 | "is-number": "3.0.0", 1445 | "kind-of": "4.0.0" 1446 | }, 1447 | "dependencies": { 1448 | "is-number": { 1449 | "version": "3.0.0", 1450 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 1451 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 1452 | "dev": true, 1453 | "optional": true, 1454 | "requires": { 1455 | "kind-of": "3.2.2" 1456 | }, 1457 | "dependencies": { 1458 | "kind-of": { 1459 | "version": "3.2.2", 1460 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1461 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1462 | "dev": true, 1463 | "optional": true, 1464 | "requires": { 1465 | "is-buffer": "1.1.5" 1466 | } 1467 | } 1468 | } 1469 | }, 1470 | "kind-of": { 1471 | "version": "4.0.0", 1472 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 1473 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 1474 | "dev": true, 1475 | "optional": true, 1476 | "requires": { 1477 | "is-buffer": "1.1.5" 1478 | } 1479 | } 1480 | } 1481 | }, 1482 | "readable-stream": { 1483 | "version": "2.3.3", 1484 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 1485 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 1486 | "dev": true, 1487 | "optional": true, 1488 | "requires": { 1489 | "core-util-is": "1.0.2", 1490 | "inherits": "2.0.3", 1491 | "isarray": "1.0.0", 1492 | "process-nextick-args": "1.0.7", 1493 | "safe-buffer": "5.1.1", 1494 | "string_decoder": "1.0.3", 1495 | "util-deprecate": "1.0.2" 1496 | } 1497 | }, 1498 | "readdirp": { 1499 | "version": "2.1.0", 1500 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", 1501 | "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", 1502 | "dev": true, 1503 | "optional": true, 1504 | "requires": { 1505 | "graceful-fs": "4.1.11", 1506 | "minimatch": "3.0.4", 1507 | "readable-stream": "2.3.3", 1508 | "set-immediate-shim": "1.0.1" 1509 | } 1510 | }, 1511 | "regenerate": { 1512 | "version": "1.3.3", 1513 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", 1514 | "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", 1515 | "dev": true 1516 | }, 1517 | "regenerator-runtime": { 1518 | "version": "0.11.0", 1519 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", 1520 | "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", 1521 | "dev": true 1522 | }, 1523 | "regenerator-transform": { 1524 | "version": "0.10.1", 1525 | "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", 1526 | "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", 1527 | "dev": true, 1528 | "requires": { 1529 | "babel-runtime": "6.26.0", 1530 | "babel-types": "6.26.0", 1531 | "private": "0.1.8" 1532 | } 1533 | }, 1534 | "regex-cache": { 1535 | "version": "0.4.4", 1536 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", 1537 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", 1538 | "dev": true, 1539 | "optional": true, 1540 | "requires": { 1541 | "is-equal-shallow": "0.1.3" 1542 | } 1543 | }, 1544 | "regexpu-core": { 1545 | "version": "2.0.0", 1546 | "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", 1547 | "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", 1548 | "dev": true, 1549 | "requires": { 1550 | "regenerate": "1.3.3", 1551 | "regjsgen": "0.2.0", 1552 | "regjsparser": "0.1.5" 1553 | } 1554 | }, 1555 | "regjsgen": { 1556 | "version": "0.2.0", 1557 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", 1558 | "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", 1559 | "dev": true 1560 | }, 1561 | "regjsparser": { 1562 | "version": "0.1.5", 1563 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", 1564 | "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", 1565 | "dev": true, 1566 | "requires": { 1567 | "jsesc": "0.5.0" 1568 | }, 1569 | "dependencies": { 1570 | "jsesc": { 1571 | "version": "0.5.0", 1572 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", 1573 | "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", 1574 | "dev": true 1575 | } 1576 | } 1577 | }, 1578 | "remove-trailing-separator": { 1579 | "version": "1.1.0", 1580 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 1581 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 1582 | "dev": true 1583 | }, 1584 | "repeat-element": { 1585 | "version": "1.1.2", 1586 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", 1587 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", 1588 | "dev": true 1589 | }, 1590 | "repeat-string": { 1591 | "version": "1.6.1", 1592 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1593 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 1594 | "dev": true, 1595 | "optional": true 1596 | }, 1597 | "repeating": { 1598 | "version": "2.0.1", 1599 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 1600 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 1601 | "dev": true, 1602 | "requires": { 1603 | "is-finite": "1.0.2" 1604 | } 1605 | }, 1606 | "safe-buffer": { 1607 | "version": "5.1.1", 1608 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1609 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", 1610 | "dev": true 1611 | }, 1612 | "semver": { 1613 | "version": "5.4.1", 1614 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", 1615 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", 1616 | "dev": true 1617 | }, 1618 | "set-immediate-shim": { 1619 | "version": "1.0.1", 1620 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", 1621 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", 1622 | "dev": true, 1623 | "optional": true 1624 | }, 1625 | "slash": { 1626 | "version": "1.0.0", 1627 | "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", 1628 | "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", 1629 | "dev": true 1630 | }, 1631 | "source-map": { 1632 | "version": "0.5.7", 1633 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1634 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1635 | "dev": true 1636 | }, 1637 | "source-map-support": { 1638 | "version": "0.4.18", 1639 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", 1640 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", 1641 | "dev": true, 1642 | "requires": { 1643 | "source-map": "0.5.7" 1644 | } 1645 | }, 1646 | "string_decoder": { 1647 | "version": "1.0.3", 1648 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 1649 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 1650 | "dev": true, 1651 | "optional": true, 1652 | "requires": { 1653 | "safe-buffer": "5.1.1" 1654 | } 1655 | }, 1656 | "strip-ansi": { 1657 | "version": "3.0.1", 1658 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1659 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1660 | "dev": true, 1661 | "requires": { 1662 | "ansi-regex": "2.1.1" 1663 | } 1664 | }, 1665 | "supports-color": { 1666 | "version": "2.0.0", 1667 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1668 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1669 | "dev": true 1670 | }, 1671 | "to-fast-properties": { 1672 | "version": "1.0.3", 1673 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", 1674 | "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", 1675 | "dev": true 1676 | }, 1677 | "trim-right": { 1678 | "version": "1.0.1", 1679 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", 1680 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", 1681 | "dev": true 1682 | }, 1683 | "user-home": { 1684 | "version": "1.1.1", 1685 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", 1686 | "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", 1687 | "dev": true 1688 | }, 1689 | "util-deprecate": { 1690 | "version": "1.0.2", 1691 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1692 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1693 | "dev": true, 1694 | "optional": true 1695 | }, 1696 | "v8flags": { 1697 | "version": "2.1.1", 1698 | "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", 1699 | "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", 1700 | "dev": true, 1701 | "requires": { 1702 | "user-home": "1.1.1" 1703 | } 1704 | }, 1705 | "wrappy": { 1706 | "version": "1.0.2", 1707 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1708 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1709 | "dev": true 1710 | } 1711 | } 1712 | } 1713 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-timepicker", 3 | "version": "2.0.2", 4 | "license": "MIT", 5 | "author": "Radosław Miernik", 6 | "main": "timepicker.js", 7 | "jsnext:main": "timepicker.es6.js", 8 | "description": "React timepicker in Android KitKat style", 9 | "repository": "https://github.com/radekmie/react-timepicker", 10 | "bugs": "https://github.com/radekmie/react-timepicker/issues", 11 | "keywords": [ 12 | "android", 13 | "svg", 14 | "react", 15 | "reactjs", 16 | "react-component", 17 | "time", 18 | "timepicker", 19 | "time picker", 20 | "time-picker" 21 | ], 22 | "files": [ 23 | "timepicker.css", 24 | "timepicker.es6.js", 25 | "timepicker.js" 26 | ], 27 | "devDependencies": { 28 | "babel-cli": "6.26.0", 29 | "babel-plugin-transform-react-remove-prop-types": "0.4.10", 30 | "babel-preset-env": "1.6.1", 31 | "babel-preset-react": "6.24.1" 32 | }, 33 | "peerDependencies": { 34 | "prop-types": ">= 15.5.7", 35 | "react": ">= 15.5.0" 36 | }, 37 | "scripts": { 38 | "build": "babel --compact --minified timepicker.es6.js > timepicker.js" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /timepicker.css: -------------------------------------------------------------------------------- 1 | .timepicker { 2 | -webkit-user-select: none; 3 | -moz-user-select: none; 4 | -ms-user-select: none; 5 | user-select: none; 6 | } 7 | 8 | .timepicker-bubble { 9 | cursor: pointer; 10 | } 11 | 12 | .timepicker-bubble circle { 13 | r: 15; 14 | 15 | fill: #79c7ff; 16 | 17 | opacity: 0.75; 18 | 19 | -webkit-transition: fill 0.25s linear, opacity 0.25s linear; 20 | -moz-transition: fill 0.25s linear, opacity 0.25s linear; 21 | -o-transition: fill 0.25s linear, opacity 0.25s linear; 22 | transition: fill 0.25s linear, opacity 0.25s linear; 23 | } 24 | 25 | .timepicker-bubble.small circle { 26 | r: 0; 27 | 28 | fill: none; 29 | 30 | -webkit-transition: r 0.25s linear; 31 | -moz-transition: r 0.25s linear; 32 | -o-transition: r 0.25s linear; 33 | transition: r 0.25s linear; 34 | } 35 | 36 | .timepicker-bubble.small.active circle { 37 | r: 5; 38 | 39 | -webkit-transition-delay: 0.25s; 40 | -moz-transition-delay: 0.25s; 41 | -o-transition-delay: 0.25s; 42 | transition-delay: 0.25s; 43 | 44 | -webkit-transition-duration: 0.1s; 45 | -moz-transition-duration: 0.1s; 46 | -o-transition-duration: 0.1s; 47 | transition-duration: 0.1s; 48 | } 49 | 50 | .timepicker-bubble.small circle + circle { 51 | r: 10; 52 | 53 | fill: transparent; 54 | } 55 | 56 | .timepicker-bubble:hover circle, 57 | .timepicker-bubble.active circle { 58 | opacity: 1; 59 | 60 | fill: #3caeff; 61 | } 62 | 63 | .timepicker-bubble text { 64 | fill: #ffffff; 65 | 66 | font-family: monospace; 67 | 68 | text-anchor: middle; 69 | dominant-baseline: middle; 70 | } 71 | 72 | .timepicker-hand { 73 | opacity: 0.25; 74 | 75 | stroke: #3caeff; 76 | stroke-width: 5; 77 | stroke-linecap: round; 78 | 79 | -webkit-transition-duration: 0.25s; 80 | -moz-transition-duration: 0.25s; 81 | -o-transition-duration: 0.25s; 82 | transition-duration: 0.25s; 83 | 84 | -webkit-transition-timing-function: linear; 85 | -moz-transition-timing-function: linear; 86 | -o-transition-timing-function: linear; 87 | transition-timing-function: linear; 88 | } 89 | 90 | .timepicker-visible, 91 | .timepicker-invisible { 92 | -webkit-transform-origin: center; 93 | -moz-transform-origin: center; 94 | -ms-transform-origin: center; 95 | -o-transform-origin: center; 96 | transform-origin: center; 97 | 98 | -webkit-transition: opacity 0.5s linear, visibility 0.5s linear, -webkit-transform 0.25s linear; 99 | transition: opacity 0.5s linear, visibility 0.5s linear, -webkit-transform 0.25s linear; 100 | -moz-transition: opacity 0.5s linear, transform 0.25s linear, visibility 0.5s linear, -moz-transform 0.25s linear; 101 | -o-transition: opacity 0.5s linear, transform 0.25s linear, visibility 0.5s linear, -o-transform 0.25s linear; 102 | transition: opacity 0.5s linear, transform 0.25s linear, visibility 0.5s linear; 103 | transition: opacity 0.5s linear, transform 0.25s linear, visibility 0.5s linear, -webkit-transform 0.25s linear, -moz-transform 0.25s linear, -o-transform 0.25s linear; 104 | } 105 | 106 | .timepicker-invisible { 107 | opacity: 0; 108 | 109 | visibility: hidden; 110 | 111 | -webkit-transform: scale(0.75); 112 | -moz-transform: scale(0.75); 113 | -ms-transform: scale(0.75); 114 | -o-transform: scale(0.75); 115 | transform: scale(0.75); 116 | } 117 | 118 | .timepicker-visible { 119 | opacity: 1; 120 | 121 | visibility: visible; 122 | 123 | -webkit-transform: scale(1); 124 | -moz-transform: scale(1); 125 | -ms-transform: scale(1); 126 | -o-transform: scale(1); 127 | transform: scale(1); 128 | } 129 | 130 | .timepicker-info { 131 | color: #bac0c5; 132 | 133 | margin: 0; 134 | 135 | font-size: 2em; 136 | line-height: 1em; 137 | font-weight: bold; 138 | 139 | text-align: center; 140 | } 141 | 142 | .timepicker-info-digits { 143 | cursor: pointer; 144 | 145 | -webkit-transition: color 0.25s linear; 146 | -moz-transition: color 0.25s linear; 147 | -o-transition: color 0.25s linear; 148 | transition: color 0.25s linear; 149 | } 150 | 151 | .timepicker-info-digits.active { 152 | color: #3caeff; 153 | } 154 | -------------------------------------------------------------------------------- /timepicker.es6.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import React from 'react'; 3 | 4 | export class Timepicker extends React.Component { 5 | constructor ({hours, minutes, mode}) { 6 | super(...arguments); 7 | 8 | this.state = {hours, minutes, mode}; 9 | 10 | this.onChange = this.onChange.bind(this); 11 | this.onChangeMode = this.onChangeMode.bind(this); 12 | } 13 | 14 | componentWillReceiveProps ({hours, minutes, mode}) { 15 | const diff = {}; 16 | const props = this.props; 17 | 18 | if (props.hours !== hours) diff.hours = hours; 19 | if (props.minutes !== minutes) diff.minutes = minutes; 20 | if (props.mode !== mode) diff.mode = mode; 21 | 22 | this.setState(diff); 23 | } 24 | 25 | render () { 26 | const {hours, minutes, mode} = this.state; 27 | const {formatNumber, militaryTime, radius, size} = this.props; 28 | 29 | return ( 30 |
31 | 39 | 40 | 51 |
52 | ); 53 | } 54 | 55 | onChange (hours, minutes) { 56 | this.setState({hours, minutes}); 57 | 58 | if (this.props.onChange) 59 | this.props.onChange(hours, minutes); 60 | } 61 | 62 | onChangeMode (mode) { 63 | this.setState({mode}); 64 | 65 | if (this.props.onChangeMode) 66 | this.props.onChangeMode(mode); 67 | } 68 | } 69 | 70 | Timepicker.HOURS = true; 71 | Timepicker.MINUTES = false; 72 | 73 | Timepicker.propTypes = { 74 | formatNumber: PropTypes.func, 75 | hours: PropTypes.number, 76 | militaryTime: PropTypes.bool, 77 | minutes: PropTypes.number, 78 | mode: PropTypes.bool, 79 | onChange: PropTypes.func, 80 | onChangeMode: PropTypes.func, 81 | radius: PropTypes.number, 82 | size: PropTypes.number 83 | }; 84 | 85 | Timepicker.defaultProps = { 86 | formatNumber: (value/*, mode */) => value < 10 ? '0' + value : value, 87 | hours: 0, 88 | militaryTime: true, 89 | minutes: 0, 90 | mode: Timepicker.HOURS, 91 | radius: 125, 92 | size: 300 93 | }; 94 | 95 | export class Info extends React.Component { 96 | constructor () { 97 | super(...arguments); 98 | 99 | this.onClickHours = this.onClickHours.bind(this); 100 | this.onClickMinutes = this.onClickMinutes.bind(this); 101 | } 102 | 103 | render () { 104 | const {formatNumber, hours, minutes, mode, size} = this.props; 105 | 106 | return ( 107 |

108 | 109 | {formatNumber(hours, 'info')} 110 | 111 | : 112 | 113 | {formatNumber(minutes, 'info')} 114 | 115 |

116 | ); 117 | } 118 | 119 | onClickHours () { 120 | if (this.props.onChangeMode) 121 | this.props.onChangeMode(Timepicker.HOURS); 122 | } 123 | 124 | onClickMinutes () { 125 | if (this.props.onChangeMode) 126 | this.props.onChangeMode(Timepicker.MINUTES); 127 | } 128 | } 129 | 130 | Info.propTypes = { 131 | formatNumber: PropTypes.func.isRequired, 132 | hours: PropTypes.number.isRequired, 133 | minutes: PropTypes.number.isRequired, 134 | mode: PropTypes.bool.isRequired, 135 | onChangeMode: PropTypes.func, 136 | size: PropTypes.number.isRequired 137 | }; 138 | 139 | Timepicker.Info = Info; 140 | 141 | export class Clock extends React.Component { 142 | constructor ({hours, militaryTime, minutes, mode}) { 143 | super(...arguments); 144 | 145 | this.state = { 146 | even: true, 147 | hours: hours % (militaryTime ? 24 : 12), 148 | minutes: minutes % 60, 149 | mode: mode, 150 | positionsHours: this.calculatePositionsHours(), 151 | positionsMinutes: this.calculatePositionsMinutes() 152 | }; 153 | 154 | this.onHand1 = this.onHand1.bind(this); 155 | this.onHand2 = this.onHand2.bind(this); 156 | } 157 | 158 | componentWillReceiveProps ({hours, militaryTime, minutes, mode, radius, size}) { 159 | const props = this.props; 160 | 161 | if (size !== props.size || radius !== props.radius) { 162 | this.setState({ 163 | positionsHours: this.calculatePositionsHours(), 164 | positionsMinutes: this.calculatePositionsMinutes() 165 | }); 166 | } else if (militaryTime !== props.militaryTime) { 167 | this.setState({ 168 | positionsHours: this.calculatePositionsHours() 169 | }); 170 | } 171 | 172 | if (mode !== props.mode) 173 | this.setState({mode: mode}); 174 | 175 | if (hours !== props.hours) 176 | this.setState({hours: hours % (militaryTime ? 24 : 12)}); 177 | 178 | if (minutes !== props.minutes) 179 | this.setState({minutes: minutes % 60}); 180 | } 181 | 182 | componentDidMount () { 183 | this.componentDidUpdate({}); 184 | } 185 | 186 | componentDidUpdate (previousProps, previousState) { 187 | const {militaryTime, mode, size} = this.props; 188 | const {even, hours, minutes, positionsHours, positionsMinutes} = this.state; 189 | 190 | if (previousProps.mode === mode && previousState.hours === hours && previousState.minutes === minutes) 191 | return; 192 | 193 | const hand1 = even ? this.hand1 : this.hand2; 194 | const hand2 = even ? this.hand2 : this.hand1; 195 | 196 | hand1.setAttribute('x2', mode ? positionsHours[hours === 0 ? militaryTime ? 23 : 11 : hours - 1][0] : positionsMinutes[minutes][0]); 197 | hand1.setAttribute('y2', mode ? positionsHours[hours === 0 ? militaryTime ? 23 : 11 : hours - 1][1] : positionsMinutes[minutes][1]); 198 | 199 | if (previousProps.mode !== mode) { 200 | hand2.setAttribute('x2', size / 2); 201 | hand2.setAttribute('y2', size / 2); 202 | } 203 | 204 | const dx1 = hand1.getAttribute('x1') - hand1.getAttribute('x2'); 205 | const dy1 = hand1.getAttribute('y1') - hand1.getAttribute('y2'); 206 | const dx2 = hand2.getAttribute('x1') - hand2.getAttribute('x2'); 207 | const dy2 = hand2.getAttribute('y1') - hand2.getAttribute('y2'); 208 | 209 | const hand1Length = Math.ceil(Math.sqrt(dx1 * dx1 + dy1 * dy1)); 210 | const hand2Length = Math.ceil(Math.sqrt(dx2 * dx2 + dy2 * dy2)); 211 | 212 | hand1.style.strokeDasharray = hand1Length; 213 | hand2.style.strokeDasharray = hand2Length; 214 | hand1.style.strokeDashoffset = hand1Length; 215 | hand2.style.strokeDashoffset = '0'; 216 | hand1.style.transitionProperty = 'none'; 217 | hand2.style.transitionProperty = 'none'; 218 | 219 | hand1.getBoundingClientRect(); 220 | hand2.getBoundingClientRect(); 221 | hand1.style.transitionProperty = 'stroke-dashoffset'; 222 | hand2.style.transitionProperty = 'stroke-dashoffset'; 223 | hand1.style.strokeDashoffset = '0'; 224 | hand2.style.strokeDashoffset = hand2Length; 225 | } 226 | 227 | render () { 228 | const size = this.props.size; 229 | const mode = this.state.mode; 230 | 231 | return ( 232 | 233 | 234 | 235 | 236 | 237 | {this.renderHoursBubbles()} 238 | 239 | 240 | {this.renderMinutesBubbles()} 241 | 242 | 243 | ); 244 | } 245 | 246 | renderHoursBubbles () { 247 | const {formatNumber} = this.props; 248 | const {hours, positionsHours: positions} = this.state; 249 | 250 | const bubbles = []; 251 | 252 | for (let index = 0; index < positions.length; ++index) { 253 | const x = positions[index][0]; 254 | const y = positions[index][1]; 255 | 256 | const hour = (index + 1) % 24; 257 | 258 | const onClick = this.onClickHour(hour); 259 | const onMouseMove = this.onMouseMoveHour(hour); 260 | 261 | bubbles.push( 262 | 269 | 270 | 271 | 272 | {formatNumber(hour, 'clock')} 273 | 274 | 275 | ); 276 | } 277 | 278 | return bubbles; 279 | } 280 | 281 | renderMinutesBubbles () { 282 | const {formatNumber} = this.props; 283 | const {minutes, positionsMinutes: positions} = this.state; 284 | 285 | const bubbles = []; 286 | 287 | for (let minute = 0; minute < positions.length; ++minute) { 288 | const x = positions[minute][0]; 289 | const y = positions[minute][1]; 290 | 291 | const onClick = this.onClickMinute(minute); 292 | const onMouseMove = this.onMouseMoveMinute(minute); 293 | 294 | bubbles.push( 295 | 301 | 302 | 303 | {minute % 5 ? ( 304 | 305 | ) : ( 306 | 307 | {formatNumber(minute, 'clock')} 308 | 309 | )} 310 | 311 | ); 312 | } 313 | 314 | return bubbles; 315 | } 316 | 317 | onChange () { 318 | if (this.props.onChange) 319 | this.props.onChange(this.state.hours, this.state.minutes); 320 | 321 | if (this.props.onChangeMode) 322 | this.props.onChangeMode(this.state.mode); 323 | } 324 | 325 | onClickHour (hours) { 326 | return (event, preventChangeMode) => { 327 | if (this.state.hours === hours && preventChangeMode) 328 | return; 329 | 330 | this.setState({ 331 | even: !this.state.even, 332 | hours, 333 | mode: preventChangeMode 334 | ? this.state.mode === Timepicker.HOURS ? Timepicker.HOURS : Timepicker.MINUTES 335 | : this.state.mode === Timepicker.HOURS ? Timepicker.MINUTES : Timepicker.HOURS 336 | }, () => this.onChange()); 337 | }; 338 | } 339 | 340 | onClickMinute (minutes) { 341 | return () => { 342 | if (this.state.minutes === minutes) 343 | return; 344 | 345 | this.setState({minutes: minutes, even: !this.state.even}, () => this.onChange()); 346 | }; 347 | } 348 | 349 | onHand1 (hand1) { 350 | this.hand1 = hand1; 351 | } 352 | 353 | onHand2 (hand2) { 354 | this.hand2 = hand2; 355 | } 356 | 357 | onMouseMoveHour (hours) { 358 | const onClickHour = this.onClickHour(hours); 359 | 360 | return function (event) { 361 | const isMouseUp = event.type === 'mouseup'; 362 | if (isMouseUp || event.buttons === 1) 363 | onClickHour(event, !isMouseUp); 364 | }; 365 | } 366 | 367 | onMouseMoveMinute (minutes) { 368 | const onClickMinute = this.onClickMinute(minutes); 369 | 370 | return function (event) { 371 | if (event.buttons === 1) 372 | onClickMinute(); 373 | }; 374 | } 375 | 376 | calculatePositionsHours () { 377 | const {militaryTime, radius, size} = this.props; 378 | 379 | const positions = []; 380 | 381 | for (let index = 1; index <= (militaryTime ? 24 : 12); ++index) { 382 | positions.push([ 383 | Math.round(size / 2 + radius * (militaryTime ? index > 12 ? 1 : 0.65 : 1) * Math.cos((index % 12 / 6 - 0.5) * Math.PI)), 384 | Math.round(size / 2 + radius * (militaryTime ? index > 12 ? 1 : 0.65 : 1) * Math.sin((index % 12 / 6 - 0.5) * Math.PI)) 385 | ]); 386 | } 387 | 388 | return positions; 389 | } 390 | 391 | calculatePositionsMinutes () { 392 | const {radius, size} = this.props; 393 | 394 | const positions = []; 395 | 396 | for (let index = 0; index < 60; ++index) { 397 | positions.push([ 398 | Math.round(size / 2 + radius * Math.cos((index / 30 - 0.5) * Math.PI)), 399 | Math.round(size / 2 + radius * Math.sin((index / 30 - 0.5) * Math.PI)) 400 | ]); 401 | } 402 | 403 | return positions; 404 | } 405 | } 406 | 407 | Clock.propTypes = { 408 | formatNumber: PropTypes.func.isRequired, 409 | hours: PropTypes.number.isRequired, 410 | militaryTime: PropTypes.bool.isRequired, 411 | minutes: PropTypes.number.isRequired, 412 | mode: PropTypes.bool.isRequired, 413 | onChange: PropTypes.func, 414 | onChangeMode: PropTypes.func, 415 | radius: PropTypes.number.isRequired, 416 | size: PropTypes.number.isRequired 417 | }; 418 | 419 | Timepicker.Clock = Clock; 420 | -------------------------------------------------------------------------------- /timepicker.js: -------------------------------------------------------------------------------- 1 | 'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.Clock=exports.Info=exports.Timepicker=undefined;var _createClass=function(){function defineProperties(target,props){for(var i=0;i12?1:0.65:1)*Math.cos((index%12/6-0.5)*Math.PI)),Math.round(size/2+radius*(militaryTime?index>12?1:0.65:1)*Math.sin((index%12/6-0.5)*Math.PI))])}return positions}},{key:'calculatePositionsMinutes',value:function calculatePositionsMinutes(){var _props5=this.props,radius=_props5.radius,size=_props5.size;var positions=[];for(var index=0;index<60;++index){positions.push([Math.round(size/2+radius*Math.cos((index/30-0.5)*Math.PI)),Math.round(size/2+radius*Math.sin((index/30-0.5)*Math.PI))])}return positions}}]);return Clock}(_react2.default.Component);Clock.propTypes=process.env.NODE_ENV!=='production'?{formatNumber:_propTypes2.default.func.isRequired,hours:_propTypes2.default.number.isRequired,militaryTime:_propTypes2.default.bool.isRequired,minutes:_propTypes2.default.number.isRequired,mode:_propTypes2.default.bool.isRequired,onChange:_propTypes2.default.func,onChangeMode:_propTypes2.default.func,radius:_propTypes2.default.number.isRequired,size:_propTypes2.default.number.isRequired}:{};Timepicker.Clock=Clock; 2 | 3 | -------------------------------------------------------------------------------- /timepicker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/radekmie/react-timepicker/030a73b01f08a37ea59808227909f347a5323273/timepicker.png --------------------------------------------------------------------------------