├── .gitignore ├── LICENSE ├── README.md ├── bower.json ├── dist ├── datetime-range.min.css └── datetime-range.min.js ├── gulpfile.js ├── images ├── date_range.png ├── datetime_range_collapsed.png ├── datetime_range_expanded.png └── time_range.png ├── index.html ├── index.js ├── package.json ├── src ├── date-range.css ├── date-range.html ├── date-range.js ├── datetime-range.css ├── datetime-range.html ├── datetime-range.js ├── time-range.css ├── time-range.html └── time-range.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | bower_components 2 | node_modules 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 g1eb 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Datetime range input UI element 2 | 3 | This directive is designed to provide easy and intuitive input of moment.js datetime objects. 4 | 5 | Typically this can be used to represent a start and an end datetime object. 6 | Desgined to be as simple as possible to afford intuitive interactions, including scrolling. 7 | 8 | Converted into an angular directive for your convenience :) 9 | 10 | ## Demo 11 | Click here for a live demo. 12 | 13 | ### Date range 14 | [Angular directive datetime range input - date range](https://rawgit.com/g1eb/angular-datetime-range/master/) 15 | 16 | ### Time range 17 | [Angular directive datetime range input - time range](https://rawgit.com/g1eb/angular-datetime-range/master/) 18 | 19 | ### Datetime range (collapsed state) 20 | [Angular directive datetime range input - datetime range (collapsed)](https://rawgit.com/g1eb/angular-datetime-range/master/) 21 | 22 | ### Datetime range (expanded state) 23 | [Angular directive datetime range input - datetime range (expanded)](https://rawgit.com/g1eb/angular-datetime-range/master/) 24 | 25 | ## Install 26 | 27 | 1) Install 'angular-datetime-range' with bower 28 | 29 | ``` 30 | bower install angular-datetime-range 31 | ``` 32 | 33 | Or with npm: 34 | 35 | ``` 36 | npm install angular-datetime-range 37 | ``` 38 | 39 | 2) Add 'g1b.datetime-range' module to your app config 40 | 41 | 42 | ```javascript 43 | angular.module('myApp', [ 44 | 'g1b.datetime-range', 45 | ...... 46 | ]) 47 | ``` 48 | 49 | 3) Use 'datetime-range' directive in a view 50 | 51 | ```html 52 | 53 | ``` 54 | 55 | ## Attributes 56 | 57 | |Property | Usage | Default | Required | 58 | |:------------- |:-------------|:-----:|:-----:| 59 | | start | Start moment.js datetime object or a datetime string | none | yes | 60 | | end | End moment.js datetime object or a datetime string | none | yes | 61 | | presets | Array of preset ranges, click here for more info | none | no | 62 | | min-date | moment.js datetime object min datetime | none | no | 63 | | max-date | moment.js datetime object max datetime | none | no | 64 | | on-change | Handler function that is fired on change of start and/or end datetime objects | none | no | 65 | | on-change-start | Handler function that is fired on change of start datetime object | none | no | 66 | | on-change-end | Handler function that is fired on change of end datetime object | none | no | 67 | | on-close | Handler function that is fired on close of the edit popover | none | no | 68 | | close-text | Close text shown in the button used to close edit popover | Close | no | 69 | 70 | ## Presets 71 | 72 | You can provide any number of preset ranges for quick selection in edit view. 73 | 74 | Consider the following example with ranges of current week, month and year. 75 | ``` 76 | $scope.presets = [ 77 | { 78 | 'name': 'This Week', 79 | 'start': moment().startOf('week').startOf('day'), 80 | 'end': moment().endOf('week').endOf('day'), 81 | }, { 82 | 'name': 'This Month', 83 | 'start': moment().startOf('month').startOf('day'), 84 | 'end': moment().endOf('month').endOf('day'), 85 | }, { 86 | 'name': 'This Year', 87 | 'start': moment().startOf('year').startOf('day'), 88 | 'end': moment().endOf('year').endOf('day'), 89 | } 90 | ]; 91 | ``` 92 | 93 | ## Other input directives 94 | 95 | If you are looking for other datetime input elements, check out [angular-datetime-inputs](https://github.com/g1eb/angular-datetime-inputs) 96 | 97 | ## Dependencies 98 | 99 | * [AngularJS](https://angularjs.org/) 100 | * [moment.js](http://momentjs.com/) 101 | * [angular-scroll-events](https://github.com/g1eb/angular-scroll-events) 102 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-datetime-range", 3 | "version": "0.4.0", 4 | "description": "UI widget for datetime range input, converted to an angular directive for your convenience.", 5 | "homepage": "https://github.com/g1eb/angular-datetime-range", 6 | "authors": [ 7 | "g1eb (https://g1eb.com)" 8 | ], 9 | "license": "MIT", 10 | "main": [ 11 | "dist/datetime-range.min.js", 12 | "dist/datetime-range.min.css" 13 | ], 14 | "dependencies": { 15 | "angular": "^1.5.6", 16 | "moment": "^2.13.0", 17 | "angular-scroll-events": "^0.0.2" 18 | }, 19 | "keywords": [ 20 | "angular", 21 | "angularjs", 22 | "directive", 23 | "date", 24 | "time", 25 | "datetime", 26 | "range", 27 | "daterange", 28 | "datepair", 29 | "input", 30 | "dateinput", 31 | "timeinput" 32 | ], 33 | "ignore": [ 34 | "**/.*", 35 | "node_modules", 36 | "bower_components", 37 | "test", 38 | "tests" 39 | ] 40 | } 41 | -------------------------------------------------------------------------------- /dist/datetime-range.min.css: -------------------------------------------------------------------------------- 1 | .datetime-range.datetime{position:relative;width:100%;min-width:350px;height:auto;min-height:4em;margin:0;padding:0;color:#444;font-size:14px;font-family:sans-serif;text-decoration:none;text-align:center;user-select:none;-ms-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-webkit-tap-highlight-color:rgba(255,255,255,0)}.datetime-range.datetime .end-datetime,.datetime-range.datetime .start-datetime{cursor:pointer;position:relative;width:47%;height:4em;background-color:#efefef;transition:background-color .25s ease-out}.datetime-range.datetime .start-datetime{position:absolute;left:0}.datetime-range.datetime .end-datetime{position:absolute;left:53%}.datetime-range.datetime .end-datetime .date,.datetime-range.datetime .start-datetime .date{color:#777;font-size:1em;line-height:1em;margin-top:.5em;display:block;overflow:hidden}.datetime-range.datetime .end-datetime .time,.datetime-range.datetime .start-datetime .time{font-size:1.5em;line-height:1.75em;display:block;overflow:hidden}.datetime-range.datetime .end-datetime.active,.datetime-range.datetime .end-datetime:hover,.datetime-range.datetime .start-datetime.active,.datetime-range.datetime .start-datetime:hover{background-color:#ddd}.datetime-range.datetime .start-datetime:after{content:"";position:absolute;top:0;border-top:2em solid transparent;border-bottom:2em solid transparent;border-left:1em solid #efefef;transition:border-left .25s ease-out;right:-1em}.datetime-range.datetime .start-datetime.active:after,.datetime-range.datetime .start-datetime:hover:after{border-left-color:#ddd}.datetime-range.datetime .end-datetime:before{content:"";position:absolute;top:0;border-width:2em 0 2em 1em;border-style:solid;border-color:#efefef #efefef #efefef transparent;transition:border-color .25s ease-out;left:-1em}.datetime-range.datetime .end-datetime.active:before,.datetime-range.datetime .end-datetime:hover:before{border-color:#ddd #ddd #ddd transparent}.datetime-range.datetime .end-datetime.warning,.datetime-range.datetime .end-datetime.warning.active,.datetime-range.datetime .end-datetime.warning:hover,.datetime-range.datetime .start-datetime.warning,.datetime-range.datetime .start-datetime.warning.active,.datetime-range.datetime .start-datetime.warning:hover{background-color:rgba(255,54,46,.75)}.datetime-range.datetime .start-datetime.warning.active:after,.datetime-range.datetime .start-datetime.warning:after,.datetime-range.datetime .start-datetime.warning:hover:after{border-left-color:rgba(255,54,46,.75)}.datetime-range.datetime .end-datetime.warning.active:before,.datetime-range.datetime .end-datetime.warning:before,.datetime-range.datetime .end-datetime.warning:hover:before{border-color:rgba(255,54,46,.75) rgba(255,54,46,.75) rgba(255,54,46,.75) transparent}.datetime-range.datetime .presets{box-sizing:border-box;position:absolute;z-index:2;top:4.5em;width:100%;height:auto;padding:0;text-align:center}.datetime-range.datetime .presets .dots{display:inline-block;cursor:pointer}.datetime-range.datetime .presets .dots .dot{display:inline-block;width:5px;height:5px;margin:0 3px;vertical-align:top;background-color:#efefef}.datetime-range.datetime .presets .dots:hover .dot{background-color:#ddd}.datetime-range.datetime .presets .list{display:none}.datetime-range.datetime .presets .list.active{display:block}.datetime-range.datetime .presets .list .preset-button{box-sizing:border-box;position:relative;display:block;cursor:pointer;color:#777;width:100%;height:auto;margin-bottom:10px;padding:0 15px;font-size:1.5em;line-height:2em;text-align:center;outline:none;border:1px solid #aaa;background-color:#efefef;transition:background-color .25s ease-out}.datetime-range.datetime .presets .list .preset-button:hover{background:#ddd}.datetime-range.datetime .edit-popover{position:absolute;z-index:2;top:4.5em;width:100%;height:auto;padding:0;background-color:#efefef;border-radius:0;border:1px solid #aaa;box-sizing:border-box}.datetime-range.datetime .calendar-toggle{width:100%;color:#777;font-size:1.5em;line-height:2em;cursor:pointer;transition:background-color .25s ease-out}.datetime-range.datetime .calendar-toggle:before{content:"";display:block;position:absolute;background-color:#efefef;width:1em;height:1em;top:-.55em;left:45%;z-index:1;border-color:#aaa;border-style:solid;border-width:1px 1px 0 0;transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);-webkit-transform:rotate(-45deg);transition:background-color .25s ease-out}.datetime-range.datetime .calendar-toggle:hover,.datetime-range.datetime .calendar-toggle:hover:before{background-color:#ddd}.datetime-range.datetime .calendar-toggle.start:before{left:20%}.datetime-range.datetime .calendar-toggle.end:before{left:74%}.datetime-range.datetime .calendar .calendar-header{cursor:default;background-color:#fff;position:relative;width:100%;font-size:1.5em;line-height:2em}.datetime-range.datetime .calendar .calendar-header .arrow{display:inline-block;color:#ddd;cursor:pointer;line-height:1.5em;font-size:1.5em}.datetime-range.datetime .calendar .calendar-header .arrow.arrow-left{position:absolute;left:0;width:2em;height:100%}.datetime-range.datetime .calendar .calendar-header .arrow.arrow-left:before{content:"";position:absolute;top:15%;left:25%;border-right:.75em solid #ddd;border-top:.5em solid transparent;border-bottom:.5em solid transparent;transition:border .25s ease-out}.datetime-range.datetime .calendar .calendar-header .arrow.arrow-left:hover:before{border-right-color:#999}.datetime-range.datetime .calendar .calendar-header .arrow.arrow-right{position:absolute;right:0;width:2em;height:100%}.datetime-range.datetime .calendar .calendar-header .arrow.arrow-right:before{content:"";position:absolute;top:15%;right:25%;border-left:.75em solid #ddd;border-top:.5em solid transparent;border-bottom:.5em solid transparent;transition:border .25s ease-out}.datetime-range.datetime .calendar .calendar-header .arrow.arrow-right:hover:before{border-left-color:#999}.datetime-range.datetime .calendar .calendar-body{padding:.5em 0}.datetime-range.datetime .calendar .calendar-body .weekdays{cursor:default;display:flex;justify-content:space-between;color:#777;font-size:1em;line-height:2em;text-transform:uppercase;padding:0 1em}.datetime-range.datetime .calendar .calendar-body .weekdays .weekday{width:5em;height:2.5em;display:inline-block}.datetime-range.datetime .calendar .calendar-body .week{display:flex;justify-content:space-between;color:#777;font-size:1.25em;line-height:2.65em;letter-spacing:1px;padding:.5em 1em}.datetime-range.datetime .calendar .calendar-body .week .date{display:inline-block;cursor:pointer;width:2.5em;height:2.5em;border-radius:50%;transition:background-color .25s ease-out}.datetime-range.datetime .calendar .calendar-body .week .date.current{color:#555;font-weight:900}.datetime-range.datetime .calendar .calendar-body .week .date:not(.active):hover{background-color:#ddd}.datetime-range.datetime .calendar .calendar-body .week .date.active,.datetime-range.datetime .calendar .calendar-body .week .date.inactive.active{color:#efefef;background-color:rgba(255,69,0,.75)}.datetime-range.datetime .calendar .calendar-body .week .date.inactive{color:#aaa}.datetime-range.datetime .timer{display:flex;justify-content:space-between;background-color:#fff}.datetime-range.datetime .timer .timer-hours,.datetime-range.datetime .timer .timer-minutes,.datetime-range.datetime .timer .timer-seconds{cursor:default;width:3em;display:inline-block;font-size:3em;line-height:1.5em;position:relative}.datetime-range.datetime .timer .timer-hours .arrow,.datetime-range.datetime .timer .timer-minutes .arrow,.datetime-range.datetime .timer .timer-seconds .arrow{position:relative;color:#ddd;cursor:pointer;height:1em;margin:0 .5em;line-height:1em;font-size:.75em}.datetime-range.datetime .timer .timer-hours .arrow.arrow-up:before,.datetime-range.datetime .timer .timer-minutes .arrow.arrow-up:before,.datetime-range.datetime .timer .timer-seconds .arrow.arrow-up:before{content:"";position:absolute;top:50%;left:calc(50% - .4em);border-left:.5em solid transparent;border-right:.5em solid transparent;border-bottom:.5em solid #ddd;transition:border .25s ease-out}.datetime-range.datetime .timer .timer-hours .arrow.arrow-up:hover:before,.datetime-range.datetime .timer .timer-minutes .arrow.arrow-up:hover:before,.datetime-range.datetime .timer .timer-seconds .arrow.arrow-up:hover:before{border-bottom-color:#999}.datetime-range.datetime .timer .timer-hours .arrow.arrow-down:before,.datetime-range.datetime .timer .timer-minutes .arrow.arrow-down:before,.datetime-range.datetime .timer .timer-seconds .arrow.arrow-down:before{content:"";position:absolute;top:0;left:calc(50% - .4em);border-left:.5em solid transparent;border-right:.5em solid transparent;border-top:.5em solid #ddd;transition:border .25s ease-out}.datetime-range.datetime .timer .timer-hours .arrow.arrow-down:hover:before,.datetime-range.datetime .timer .timer-minutes .arrow.arrow-down:hover:before,.datetime-range.datetime .timer .timer-seconds .arrow.arrow-down:hover:before{border-top-color:#999}.datetime-range.datetime .timer .timer-divider{font-size:3em;line-height:3em;-webkit-animation-name:a;-webkit-animation-duration:5s;-webkit-animation-timing-function:linear;-webkit-animation-iteration-count:infinite;-moz-animation-name:a;-moz-animation-duration:5s;-moz-animation-timing-function:linear;-moz-animation-iteration-count:infinite;animation-name:a;animation-duration:5s;animation-timing-function:linear;animation-iteration-count:infinite}@-webkit-keyframes a{0%{opacity:0}5%{opacity:1}95%{opacity:1}to{opacity:0}}@keyframes a{0%{opacity:0}5%{opacity:1}95%{opacity:1}to{opacity:0}}.datetime-range.datetime .close-button{position:absolute;z-index:2;left:-1px;cursor:pointer;outline:none;border-top:1px solid #aaa;border-left:1px solid #aaa;border-bottom:1px solid #aaa;color:#777;width:25%;height:auto;margin-top:10px;font-size:1.5em;line-height:2em;box-sizing:border-box;background-color:#efefef;transition:background-color .25s ease-out}.datetime-range.datetime .close-button:before{content:"";position:absolute;right:-.5em;top:-1px;width:1em;height:2em;background:#efefef;border-top:1px solid #aaa;border-right:1px solid #aaa;transition:background .25s ease-out;transform:skewX(-26deg)}.datetime-range.datetime .close-button:hover,.datetime-range.datetime .close-button:hover:before{background:#ddd} 2 | .datetime-range.date{position:relative;width:100%;min-width:350px;height:auto;min-height:4em;margin:0;padding:0;color:#444;font-size:14px;font-family:sans-serif;text-decoration:none;text-align:center;user-select:none;-ms-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-webkit-tap-highlight-color:rgba(255,255,255,0)}.datetime-range.date .end-datetime,.datetime-range.date .start-datetime{cursor:pointer;position:relative;width:47%;height:4em;background-color:#efefef;transition:background-color .25s ease-out}.datetime-range.date .start-datetime{position:absolute;left:0}.datetime-range.date .end-datetime{position:absolute;left:53%}.datetime-range.date .end-datetime .date,.datetime-range.date .start-datetime .date{color:#777;font-size:2em;line-height:2em;display:block;overflow:hidden}.datetime-range.date .end-datetime.active,.datetime-range.date .end-datetime:hover,.datetime-range.date .start-datetime.active,.datetime-range.date .start-datetime:hover{background-color:#ddd}.datetime-range.date .start-datetime:after{content:"";position:absolute;top:0;border-top:2em solid transparent;border-bottom:2em solid transparent;border-left:1em solid #efefef;transition:border-left .25s ease-out;right:-1em}.datetime-range.date .start-datetime.active:after,.datetime-range.date .start-datetime:hover:after{border-left-color:#ddd}.datetime-range.date .end-datetime:before{content:"";position:absolute;top:0;border-width:2em 0 2em 1em;border-style:solid;border-color:#efefef #efefef #efefef transparent;transition:border-color .25s ease-out;left:-1em}.datetime-range.date .end-datetime.active:before,.datetime-range.date .end-datetime:hover:before{border-color:#ddd #ddd #ddd transparent}.datetime-range.date .end-datetime.warning,.datetime-range.date .end-datetime.warning.active,.datetime-range.date .end-datetime.warning:hover,.datetime-range.date .start-datetime.warning,.datetime-range.date .start-datetime.warning.active,.datetime-range.date .start-datetime.warning:hover{background-color:rgba(255,54,46,.75)}.datetime-range.date .start-datetime.warning.active:after,.datetime-range.date .start-datetime.warning:after,.datetime-range.date .start-datetime.warning:hover:after{border-left-color:rgba(255,54,46,.75)}.datetime-range.date .end-datetime.warning.active:before,.datetime-range.date .end-datetime.warning:before,.datetime-range.date .end-datetime.warning:hover:before{border-color:rgba(255,54,46,.75) rgba(255,54,46,.75) rgba(255,54,46,.75) transparent}.datetime-range.date .presets{box-sizing:border-box;position:absolute;z-index:2;top:4.5em;width:100%;height:auto;padding:0;text-align:center}.datetime-range.date .presets .dots{display:inline-block;cursor:pointer}.datetime-range.date .presets .dots .dot{display:inline-block;width:5px;height:5px;margin:0 3px;vertical-align:top;background-color:#efefef}.datetime-range.date .presets .dots:hover .dot{background-color:#ddd}.datetime-range.date .presets .list{display:none}.datetime-range.date .presets .list.active{display:block}.datetime-range.date .presets .list .preset-button{box-sizing:border-box;position:relative;display:block;cursor:pointer;color:#777;width:100%;height:auto;margin-bottom:10px;padding:0 15px;font-size:1.5em;line-height:2em;text-align:center;outline:none;border:1px solid #aaa;background-color:#efefef;transition:background-color .25s ease-out}.datetime-range.date .presets .list .preset-button:hover{background:#ddd}.datetime-range.date .edit-popover{position:absolute;z-index:2;top:4.5em;width:100%;height:auto;padding:0;background-color:#efefef;border-radius:0;border:1px solid #aaa;box-sizing:border-box}.datetime-range.date .edit-popover .header{width:100%;color:#777;font-size:1.5em;line-height:2em;transition:background-color .25s ease-out}.datetime-range.date .edit-popover .header:before{content:"";display:block;position:absolute;background-color:#efefef;width:1em;height:1em;top:-.55em;left:45%;z-index:1;border-color:#aaa;border-style:solid;border-width:1px 1px 0 0;transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);-webkit-transform:rotate(-45deg);transition:background-color .25s ease-out}.datetime-range.date .edit-popover .header.start:before{left:20%}.datetime-range.date .edit-popover .header.end:before{left:74%}.datetime-range.date .calendar .calendar-header{cursor:default;background-color:#fff;position:relative;width:100%;font-size:1.5em;line-height:2em}.datetime-range.date .calendar .calendar-header .arrow{display:inline-block;color:#ddd;cursor:pointer;line-height:1.5em;font-size:1.5em}.datetime-range.date .calendar .calendar-header .arrow.arrow-left{position:absolute;left:0;width:2em;height:100%}.datetime-range.date .calendar .calendar-header .arrow.arrow-left:before{content:"";position:absolute;top:15%;left:25%;border-right:.75em solid #ddd;border-top:.5em solid transparent;border-bottom:.5em solid transparent;transition:border .25s ease-out}.datetime-range.date .calendar .calendar-header .arrow.arrow-left:hover:before{border-right-color:#999}.datetime-range.date .calendar .calendar-header .arrow.arrow-right{position:absolute;right:0;width:2em;height:100%}.datetime-range.date .calendar .calendar-header .arrow.arrow-right:before{content:"";position:absolute;top:15%;right:25%;border-left:.75em solid #ddd;border-top:.5em solid transparent;border-bottom:.5em solid transparent;transition:border .25s ease-out}.datetime-range.date .calendar .calendar-header .arrow.arrow-right:hover:before{border-left-color:#999}.datetime-range.date .calendar .calendar-body{padding:.5em 0}.datetime-range.date .calendar .calendar-body .weekdays{cursor:default;display:flex;justify-content:space-between;color:#777;font-size:1em;line-height:2em;text-transform:uppercase;padding:0 1em}.datetime-range.date .calendar .calendar-body .weekdays .weekday{width:5em;height:2.5em;display:inline-block}.datetime-range.date .calendar .calendar-body .week{display:flex;justify-content:space-between;color:#777;font-size:1.25em;line-height:2.65em;letter-spacing:1px;padding:.5em 1em}.datetime-range.date .calendar .calendar-body .week .date{display:inline-block;cursor:pointer;width:2.5em;height:2.5em;border-radius:50%;transition:background-color .25s ease-out}.datetime-range.date .calendar .calendar-body .week .date.current{color:#555;font-weight:900}.datetime-range.date .calendar .calendar-body .week .date:not(.active):hover{background-color:#ddd}.datetime-range.date .calendar .calendar-body .week .date.active,.datetime-range.date .calendar .calendar-body .week .date.inactive.active{color:#efefef;background-color:rgba(255,69,0,.75)}.datetime-range.date .calendar .calendar-body .week .date.inactive{color:#aaa}.datetime-range.date .close-button{position:absolute;z-index:2;left:-1px;cursor:pointer;outline:none;border-top:1px solid #aaa;border-left:1px solid #aaa;border-bottom:1px solid #aaa;color:#777;width:25%;height:auto;margin-top:10px;font-size:1.5em;line-height:2em;box-sizing:border-box;background-color:#efefef;transition:background-color .25s ease-out}.datetime-range.date .close-button:before{content:"";position:absolute;right:-.5em;top:-1px;width:1em;height:2em;background:#efefef;border-top:1px solid #aaa;border-right:1px solid #aaa;transition:background .25s ease-out;transform:skewX(-26deg)}.datetime-range.date .close-button:hover,.datetime-range.date .close-button:hover:before{background:#ddd} 3 | .datetime-range.time{position:relative;width:100%;min-width:350px;height:auto;min-height:4em;margin:0;padding:0;color:#444;font-size:14px;font-family:sans-serif;text-decoration:none;text-align:center;user-select:none;-ms-user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-touch-callout:none;-webkit-user-select:none;-webkit-tap-highlight-color:rgba(255,255,255,0)}.datetime-range.time .end-datetime,.datetime-range.time .start-datetime{cursor:pointer;position:relative;width:47%;height:4em;background-color:#efefef;transition:background-color .25s ease-out}.datetime-range.time .start-datetime{position:absolute;left:0}.datetime-range.time .end-datetime{position:absolute;left:53%}.datetime-range.time .end-datetime .time,.datetime-range.time .start-datetime .time{color:#777;font-size:2em;line-height:2em;display:block;overflow:hidden}.datetime-range.time .end-datetime.active,.datetime-range.time .end-datetime:hover,.datetime-range.time .start-datetime.active,.datetime-range.time .start-datetime:hover{background-color:#ddd}.datetime-range.time .start-datetime:after{content:"";position:absolute;top:0;border-top:2em solid transparent;border-bottom:2em solid transparent;border-left:1em solid #efefef;transition:border-left .25s ease-out;right:-1em}.datetime-range.time .start-datetime.active:after,.datetime-range.time .start-datetime:hover:after{border-left-color:#ddd}.datetime-range.time .end-datetime:before{content:"";position:absolute;top:0;border-width:2em 0 2em 1em;border-style:solid;border-color:#efefef #efefef #efefef transparent;transition:border-color .25s ease-out;left:-1em}.datetime-range.time .end-datetime.active:before,.datetime-range.time .end-datetime:hover:before{border-color:#ddd #ddd #ddd transparent}.datetime-range.time .end-datetime.warning,.datetime-range.time .end-datetime.warning.active,.datetime-range.time .end-datetime.warning:hover,.datetime-range.time .start-datetime.warning,.datetime-range.time .start-datetime.warning.active,.datetime-range.time .start-datetime.warning:hover{background-color:rgba(255,54,46,.75)}.datetime-range.time .start-datetime.warning.active:after,.datetime-range.time .start-datetime.warning:after,.datetime-range.time .start-datetime.warning:hover:after{border-left-color:rgba(255,54,46,.75)}.datetime-range.time .end-datetime.warning.active:before,.datetime-range.time .end-datetime.warning:before,.datetime-range.time .end-datetime.warning:hover:before{border-color:rgba(255,54,46,.75) rgba(255,54,46,.75) rgba(255,54,46,.75) transparent}.datetime-range.time .presets{box-sizing:border-box;position:absolute;z-index:2;top:4.5em;width:100%;height:auto;padding:0;text-align:center}.datetime-range.time .presets .dots{display:inline-block;cursor:pointer}.datetime-range.time .presets .dots .dot{display:inline-block;width:5px;height:5px;margin:0 3px;vertical-align:top;background-color:#efefef}.datetime-range.time .presets .dots:hover .dot{background-color:#ddd}.datetime-range.time .presets .list{display:none}.datetime-range.time .presets .list.active{display:block}.datetime-range.time .presets .list .preset-button{box-sizing:border-box;position:relative;display:block;cursor:pointer;color:#777;width:100%;height:auto;margin-bottom:10px;padding:0 15px;font-size:1.5em;line-height:2em;text-align:center;outline:none;border:1px solid #aaa;background-color:#efefef;transition:background-color .25s ease-out}.datetime-range.time .presets .list .preset-button:hover{background:#ddd}.datetime-range.time .edit-popover{position:absolute;z-index:2;top:4.5em;width:100%;height:auto;padding:0;background-color:#efefef;border-radius:0;border:1px solid #aaa;box-sizing:border-box}.datetime-range.time .edit-popover .header{width:100%;color:#777;font-size:1.5em;line-height:2em;cursor:pointer;transition:background-color .25s ease-out}.datetime-range.time .edit-popover .header:before{content:"";display:block;position:absolute;background-color:#efefef;width:1em;height:1em;top:-.55em;left:45%;z-index:1;border-color:#aaa;border-style:solid;border-width:1px 1px 0 0;transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);-webkit-transform:rotate(-45deg);transition:background-color .25s ease-out}.datetime-range.time .edit-popover .header.start:before{left:20%}.datetime-range.time .edit-popover .header.end:before{left:74%}.datetime-range.time .timer{display:flex;justify-content:space-between;background-color:#fff}.datetime-range.time .timer .timer-hours,.datetime-range.time .timer .timer-minutes,.datetime-range.time .timer .timer-seconds{cursor:default;width:3em;display:inline-block;font-size:3em;line-height:1.5em;position:relative}.datetime-range.time .timer .timer-hours .arrow,.datetime-range.time .timer .timer-minutes .arrow,.datetime-range.time .timer .timer-seconds .arrow{position:relative;color:#ddd;cursor:pointer;height:1em;margin:0 .5em;line-height:1em;font-size:.75em}.datetime-range.time .timer .timer-hours .arrow.arrow-up:before,.datetime-range.time .timer .timer-minutes .arrow.arrow-up:before,.datetime-range.time .timer .timer-seconds .arrow.arrow-up:before{content:"";position:absolute;top:50%;left:calc(50% - .4em);border-left:.5em solid transparent;border-right:.5em solid transparent;border-bottom:.5em solid #ddd;transition:border .25s ease-out}.datetime-range.time .timer .timer-hours .arrow.arrow-up:hover:before,.datetime-range.time .timer .timer-minutes .arrow.arrow-up:hover:before,.datetime-range.time .timer .timer-seconds .arrow.arrow-up:hover:before{border-bottom-color:#999}.datetime-range.time .timer .timer-hours .arrow.arrow-down:before,.datetime-range.time .timer .timer-minutes .arrow.arrow-down:before,.datetime-range.time .timer .timer-seconds .arrow.arrow-down:before{content:"";position:absolute;top:0;left:calc(50% - .4em);border-left:.5em solid transparent;border-right:.5em solid transparent;border-top:.5em solid #ddd;transition:border .25s ease-out}.datetime-range.time .timer .timer-hours .arrow.arrow-down:hover:before,.datetime-range.time .timer .timer-minutes .arrow.arrow-down:hover:before,.datetime-range.time .timer .timer-seconds .arrow.arrow-down:hover:before{border-top-color:#999}.datetime-range.time .timer .timer-divider{font-size:3em;line-height:3em;-webkit-animation-name:a;-webkit-animation-duration:5s;-webkit-animation-timing-function:linear;-webkit-animation-iteration-count:infinite;-moz-animation-name:a;-moz-animation-duration:5s;-moz-animation-timing-function:linear;-moz-animation-iteration-count:infinite;animation-name:a;animation-duration:5s;animation-timing-function:linear;animation-iteration-count:infinite}@-webkit-keyframes a{0%{opacity:0}5%{opacity:1}95%{opacity:1}to{opacity:0}}@keyframes a{0%{opacity:0}5%{opacity:1}95%{opacity:1}to{opacity:0}}.datetime-range.time .close-button{position:absolute;z-index:2;left:-1px;cursor:pointer;outline:none;border-top:1px solid #aaa;border-left:1px solid #aaa;border-bottom:1px solid #aaa;color:#777;width:25%;height:auto;margin-top:10px;font-size:1.5em;line-height:2em;box-sizing:border-box;background-color:#efefef;transition:background-color .25s ease-out}.datetime-range.time .close-button:before{content:"";position:absolute;right:-.5em;top:-1px;width:1em;height:2em;background:#efefef;border-top:1px solid #aaa;border-right:1px solid #aaa;transition:background .25s ease-out;transform:skewX(-26deg)}.datetime-range.time .close-button:hover,.datetime-range.time .close-button:hover:before{background:#ddd} -------------------------------------------------------------------------------- /dist/datetime-range.min.js: -------------------------------------------------------------------------------- 1 | "use strict";angular.module("g1b.datetime-range",["g1b.scroll-events"]).directive("datetimeRange",["$document","$timeout",function(e,t){return{restrict:"E",scope:{start:"=",end:"=",presets:"=?",minDate:"=?",maxDate:"=?",onChange:"&?",onChangeStart:"&?",onChangeEnd:"&?",onClose:"&?",closeText:"@"},replace:!0,template:'
:
:
',compile:function(){return{pre:function(){},post:function(a,n){a.current=moment(),a.start&&!a.start._isAMomentObject&&(a.start=moment(a.start)),a.end&&!a.end._isAMomentObject&&(a.end=moment(a.end)),a.getNumWeeks=function(){if(a.calendar){var e=a.calendar.clone().startOf("week").weekday(),t=a.calendar.clone().startOf("month"),n=(a.calendar.clone().endOf("month"),(t.weekday()-e+7)%7);return Math.ceil((n+a.calendar.daysInMonth())/7)}},a.selectDate=function(e){a.selected===e?a.selected=void 0:(a.selected=e,a.calendar=a.selected.clone(),a.presetsActive=!1)},a.isWithinBounds=function(e){return(!a.minDate||e>a.minDate)&&(!a.maxDate||ea.start?(a.selected.year(e.year()).month(e.month()).date(e.date()).hours(e.hours()).minutes(e.minutes()).seconds(e.seconds()),(a.selected.clone().startOf("week").month()!==a.calendar.month()&&a.selected.clone().endOf("week").month()!==a.calendar.month()||n)&&(a.calendar=a.selected.clone()),a.selected===a.start&&a.callbackStart(),a.selected===a.end&&a.callbackEnd(),a.callbackAll()):(a.warning=a.selected===a.start?"end":"start",t(function(){a.warning=void 0},250)))},a.selectPreset=function(e){a.close(),a.start.isSame(e.start)&&a.end.isSame(e.end)||(a.start.isSame(e.start)||(a.start=e.start.clone(),a.callbackStart()),a.end.isSame(e.end)||(a.end=e.end.clone(),a.callbackEnd()),a.callbackAll())},a.callbackStart=function(){a.onChangeStart&&t(function(){a.onChangeStart()})},a.callbackEnd=function(){a.onChangeEnd&&t(function(){a.onChangeEnd()})},a.callbackAll=function(){a.onChange&&t(function(){a.onChange()})},a.close=function(){a.selected="",a.presetsActive=!1,a.calendarActive=!1,a.onClose&&a.onClose()},e.on("mousedown",function(e){n[0].contains(e.target)||!a.presetsActive&&!a.selected||a.$apply(function(){a.close()})}),e.on("keyup",function(e){27===e.keyCode&&(a.presetsActive||a.selected)&&a.$apply(function(){a.close()})})}}}}}]); 2 | "use strict";angular.module("g1b.datetime-range").directive("dateRange",["$document","$timeout",function(e,t){return{restrict:"E",scope:{start:"=",end:"=",presets:"=?",minDate:"=?",maxDate:"=?",onChange:"&?",onChangeStart:"&?",onChangeEnd:"&?",onClose:"&?",closeText:"@"},replace:!0,template:'
',compile:function(){return{pre:function(){},post:function(n,a){n.current=moment(),n.start&&!n.start._isAMomentObject&&(n.start=moment(n.start)),n.end&&!n.end._isAMomentObject&&(n.end=moment(n.end)),n.getNumWeeks=function(){if(n.calendar){var e=n.calendar.clone().startOf("week").weekday(),t=n.calendar.clone().startOf("month"),a=(n.calendar.clone().endOf("month"),(t.weekday()-e+7)%7);return Math.ceil((a+n.calendar.daysInMonth())/7)}},n.selectDate=function(e){n.selected===e?n.selected=void 0:(n.selected=e,n.calendar=n.selected.clone(),n.presetsActive=!1)},n.isWithinBounds=function(e){return(!n.minDate||e>n.minDate)&&(!n.maxDate||en.start?(n.selected.year(e.year()).month(e.month()).date(e.date()).hours(e.hours()).minutes(e.minutes()).seconds(e.seconds()),(n.selected.clone().startOf("week").month()!==n.calendar.month()&&n.selected.clone().endOf("week").month()!==n.calendar.month()||a)&&(n.calendar=n.selected.clone()),n.selected===n.start&&n.callbackStart(),n.selected===n.end&&n.callbackEnd(),n.callbackAll()):(n.warning=n.selected===n.start?"end":"start",t(function(){n.warning=void 0},250)))},n.selectPreset=function(e){n.close(),n.start.isSame(e.start)&&n.end.isSame(e.end)||(n.start.isSame(e.start)||(n.start=e.start.clone(),n.callbackStart()),n.end.isSame(e.end)||(n.end=e.end.clone(),n.callbackEnd()),n.callbackAll())},n.callbackStart=function(){n.onChangeStart&&t(function(){n.onChangeStart()})},n.callbackEnd=function(){n.onChangeEnd&&t(function(){n.onChangeEnd()})},n.callbackAll=function(){n.onChange&&t(function(){n.onChange()})},n.close=function(){n.selected="",n.presetsActive=!1,n.onClose&&n.onClose()},e.on("mousedown",function(e){a[0].contains(e.target)||!n.presetsActive&&!n.selected||n.$apply(function(){n.close()})}),e.on("keyup",function(e){27===e.keyCode&&(n.presetsActive||n.selected)&&n.$apply(function(){n.close()})})}}}}}]); 3 | "use strict";angular.module("g1b.datetime-range").directive("timeRange",["$document","$timeout",function(e,t){return{restrict:"E",scope:{start:"=",end:"=",presets:"=?",minDate:"=?",maxDate:"=?",onChange:"&?",onChangeStart:"&?",onChangeEnd:"&?",onClose:"&?",closeText:"@"},replace:!0,template:'
:
:
',compile:function(){return{pre:function(){},post:function(a,n){a.current=moment(),a.start&&!a.start._isAMomentObject&&(a.start=moment(a.start)),a.end&&!a.end._isAMomentObject&&(a.end=moment(a.end)),a.getNumWeeks=function(){if(a.calendar){var e=a.calendar.clone().startOf("week").weekday(),t=a.calendar.clone().startOf("month"),n=(a.calendar.clone().endOf("month"),(t.weekday()-e+7)%7);return Math.ceil((n+a.calendar.daysInMonth())/7)}},a.selectDate=function(e){a.selected===e?a.selected=void 0:(a.selected=e,a.calendar=a.selected.clone(),a.presetsActive=!1)},a.isWithinBounds=function(e){return(!a.minDate||e>a.minDate)&&(!a.maxDate||ea.start?(a.selected.year(e.year()).month(e.month()).date(e.date()).hours(e.hours()).minutes(e.minutes()).seconds(e.seconds()),(a.selected.clone().startOf("week").month()!==a.calendar.month()&&a.selected.clone().endOf("week").month()!==a.calendar.month()||n)&&(a.calendar=a.selected.clone()),a.selected===a.start&&a.callbackStart(),a.selected===a.end&&a.callbackEnd(),a.callbackAll()):(a.warning=a.selected===a.start?"end":"start",t(function(){a.warning=void 0},250)))},a.selectPreset=function(e){a.close(),a.start.isSame(e.start)&&a.end.isSame(e.end)||(a.start.isSame(e.start)||(a.start=e.start.clone(),a.callbackStart()),a.end.isSame(e.end)||(a.end=e.end.clone(),a.callbackEnd()),a.callbackAll())},a.callbackStart=function(){a.onChangeStart&&t(function(){a.onChangeStart()})},a.callbackEnd=function(){a.onChangeEnd&&t(function(){a.onChangeEnd()})},a.callbackAll=function(){a.onChange&&t(function(){a.onChange()})},a.close=function(){a.selected="",a.presetsActive=!1,a.onClose&&a.onClose()},e.on("mousedown",function(e){n[0].contains(e.target)||!a.presetsActive&&!a.selected||a.$apply(function(){a.close()})}),e.on("keyup",function(e){27===e.keyCode&&(a.presetsActive||a.selected)&&a.$apply(function(){a.close()})})}}}}}]); -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'); 2 | var embedTemplates = require('gulp-angular-embed-templates'); 3 | var concat = require('gulp-concat'); 4 | var uglify = require('gulp-uglify'); 5 | var cssnano = require('gulp-cssnano'); 6 | 7 | gulp.task('build', function () { 8 | gulp.src(['src/datetime-range.js', 'src/date-range.js', 'src/time-range.js']) 9 | .pipe(embedTemplates()) 10 | .pipe(uglify()) 11 | .pipe(concat('datetime-range.min.js')) 12 | .pipe(gulp.dest('./dist')); 13 | gulp.src(['src/datetime-range.css', 'src/date-range.css', 'src/time-range.css']) 14 | .pipe(cssnano()) 15 | .pipe(concat('datetime-range.min.css')) 16 | .pipe(gulp.dest('./dist')); 17 | }); 18 | 19 | gulp.task('watch', function() { 20 | gulp.watch('src/**/*.+(js|html|css)', ['build']); 21 | }); 22 | -------------------------------------------------------------------------------- /images/date_range.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/g1eb/angular-datetime-range/dfbc75a4c3940738cded05a0e6393283c89f4e56/images/date_range.png -------------------------------------------------------------------------------- /images/datetime_range_collapsed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/g1eb/angular-datetime-range/dfbc75a4c3940738cded05a0e6393283c89f4e56/images/datetime_range_collapsed.png -------------------------------------------------------------------------------- /images/datetime_range_expanded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/g1eb/angular-datetime-range/dfbc75a4c3940738cded05a0e6393283c89f4e56/images/datetime_range_expanded.png -------------------------------------------------------------------------------- /images/time_range.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/g1eb/angular-datetime-range/dfbc75a4c3940738cded05a0e6393283c89f4e56/images/time_range.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Datetime range input UI element for AngularJS 5 | 6 | 7 | 19 | 20 | 21 | 22 |

Date

23 | 31 | 32 | 33 |
34 |
35 |
36 | 37 |

Time

38 | 46 | 47 | 48 |
49 |
50 |
51 | 52 |

Datetime

53 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | require('./dist/datetime-range.min.js'); 2 | module.exports = 'g1b.datetime-range'; 3 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-datetime-range", 3 | "version": "0.4.0", 4 | "description": "UI widget for datetime range input, converted to an angular directive for your convenience.", 5 | "homepage": "https://github.com/g1eb/angular-datetime-range#readme", 6 | "author": "g1eb (https://g1eb.com)", 7 | "license": "MIT", 8 | "main": "index.js", 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/g1eb/angular-datetime-range.git" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/g1eb/angular-datetime-range/issues" 15 | }, 16 | "scripts": { 17 | "build": "gulp build" 18 | }, 19 | "dependencies": { 20 | "angular-scroll-events": "^0.0.2" 21 | }, 22 | "devDependencies": { 23 | "gulp": "^3.9.1", 24 | "gulp-angular-embed-templates": "^2.2.0", 25 | "gulp-concat": "^2.6.0", 26 | "gulp-cssnano": "^2.1.2", 27 | "gulp-uglify": "^1.5.3" 28 | }, 29 | "peerDependencies": { 30 | "angular": "^1.5.6", 31 | "moment": "^2.13.0" 32 | }, 33 | "keywords": [ 34 | "angular", 35 | "angularjs", 36 | "directive", 37 | "date", 38 | "time", 39 | "datetime", 40 | "range", 41 | "daterange", 42 | "datepair", 43 | "input", 44 | "picker", 45 | "dateinput", 46 | "timeinput" 47 | ] 48 | } 49 | -------------------------------------------------------------------------------- /src/date-range.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Datetime range styles 3 | */ 4 | .datetime-range.date { 5 | position: relative; 6 | width: 100%; 7 | min-width: 350px; 8 | height: auto; 9 | min-height: 4em; 10 | margin: 0; 11 | padding: 0; 12 | color: #444; 13 | font-size: 14px; 14 | font-family: sans-serif; 15 | text-decoration: none; 16 | text-align: center; 17 | user-select: none; 18 | -ms-user-select: none; 19 | -moz-user-select: none; 20 | -khtml-user-select: none; 21 | -webkit-user-select: none; 22 | -webkit-touch-callout: none; 23 | -webkit-user-select: none; 24 | -webkit-tap-highlight-color: rgba(255, 255, 255, 0); 25 | } 26 | 27 | 28 | /** 29 | * Start and end datetime objects 30 | */ 31 | .datetime-range.date .start-datetime, 32 | .datetime-range.date .end-datetime { 33 | cursor: pointer; 34 | position: relative; 35 | width: 47%; 36 | height: 4em; 37 | background-color: #efefef; 38 | transition: background-color 0.25s ease-out; 39 | } 40 | .datetime-range.date .start-datetime { 41 | position: absolute; 42 | left: 0; 43 | } 44 | .datetime-range.date .end-datetime { 45 | position: absolute; 46 | left: 53%; 47 | } 48 | .datetime-range.date .start-datetime .date, 49 | .datetime-range.date .end-datetime .date { 50 | color: #777; 51 | font-size: 2em; 52 | line-height: 2em; 53 | display: block; 54 | overflow: hidden; 55 | } 56 | .datetime-range.date .start-datetime.active, 57 | .datetime-range.date .start-datetime:hover, 58 | .datetime-range.date .end-datetime.active, 59 | .datetime-range.date .end-datetime:hover { 60 | background-color: #ddd; 61 | } 62 | .datetime-range.date .start-datetime::after { 63 | content: ""; 64 | position: absolute; 65 | top: 0; 66 | border-top: 2em solid transparent; 67 | border-bottom: 2em solid transparent; 68 | border-left: 1em solid #efefef; 69 | transition: border-left 0.25s ease-out; 70 | right: -1em; 71 | } 72 | .datetime-range.date .start-datetime.active::after, 73 | .datetime-range.date .start-datetime:hover::after { 74 | border-left-color: #ddd; 75 | } 76 | .datetime-range.date .end-datetime::before { 77 | content: ""; 78 | position: absolute; 79 | top: 0; 80 | border-width: 2em 0 2em 1em; 81 | border-style: solid; 82 | border-color: #efefef #efefef #efefef transparent; 83 | transition: border-color 0.25s ease-out; 84 | left: -1em; 85 | } 86 | .datetime-range.date .end-datetime.active::before, 87 | .datetime-range.date .end-datetime:hover::before { 88 | border-color: #ddd #ddd #ddd transparent; 89 | } 90 | .datetime-range.date .start-datetime.warning, 91 | .datetime-range.date .end-datetime.warning { 92 | background-color: rgba(255, 54, 46, 0.75); 93 | } 94 | .datetime-range.date .start-datetime.warning.active, 95 | .datetime-range.date .start-datetime.warning:hover, 96 | .datetime-range.date .end-datetime.warning.active, 97 | .datetime-range.date .end-datetime.warning:hover { 98 | background-color: rgba(255, 54, 46, 0.75); 99 | } 100 | .datetime-range.date .start-datetime.warning::after { 101 | border-left-color: rgba(255, 54, 46, 0.75); 102 | } 103 | .datetime-range.date .start-datetime.warning.active::after, 104 | .datetime-range.date .start-datetime.warning:hover::after { 105 | border-left-color: rgba(255, 54, 46, 0.75); 106 | } 107 | .datetime-range.date .end-datetime.warning::before { 108 | border-color: rgba(255, 54, 46, 0.75) rgba(255, 54, 46, 0.75) rgba(255, 54, 46, 0.75) transparent; 109 | } 110 | .datetime-range.date .end-datetime.warning.active::before, 111 | .datetime-range.date .end-datetime.warning:hover::before { 112 | border-color: rgba(255, 54, 46, 0.75) rgba(255, 54, 46, 0.75) rgba(255, 54, 46, 0.75) transparent; 113 | } 114 | 115 | 116 | /** 117 | * Presets 118 | */ 119 | .datetime-range.date .presets { 120 | box-sizing: border-box; 121 | position: absolute; 122 | z-index: 5; 123 | top: 4.5em; 124 | width: 100%; 125 | height: auto; 126 | padding: 0; 127 | text-align: center; 128 | } 129 | .datetime-range.date .presets .dots { 130 | display: inline-block; 131 | cursor: pointer; 132 | } 133 | .datetime-range.date .presets .dots .dot { 134 | display: inline-block; 135 | width: 5px; 136 | height: 5px; 137 | margin: 0 3px; 138 | vertical-align: top; 139 | background-color: #efefef; 140 | } 141 | .datetime-range.date .presets .dots:hover .dot { 142 | background-color: #ddd; 143 | } 144 | .datetime-range.date .presets .list { 145 | display: none; 146 | } 147 | .datetime-range.date .presets .list.active { 148 | display: block; 149 | } 150 | .datetime-range.date .presets .list .preset-button { 151 | box-sizing: border-box; 152 | position: relative; 153 | display: block; 154 | cursor: pointer; 155 | color: #777; 156 | width: 100%; 157 | height: auto; 158 | margin-bottom: 10px; 159 | padding: 0 15px; 160 | font-size: 1.5em; 161 | line-height: 2em; 162 | text-align: center; 163 | outline: none; 164 | border: 1px solid #aaa; 165 | background-color: #efefef; 166 | transition: background-color 0.25s ease-out; 167 | } 168 | .datetime-range.date .presets .list .preset-button:hover { 169 | background: #ddd; 170 | } 171 | 172 | 173 | /** 174 | * Edit datetime popover 175 | */ 176 | .datetime-range.date .edit-popover { 177 | position: absolute; 178 | z-index: 5; 179 | top: 4.5em; 180 | width: 100%; 181 | height: auto; 182 | padding: 0; 183 | background-color: #efefef; 184 | border-radius: 0; 185 | border: 1px solid #aaa; 186 | box-sizing: border-box; 187 | } 188 | .datetime-range.date .edit-popover .header { 189 | width: 100%; 190 | color: #777; 191 | font-size: 1.5em; 192 | line-height: 2em; 193 | transition: background-color 0.25s ease-out; 194 | } 195 | .datetime-range.date .edit-popover .header::before { 196 | content: ""; 197 | display: block; 198 | position: absolute; 199 | background-color: #efefef; 200 | width: 1em; 201 | height: 1em; 202 | top: -0.55em; 203 | left: 45%; 204 | z-index: 2; 205 | border-color: #aaa; 206 | border-style: solid; 207 | border-width: 1px 1px 0 0; 208 | transform: rotate(-45deg); 209 | -moz-transform: rotate(-45deg); 210 | -ms-transform: rotate(-45deg); 211 | -o-transform: rotate(-45deg); 212 | -webkit-transform: rotate(-45deg); 213 | transition: background-color 0.25s ease-out; 214 | } 215 | .datetime-range.date .edit-popover .header.start::before { 216 | left: 20%; 217 | } 218 | .datetime-range.date .edit-popover .header.end::before { 219 | left: 74%; 220 | } 221 | 222 | 223 | /** 224 | * Calendar 225 | */ 226 | .datetime-range.date .calendar .calendar-header { 227 | cursor: default; 228 | background-color: #fff; 229 | position: relative; 230 | width: 100%; 231 | font-size: 1.5em; 232 | line-height: 2em; 233 | } 234 | .datetime-range.date .calendar .calendar-header .arrow { 235 | display: inline-block; 236 | color: #ddd; 237 | cursor: pointer; 238 | line-height: 1.5em; 239 | font-size: 1.5em; 240 | } 241 | .datetime-range.date .calendar .calendar-header .arrow.arrow-left { 242 | position: absolute; 243 | left: 0; 244 | width: 2em; 245 | height: 100%; 246 | } 247 | .datetime-range.date .calendar .calendar-header .arrow.arrow-left::before { 248 | content: ""; 249 | position: absolute; 250 | top: 15%; 251 | left: 25%; 252 | border-right: 0.75em solid #ddd; 253 | border-top: 0.5em solid transparent; 254 | border-bottom: 0.5em solid transparent; 255 | transition: border 0.25s ease-out; 256 | } 257 | .datetime-range.date .calendar .calendar-header .arrow.arrow-left:hover::before { 258 | border-right-color: #999; 259 | } 260 | .datetime-range.date .calendar .calendar-header .arrow.arrow-right { 261 | position: absolute; 262 | right: 0; 263 | width: 2em; 264 | height: 100%; 265 | } 266 | .datetime-range.date .calendar .calendar-header .arrow.arrow-right::before { 267 | content: ""; 268 | position: absolute; 269 | top: 15%; 270 | right: 25%; 271 | border-left: 0.75em solid #ddd; 272 | border-top: 0.5em solid transparent; 273 | border-bottom: 0.5em solid transparent; 274 | transition: border 0.25s ease-out; 275 | } 276 | .datetime-range.date .calendar .calendar-header .arrow.arrow-right:hover::before { 277 | border-left-color: #999; 278 | } 279 | .datetime-range.date .calendar .calendar-body { 280 | padding: 0.5em 0; 281 | } 282 | .datetime-range.date .calendar .calendar-body .weekdays { 283 | cursor: default; 284 | display: flex; 285 | justify-content: space-between; 286 | color: #777; 287 | font-size: 1em; 288 | line-height: 2em; 289 | text-transform: uppercase; 290 | padding: 0 1em; 291 | } 292 | .datetime-range.date .calendar .calendar-body .weekdays .weekday { 293 | display: inline-block; 294 | width: 5em; 295 | height: 2.5em; 296 | } 297 | .datetime-range.date .calendar .calendar-body .weekdays .weekday { 298 | display: inline-block; 299 | } 300 | .datetime-range.date .calendar .calendar-body .week { 301 | display: flex; 302 | justify-content: space-between; 303 | color: #777; 304 | font-size: 1.25em; 305 | line-height: 2.65em; 306 | letter-spacing: 1px; 307 | padding: 0.5em 1em; 308 | } 309 | .datetime-range.date .calendar .calendar-body .week .date { 310 | display: inline-block; 311 | cursor: pointer; 312 | width: 2.5em; 313 | height: 2.5em; 314 | border-radius: 50%; 315 | transition: background-color 0.25s ease-out; 316 | } 317 | .datetime-range.date .calendar .calendar-body .week .date.current { 318 | color: #555; 319 | font-weight: 900; 320 | } 321 | .datetime-range.date .calendar .calendar-body .week .date:not(.active):hover { 322 | background-color: #ddd; 323 | } 324 | .datetime-range.date .calendar .calendar-body .week .date.active, 325 | .datetime-range.date .calendar .calendar-body .week .date.inactive.active { 326 | color: #efefef; 327 | background-color: rgba(255, 69, 0, 0.75); 328 | } 329 | .datetime-range.date .calendar .calendar-body .week .date.inactive { 330 | color: #aaa; 331 | } 332 | 333 | 334 | /** 335 | * Close button 336 | */ 337 | .datetime-range.date .close-button { 338 | position: absolute; 339 | z-index: 5; 340 | left: -1px; 341 | cursor: pointer; 342 | outline: none; 343 | border-top: 1px solid #aaa; 344 | border-left: 1px solid #aaa; 345 | border-bottom: 1px solid #aaa; 346 | color: #777; 347 | width: 25%; 348 | height: auto; 349 | margin-top: 10px; 350 | font-size: 1.5em; 351 | line-height: 2em; 352 | box-sizing: border-box; 353 | background-color: #efefef; 354 | transition: background-color 0.25s ease-out; 355 | } 356 | .datetime-range.date .close-button::before { 357 | content: ""; 358 | position: absolute; 359 | right: -0.5em; 360 | top: -1px; 361 | width: 1em; 362 | height: 2em; 363 | background: #efefef; 364 | border-top: 1px solid #aaa; 365 | border-right: 1px solid #aaa; 366 | transition: background 0.25s ease-out; 367 | transform: skewX(-26deg); 368 | } 369 | .datetime-range.date .close-button:hover, 370 | .datetime-range.date .close-button:hover::before { 371 | background: #ddd; 372 | } 373 | -------------------------------------------------------------------------------- /src/date-range.html: -------------------------------------------------------------------------------- 1 |
2 |
5 |
6 |
7 |
10 |
11 |
12 |
13 |
16 |
17 |
18 |
19 |
23 |
24 |
25 |
26 |
27 |
30 |
31 |
32 |
35 |
36 | 37 |
38 |
39 |
40 |
41 | 44 | 45 |
46 |
47 | 55 | 56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 | -------------------------------------------------------------------------------- /src/date-range.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('g1b.datetime-range'). 4 | directive('dateRange', ['$document', '$timeout', function ($document, $timeout) { 5 | 6 | return { 7 | restrict: 'E', 8 | scope: { 9 | start: '=', 10 | end: '=', 11 | presets: '=?', 12 | minDate:'=?', 13 | maxDate:'=?', 14 | onChange: '&?', 15 | onChangeStart: '&?', 16 | onChangeEnd: '&?', 17 | onClose: '&?', 18 | closeText: '@', 19 | }, 20 | replace: true, 21 | templateUrl: './date-range.html', 22 | compile: function () { 23 | return { 24 | pre: function preLink() {}, 25 | post: function postLink(scope, element) { 26 | 27 | // Get current date 28 | scope.current = moment(); 29 | 30 | // Convert start datetime to moment.js if its not a moment object yet 31 | if ( scope.start && !scope.start._isAMomentObject ) { 32 | scope.start = moment(scope.start); 33 | } 34 | 35 | // Convert end datetime to moment.js if its not a moment object yet 36 | if ( scope.end && !scope.end._isAMomentObject ) { 37 | scope.end = moment(scope.end); 38 | } 39 | 40 | // Get number of weeks in month 41 | scope.getNumWeeks = function () { 42 | if ( !scope.calendar ) { return; } 43 | 44 | var firstDayOfWeek = scope.calendar.clone().startOf('week').weekday(); 45 | 46 | var firstOfMonth = scope.calendar.clone().startOf('month'); 47 | var lastOfMonth = scope.calendar.clone().endOf('month'); 48 | 49 | var firstWeekDay = (firstOfMonth.weekday() - firstDayOfWeek + 7) % 7; 50 | 51 | return Math.ceil((firstWeekDay + scope.calendar.daysInMonth()) / 7); 52 | } 53 | 54 | // Set selected date 55 | scope.selectDate = function (date) { 56 | if ( scope.selected === date ) { 57 | scope.selected = undefined; 58 | } else { 59 | scope.selected = date; 60 | scope.calendar = scope.selected.clone(); 61 | scope.presetsActive = false; 62 | } 63 | }; 64 | 65 | // Check if date is within bounds of min and max allowed date 66 | scope.isWithinBounds = function (date) { 67 | return ( !scope.minDate || date > scope.minDate ) && ( !scope.maxDate || date < scope.maxDate ); 68 | }; 69 | 70 | // Update selected date 71 | scope.setDate = function (date, calendar_update) { 72 | if ( scope.selected.isSame(date) || !scope.isWithinBounds(date) ) { return; } 73 | if ( ( scope.selected === scope.start && date < scope.end ) || ( scope.selected === scope.end && date > scope.start ) ) { 74 | scope.selected.year(date.year()).month(date.month()).date(date.date()).hours(date.hours()).minutes(date.minutes()).seconds(date.seconds()); 75 | if ( (scope.selected.clone().startOf('week').month() !== scope.calendar.month() && scope.selected.clone().endOf('week').month() !== scope.calendar.month()) || calendar_update ) { 76 | scope.calendar = scope.selected.clone(); 77 | } 78 | if ( scope.selected === scope.start ) { 79 | scope.callbackStart(); 80 | } 81 | if ( scope.selected === scope.end ) { 82 | scope.callbackEnd(); 83 | } 84 | scope.callbackAll(); 85 | } else { 86 | scope.warning = ( scope.selected === scope.start ) ? 'end' : 'start'; 87 | $timeout(function () { 88 | scope.warning = undefined; 89 | }, 250); 90 | } 91 | }; 92 | 93 | // Set start and end datetime objects to the selected preset 94 | scope.selectPreset = function (preset) { 95 | // Hide presets menu on select 96 | scope.close(); 97 | 98 | // Don't do anything if nothing is changed 99 | if ( scope.start.isSame(preset.start) && scope.end.isSame(preset.end) ) { return; } 100 | 101 | // Update start datetime object if changed 102 | if ( !scope.start.isSame(preset.start) ) { 103 | scope.start = preset.start.clone(); 104 | scope.callbackStart(); 105 | } 106 | 107 | // Update end datetime object if changed 108 | if ( !scope.end.isSame(preset.end) ) { 109 | scope.end = preset.end.clone(); 110 | scope.callbackEnd(); 111 | } 112 | 113 | // Something has definitely changed, fire ambiguous callback 114 | scope.callbackAll(); 115 | }; 116 | 117 | // Callbacks fired on change of start datetime object 118 | scope.callbackStart = function () { 119 | if ( !!scope.onChangeStart ) { 120 | $timeout(function () { 121 | scope.onChangeStart(); 122 | }); 123 | } 124 | }; 125 | 126 | // Callbacks fired on change of end datetime object 127 | scope.callbackEnd = function () { 128 | if ( !!scope.onChangeEnd ) { 129 | $timeout(function () { 130 | scope.onChangeEnd(); 131 | }); 132 | } 133 | }; 134 | 135 | // Callbacks fired on change of start and/or end datetime objects 136 | scope.callbackAll = function () { 137 | if ( !!scope.onChange ) { 138 | $timeout(function () { 139 | scope.onChange(); 140 | }); 141 | } 142 | }; 143 | 144 | // Close edit popover 145 | scope.close = function () { 146 | scope.selected = ''; 147 | scope.presetsActive = false; 148 | 149 | if ( !!scope.onClose ) { 150 | scope.onClose(); 151 | } 152 | } 153 | 154 | // Bind click events outside directive to close edit popover 155 | $document.on('mousedown', function (e) { 156 | if ( !element[0].contains(e.target) && (!!scope.presetsActive || !!scope.selected) ) { 157 | scope.$apply(function () { 158 | scope.close(); 159 | }); 160 | } 161 | }); 162 | 163 | // Bind 'esc' keyup event to close edit popover 164 | $document.on('keyup', function (e) { 165 | if ( e.keyCode === 27 && (!!scope.presetsActive || !!scope.selected) ) { 166 | scope.$apply(function () { 167 | scope.close(); 168 | }); 169 | } 170 | }); 171 | } 172 | }; 173 | } 174 | }; 175 | }]); 176 | -------------------------------------------------------------------------------- /src/datetime-range.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Datetime range styles 3 | */ 4 | .datetime-range.datetime { 5 | position: relative; 6 | width: 100%; 7 | min-width: 350px; 8 | height: auto; 9 | min-height: 4em; 10 | margin: 0; 11 | padding: 0; 12 | color: #444; 13 | font-size: 14px; 14 | font-family: sans-serif; 15 | text-decoration: none; 16 | text-align: center; 17 | user-select: none; 18 | -ms-user-select: none; 19 | -moz-user-select: none; 20 | -khtml-user-select: none; 21 | -webkit-user-select: none; 22 | -webkit-touch-callout: none; 23 | -webkit-user-select: none; 24 | -webkit-tap-highlight-color: rgba(255, 255, 255, 0); 25 | } 26 | 27 | 28 | /** 29 | * Start and end datetime objects 30 | */ 31 | .datetime-range.datetime .start-datetime, 32 | .datetime-range.datetime .end-datetime { 33 | cursor: pointer; 34 | position: relative; 35 | width: 47%; 36 | height: 4em; 37 | background-color: #efefef; 38 | transition: background-color 0.25s ease-out; 39 | } 40 | .datetime-range.datetime .start-datetime { 41 | position: absolute; 42 | left: 0; 43 | } 44 | .datetime-range.datetime .end-datetime { 45 | position: absolute; 46 | left: 53%; 47 | } 48 | .datetime-range.datetime .start-datetime .date, 49 | .datetime-range.datetime .end-datetime .date { 50 | color: #777; 51 | font-size: 1em; 52 | line-height: 1em; 53 | margin-top: 0.5em; 54 | display: block; 55 | overflow: hidden; 56 | } 57 | .datetime-range.datetime .start-datetime .time, 58 | .datetime-range.datetime .end-datetime .time { 59 | font-size: 1.5em; 60 | line-height: 1.75em; 61 | display: block; 62 | overflow: hidden; 63 | } 64 | .datetime-range.datetime .start-datetime.active, 65 | .datetime-range.datetime .start-datetime:hover, 66 | .datetime-range.datetime .end-datetime.active, 67 | .datetime-range.datetime .end-datetime:hover { 68 | background-color: #ddd; 69 | } 70 | .datetime-range.datetime .start-datetime::after { 71 | content: ""; 72 | position: absolute; 73 | top: 0; 74 | border-top: 2em solid transparent; 75 | border-bottom: 2em solid transparent; 76 | border-left: 1em solid #efefef; 77 | transition: border-left 0.25s ease-out; 78 | right: -1em; 79 | } 80 | .datetime-range.datetime .start-datetime.active::after, 81 | .datetime-range.datetime .start-datetime:hover::after { 82 | border-left-color: #ddd; 83 | } 84 | .datetime-range.datetime .end-datetime::before { 85 | content: ""; 86 | position: absolute; 87 | top: 0; 88 | border-width: 2em 0 2em 1em; 89 | border-style: solid; 90 | border-color: #efefef #efefef #efefef transparent; 91 | transition: border-color 0.25s ease-out; 92 | left: -1em; 93 | } 94 | .datetime-range.datetime .end-datetime.active::before, 95 | .datetime-range.datetime .end-datetime:hover::before { 96 | border-color: #ddd #ddd #ddd transparent; 97 | } 98 | .datetime-range.datetime .start-datetime.warning, 99 | .datetime-range.datetime .end-datetime.warning { 100 | background-color: rgba(255, 54, 46, 0.75); 101 | } 102 | .datetime-range.datetime .start-datetime.warning.active, 103 | .datetime-range.datetime .start-datetime.warning:hover, 104 | .datetime-range.datetime .end-datetime.warning.active, 105 | .datetime-range.datetime .end-datetime.warning:hover { 106 | background-color: rgba(255, 54, 46, 0.75); 107 | } 108 | .datetime-range.datetime .start-datetime.warning::after { 109 | border-left-color: rgba(255, 54, 46, 0.75); 110 | } 111 | .datetime-range.datetime .start-datetime.warning.active::after, 112 | .datetime-range.datetime .start-datetime.warning:hover::after { 113 | border-left-color: rgba(255, 54, 46, 0.75); 114 | } 115 | .datetime-range.datetime .end-datetime.warning::before { 116 | border-color: rgba(255, 54, 46, 0.75) rgba(255, 54, 46, 0.75) rgba(255, 54, 46, 0.75) transparent; 117 | } 118 | .datetime-range.datetime .end-datetime.warning.active::before, 119 | .datetime-range.datetime .end-datetime.warning:hover::before { 120 | border-color: rgba(255, 54, 46, 0.75) rgba(255, 54, 46, 0.75) rgba(255, 54, 46, 0.75) transparent; 121 | } 122 | 123 | 124 | /** 125 | * Presets 126 | */ 127 | .datetime-range.datetime .presets { 128 | box-sizing: border-box; 129 | position: absolute; 130 | z-index: 5; 131 | top: 4.5em; 132 | width: 100%; 133 | height: auto; 134 | padding: 0; 135 | text-align: center; 136 | } 137 | .datetime-range.datetime .presets .dots { 138 | display: inline-block; 139 | cursor: pointer; 140 | } 141 | .datetime-range.datetime .presets .dots .dot { 142 | display: inline-block; 143 | width: 5px; 144 | height: 5px; 145 | margin: 0 3px; 146 | vertical-align: top; 147 | background-color: #efefef; 148 | } 149 | .datetime-range.datetime .presets .dots:hover .dot { 150 | background-color: #ddd; 151 | } 152 | .datetime-range.datetime .presets .list { 153 | display: none; 154 | } 155 | .datetime-range.datetime .presets .list.active { 156 | display: block; 157 | } 158 | .datetime-range.datetime .presets .list .preset-button { 159 | box-sizing: border-box; 160 | position: relative; 161 | display: block; 162 | cursor: pointer; 163 | color: #777; 164 | width: 100%; 165 | height: auto; 166 | margin-bottom: 10px; 167 | padding: 0 15px; 168 | font-size: 1.5em; 169 | line-height: 2em; 170 | text-align: center; 171 | outline: none; 172 | border: 1px solid #aaa; 173 | background-color: #efefef; 174 | transition: background-color 0.25s ease-out; 175 | } 176 | .datetime-range.datetime .presets .list .preset-button:hover { 177 | background: #ddd; 178 | } 179 | 180 | 181 | /** 182 | * Edit datetime popover 183 | */ 184 | .datetime-range.datetime .edit-popover { 185 | position: absolute; 186 | z-index: 5; 187 | top: 4.5em; 188 | width: 100%; 189 | height: auto; 190 | padding: 0; 191 | background-color: #efefef; 192 | border-radius: 0; 193 | border: 1px solid #aaa; 194 | box-sizing: border-box; 195 | } 196 | 197 | 198 | /** 199 | * Calendar 200 | */ 201 | .datetime-range.datetime .calendar-toggle { 202 | width: 100%; 203 | color: #777; 204 | font-size: 1.5em; 205 | line-height: 2em; 206 | cursor: pointer; 207 | transition: background-color 0.25s ease-out; 208 | } 209 | .datetime-range.datetime .calendar-toggle::before { 210 | content: ""; 211 | display: block; 212 | position: absolute; 213 | background-color: #efefef; 214 | width: 1em; 215 | height: 1em; 216 | top: -0.55em; 217 | left: 45%; 218 | z-index: 2; 219 | border-color: #aaa; 220 | border-style: solid; 221 | border-width: 1px 1px 0 0; 222 | transform: rotate(-45deg); 223 | -moz-transform: rotate(-45deg); 224 | -ms-transform: rotate(-45deg); 225 | -o-transform: rotate(-45deg); 226 | -webkit-transform: rotate(-45deg); 227 | transition: background-color 0.25s ease-out; 228 | } 229 | .datetime-range.datetime .calendar-toggle:hover, 230 | .datetime-range.datetime .calendar-toggle:hover::before { 231 | background-color: #ddd; 232 | } 233 | .datetime-range.datetime .calendar-toggle.start::before { 234 | left: 20%; 235 | } 236 | .datetime-range.datetime .calendar-toggle.end::before { 237 | left: 74%; 238 | } 239 | .datetime-range.datetime .calendar .calendar-header { 240 | cursor: default; 241 | background-color: #fff; 242 | position: relative; 243 | width: 100%; 244 | font-size: 1.5em; 245 | line-height: 2em; 246 | } 247 | .datetime-range.datetime .calendar .calendar-header .arrow { 248 | display: inline-block; 249 | color: #ddd; 250 | cursor: pointer; 251 | line-height: 1.5em; 252 | font-size: 1.5em; 253 | } 254 | .datetime-range.datetime .calendar .calendar-header .arrow.arrow-left { 255 | position: absolute; 256 | left: 0; 257 | width: 2em; 258 | height: 100%; 259 | } 260 | .datetime-range.datetime .calendar .calendar-header .arrow.arrow-left::before { 261 | content: ""; 262 | position: absolute; 263 | top: 15%; 264 | left: 25%; 265 | border-right: 0.75em solid #ddd; 266 | border-top: 0.5em solid transparent; 267 | border-bottom: 0.5em solid transparent; 268 | transition: border 0.25s ease-out; 269 | } 270 | .datetime-range.datetime .calendar .calendar-header .arrow.arrow-left:hover::before { 271 | border-right-color: #999; 272 | } 273 | .datetime-range.datetime .calendar .calendar-header .arrow.arrow-right { 274 | position: absolute; 275 | right: 0; 276 | width: 2em; 277 | height: 100%; 278 | } 279 | .datetime-range.datetime .calendar .calendar-header .arrow.arrow-right::before { 280 | content: ""; 281 | position: absolute; 282 | top: 15%; 283 | right: 25%; 284 | border-left: 0.75em solid #ddd; 285 | border-top: 0.5em solid transparent; 286 | border-bottom: 0.5em solid transparent; 287 | transition: border 0.25s ease-out; 288 | } 289 | .datetime-range.datetime .calendar .calendar-header .arrow.arrow-right:hover::before { 290 | border-left-color: #999; 291 | } 292 | .datetime-range.datetime .calendar .calendar-body { 293 | padding: 0.5em 0; 294 | } 295 | .datetime-range.datetime .calendar .calendar-body .weekdays { 296 | cursor: default; 297 | display: flex; 298 | justify-content: space-between; 299 | color: #777; 300 | font-size: 1em; 301 | line-height: 2em; 302 | text-transform: uppercase; 303 | padding: 0 1em; 304 | } 305 | .datetime-range.datetime .calendar .calendar-body .weekdays .weekday { 306 | display: inline-block; 307 | width: 5em; 308 | height: 2.5em; 309 | } 310 | .datetime-range.datetime .calendar .calendar-body .weekdays .weekday { 311 | display: inline-block; 312 | } 313 | .datetime-range.datetime .calendar .calendar-body .week { 314 | display: flex; 315 | justify-content: space-between; 316 | color: #777; 317 | font-size: 1.25em; 318 | line-height: 2.65em; 319 | letter-spacing: 1px; 320 | padding: 0.5em 1em; 321 | } 322 | .datetime-range.datetime .calendar .calendar-body .week .date { 323 | display: inline-block; 324 | cursor: pointer; 325 | width: 2.5em; 326 | height: 2.5em; 327 | border-radius: 50%; 328 | transition: background-color 0.25s ease-out; 329 | } 330 | .datetime-range.datetime .calendar .calendar-body .week .date.current { 331 | color: #555; 332 | font-weight: 900; 333 | } 334 | .datetime-range.datetime .calendar .calendar-body .week .date:not(.active):hover { 335 | background-color: #ddd; 336 | } 337 | .datetime-range.datetime .calendar .calendar-body .week .date.active, 338 | .datetime-range.datetime .calendar .calendar-body .week .date.inactive.active { 339 | color: #efefef; 340 | background-color: rgba(255, 69, 0, 0.75); 341 | } 342 | .datetime-range.datetime .calendar .calendar-body .week .date.inactive { 343 | color: #aaa; 344 | } 345 | 346 | 347 | /** 348 | * Timer 349 | */ 350 | .datetime-range.datetime .timer { 351 | display: flex; 352 | justify-content: space-between; 353 | background-color: #fff; 354 | } 355 | .datetime-range.datetime .timer .timer-hours, 356 | .datetime-range.datetime .timer .timer-minutes, 357 | .datetime-range.datetime .timer .timer-seconds { 358 | cursor: default; 359 | width: 3em; 360 | display: inline-block; 361 | font-size: 3em; 362 | line-height: 1.5em; 363 | position: relative; 364 | } 365 | .datetime-range.datetime .timer .timer-hours .arrow, 366 | .datetime-range.datetime .timer .timer-minutes .arrow, 367 | .datetime-range.datetime .timer .timer-seconds .arrow { 368 | position: relative; 369 | color: #ddd; 370 | cursor: pointer; 371 | height: 1em; 372 | margin: 0 0.5em; 373 | line-height: 1em; 374 | font-size: 0.75em; 375 | } 376 | .datetime-range.datetime .timer .timer-hours .arrow.arrow-up::before, 377 | .datetime-range.datetime .timer .timer-minutes .arrow.arrow-up::before, 378 | .datetime-range.datetime .timer .timer-seconds .arrow.arrow-up::before { 379 | content: ""; 380 | position: absolute; 381 | top: 50%; 382 | left: calc(50% - 0.4em); 383 | border-left: 0.5em solid transparent; 384 | border-right: 0.5em solid transparent; 385 | border-bottom: 0.5em solid #ddd; 386 | transition: border 0.25s ease-out; 387 | } 388 | .datetime-range.datetime .timer .timer-hours .arrow.arrow-up:hover::before, 389 | .datetime-range.datetime .timer .timer-minutes .arrow.arrow-up:hover::before, 390 | .datetime-range.datetime .timer .timer-seconds .arrow.arrow-up:hover::before { 391 | border-bottom-color: #999; 392 | } 393 | .datetime-range.datetime .timer .timer-hours .arrow.arrow-down::before, 394 | .datetime-range.datetime .timer .timer-minutes .arrow.arrow-down::before, 395 | .datetime-range.datetime .timer .timer-seconds .arrow.arrow-down::before { 396 | content: ""; 397 | position: absolute; 398 | top: 0; 399 | left: calc(50% - 0.4em); 400 | border-left: 0.5em solid transparent; 401 | border-right: 0.5em solid transparent; 402 | border-top: 0.5em solid #ddd; 403 | transition: border 0.25s ease-out; 404 | } 405 | .datetime-range.datetime .timer .timer-hours .arrow.arrow-down:hover::before, 406 | .datetime-range.datetime .timer .timer-minutes .arrow.arrow-down:hover::before, 407 | .datetime-range.datetime .timer .timer-seconds .arrow.arrow-down:hover::before { 408 | border-top-color: #999; 409 | } 410 | .datetime-range.datetime .timer .timer-divider { 411 | font-size: 3em; 412 | line-height: 3em; 413 | -webkit-animation-name: blinker; 414 | -webkit-animation-duration: 5s; 415 | -webkit-animation-timing-function: linear; 416 | -webkit-animation-iteration-count: infinite; 417 | -moz-animation-name: blinker; 418 | -moz-animation-duration: 5s; 419 | -moz-animation-timing-function: linear; 420 | -moz-animation-iteration-count: infinite; 421 | animation-name: blinker; 422 | animation-duration: 5s; 423 | animation-timing-function: linear; 424 | animation-iteration-count: infinite; 425 | } 426 | @-moz-keyframes blinker { 427 | 0% { opacity: 0.0; } 428 | 5% { opacity: 1.0; } 429 | 95% { opacity: 1.0; } 430 | 100% { opacity: 0.0; } 431 | } 432 | @-webkit-keyframes blinker { 433 | 0% { opacity: 0.0; } 434 | 5% { opacity: 1.0; } 435 | 95% { opacity: 1.0; } 436 | 100% { opacity: 0.0; } 437 | } 438 | @keyframes blinker { 439 | 0% { opacity: 0.0; } 440 | 5% { opacity: 1.0; } 441 | 95% { opacity: 1.0; } 442 | 100% { opacity: 0.0; } 443 | } 444 | 445 | 446 | /** 447 | * Close button 448 | */ 449 | .datetime-range.datetime .close-button { 450 | position: absolute; 451 | z-index: 5; 452 | left: -1px; 453 | cursor: pointer; 454 | outline: none; 455 | border-top: 1px solid #aaa; 456 | border-left: 1px solid #aaa; 457 | border-bottom: 1px solid #aaa; 458 | color: #777; 459 | width: 25%; 460 | height: auto; 461 | margin-top: 10px; 462 | font-size: 1.5em; 463 | line-height: 2em; 464 | box-sizing: border-box; 465 | background-color: #efefef; 466 | transition: background-color 0.25s ease-out; 467 | } 468 | .datetime-range.datetime .close-button::before { 469 | content: ""; 470 | position: absolute; 471 | right: -0.5em; 472 | top: -1px; 473 | width: 1em; 474 | height: 2em; 475 | background: #efefef; 476 | border-top: 1px solid #aaa; 477 | border-right: 1px solid #aaa; 478 | transition: background 0.25s ease-out; 479 | transform: skewX(-26deg); 480 | } 481 | .datetime-range.datetime .close-button:hover, 482 | .datetime-range.datetime .close-button:hover::before { 483 | background: #ddd; 484 | } 485 | -------------------------------------------------------------------------------- /src/datetime-range.html: -------------------------------------------------------------------------------- 1 |
2 |
5 |
6 |
7 |
8 |
11 |
12 |
13 |
14 |
15 |
18 |
19 |
20 |
21 |
25 |
26 |
27 |
28 |
29 |
33 |
34 |
35 |
38 |
39 | 40 |
41 |
42 |
43 |
44 | 47 | 48 |
49 |
50 | 58 | 59 |
60 |
61 |
62 |
63 |
66 |
67 | 68 |
69 |
70 |
:
71 |
74 |
75 | 76 |
77 |
78 |
:
79 |
82 |
83 | 84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 | -------------------------------------------------------------------------------- /src/datetime-range.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('g1b.datetime-range', ['g1b.scroll-events']). 4 | directive('datetimeRange', ['$document', '$timeout', function ($document, $timeout) { 5 | 6 | return { 7 | restrict: 'E', 8 | scope: { 9 | start: '=', 10 | end: '=', 11 | presets: '=?', 12 | minDate:'=?', 13 | maxDate:'=?', 14 | onChange: '&?', 15 | onChangeStart: '&?', 16 | onChangeEnd: '&?', 17 | onClose: '&?', 18 | closeText: '@', 19 | }, 20 | replace: true, 21 | templateUrl: './datetime-range.html', 22 | compile: function () { 23 | return { 24 | pre: function preLink() {}, 25 | post: function postLink(scope, element) { 26 | 27 | // Get current date 28 | scope.current = moment(); 29 | 30 | // Convert start datetime to moment.js if its not a moment object yet 31 | if ( scope.start && !scope.start._isAMomentObject ) { 32 | scope.start = moment(scope.start); 33 | } 34 | 35 | // Convert end datetime to moment.js if its not a moment object yet 36 | if ( scope.end && !scope.end._isAMomentObject ) { 37 | scope.end = moment(scope.end); 38 | } 39 | 40 | // Get number of weeks in month 41 | scope.getNumWeeks = function () { 42 | if ( !scope.calendar ) { return; } 43 | 44 | var firstDayOfWeek = scope.calendar.clone().startOf('week').weekday(); 45 | 46 | var firstOfMonth = scope.calendar.clone().startOf('month'); 47 | var lastOfMonth = scope.calendar.clone().endOf('month'); 48 | 49 | var firstWeekDay = (firstOfMonth.weekday() - firstDayOfWeek + 7) % 7; 50 | 51 | return Math.ceil((firstWeekDay + scope.calendar.daysInMonth()) / 7); 52 | } 53 | 54 | // Set selected date 55 | scope.selectDate = function (date) { 56 | if ( scope.selected === date ) { 57 | scope.selected = undefined; 58 | } else { 59 | scope.selected = date; 60 | scope.calendar = scope.selected.clone(); 61 | scope.presetsActive = false; 62 | } 63 | }; 64 | 65 | // Check if date is within bounds of min and max allowed date 66 | scope.isWithinBounds = function (date) { 67 | return ( !scope.minDate || date > scope.minDate ) && ( !scope.maxDate || date < scope.maxDate ); 68 | }; 69 | 70 | // Update selected date 71 | scope.setDate = function (date, calendar_update) { 72 | if ( scope.selected.isSame(date) || !scope.isWithinBounds(date) ) { return; } 73 | if ( ( scope.selected === scope.start && date < scope.end ) || ( scope.selected === scope.end && date > scope.start ) ) { 74 | scope.selected.year(date.year()).month(date.month()).date(date.date()).hours(date.hours()).minutes(date.minutes()).seconds(date.seconds()); 75 | if ( (scope.selected.clone().startOf('week').month() !== scope.calendar.month() && scope.selected.clone().endOf('week').month() !== scope.calendar.month()) || calendar_update ) { 76 | scope.calendar = scope.selected.clone(); 77 | } 78 | if ( scope.selected === scope.start ) { 79 | scope.callbackStart(); 80 | } 81 | if ( scope.selected === scope.end ) { 82 | scope.callbackEnd(); 83 | } 84 | scope.callbackAll(); 85 | } else { 86 | scope.warning = ( scope.selected === scope.start ) ? 'end' : 'start'; 87 | $timeout(function () { 88 | scope.warning = undefined; 89 | }, 250); 90 | } 91 | }; 92 | 93 | // Set start and end datetime objects to the selected preset 94 | scope.selectPreset = function (preset) { 95 | // Hide presets menu on select 96 | scope.close(); 97 | 98 | // Don't do anything if nothing is changed 99 | if ( scope.start.isSame(preset.start) && scope.end.isSame(preset.end) ) { return; } 100 | 101 | // Update start datetime object if changed 102 | if ( !scope.start.isSame(preset.start) ) { 103 | scope.start = preset.start.clone(); 104 | scope.callbackStart(); 105 | } 106 | 107 | // Update end datetime object if changed 108 | if ( !scope.end.isSame(preset.end) ) { 109 | scope.end = preset.end.clone(); 110 | scope.callbackEnd(); 111 | } 112 | 113 | // Something has definitely changed, fire ambiguous callback 114 | scope.callbackAll(); 115 | }; 116 | 117 | // Callbacks fired on change of start datetime object 118 | scope.callbackStart = function () { 119 | if ( !!scope.onChangeStart ) { 120 | $timeout(function () { 121 | scope.onChangeStart(); 122 | }); 123 | } 124 | }; 125 | 126 | // Callbacks fired on change of end datetime object 127 | scope.callbackEnd = function () { 128 | if ( !!scope.onChangeEnd ) { 129 | $timeout(function () { 130 | scope.onChangeEnd(); 131 | }); 132 | } 133 | }; 134 | 135 | // Callbacks fired on change of start and/or end datetime objects 136 | scope.callbackAll = function () { 137 | if ( !!scope.onChange ) { 138 | $timeout(function () { 139 | scope.onChange(); 140 | }); 141 | } 142 | }; 143 | 144 | // Close edit popover 145 | scope.close = function () { 146 | scope.selected = ''; 147 | scope.presetsActive = false; 148 | scope.calendarActive = false; 149 | 150 | if ( !!scope.onClose ) { 151 | scope.onClose(); 152 | } 153 | } 154 | 155 | // Bind click events outside directive to close edit popover 156 | $document.on('mousedown', function (e) { 157 | if ( !element[0].contains(e.target) && (!!scope.presetsActive || !!scope.selected) ) { 158 | scope.$apply(function () { 159 | scope.close(); 160 | }); 161 | } 162 | }); 163 | 164 | // Bind 'esc' keyup event to close edit popover 165 | $document.on('keyup', function (e) { 166 | if ( e.keyCode === 27 && (!!scope.presetsActive || !!scope.selected) ) { 167 | scope.$apply(function () { 168 | scope.close(); 169 | }); 170 | } 171 | }); 172 | } 173 | }; 174 | } 175 | }; 176 | }]); 177 | -------------------------------------------------------------------------------- /src/time-range.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Datetime range styles 3 | */ 4 | .datetime-range.time { 5 | position: relative; 6 | width: 100%; 7 | min-width: 350px; 8 | height: auto; 9 | min-height: 4em; 10 | margin: 0; 11 | padding: 0; 12 | color: #444; 13 | font-size: 14px; 14 | font-family: sans-serif; 15 | text-decoration: none; 16 | text-align: center; 17 | user-select: none; 18 | -ms-user-select: none; 19 | -moz-user-select: none; 20 | -khtml-user-select: none; 21 | -webkit-user-select: none; 22 | -webkit-touch-callout: none; 23 | -webkit-user-select: none; 24 | -webkit-tap-highlight-color: rgba(255, 255, 255, 0); 25 | } 26 | 27 | 28 | /** 29 | * Start and end datetime objects 30 | */ 31 | .datetime-range.time .start-datetime, 32 | .datetime-range.time .end-datetime { 33 | cursor: pointer; 34 | position: relative; 35 | width: 47%; 36 | height: 4em; 37 | background-color: #efefef; 38 | transition: background-color 0.25s ease-out; 39 | } 40 | .datetime-range.time .start-datetime { 41 | position: absolute; 42 | left: 0; 43 | } 44 | .datetime-range.time .end-datetime { 45 | position: absolute; 46 | left: 53%; 47 | } 48 | .datetime-range.time .start-datetime .time, 49 | .datetime-range.time .end-datetime .time { 50 | color: #777; 51 | font-size: 2em; 52 | line-height: 2em; 53 | display: block; 54 | overflow: hidden; 55 | } 56 | .datetime-range.time .start-datetime.active, 57 | .datetime-range.time .start-datetime:hover, 58 | .datetime-range.time .end-datetime.active, 59 | .datetime-range.time .end-datetime:hover { 60 | background-color: #ddd; 61 | } 62 | .datetime-range.time .start-datetime::after { 63 | content: ""; 64 | position: absolute; 65 | top: 0; 66 | border-top: 2em solid transparent; 67 | border-bottom: 2em solid transparent; 68 | border-left: 1em solid #efefef; 69 | transition: border-left 0.25s ease-out; 70 | right: -1em; 71 | } 72 | .datetime-range.time .start-datetime.active::after, 73 | .datetime-range.time .start-datetime:hover::after { 74 | border-left-color: #ddd; 75 | } 76 | .datetime-range.time .end-datetime::before { 77 | content: ""; 78 | position: absolute; 79 | top: 0; 80 | border-width: 2em 0 2em 1em; 81 | border-style: solid; 82 | border-color: #efefef #efefef #efefef transparent; 83 | transition: border-color 0.25s ease-out; 84 | left: -1em; 85 | } 86 | .datetime-range.time .end-datetime.active::before, 87 | .datetime-range.time .end-datetime:hover::before { 88 | border-color: #ddd #ddd #ddd transparent; 89 | } 90 | .datetime-range.time .start-datetime.warning, 91 | .datetime-range.time .end-datetime.warning { 92 | background-color: rgba(255, 54, 46, 0.75); 93 | } 94 | .datetime-range.time .start-datetime.warning.active, 95 | .datetime-range.time .start-datetime.warning:hover, 96 | .datetime-range.time .end-datetime.warning.active, 97 | .datetime-range.time .end-datetime.warning:hover { 98 | background-color: rgba(255, 54, 46, 0.75); 99 | } 100 | .datetime-range.time .start-datetime.warning::after { 101 | border-left-color: rgba(255, 54, 46, 0.75); 102 | } 103 | .datetime-range.time .start-datetime.warning.active::after, 104 | .datetime-range.time .start-datetime.warning:hover::after { 105 | border-left-color: rgba(255, 54, 46, 0.75); 106 | } 107 | .datetime-range.time .end-datetime.warning::before { 108 | border-color: rgba(255, 54, 46, 0.75) rgba(255, 54, 46, 0.75) rgba(255, 54, 46, 0.75) transparent; 109 | } 110 | .datetime-range.time .end-datetime.warning.active::before, 111 | .datetime-range.time .end-datetime.warning:hover::before { 112 | border-color: rgba(255, 54, 46, 0.75) rgba(255, 54, 46, 0.75) rgba(255, 54, 46, 0.75) transparent; 113 | } 114 | 115 | 116 | /** 117 | * Presets 118 | */ 119 | .datetime-range.time .presets { 120 | box-sizing: border-box; 121 | position: absolute; 122 | z-index: 5; 123 | top: 4.5em; 124 | width: 100%; 125 | height: auto; 126 | padding: 0; 127 | text-align: center; 128 | } 129 | .datetime-range.time .presets .dots { 130 | display: inline-block; 131 | cursor: pointer; 132 | } 133 | .datetime-range.time .presets .dots .dot { 134 | display: inline-block; 135 | width: 5px; 136 | height: 5px; 137 | margin: 0 3px; 138 | vertical-align: top; 139 | background-color: #efefef; 140 | } 141 | .datetime-range.time .presets .dots:hover .dot { 142 | background-color: #ddd; 143 | } 144 | .datetime-range.time .presets .list { 145 | display: none; 146 | } 147 | .datetime-range.time .presets .list.active { 148 | display: block; 149 | } 150 | .datetime-range.time .presets .list .preset-button { 151 | box-sizing: border-box; 152 | position: relative; 153 | display: block; 154 | cursor: pointer; 155 | color: #777; 156 | width: 100%; 157 | height: auto; 158 | margin-bottom: 10px; 159 | padding: 0 15px; 160 | font-size: 1.5em; 161 | line-height: 2em; 162 | text-align: center; 163 | outline: none; 164 | border: 1px solid #aaa; 165 | background-color: #efefef; 166 | transition: background-color 0.25s ease-out; 167 | } 168 | .datetime-range.time .presets .list .preset-button:hover { 169 | background: #ddd; 170 | } 171 | 172 | 173 | /** 174 | * Edit datetime popover 175 | */ 176 | .datetime-range.time .edit-popover { 177 | position: absolute; 178 | z-index: 5; 179 | top: 4.5em; 180 | width: 100%; 181 | height: auto; 182 | padding: 0; 183 | background-color: #efefef; 184 | border-radius: 0; 185 | border: 1px solid #aaa; 186 | box-sizing: border-box; 187 | } 188 | .datetime-range.time .edit-popover .header { 189 | width: 100%; 190 | color: #777; 191 | font-size: 1.5em; 192 | line-height: 2em; 193 | cursor: pointer; 194 | transition: background-color 0.25s ease-out; 195 | } 196 | .datetime-range.time .edit-popover .header::before { 197 | content: ""; 198 | display: block; 199 | position: absolute; 200 | background-color: #efefef; 201 | width: 1em; 202 | height: 1em; 203 | top: -0.55em; 204 | left: 45%; 205 | z-index: 2; 206 | border-color: #aaa; 207 | border-style: solid; 208 | border-width: 1px 1px 0 0; 209 | transform: rotate(-45deg); 210 | -moz-transform: rotate(-45deg); 211 | -ms-transform: rotate(-45deg); 212 | -o-transform: rotate(-45deg); 213 | -webkit-transform: rotate(-45deg); 214 | transition: background-color 0.25s ease-out; 215 | } 216 | .datetime-range.time .edit-popover .header.start::before { 217 | left: 20%; 218 | } 219 | .datetime-range.time .edit-popover .header.end::before { 220 | left: 74%; 221 | } 222 | 223 | 224 | /** 225 | * Timer 226 | */ 227 | .datetime-range.time .timer { 228 | display: flex; 229 | justify-content: space-between; 230 | background-color: #fff; 231 | } 232 | .datetime-range.time .timer .timer-hours, 233 | .datetime-range.time .timer .timer-minutes, 234 | .datetime-range.time .timer .timer-seconds { 235 | cursor: default; 236 | width: 3em; 237 | display: inline-block; 238 | font-size: 3em; 239 | line-height: 1.5em; 240 | position: relative; 241 | } 242 | .datetime-range.time .timer .timer-hours .arrow, 243 | .datetime-range.time .timer .timer-minutes .arrow, 244 | .datetime-range.time .timer .timer-seconds .arrow { 245 | position: relative; 246 | color: #ddd; 247 | cursor: pointer; 248 | height: 1em; 249 | margin: 0 0.5em; 250 | line-height: 1em; 251 | font-size: 0.75em; 252 | } 253 | .datetime-range.time .timer .timer-hours .arrow.arrow-up::before, 254 | .datetime-range.time .timer .timer-minutes .arrow.arrow-up::before, 255 | .datetime-range.time .timer .timer-seconds .arrow.arrow-up::before { 256 | content: ""; 257 | position: absolute; 258 | top: 50%; 259 | left: calc(50% - 0.4em); 260 | border-left: 0.5em solid transparent; 261 | border-right: 0.5em solid transparent; 262 | border-bottom: 0.5em solid #ddd; 263 | transition: border 0.25s ease-out; 264 | } 265 | .datetime-range.time .timer .timer-hours .arrow.arrow-up:hover::before, 266 | .datetime-range.time .timer .timer-minutes .arrow.arrow-up:hover::before, 267 | .datetime-range.time .timer .timer-seconds .arrow.arrow-up:hover::before { 268 | border-bottom-color: #999; 269 | } 270 | .datetime-range.time .timer .timer-hours .arrow.arrow-down::before, 271 | .datetime-range.time .timer .timer-minutes .arrow.arrow-down::before, 272 | .datetime-range.time .timer .timer-seconds .arrow.arrow-down::before { 273 | content: ""; 274 | position: absolute; 275 | top: 0; 276 | left: calc(50% - 0.4em); 277 | border-left: 0.5em solid transparent; 278 | border-right: 0.5em solid transparent; 279 | border-top: 0.5em solid #ddd; 280 | transition: border 0.25s ease-out; 281 | } 282 | .datetime-range.time .timer .timer-hours .arrow.arrow-down:hover::before, 283 | .datetime-range.time .timer .timer-minutes .arrow.arrow-down:hover::before, 284 | .datetime-range.time .timer .timer-seconds .arrow.arrow-down:hover::before { 285 | border-top-color: #999; 286 | } 287 | .datetime-range.time .timer .timer-divider { 288 | font-size: 3em; 289 | line-height: 3em; 290 | -webkit-animation-name: blinker; 291 | -webkit-animation-duration: 5s; 292 | -webkit-animation-timing-function: linear; 293 | -webkit-animation-iteration-count: infinite; 294 | -moz-animation-name: blinker; 295 | -moz-animation-duration: 5s; 296 | -moz-animation-timing-function: linear; 297 | -moz-animation-iteration-count: infinite; 298 | animation-name: blinker; 299 | animation-duration: 5s; 300 | animation-timing-function: linear; 301 | animation-iteration-count: infinite; 302 | } 303 | @-moz-keyframes blinker { 304 | 0% { opacity: 0.0; } 305 | 5% { opacity: 1.0; } 306 | 95% { opacity: 1.0; } 307 | 100% { opacity: 0.0; } 308 | } 309 | @-webkit-keyframes blinker { 310 | 0% { opacity: 0.0; } 311 | 5% { opacity: 1.0; } 312 | 95% { opacity: 1.0; } 313 | 100% { opacity: 0.0; } 314 | } 315 | @keyframes blinker { 316 | 0% { opacity: 0.0; } 317 | 5% { opacity: 1.0; } 318 | 95% { opacity: 1.0; } 319 | 100% { opacity: 0.0; } 320 | } 321 | 322 | 323 | /** 324 | * Close button 325 | */ 326 | .datetime-range.time .close-button { 327 | position: absolute; 328 | z-index: 5; 329 | left: -1px; 330 | cursor: pointer; 331 | outline: none; 332 | border-top: 1px solid #aaa; 333 | border-left: 1px solid #aaa; 334 | border-bottom: 1px solid #aaa; 335 | color: #777; 336 | width: 25%; 337 | height: auto; 338 | margin-top: 10px; 339 | font-size: 1.5em; 340 | line-height: 2em; 341 | box-sizing: border-box; 342 | background-color: #efefef; 343 | transition: background-color 0.25s ease-out; 344 | } 345 | .datetime-range.time .close-button::before { 346 | content: ""; 347 | position: absolute; 348 | right: -0.5em; 349 | top: -1px; 350 | width: 1em; 351 | height: 2em; 352 | background: #efefef; 353 | border-top: 1px solid #aaa; 354 | border-right: 1px solid #aaa; 355 | transition: background 0.25s ease-out; 356 | transform: skewX(-26deg); 357 | } 358 | .datetime-range.time .close-button:hover, 359 | .datetime-range.time .close-button:hover::before { 360 | background: #ddd; 361 | } 362 | -------------------------------------------------------------------------------- /src/time-range.html: -------------------------------------------------------------------------------- 1 |
2 |
5 |
6 |
7 |
10 |
11 |
12 |
13 |
16 |
17 |
18 |
19 |
23 |
24 |
25 |
26 |
27 |
30 |
31 |
32 |
35 |
36 | 37 |
38 |
39 |
40 |
41 | 44 | 45 |
46 |
47 | 55 | 56 |
57 |
58 |
59 |
60 |
63 |
64 | 65 |
66 |
67 |
:
68 |
71 |
72 | 73 |
74 |
75 |
:
76 |
79 |
80 | 81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 | -------------------------------------------------------------------------------- /src/time-range.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | angular.module('g1b.datetime-range'). 4 | directive('timeRange', ['$document', '$timeout', function ($document, $timeout) { 5 | 6 | return { 7 | restrict: 'E', 8 | scope: { 9 | start: '=', 10 | end: '=', 11 | presets: '=?', 12 | minDate:'=?', 13 | maxDate:'=?', 14 | onChange: '&?', 15 | onChangeStart: '&?', 16 | onChangeEnd: '&?', 17 | onClose: '&?', 18 | closeText: '@', 19 | }, 20 | replace: true, 21 | templateUrl: './time-range.html', 22 | compile: function () { 23 | return { 24 | pre: function preLink() {}, 25 | post: function postLink(scope, element) { 26 | 27 | // Get current date 28 | scope.current = moment(); 29 | 30 | // Convert start datetime to moment.js if its not a moment object yet 31 | if ( scope.start && !scope.start._isAMomentObject ) { 32 | scope.start = moment(scope.start); 33 | } 34 | 35 | // Convert end datetime to moment.js if its not a moment object yet 36 | if ( scope.end && !scope.end._isAMomentObject ) { 37 | scope.end = moment(scope.end); 38 | } 39 | 40 | // Get number of weeks in month 41 | scope.getNumWeeks = function () { 42 | if ( !scope.calendar ) { return; } 43 | 44 | var firstDayOfWeek = scope.calendar.clone().startOf('week').weekday(); 45 | 46 | var firstOfMonth = scope.calendar.clone().startOf('month'); 47 | var lastOfMonth = scope.calendar.clone().endOf('month'); 48 | 49 | var firstWeekDay = (firstOfMonth.weekday() - firstDayOfWeek + 7) % 7; 50 | 51 | return Math.ceil((firstWeekDay + scope.calendar.daysInMonth()) / 7); 52 | } 53 | 54 | // Set selected date 55 | scope.selectDate = function (date) { 56 | if ( scope.selected === date ) { 57 | scope.selected = undefined; 58 | } else { 59 | scope.selected = date; 60 | scope.calendar = scope.selected.clone(); 61 | scope.presetsActive = false; 62 | } 63 | }; 64 | 65 | // Check if date is within bounds of min and max allowed date 66 | scope.isWithinBounds = function (date) { 67 | return ( !scope.minDate || date > scope.minDate ) && ( !scope.maxDate || date < scope.maxDate ); 68 | }; 69 | 70 | // Update selected date 71 | scope.setDate = function (date, calendar_update) { 72 | if ( scope.selected.isSame(date) || !scope.isWithinBounds(date) ) { return; } 73 | if ( ( scope.selected === scope.start && date < scope.end ) || ( scope.selected === scope.end && date > scope.start ) ) { 74 | scope.selected.year(date.year()).month(date.month()).date(date.date()).hours(date.hours()).minutes(date.minutes()).seconds(date.seconds()); 75 | if ( (scope.selected.clone().startOf('week').month() !== scope.calendar.month() && scope.selected.clone().endOf('week').month() !== scope.calendar.month()) || calendar_update ) { 76 | scope.calendar = scope.selected.clone(); 77 | } 78 | if ( scope.selected === scope.start ) { 79 | scope.callbackStart(); 80 | } 81 | if ( scope.selected === scope.end ) { 82 | scope.callbackEnd(); 83 | } 84 | scope.callbackAll(); 85 | } else { 86 | scope.warning = ( scope.selected === scope.start ) ? 'end' : 'start'; 87 | $timeout(function () { 88 | scope.warning = undefined; 89 | }, 250); 90 | } 91 | }; 92 | 93 | // Set start and end datetime objects to the selected preset 94 | scope.selectPreset = function (preset) { 95 | // Hide presets menu on select 96 | scope.close(); 97 | 98 | // Don't do anything if nothing is changed 99 | if ( scope.start.isSame(preset.start) && scope.end.isSame(preset.end) ) { return; } 100 | 101 | // Update start datetime object if changed 102 | if ( !scope.start.isSame(preset.start) ) { 103 | scope.start = preset.start.clone(); 104 | scope.callbackStart(); 105 | } 106 | 107 | // Update end datetime object if changed 108 | if ( !scope.end.isSame(preset.end) ) { 109 | scope.end = preset.end.clone(); 110 | scope.callbackEnd(); 111 | } 112 | 113 | // Something has definitely changed, fire ambiguous callback 114 | scope.callbackAll(); 115 | }; 116 | 117 | // Callbacks fired on change of start datetime object 118 | scope.callbackStart = function () { 119 | if ( !!scope.onChangeStart ) { 120 | $timeout(function () { 121 | scope.onChangeStart(); 122 | }); 123 | } 124 | }; 125 | 126 | // Callbacks fired on change of end datetime object 127 | scope.callbackEnd = function () { 128 | if ( !!scope.onChangeEnd ) { 129 | $timeout(function () { 130 | scope.onChangeEnd(); 131 | }); 132 | } 133 | }; 134 | 135 | // Callbacks fired on change of start and/or end datetime objects 136 | scope.callbackAll = function () { 137 | if ( !!scope.onChange ) { 138 | $timeout(function () { 139 | scope.onChange(); 140 | }); 141 | } 142 | }; 143 | 144 | // Close edit popover 145 | scope.close = function () { 146 | scope.selected = ''; 147 | scope.presetsActive = false; 148 | 149 | if ( !!scope.onClose ) { 150 | scope.onClose(); 151 | } 152 | } 153 | 154 | // Bind click events outside directive to close edit popover 155 | $document.on('mousedown', function (e) { 156 | if ( !element[0].contains(e.target) && (!!scope.presetsActive || !!scope.selected) ) { 157 | scope.$apply(function () { 158 | scope.close(); 159 | }); 160 | } 161 | }); 162 | 163 | // Bind 'esc' keyup event to close edit popover 164 | $document.on('keyup', function (e) { 165 | if ( e.keyCode === 27 && (!!scope.presetsActive || !!scope.selected) ) { 166 | scope.$apply(function () { 167 | scope.close(); 168 | }); 169 | } 170 | }); 171 | } 172 | }; 173 | } 174 | }; 175 | }]); 176 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | align-text@^0.1.1, align-text@^0.1.3: 6 | version "0.1.4" 7 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 8 | dependencies: 9 | kind-of "^3.0.2" 10 | longest "^1.0.1" 11 | repeat-string "^1.5.2" 12 | 13 | alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: 14 | version "1.0.2" 15 | resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" 16 | 17 | angular-scroll-events@^0.0.2: 18 | version "0.0.2" 19 | resolved "https://registry.yarnpkg.com/angular-scroll-events/-/angular-scroll-events-0.0.2.tgz#a47a25e0d1f19f087f496433730dccb90ca6d230" 20 | dependencies: 21 | angular "^1.5.6" 22 | 23 | angular@^1.5.6: 24 | version "1.6.6" 25 | resolved "https://registry.yarnpkg.com/angular/-/angular-1.6.6.tgz#fd5a3cfb437ce382d854ee01120797978527cb64" 26 | 27 | ansi-regex@^2.0.0, ansi-regex@^2.1.1: 28 | version "2.1.1" 29 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 30 | 31 | ansi-styles@^2.2.1: 32 | version "2.2.1" 33 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 34 | 35 | archy@^1.0.0: 36 | version "1.0.0" 37 | resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 38 | 39 | argh@^0.1.4: 40 | version "0.1.4" 41 | resolved "https://registry.yarnpkg.com/argh/-/argh-0.1.4.tgz#3eb4d612973fc6b6dc6ef338f56f759f2ac5c3a6" 42 | 43 | argparse@^1.0.7: 44 | version "1.0.9" 45 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 46 | dependencies: 47 | sprintf-js "~1.0.2" 48 | 49 | arr-diff@^2.0.0: 50 | version "2.0.0" 51 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 52 | dependencies: 53 | arr-flatten "^1.0.1" 54 | 55 | arr-flatten@^1.0.1: 56 | version "1.1.0" 57 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 58 | 59 | array-differ@^1.0.0: 60 | version "1.0.0" 61 | resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" 62 | 63 | array-each@^1.0.1: 64 | version "1.0.1" 65 | resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" 66 | 67 | array-slice@^1.0.0: 68 | version "1.0.0" 69 | resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.0.0.tgz#e73034f00dcc1f40876008fd20feae77bd4b7c2f" 70 | 71 | array-uniq@^1.0.2: 72 | version "1.0.3" 73 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 74 | 75 | array-unique@^0.2.1: 76 | version "0.2.1" 77 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 78 | 79 | async@^2.1.5: 80 | version "2.6.0" 81 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" 82 | dependencies: 83 | lodash "^4.14.0" 84 | 85 | async@~0.2.6: 86 | version "0.2.10" 87 | resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" 88 | 89 | autoprefixer@^6.3.1: 90 | version "6.7.7" 91 | resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" 92 | dependencies: 93 | browserslist "^1.7.6" 94 | caniuse-db "^1.0.30000634" 95 | normalize-range "^0.1.2" 96 | num2fraction "^1.2.2" 97 | postcss "^5.2.16" 98 | postcss-value-parser "^3.2.3" 99 | 100 | balanced-match@^0.4.2: 101 | version "0.4.2" 102 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 103 | 104 | balanced-match@^1.0.0: 105 | version "1.0.0" 106 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 107 | 108 | beeper@^1.0.0: 109 | version "1.1.1" 110 | resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" 111 | 112 | brace-expansion@^1.0.0: 113 | version "1.1.8" 114 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 115 | dependencies: 116 | balanced-match "^1.0.0" 117 | concat-map "0.0.1" 118 | 119 | braces@^1.8.2: 120 | version "1.8.5" 121 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 122 | dependencies: 123 | expand-range "^1.8.1" 124 | preserve "^0.2.0" 125 | repeat-element "^1.1.2" 126 | 127 | browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: 128 | version "1.7.7" 129 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" 130 | dependencies: 131 | caniuse-db "^1.0.30000639" 132 | electron-to-chromium "^1.2.7" 133 | 134 | camelcase@^1.0.2: 135 | version "1.2.1" 136 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 137 | 138 | caniuse-api@^1.5.2: 139 | version "1.6.1" 140 | resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" 141 | dependencies: 142 | browserslist "^1.3.6" 143 | caniuse-db "^1.0.30000529" 144 | lodash.memoize "^4.1.2" 145 | lodash.uniq "^4.5.0" 146 | 147 | caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: 148 | version "1.0.30000760" 149 | resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000760.tgz#3ea29473eb78a6ccb09f2eb73ac9e1debfec528d" 150 | 151 | center-align@^0.1.1: 152 | version "0.1.3" 153 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" 154 | dependencies: 155 | align-text "^0.1.3" 156 | lazy-cache "^1.0.3" 157 | 158 | chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: 159 | version "1.1.3" 160 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 161 | dependencies: 162 | ansi-styles "^2.2.1" 163 | escape-string-regexp "^1.0.2" 164 | has-ansi "^2.0.0" 165 | strip-ansi "^3.0.0" 166 | supports-color "^2.0.0" 167 | 168 | clap@^1.0.9: 169 | version "1.2.3" 170 | resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" 171 | dependencies: 172 | chalk "^1.1.3" 173 | 174 | cli-color@^1.2.0: 175 | version "1.2.0" 176 | resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.2.0.tgz#3a5ae74fd76b6267af666e69e2afbbd01def34d1" 177 | dependencies: 178 | ansi-regex "^2.1.1" 179 | d "1" 180 | es5-ext "^0.10.12" 181 | es6-iterator "2" 182 | memoizee "^0.4.3" 183 | timers-ext "0.1" 184 | 185 | cliui@^2.1.0: 186 | version "2.1.0" 187 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" 188 | dependencies: 189 | center-align "^0.1.1" 190 | right-align "^0.1.1" 191 | wordwrap "0.0.2" 192 | 193 | clone-buffer@^1.0.0: 194 | version "1.0.0" 195 | resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" 196 | 197 | clone-stats@^0.0.1: 198 | version "0.0.1" 199 | resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" 200 | 201 | clone-stats@^1.0.0: 202 | version "1.0.0" 203 | resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" 204 | 205 | clone@^0.2.0: 206 | version "0.2.0" 207 | resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" 208 | 209 | clone@^1.0.0, clone@^1.0.2: 210 | version "1.0.2" 211 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" 212 | 213 | clone@^2.1.1: 214 | version "2.1.1" 215 | resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" 216 | 217 | cloneable-readable@^1.0.0: 218 | version "1.0.0" 219 | resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.0.0.tgz#a6290d413f217a61232f95e458ff38418cfb0117" 220 | dependencies: 221 | inherits "^2.0.1" 222 | process-nextick-args "^1.0.6" 223 | through2 "^2.0.1" 224 | 225 | coa@~1.0.1: 226 | version "1.0.4" 227 | resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" 228 | dependencies: 229 | q "^1.1.2" 230 | 231 | color-convert@^0.5.0: 232 | version "0.5.3" 233 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd" 234 | 235 | color-convert@^1.3.0: 236 | version "1.9.0" 237 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" 238 | dependencies: 239 | color-name "^1.1.1" 240 | 241 | color-name@^1.0.0, color-name@^1.1.1: 242 | version "1.1.3" 243 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 244 | 245 | color-string@^0.3.0: 246 | version "0.3.0" 247 | resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" 248 | dependencies: 249 | color-name "^1.0.0" 250 | 251 | color@0.8.x: 252 | version "0.8.0" 253 | resolved "https://registry.yarnpkg.com/color/-/color-0.8.0.tgz#890c07c3fd4e649537638911cf691e5458b6fca5" 254 | dependencies: 255 | color-convert "^0.5.0" 256 | color-string "^0.3.0" 257 | 258 | color@^0.11.0: 259 | version "0.11.4" 260 | resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" 261 | dependencies: 262 | clone "^1.0.2" 263 | color-convert "^1.3.0" 264 | color-string "^0.3.0" 265 | 266 | colormin@^1.0.5: 267 | version "1.1.2" 268 | resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" 269 | dependencies: 270 | color "^0.11.0" 271 | css-color-names "0.0.4" 272 | has "^1.0.1" 273 | 274 | colornames@0.0.2: 275 | version "0.0.2" 276 | resolved "https://registry.yarnpkg.com/colornames/-/colornames-0.0.2.tgz#d811fd6c84f59029499a8ac4436202935b92be31" 277 | 278 | colors@~1.1.2: 279 | version "1.1.2" 280 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" 281 | 282 | colorspace@1.0.x: 283 | version "1.0.1" 284 | resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.0.1.tgz#c99c796ed31128b9876a52e1ee5ee03a4a719749" 285 | dependencies: 286 | color "0.8.x" 287 | text-hex "0.0.x" 288 | 289 | concat-map@0.0.1: 290 | version "0.0.1" 291 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 292 | 293 | concat-with-sourcemaps@^1.0.0: 294 | version "1.0.4" 295 | resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.4.tgz#f55b3be2aeb47601b10a2d5259ccfb70fd2f1dd6" 296 | dependencies: 297 | source-map "^0.5.1" 298 | 299 | core-util-is@~1.0.0: 300 | version "1.0.2" 301 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 302 | 303 | css-color-names@0.0.4: 304 | version "0.0.4" 305 | resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" 306 | 307 | cssnano@^3.0.0: 308 | version "3.10.0" 309 | resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" 310 | dependencies: 311 | autoprefixer "^6.3.1" 312 | decamelize "^1.1.2" 313 | defined "^1.0.0" 314 | has "^1.0.1" 315 | object-assign "^4.0.1" 316 | postcss "^5.0.14" 317 | postcss-calc "^5.2.0" 318 | postcss-colormin "^2.1.8" 319 | postcss-convert-values "^2.3.4" 320 | postcss-discard-comments "^2.0.4" 321 | postcss-discard-duplicates "^2.0.1" 322 | postcss-discard-empty "^2.0.1" 323 | postcss-discard-overridden "^0.1.1" 324 | postcss-discard-unused "^2.2.1" 325 | postcss-filter-plugins "^2.0.0" 326 | postcss-merge-idents "^2.1.5" 327 | postcss-merge-longhand "^2.0.1" 328 | postcss-merge-rules "^2.0.3" 329 | postcss-minify-font-values "^1.0.2" 330 | postcss-minify-gradients "^1.0.1" 331 | postcss-minify-params "^1.0.4" 332 | postcss-minify-selectors "^2.0.4" 333 | postcss-normalize-charset "^1.1.0" 334 | postcss-normalize-url "^3.0.7" 335 | postcss-ordered-values "^2.1.0" 336 | postcss-reduce-idents "^2.2.2" 337 | postcss-reduce-initial "^1.0.0" 338 | postcss-reduce-transforms "^1.0.3" 339 | postcss-svgo "^2.1.1" 340 | postcss-unique-selectors "^2.0.2" 341 | postcss-value-parser "^3.2.3" 342 | postcss-zindex "^2.0.1" 343 | 344 | csso@~2.3.1: 345 | version "2.3.2" 346 | resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" 347 | dependencies: 348 | clap "^1.0.9" 349 | source-map "^0.5.3" 350 | 351 | d@1: 352 | version "1.0.0" 353 | resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" 354 | dependencies: 355 | es5-ext "^0.10.9" 356 | 357 | dateformat@^2.0.0: 358 | version "2.2.0" 359 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" 360 | 361 | deap@^1.0.0: 362 | version "1.0.0" 363 | resolved "https://registry.yarnpkg.com/deap/-/deap-1.0.0.tgz#b148bf82430a27699b7483a03eb6b67585bfc888" 364 | 365 | decamelize@^1.0.0, decamelize@^1.1.2: 366 | version "1.2.0" 367 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 368 | 369 | defaults@^1.0.0: 370 | version "1.0.3" 371 | resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" 372 | dependencies: 373 | clone "^1.0.2" 374 | 375 | defined@^1.0.0: 376 | version "1.0.0" 377 | resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" 378 | 379 | deprecated@^0.0.1: 380 | version "0.0.1" 381 | resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" 382 | 383 | detect-file@^0.1.0: 384 | version "0.1.0" 385 | resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" 386 | dependencies: 387 | fs-exists-sync "^0.1.0" 388 | 389 | diagnostics@^1.1.0: 390 | version "1.1.0" 391 | resolved "https://registry.yarnpkg.com/diagnostics/-/diagnostics-1.1.0.tgz#e1090900b49523e8527be20f081275205f2ae36a" 392 | dependencies: 393 | colorspace "1.0.x" 394 | enabled "1.0.x" 395 | kuler "0.0.x" 396 | 397 | dom-serializer@0: 398 | version "0.1.0" 399 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" 400 | dependencies: 401 | domelementtype "~1.1.1" 402 | entities "~1.1.1" 403 | 404 | domelementtype@1, domelementtype@^1.3.0: 405 | version "1.3.0" 406 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" 407 | 408 | domelementtype@~1.1.1: 409 | version "1.1.3" 410 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" 411 | 412 | domhandler@^2.3.0: 413 | version "2.4.1" 414 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259" 415 | dependencies: 416 | domelementtype "1" 417 | 418 | domutils@^1.5.1: 419 | version "1.6.2" 420 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.6.2.tgz#1958cc0b4c9426e9ed367fb1c8e854891b0fa3ff" 421 | dependencies: 422 | dom-serializer "0" 423 | domelementtype "1" 424 | 425 | duplexer2@0.0.2: 426 | version "0.0.2" 427 | resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" 428 | dependencies: 429 | readable-stream "~1.1.9" 430 | 431 | electron-to-chromium@^1.2.7: 432 | version "1.3.27" 433 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" 434 | 435 | emits@^3.0.0: 436 | version "3.0.0" 437 | resolved "https://registry.yarnpkg.com/emits/-/emits-3.0.0.tgz#32752bba95e1707b219562384ab9bb8b1fd62f70" 438 | 439 | enabled@1.0.x: 440 | version "1.0.2" 441 | resolved "https://registry.yarnpkg.com/enabled/-/enabled-1.0.2.tgz#965f6513d2c2d1c5f4652b64a2e3396467fc2f93" 442 | dependencies: 443 | env-variable "0.0.x" 444 | 445 | end-of-stream@~0.1.5: 446 | version "0.1.5" 447 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" 448 | dependencies: 449 | once "~1.3.0" 450 | 451 | entities@^1.1.1, entities@~1.1.1: 452 | version "1.1.1" 453 | resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" 454 | 455 | env-variable@0.0.x: 456 | version "0.0.3" 457 | resolved "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.3.tgz#b86c1641be5610267d506f18071ea76d707097cb" 458 | 459 | es5-ext@^0.10.12, es5-ext@^0.10.14, es5-ext@^0.10.30, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2: 460 | version "0.10.35" 461 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.35.tgz#18ee858ce6a3c45c7d79e91c15fcca9ec568494f" 462 | dependencies: 463 | es6-iterator "~2.0.1" 464 | es6-symbol "~3.1.1" 465 | 466 | es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: 467 | version "2.0.3" 468 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" 469 | dependencies: 470 | d "1" 471 | es5-ext "^0.10.35" 472 | es6-symbol "^3.1.1" 473 | 474 | es6-symbol@^3.1.1, es6-symbol@~3.1.1: 475 | version "3.1.1" 476 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" 477 | dependencies: 478 | d "1" 479 | es5-ext "~0.10.14" 480 | 481 | es6-weak-map@^2.0.2: 482 | version "2.0.2" 483 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" 484 | dependencies: 485 | d "1" 486 | es5-ext "^0.10.14" 487 | es6-iterator "^2.0.1" 488 | es6-symbol "^3.1.1" 489 | 490 | escape-string-regexp@^1.0.2: 491 | version "1.0.5" 492 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 493 | 494 | esprima@^2.6.0: 495 | version "2.7.3" 496 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 497 | 498 | event-emitter@^0.3.5: 499 | version "0.3.5" 500 | resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" 501 | dependencies: 502 | d "1" 503 | es5-ext "~0.10.14" 504 | 505 | expand-brackets@^0.1.4: 506 | version "0.1.5" 507 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 508 | dependencies: 509 | is-posix-bracket "^0.1.0" 510 | 511 | expand-range@^1.8.1: 512 | version "1.8.2" 513 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 514 | dependencies: 515 | fill-range "^2.1.0" 516 | 517 | expand-tilde@^1.2.2: 518 | version "1.2.2" 519 | resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" 520 | dependencies: 521 | os-homedir "^1.0.1" 522 | 523 | expand-tilde@^2.0.2: 524 | version "2.0.2" 525 | resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" 526 | dependencies: 527 | homedir-polyfill "^1.0.1" 528 | 529 | extend@^3.0.0: 530 | version "3.0.1" 531 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 532 | 533 | extglob@^0.3.1: 534 | version "0.3.2" 535 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 536 | dependencies: 537 | is-extglob "^1.0.0" 538 | 539 | fancy-log@^1.0.0, fancy-log@^1.1.0: 540 | version "1.3.0" 541 | resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" 542 | dependencies: 543 | chalk "^1.1.1" 544 | time-stamp "^1.0.0" 545 | 546 | filename-regex@^2.0.0: 547 | version "2.0.1" 548 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 549 | 550 | fill-range@^2.1.0: 551 | version "2.2.3" 552 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 553 | dependencies: 554 | is-number "^2.1.0" 555 | isobject "^2.0.0" 556 | randomatic "^1.1.3" 557 | repeat-element "^1.1.2" 558 | repeat-string "^1.5.2" 559 | 560 | find-index@^0.1.1: 561 | version "0.1.1" 562 | resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" 563 | 564 | findup-sync@^0.4.2: 565 | version "0.4.3" 566 | resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" 567 | dependencies: 568 | detect-file "^0.1.0" 569 | is-glob "^2.0.1" 570 | micromatch "^2.3.7" 571 | resolve-dir "^0.1.0" 572 | 573 | fined@^1.0.1: 574 | version "1.1.0" 575 | resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" 576 | dependencies: 577 | expand-tilde "^2.0.2" 578 | is-plain-object "^2.0.3" 579 | object.defaults "^1.1.0" 580 | object.pick "^1.2.0" 581 | parse-filepath "^1.0.1" 582 | 583 | first-chunk-stream@^1.0.0: 584 | version "1.0.0" 585 | resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" 586 | 587 | flagged-respawn@^0.3.2: 588 | version "0.3.2" 589 | resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" 590 | 591 | flatten@^1.0.2: 592 | version "1.0.2" 593 | resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" 594 | 595 | for-in@^1.0.1: 596 | version "1.0.2" 597 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 598 | 599 | for-own@^0.1.4: 600 | version "0.1.5" 601 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 602 | dependencies: 603 | for-in "^1.0.1" 604 | 605 | for-own@^1.0.0: 606 | version "1.0.0" 607 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" 608 | dependencies: 609 | for-in "^1.0.1" 610 | 611 | fs-exists-sync@^0.1.0: 612 | version "0.1.0" 613 | resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" 614 | 615 | function-bind@^1.0.2: 616 | version "1.1.1" 617 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 618 | 619 | gaze@^0.5.1: 620 | version "0.5.2" 621 | resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" 622 | dependencies: 623 | globule "~0.1.0" 624 | 625 | glob-base@^0.3.0: 626 | version "0.3.0" 627 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 628 | dependencies: 629 | glob-parent "^2.0.0" 630 | is-glob "^2.0.0" 631 | 632 | glob-parent@^2.0.0: 633 | version "2.0.0" 634 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 635 | dependencies: 636 | is-glob "^2.0.0" 637 | 638 | glob-stream@^3.1.5: 639 | version "3.1.18" 640 | resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" 641 | dependencies: 642 | glob "^4.3.1" 643 | glob2base "^0.0.12" 644 | minimatch "^2.0.1" 645 | ordered-read-streams "^0.1.0" 646 | through2 "^0.6.1" 647 | unique-stream "^1.0.0" 648 | 649 | glob-watcher@^0.0.6: 650 | version "0.0.6" 651 | resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" 652 | dependencies: 653 | gaze "^0.5.1" 654 | 655 | glob2base@^0.0.12: 656 | version "0.0.12" 657 | resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" 658 | dependencies: 659 | find-index "^0.1.1" 660 | 661 | glob@^4.3.1: 662 | version "4.5.3" 663 | resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" 664 | dependencies: 665 | inflight "^1.0.4" 666 | inherits "2" 667 | minimatch "^2.0.1" 668 | once "^1.3.0" 669 | 670 | glob@~3.1.21: 671 | version "3.1.21" 672 | resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" 673 | dependencies: 674 | graceful-fs "~1.2.0" 675 | inherits "1" 676 | minimatch "~0.2.11" 677 | 678 | global-modules@^0.2.3: 679 | version "0.2.3" 680 | resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" 681 | dependencies: 682 | global-prefix "^0.1.4" 683 | is-windows "^0.2.0" 684 | 685 | global-prefix@^0.1.4: 686 | version "0.1.5" 687 | resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" 688 | dependencies: 689 | homedir-polyfill "^1.0.0" 690 | ini "^1.3.4" 691 | is-windows "^0.2.0" 692 | which "^1.2.12" 693 | 694 | globule@~0.1.0: 695 | version "0.1.0" 696 | resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" 697 | dependencies: 698 | glob "~3.1.21" 699 | lodash "~1.0.1" 700 | minimatch "~0.2.11" 701 | 702 | glogg@^1.0.0: 703 | version "1.0.0" 704 | resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" 705 | dependencies: 706 | sparkles "^1.0.0" 707 | 708 | graceful-fs@^3.0.0: 709 | version "3.0.11" 710 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" 711 | dependencies: 712 | natives "^1.1.0" 713 | 714 | graceful-fs@~1.2.0: 715 | version "1.2.3" 716 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" 717 | 718 | gulp-angular-embed-templates@^2.2.0: 719 | version "2.3.0" 720 | resolved "https://registry.yarnpkg.com/gulp-angular-embed-templates/-/gulp-angular-embed-templates-2.3.0.tgz#c010efdd594dee945132834537d7923ade840d79" 721 | dependencies: 722 | gulp-util "^3.0.6" 723 | htmlparser2 "~3.9.1" 724 | minimize "^2.0.0" 725 | object-assign "4.1.0" 726 | through2 "^2.0.1" 727 | 728 | gulp-concat@^2.6.0: 729 | version "2.6.1" 730 | resolved "https://registry.yarnpkg.com/gulp-concat/-/gulp-concat-2.6.1.tgz#633d16c95d88504628ad02665663cee5a4793353" 731 | dependencies: 732 | concat-with-sourcemaps "^1.0.0" 733 | through2 "^2.0.0" 734 | vinyl "^2.0.0" 735 | 736 | gulp-cssnano@^2.1.2: 737 | version "2.1.2" 738 | resolved "https://registry.yarnpkg.com/gulp-cssnano/-/gulp-cssnano-2.1.2.tgz#e08a09771ec5454a549f1a005bdd256cb8e5e0a3" 739 | dependencies: 740 | cssnano "^3.0.0" 741 | gulp-util "^3.0.6" 742 | object-assign "^4.0.1" 743 | vinyl-sourcemaps-apply "^0.2.1" 744 | 745 | gulp-uglify@^1.5.3: 746 | version "1.5.4" 747 | resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-1.5.4.tgz#524788d87666d09f9d0c21fb2177f90039a658c9" 748 | dependencies: 749 | deap "^1.0.0" 750 | fancy-log "^1.0.0" 751 | gulp-util "^3.0.0" 752 | isobject "^2.0.0" 753 | through2 "^2.0.0" 754 | uglify-js "2.6.4" 755 | uglify-save-license "^0.4.1" 756 | vinyl-sourcemaps-apply "^0.2.0" 757 | 758 | gulp-util@^3.0.0, gulp-util@^3.0.6: 759 | version "3.0.8" 760 | resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" 761 | dependencies: 762 | array-differ "^1.0.0" 763 | array-uniq "^1.0.2" 764 | beeper "^1.0.0" 765 | chalk "^1.0.0" 766 | dateformat "^2.0.0" 767 | fancy-log "^1.1.0" 768 | gulplog "^1.0.0" 769 | has-gulplog "^0.1.0" 770 | lodash._reescape "^3.0.0" 771 | lodash._reevaluate "^3.0.0" 772 | lodash._reinterpolate "^3.0.0" 773 | lodash.template "^3.0.0" 774 | minimist "^1.1.0" 775 | multipipe "^0.1.2" 776 | object-assign "^3.0.0" 777 | replace-ext "0.0.1" 778 | through2 "^2.0.0" 779 | vinyl "^0.5.0" 780 | 781 | gulp@^3.9.1: 782 | version "3.9.1" 783 | resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" 784 | dependencies: 785 | archy "^1.0.0" 786 | chalk "^1.0.0" 787 | deprecated "^0.0.1" 788 | gulp-util "^3.0.0" 789 | interpret "^1.0.0" 790 | liftoff "^2.1.0" 791 | minimist "^1.1.0" 792 | orchestrator "^0.3.0" 793 | pretty-hrtime "^1.0.0" 794 | semver "^4.1.0" 795 | tildify "^1.0.0" 796 | v8flags "^2.0.2" 797 | vinyl-fs "^0.3.0" 798 | 799 | gulplog@^1.0.0: 800 | version "1.0.0" 801 | resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" 802 | dependencies: 803 | glogg "^1.0.0" 804 | 805 | has-ansi@^2.0.0: 806 | version "2.0.0" 807 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 808 | dependencies: 809 | ansi-regex "^2.0.0" 810 | 811 | has-flag@^1.0.0: 812 | version "1.0.0" 813 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 814 | 815 | has-gulplog@^0.1.0: 816 | version "0.1.0" 817 | resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" 818 | dependencies: 819 | sparkles "^1.0.0" 820 | 821 | has@^1.0.1: 822 | version "1.0.1" 823 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 824 | dependencies: 825 | function-bind "^1.0.2" 826 | 827 | homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: 828 | version "1.0.1" 829 | resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" 830 | dependencies: 831 | parse-passwd "^1.0.0" 832 | 833 | html-comment-regex@^1.1.0: 834 | version "1.1.1" 835 | resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" 836 | 837 | htmlparser2@^3.9.2, htmlparser2@~3.9.1: 838 | version "3.9.2" 839 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" 840 | dependencies: 841 | domelementtype "^1.3.0" 842 | domhandler "^2.3.0" 843 | domutils "^1.5.1" 844 | entities "^1.1.1" 845 | inherits "^2.0.1" 846 | readable-stream "^2.0.2" 847 | 848 | indexes-of@^1.0.1: 849 | version "1.0.1" 850 | resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" 851 | 852 | inflight@^1.0.4: 853 | version "1.0.6" 854 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 855 | dependencies: 856 | once "^1.3.0" 857 | wrappy "1" 858 | 859 | inherits@1: 860 | version "1.0.2" 861 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" 862 | 863 | inherits@2, inherits@^2.0.1, inherits@~2.0.1, inherits@~2.0.3: 864 | version "2.0.3" 865 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 866 | 867 | ini@^1.3.4: 868 | version "1.3.4" 869 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 870 | 871 | interpret@^1.0.0: 872 | version "1.0.4" 873 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" 874 | 875 | is-absolute-url@^2.0.0: 876 | version "2.1.0" 877 | resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" 878 | 879 | is-absolute@^0.2.3: 880 | version "0.2.6" 881 | resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" 882 | dependencies: 883 | is-relative "^0.2.1" 884 | is-windows "^0.2.0" 885 | 886 | is-buffer@^1.1.5: 887 | version "1.1.6" 888 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 889 | 890 | is-dotfile@^1.0.0: 891 | version "1.0.3" 892 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" 893 | 894 | is-equal-shallow@^0.1.3: 895 | version "0.1.3" 896 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 897 | dependencies: 898 | is-primitive "^2.0.0" 899 | 900 | is-extendable@^0.1.1: 901 | version "0.1.1" 902 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 903 | 904 | is-extglob@^1.0.0: 905 | version "1.0.0" 906 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 907 | 908 | is-glob@^2.0.0, is-glob@^2.0.1: 909 | version "2.0.1" 910 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 911 | dependencies: 912 | is-extglob "^1.0.0" 913 | 914 | is-number@^2.1.0: 915 | version "2.1.0" 916 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 917 | dependencies: 918 | kind-of "^3.0.2" 919 | 920 | is-number@^3.0.0: 921 | version "3.0.0" 922 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 923 | dependencies: 924 | kind-of "^3.0.2" 925 | 926 | is-plain-obj@^1.0.0: 927 | version "1.1.0" 928 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" 929 | 930 | is-plain-object@^2.0.3: 931 | version "2.0.4" 932 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 933 | dependencies: 934 | isobject "^3.0.1" 935 | 936 | is-posix-bracket@^0.1.0: 937 | version "0.1.1" 938 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 939 | 940 | is-primitive@^2.0.0: 941 | version "2.0.0" 942 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 943 | 944 | is-promise@^2.1: 945 | version "2.1.0" 946 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 947 | 948 | is-relative@^0.2.1: 949 | version "0.2.1" 950 | resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" 951 | dependencies: 952 | is-unc-path "^0.1.1" 953 | 954 | is-svg@^2.0.0: 955 | version "2.1.0" 956 | resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" 957 | dependencies: 958 | html-comment-regex "^1.1.0" 959 | 960 | is-unc-path@^0.1.1: 961 | version "0.1.2" 962 | resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" 963 | dependencies: 964 | unc-path-regex "^0.1.0" 965 | 966 | is-utf8@^0.2.0: 967 | version "0.2.1" 968 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 969 | 970 | is-windows@^0.2.0: 971 | version "0.2.0" 972 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" 973 | 974 | isarray@0.0.1: 975 | version "0.0.1" 976 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 977 | 978 | isarray@1.0.0, isarray@~1.0.0: 979 | version "1.0.0" 980 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 981 | 982 | isexe@^2.0.0: 983 | version "2.0.0" 984 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 985 | 986 | isobject@^2.0.0: 987 | version "2.1.0" 988 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 989 | dependencies: 990 | isarray "1.0.0" 991 | 992 | isobject@^3.0.0, isobject@^3.0.1: 993 | version "3.0.1" 994 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 995 | 996 | js-base64@^2.1.9: 997 | version "2.3.2" 998 | resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf" 999 | 1000 | js-yaml@~3.7.0: 1001 | version "3.7.0" 1002 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" 1003 | dependencies: 1004 | argparse "^1.0.7" 1005 | esprima "^2.6.0" 1006 | 1007 | kind-of@^3.0.2: 1008 | version "3.2.2" 1009 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1010 | dependencies: 1011 | is-buffer "^1.1.5" 1012 | 1013 | kind-of@^4.0.0: 1014 | version "4.0.0" 1015 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1016 | dependencies: 1017 | is-buffer "^1.1.5" 1018 | 1019 | kuler@0.0.x: 1020 | version "0.0.0" 1021 | resolved "https://registry.yarnpkg.com/kuler/-/kuler-0.0.0.tgz#b66bb46b934e550f59d818848e0abba4f7f5553c" 1022 | dependencies: 1023 | colornames "0.0.2" 1024 | 1025 | lazy-cache@^1.0.3: 1026 | version "1.0.4" 1027 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 1028 | 1029 | liftoff@^2.1.0: 1030 | version "2.3.0" 1031 | resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" 1032 | dependencies: 1033 | extend "^3.0.0" 1034 | findup-sync "^0.4.2" 1035 | fined "^1.0.1" 1036 | flagged-respawn "^0.3.2" 1037 | lodash.isplainobject "^4.0.4" 1038 | lodash.isstring "^4.0.1" 1039 | lodash.mapvalues "^4.4.0" 1040 | rechoir "^0.6.2" 1041 | resolve "^1.1.7" 1042 | 1043 | lodash._basecopy@^3.0.0: 1044 | version "3.0.1" 1045 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 1046 | 1047 | lodash._basetostring@^3.0.0: 1048 | version "3.0.1" 1049 | resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" 1050 | 1051 | lodash._basevalues@^3.0.0: 1052 | version "3.0.0" 1053 | resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" 1054 | 1055 | lodash._getnative@^3.0.0: 1056 | version "3.9.1" 1057 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 1058 | 1059 | lodash._isiterateecall@^3.0.0: 1060 | version "3.0.9" 1061 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 1062 | 1063 | lodash._reescape@^3.0.0: 1064 | version "3.0.0" 1065 | resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" 1066 | 1067 | lodash._reevaluate@^3.0.0: 1068 | version "3.0.0" 1069 | resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" 1070 | 1071 | lodash._reinterpolate@^3.0.0: 1072 | version "3.0.0" 1073 | resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" 1074 | 1075 | lodash._root@^3.0.0: 1076 | version "3.0.1" 1077 | resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" 1078 | 1079 | lodash.escape@^3.0.0: 1080 | version "3.2.0" 1081 | resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" 1082 | dependencies: 1083 | lodash._root "^3.0.0" 1084 | 1085 | lodash.isarguments@^3.0.0: 1086 | version "3.1.0" 1087 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 1088 | 1089 | lodash.isarray@^3.0.0: 1090 | version "3.0.4" 1091 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 1092 | 1093 | lodash.isplainobject@^4.0.4: 1094 | version "4.0.6" 1095 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 1096 | 1097 | lodash.isstring@^4.0.1: 1098 | version "4.0.1" 1099 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 1100 | 1101 | lodash.keys@^3.0.0: 1102 | version "3.1.2" 1103 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 1104 | dependencies: 1105 | lodash._getnative "^3.0.0" 1106 | lodash.isarguments "^3.0.0" 1107 | lodash.isarray "^3.0.0" 1108 | 1109 | lodash.mapvalues@^4.4.0: 1110 | version "4.6.0" 1111 | resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" 1112 | 1113 | lodash.memoize@^4.1.2: 1114 | version "4.1.2" 1115 | resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" 1116 | 1117 | lodash.restparam@^3.0.0: 1118 | version "3.6.1" 1119 | resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" 1120 | 1121 | lodash.template@^3.0.0: 1122 | version "3.6.2" 1123 | resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" 1124 | dependencies: 1125 | lodash._basecopy "^3.0.0" 1126 | lodash._basetostring "^3.0.0" 1127 | lodash._basevalues "^3.0.0" 1128 | lodash._isiterateecall "^3.0.0" 1129 | lodash._reinterpolate "^3.0.0" 1130 | lodash.escape "^3.0.0" 1131 | lodash.keys "^3.0.0" 1132 | lodash.restparam "^3.0.0" 1133 | lodash.templatesettings "^3.0.0" 1134 | 1135 | lodash.templatesettings@^3.0.0: 1136 | version "3.1.1" 1137 | resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" 1138 | dependencies: 1139 | lodash._reinterpolate "^3.0.0" 1140 | lodash.escape "^3.0.0" 1141 | 1142 | lodash.uniq@^4.5.0: 1143 | version "4.5.0" 1144 | resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" 1145 | 1146 | lodash@^4.14.0: 1147 | version "4.17.4" 1148 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1149 | 1150 | lodash@~1.0.1: 1151 | version "1.0.2" 1152 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" 1153 | 1154 | longest@^1.0.1: 1155 | version "1.0.1" 1156 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 1157 | 1158 | lru-cache@2: 1159 | version "2.7.3" 1160 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" 1161 | 1162 | lru-queue@0.1: 1163 | version "0.1.0" 1164 | resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" 1165 | dependencies: 1166 | es5-ext "~0.10.2" 1167 | 1168 | macaddress@^0.2.8: 1169 | version "0.2.8" 1170 | resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" 1171 | 1172 | map-cache@^0.2.0: 1173 | version "0.2.2" 1174 | resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 1175 | 1176 | math-expression-evaluator@^1.2.14: 1177 | version "1.2.17" 1178 | resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" 1179 | 1180 | memoizee@^0.4.3: 1181 | version "0.4.11" 1182 | resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.11.tgz#bde9817663c9e40fdb2a4ea1c367296087ae8c8f" 1183 | dependencies: 1184 | d "1" 1185 | es5-ext "^0.10.30" 1186 | es6-weak-map "^2.0.2" 1187 | event-emitter "^0.3.5" 1188 | is-promise "^2.1" 1189 | lru-queue "0.1" 1190 | next-tick "1" 1191 | timers-ext "^0.1.2" 1192 | 1193 | micromatch@^2.3.7: 1194 | version "2.3.11" 1195 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1196 | dependencies: 1197 | arr-diff "^2.0.0" 1198 | array-unique "^0.2.1" 1199 | braces "^1.8.2" 1200 | expand-brackets "^0.1.4" 1201 | extglob "^0.3.1" 1202 | filename-regex "^2.0.0" 1203 | is-extglob "^1.0.0" 1204 | is-glob "^2.0.1" 1205 | kind-of "^3.0.2" 1206 | normalize-path "^2.0.1" 1207 | object.omit "^2.0.0" 1208 | parse-glob "^3.0.4" 1209 | regex-cache "^0.4.2" 1210 | 1211 | minimatch@^2.0.1: 1212 | version "2.0.10" 1213 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" 1214 | dependencies: 1215 | brace-expansion "^1.0.0" 1216 | 1217 | minimatch@~0.2.11: 1218 | version "0.2.14" 1219 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" 1220 | dependencies: 1221 | lru-cache "2" 1222 | sigmund "~1.0.0" 1223 | 1224 | minimist@0.0.8: 1225 | version "0.0.8" 1226 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1227 | 1228 | minimist@^1.1.0: 1229 | version "1.2.0" 1230 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1231 | 1232 | minimize@^2.0.0: 1233 | version "2.1.0" 1234 | resolved "https://registry.yarnpkg.com/minimize/-/minimize-2.1.0.tgz#fa277647fc5f9a21524bfde62814ca7ce1ffd7a2" 1235 | dependencies: 1236 | argh "^0.1.4" 1237 | async "^2.1.5" 1238 | cli-color "^1.2.0" 1239 | diagnostics "^1.1.0" 1240 | emits "^3.0.0" 1241 | htmlparser2 "^3.9.2" 1242 | uuid "^3.0.0" 1243 | 1244 | mkdirp@^0.5.0, mkdirp@~0.5.1: 1245 | version "0.5.1" 1246 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1247 | dependencies: 1248 | minimist "0.0.8" 1249 | 1250 | multipipe@^0.1.2: 1251 | version "0.1.2" 1252 | resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" 1253 | dependencies: 1254 | duplexer2 "0.0.2" 1255 | 1256 | natives@^1.1.0: 1257 | version "1.1.0" 1258 | resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" 1259 | 1260 | next-tick@1: 1261 | version "1.0.0" 1262 | resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" 1263 | 1264 | normalize-path@^2.0.1: 1265 | version "2.1.1" 1266 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1267 | dependencies: 1268 | remove-trailing-separator "^1.0.1" 1269 | 1270 | normalize-range@^0.1.2: 1271 | version "0.1.2" 1272 | resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" 1273 | 1274 | normalize-url@^1.4.0: 1275 | version "1.9.1" 1276 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" 1277 | dependencies: 1278 | object-assign "^4.0.1" 1279 | prepend-http "^1.0.0" 1280 | query-string "^4.1.0" 1281 | sort-keys "^1.0.0" 1282 | 1283 | num2fraction@^1.2.2: 1284 | version "1.2.2" 1285 | resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" 1286 | 1287 | object-assign@4.1.0: 1288 | version "4.1.0" 1289 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" 1290 | 1291 | object-assign@^3.0.0: 1292 | version "3.0.0" 1293 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" 1294 | 1295 | object-assign@^4.0.1, object-assign@^4.1.0: 1296 | version "4.1.1" 1297 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1298 | 1299 | object.defaults@^1.1.0: 1300 | version "1.1.0" 1301 | resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" 1302 | dependencies: 1303 | array-each "^1.0.1" 1304 | array-slice "^1.0.0" 1305 | for-own "^1.0.0" 1306 | isobject "^3.0.0" 1307 | 1308 | object.omit@^2.0.0: 1309 | version "2.0.1" 1310 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1311 | dependencies: 1312 | for-own "^0.1.4" 1313 | is-extendable "^0.1.1" 1314 | 1315 | object.pick@^1.2.0: 1316 | version "1.3.0" 1317 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 1318 | dependencies: 1319 | isobject "^3.0.1" 1320 | 1321 | once@^1.3.0: 1322 | version "1.4.0" 1323 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1324 | dependencies: 1325 | wrappy "1" 1326 | 1327 | once@~1.3.0: 1328 | version "1.3.3" 1329 | resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" 1330 | dependencies: 1331 | wrappy "1" 1332 | 1333 | orchestrator@^0.3.0: 1334 | version "0.3.8" 1335 | resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" 1336 | dependencies: 1337 | end-of-stream "~0.1.5" 1338 | sequencify "~0.0.7" 1339 | stream-consume "~0.1.0" 1340 | 1341 | ordered-read-streams@^0.1.0: 1342 | version "0.1.0" 1343 | resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" 1344 | 1345 | os-homedir@^1.0.0, os-homedir@^1.0.1: 1346 | version "1.0.2" 1347 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1348 | 1349 | parse-filepath@^1.0.1: 1350 | version "1.0.1" 1351 | resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" 1352 | dependencies: 1353 | is-absolute "^0.2.3" 1354 | map-cache "^0.2.0" 1355 | path-root "^0.1.1" 1356 | 1357 | parse-glob@^3.0.4: 1358 | version "3.0.4" 1359 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1360 | dependencies: 1361 | glob-base "^0.3.0" 1362 | is-dotfile "^1.0.0" 1363 | is-extglob "^1.0.0" 1364 | is-glob "^2.0.0" 1365 | 1366 | parse-passwd@^1.0.0: 1367 | version "1.0.0" 1368 | resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" 1369 | 1370 | path-parse@^1.0.5: 1371 | version "1.0.5" 1372 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 1373 | 1374 | path-root-regex@^0.1.0: 1375 | version "0.1.2" 1376 | resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" 1377 | 1378 | path-root@^0.1.1: 1379 | version "0.1.1" 1380 | resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" 1381 | dependencies: 1382 | path-root-regex "^0.1.0" 1383 | 1384 | postcss-calc@^5.2.0: 1385 | version "5.3.1" 1386 | resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" 1387 | dependencies: 1388 | postcss "^5.0.2" 1389 | postcss-message-helpers "^2.0.0" 1390 | reduce-css-calc "^1.2.6" 1391 | 1392 | postcss-colormin@^2.1.8: 1393 | version "2.2.2" 1394 | resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" 1395 | dependencies: 1396 | colormin "^1.0.5" 1397 | postcss "^5.0.13" 1398 | postcss-value-parser "^3.2.3" 1399 | 1400 | postcss-convert-values@^2.3.4: 1401 | version "2.6.1" 1402 | resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" 1403 | dependencies: 1404 | postcss "^5.0.11" 1405 | postcss-value-parser "^3.1.2" 1406 | 1407 | postcss-discard-comments@^2.0.4: 1408 | version "2.0.4" 1409 | resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" 1410 | dependencies: 1411 | postcss "^5.0.14" 1412 | 1413 | postcss-discard-duplicates@^2.0.1: 1414 | version "2.1.0" 1415 | resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" 1416 | dependencies: 1417 | postcss "^5.0.4" 1418 | 1419 | postcss-discard-empty@^2.0.1: 1420 | version "2.1.0" 1421 | resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" 1422 | dependencies: 1423 | postcss "^5.0.14" 1424 | 1425 | postcss-discard-overridden@^0.1.1: 1426 | version "0.1.1" 1427 | resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" 1428 | dependencies: 1429 | postcss "^5.0.16" 1430 | 1431 | postcss-discard-unused@^2.2.1: 1432 | version "2.2.3" 1433 | resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" 1434 | dependencies: 1435 | postcss "^5.0.14" 1436 | uniqs "^2.0.0" 1437 | 1438 | postcss-filter-plugins@^2.0.0: 1439 | version "2.0.2" 1440 | resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" 1441 | dependencies: 1442 | postcss "^5.0.4" 1443 | uniqid "^4.0.0" 1444 | 1445 | postcss-merge-idents@^2.1.5: 1446 | version "2.1.7" 1447 | resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" 1448 | dependencies: 1449 | has "^1.0.1" 1450 | postcss "^5.0.10" 1451 | postcss-value-parser "^3.1.1" 1452 | 1453 | postcss-merge-longhand@^2.0.1: 1454 | version "2.0.2" 1455 | resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" 1456 | dependencies: 1457 | postcss "^5.0.4" 1458 | 1459 | postcss-merge-rules@^2.0.3: 1460 | version "2.1.2" 1461 | resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" 1462 | dependencies: 1463 | browserslist "^1.5.2" 1464 | caniuse-api "^1.5.2" 1465 | postcss "^5.0.4" 1466 | postcss-selector-parser "^2.2.2" 1467 | vendors "^1.0.0" 1468 | 1469 | postcss-message-helpers@^2.0.0: 1470 | version "2.0.0" 1471 | resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" 1472 | 1473 | postcss-minify-font-values@^1.0.2: 1474 | version "1.0.5" 1475 | resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" 1476 | dependencies: 1477 | object-assign "^4.0.1" 1478 | postcss "^5.0.4" 1479 | postcss-value-parser "^3.0.2" 1480 | 1481 | postcss-minify-gradients@^1.0.1: 1482 | version "1.0.5" 1483 | resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" 1484 | dependencies: 1485 | postcss "^5.0.12" 1486 | postcss-value-parser "^3.3.0" 1487 | 1488 | postcss-minify-params@^1.0.4: 1489 | version "1.2.2" 1490 | resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" 1491 | dependencies: 1492 | alphanum-sort "^1.0.1" 1493 | postcss "^5.0.2" 1494 | postcss-value-parser "^3.0.2" 1495 | uniqs "^2.0.0" 1496 | 1497 | postcss-minify-selectors@^2.0.4: 1498 | version "2.1.1" 1499 | resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" 1500 | dependencies: 1501 | alphanum-sort "^1.0.2" 1502 | has "^1.0.1" 1503 | postcss "^5.0.14" 1504 | postcss-selector-parser "^2.0.0" 1505 | 1506 | postcss-normalize-charset@^1.1.0: 1507 | version "1.1.1" 1508 | resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" 1509 | dependencies: 1510 | postcss "^5.0.5" 1511 | 1512 | postcss-normalize-url@^3.0.7: 1513 | version "3.0.8" 1514 | resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" 1515 | dependencies: 1516 | is-absolute-url "^2.0.0" 1517 | normalize-url "^1.4.0" 1518 | postcss "^5.0.14" 1519 | postcss-value-parser "^3.2.3" 1520 | 1521 | postcss-ordered-values@^2.1.0: 1522 | version "2.2.3" 1523 | resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" 1524 | dependencies: 1525 | postcss "^5.0.4" 1526 | postcss-value-parser "^3.0.1" 1527 | 1528 | postcss-reduce-idents@^2.2.2: 1529 | version "2.4.0" 1530 | resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" 1531 | dependencies: 1532 | postcss "^5.0.4" 1533 | postcss-value-parser "^3.0.2" 1534 | 1535 | postcss-reduce-initial@^1.0.0: 1536 | version "1.0.1" 1537 | resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" 1538 | dependencies: 1539 | postcss "^5.0.4" 1540 | 1541 | postcss-reduce-transforms@^1.0.3: 1542 | version "1.0.4" 1543 | resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" 1544 | dependencies: 1545 | has "^1.0.1" 1546 | postcss "^5.0.8" 1547 | postcss-value-parser "^3.0.1" 1548 | 1549 | postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: 1550 | version "2.2.3" 1551 | resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" 1552 | dependencies: 1553 | flatten "^1.0.2" 1554 | indexes-of "^1.0.1" 1555 | uniq "^1.0.1" 1556 | 1557 | postcss-svgo@^2.1.1: 1558 | version "2.1.6" 1559 | resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" 1560 | dependencies: 1561 | is-svg "^2.0.0" 1562 | postcss "^5.0.14" 1563 | postcss-value-parser "^3.2.3" 1564 | svgo "^0.7.0" 1565 | 1566 | postcss-unique-selectors@^2.0.2: 1567 | version "2.0.2" 1568 | resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" 1569 | dependencies: 1570 | alphanum-sort "^1.0.1" 1571 | postcss "^5.0.4" 1572 | uniqs "^2.0.0" 1573 | 1574 | postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: 1575 | version "3.3.0" 1576 | resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" 1577 | 1578 | postcss-zindex@^2.0.1: 1579 | version "2.2.0" 1580 | resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" 1581 | dependencies: 1582 | has "^1.0.1" 1583 | postcss "^5.0.4" 1584 | uniqs "^2.0.0" 1585 | 1586 | postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.2.16: 1587 | version "5.2.18" 1588 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" 1589 | dependencies: 1590 | chalk "^1.1.3" 1591 | js-base64 "^2.1.9" 1592 | source-map "^0.5.6" 1593 | supports-color "^3.2.3" 1594 | 1595 | prepend-http@^1.0.0: 1596 | version "1.0.4" 1597 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 1598 | 1599 | preserve@^0.2.0: 1600 | version "0.2.0" 1601 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1602 | 1603 | pretty-hrtime@^1.0.0: 1604 | version "1.0.3" 1605 | resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" 1606 | 1607 | process-nextick-args@^1.0.6, process-nextick-args@~1.0.6: 1608 | version "1.0.7" 1609 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1610 | 1611 | q@^1.1.2: 1612 | version "1.5.1" 1613 | resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" 1614 | 1615 | query-string@^4.1.0: 1616 | version "4.3.4" 1617 | resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" 1618 | dependencies: 1619 | object-assign "^4.1.0" 1620 | strict-uri-encode "^1.0.0" 1621 | 1622 | randomatic@^1.1.3: 1623 | version "1.1.7" 1624 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" 1625 | dependencies: 1626 | is-number "^3.0.0" 1627 | kind-of "^4.0.0" 1628 | 1629 | "readable-stream@>=1.0.33-1 <1.1.0-0": 1630 | version "1.0.34" 1631 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" 1632 | dependencies: 1633 | core-util-is "~1.0.0" 1634 | inherits "~2.0.1" 1635 | isarray "0.0.1" 1636 | string_decoder "~0.10.x" 1637 | 1638 | readable-stream@^2.0.2, readable-stream@^2.1.5: 1639 | version "2.3.3" 1640 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 1641 | dependencies: 1642 | core-util-is "~1.0.0" 1643 | inherits "~2.0.3" 1644 | isarray "~1.0.0" 1645 | process-nextick-args "~1.0.6" 1646 | safe-buffer "~5.1.1" 1647 | string_decoder "~1.0.3" 1648 | util-deprecate "~1.0.1" 1649 | 1650 | readable-stream@~1.1.9: 1651 | version "1.1.14" 1652 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 1653 | dependencies: 1654 | core-util-is "~1.0.0" 1655 | inherits "~2.0.1" 1656 | isarray "0.0.1" 1657 | string_decoder "~0.10.x" 1658 | 1659 | rechoir@^0.6.2: 1660 | version "0.6.2" 1661 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" 1662 | dependencies: 1663 | resolve "^1.1.6" 1664 | 1665 | reduce-css-calc@^1.2.6: 1666 | version "1.3.0" 1667 | resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" 1668 | dependencies: 1669 | balanced-match "^0.4.2" 1670 | math-expression-evaluator "^1.2.14" 1671 | reduce-function-call "^1.0.1" 1672 | 1673 | reduce-function-call@^1.0.1: 1674 | version "1.0.2" 1675 | resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" 1676 | dependencies: 1677 | balanced-match "^0.4.2" 1678 | 1679 | regex-cache@^0.4.2: 1680 | version "0.4.4" 1681 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" 1682 | dependencies: 1683 | is-equal-shallow "^0.1.3" 1684 | 1685 | remove-trailing-separator@^1.0.1: 1686 | version "1.1.0" 1687 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 1688 | 1689 | repeat-element@^1.1.2: 1690 | version "1.1.2" 1691 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1692 | 1693 | repeat-string@^1.5.2: 1694 | version "1.6.1" 1695 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1696 | 1697 | replace-ext@0.0.1: 1698 | version "0.0.1" 1699 | resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" 1700 | 1701 | replace-ext@^1.0.0: 1702 | version "1.0.0" 1703 | resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" 1704 | 1705 | resolve-dir@^0.1.0: 1706 | version "0.1.1" 1707 | resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" 1708 | dependencies: 1709 | expand-tilde "^1.2.2" 1710 | global-modules "^0.2.3" 1711 | 1712 | resolve@^1.1.6, resolve@^1.1.7: 1713 | version "1.5.0" 1714 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" 1715 | dependencies: 1716 | path-parse "^1.0.5" 1717 | 1718 | right-align@^0.1.1: 1719 | version "0.1.3" 1720 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 1721 | dependencies: 1722 | align-text "^0.1.1" 1723 | 1724 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1725 | version "5.1.1" 1726 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 1727 | 1728 | sax@~1.2.1: 1729 | version "1.2.4" 1730 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1731 | 1732 | semver@^4.1.0: 1733 | version "4.3.6" 1734 | resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" 1735 | 1736 | sequencify@~0.0.7: 1737 | version "0.0.7" 1738 | resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" 1739 | 1740 | sigmund@~1.0.0: 1741 | version "1.0.1" 1742 | resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" 1743 | 1744 | sort-keys@^1.0.0: 1745 | version "1.1.2" 1746 | resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" 1747 | dependencies: 1748 | is-plain-obj "^1.0.0" 1749 | 1750 | source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: 1751 | version "0.5.7" 1752 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1753 | 1754 | sparkles@^1.0.0: 1755 | version "1.0.0" 1756 | resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" 1757 | 1758 | sprintf-js@~1.0.2: 1759 | version "1.0.3" 1760 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1761 | 1762 | stream-consume@~0.1.0: 1763 | version "0.1.0" 1764 | resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" 1765 | 1766 | strict-uri-encode@^1.0.0: 1767 | version "1.1.0" 1768 | resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" 1769 | 1770 | string_decoder@~0.10.x: 1771 | version "0.10.31" 1772 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1773 | 1774 | string_decoder@~1.0.3: 1775 | version "1.0.3" 1776 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 1777 | dependencies: 1778 | safe-buffer "~5.1.0" 1779 | 1780 | strip-ansi@^3.0.0: 1781 | version "3.0.1" 1782 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1783 | dependencies: 1784 | ansi-regex "^2.0.0" 1785 | 1786 | strip-bom@^1.0.0: 1787 | version "1.0.0" 1788 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" 1789 | dependencies: 1790 | first-chunk-stream "^1.0.0" 1791 | is-utf8 "^0.2.0" 1792 | 1793 | supports-color@^2.0.0: 1794 | version "2.0.0" 1795 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1796 | 1797 | supports-color@^3.2.3: 1798 | version "3.2.3" 1799 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" 1800 | dependencies: 1801 | has-flag "^1.0.0" 1802 | 1803 | svgo@^0.7.0: 1804 | version "0.7.2" 1805 | resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" 1806 | dependencies: 1807 | coa "~1.0.1" 1808 | colors "~1.1.2" 1809 | csso "~2.3.1" 1810 | js-yaml "~3.7.0" 1811 | mkdirp "~0.5.1" 1812 | sax "~1.2.1" 1813 | whet.extend "~0.9.9" 1814 | 1815 | text-hex@0.0.x: 1816 | version "0.0.0" 1817 | resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-0.0.0.tgz#578fbc85a6a92636e42dd17b41d0218cce9eb2b3" 1818 | 1819 | through2@^0.6.1: 1820 | version "0.6.5" 1821 | resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" 1822 | dependencies: 1823 | readable-stream ">=1.0.33-1 <1.1.0-0" 1824 | xtend ">=4.0.0 <4.1.0-0" 1825 | 1826 | through2@^2.0.0, through2@^2.0.1: 1827 | version "2.0.3" 1828 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 1829 | dependencies: 1830 | readable-stream "^2.1.5" 1831 | xtend "~4.0.1" 1832 | 1833 | tildify@^1.0.0: 1834 | version "1.2.0" 1835 | resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" 1836 | dependencies: 1837 | os-homedir "^1.0.0" 1838 | 1839 | time-stamp@^1.0.0: 1840 | version "1.1.0" 1841 | resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" 1842 | 1843 | timers-ext@0.1, timers-ext@^0.1.2: 1844 | version "0.1.2" 1845 | resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.2.tgz#61cc47a76c1abd3195f14527f978d58ae94c5204" 1846 | dependencies: 1847 | es5-ext "~0.10.14" 1848 | next-tick "1" 1849 | 1850 | uglify-js@2.6.4: 1851 | version "2.6.4" 1852 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.6.4.tgz#65ea2fb3059c9394692f15fed87c2b36c16b9adf" 1853 | dependencies: 1854 | async "~0.2.6" 1855 | source-map "~0.5.1" 1856 | uglify-to-browserify "~1.0.0" 1857 | yargs "~3.10.0" 1858 | 1859 | uglify-save-license@^0.4.1: 1860 | version "0.4.1" 1861 | resolved "https://registry.yarnpkg.com/uglify-save-license/-/uglify-save-license-0.4.1.tgz#95726c17cc6fd171c3617e3bf4d8d82aa8c4cce1" 1862 | 1863 | uglify-to-browserify@~1.0.0: 1864 | version "1.0.2" 1865 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 1866 | 1867 | unc-path-regex@^0.1.0: 1868 | version "0.1.2" 1869 | resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" 1870 | 1871 | uniq@^1.0.1: 1872 | version "1.0.1" 1873 | resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" 1874 | 1875 | uniqid@^4.0.0: 1876 | version "4.1.1" 1877 | resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" 1878 | dependencies: 1879 | macaddress "^0.2.8" 1880 | 1881 | uniqs@^2.0.0: 1882 | version "2.0.0" 1883 | resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" 1884 | 1885 | unique-stream@^1.0.0: 1886 | version "1.0.0" 1887 | resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" 1888 | 1889 | user-home@^1.1.1: 1890 | version "1.1.1" 1891 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" 1892 | 1893 | util-deprecate@~1.0.1: 1894 | version "1.0.2" 1895 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1896 | 1897 | uuid@^3.0.0: 1898 | version "3.1.0" 1899 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" 1900 | 1901 | v8flags@^2.0.2: 1902 | version "2.1.1" 1903 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" 1904 | dependencies: 1905 | user-home "^1.1.1" 1906 | 1907 | vendors@^1.0.0: 1908 | version "1.0.1" 1909 | resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" 1910 | 1911 | vinyl-fs@^0.3.0: 1912 | version "0.3.14" 1913 | resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" 1914 | dependencies: 1915 | defaults "^1.0.0" 1916 | glob-stream "^3.1.5" 1917 | glob-watcher "^0.0.6" 1918 | graceful-fs "^3.0.0" 1919 | mkdirp "^0.5.0" 1920 | strip-bom "^1.0.0" 1921 | through2 "^0.6.1" 1922 | vinyl "^0.4.0" 1923 | 1924 | vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: 1925 | version "0.2.1" 1926 | resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" 1927 | dependencies: 1928 | source-map "^0.5.1" 1929 | 1930 | vinyl@^0.4.0: 1931 | version "0.4.6" 1932 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" 1933 | dependencies: 1934 | clone "^0.2.0" 1935 | clone-stats "^0.0.1" 1936 | 1937 | vinyl@^0.5.0: 1938 | version "0.5.3" 1939 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" 1940 | dependencies: 1941 | clone "^1.0.0" 1942 | clone-stats "^0.0.1" 1943 | replace-ext "0.0.1" 1944 | 1945 | vinyl@^2.0.0: 1946 | version "2.1.0" 1947 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c" 1948 | dependencies: 1949 | clone "^2.1.1" 1950 | clone-buffer "^1.0.0" 1951 | clone-stats "^1.0.0" 1952 | cloneable-readable "^1.0.0" 1953 | remove-trailing-separator "^1.0.1" 1954 | replace-ext "^1.0.0" 1955 | 1956 | whet.extend@~0.9.9: 1957 | version "0.9.9" 1958 | resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" 1959 | 1960 | which@^1.2.12: 1961 | version "1.3.0" 1962 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 1963 | dependencies: 1964 | isexe "^2.0.0" 1965 | 1966 | window-size@0.1.0: 1967 | version "0.1.0" 1968 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 1969 | 1970 | wordwrap@0.0.2: 1971 | version "0.0.2" 1972 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 1973 | 1974 | wrappy@1: 1975 | version "1.0.2" 1976 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1977 | 1978 | "xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.1: 1979 | version "4.0.1" 1980 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1981 | 1982 | yargs@~3.10.0: 1983 | version "3.10.0" 1984 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 1985 | dependencies: 1986 | camelcase "^1.0.2" 1987 | cliui "^2.1.0" 1988 | decamelize "^1.0.0" 1989 | window-size "0.1.0" 1990 | --------------------------------------------------------------------------------