├── .editorconfig
├── .gitignore
├── .npmignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── package-lock.json
├── package.json
├── rollup.config.js
├── screenshots
└── thumbnail.png
└── src
├── color-picker-conic-gradient.directive.js
├── color-picker-core.module.js
├── color-picker-rotator.directive.js
├── color-picker.component.js
├── color-picker.service.js
├── conic-gradient.js
├── main.js
├── propeller.js
└── scss
└── color-picker.scss
/.editorconfig:
--------------------------------------------------------------------------------
1 | # This file is for unifying the coding style for different editors and IDEs
2 | # see editorconfig.org for more information
3 |
4 | root = true
5 |
6 | [*]
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 | indent_style = space
11 | indent_size = 4
12 | [**.scss]
13 | end_of_line = lf
14 |
15 | [**.md]
16 | trim_trailing_whitespace = false
17 |
18 | ## Commenting out below in case we ever want to customize per filetype
19 | # [**.js]
20 | # indent_size = 4
21 |
22 | # [**.css]
23 | # indent_size = 4
24 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Specifies intentionally untracked files to ignore when using Git
2 | # http://git-scm.com/docs/gitignore
3 |
4 | node_modules/
5 | bower_components/
6 | platforms/
7 | plugins/
8 | dist/
9 | .sass-cache/
10 |
11 | # Sublime Text
12 | *.sublime-workspace
13 | *.sublime-project
14 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | # Specifies intentionally untracked files to ignore when using Git
2 | # http://git-scm.com/docs/gitignore
3 |
4 | node_modules/
5 | bower_components/
6 | platforms/
7 | plugins/
8 | .sass-cache/
9 |
10 | # Sublime Text
11 | *.sublime-workspace
12 | *.sublime-project
13 |
14 | .jscsrc
15 | .jshintrc
16 | .sass-lint.yml
17 | .editorconfig
18 | .bowerrc
19 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | In the interest of fostering an open and welcoming environment, we as
6 | contributors and maintainers pledge to making participation in our project and
7 | our community a harassment-free experience for everyone, regardless of age, body
8 | size, disability, ethnicity, gender identity and expression, level of experience,
9 | education, socio-economic status, nationality, personal appearance, race,
10 | religion, or sexual identity and orientation.
11 |
12 | ## Our Standards
13 |
14 | Examples of behavior that contributes to creating a positive environment
15 | include:
16 |
17 | * Using welcoming and inclusive language
18 | * Being respectful of differing viewpoints and experiences
19 | * Gracefully accepting constructive criticism
20 | * Focusing on what is best for the community
21 | * Showing empathy towards other community members
22 |
23 | Examples of unacceptable behavior by participants include:
24 |
25 | * The use of sexualized language or imagery and unwelcome sexual attention or
26 | advances
27 | * Trolling, insulting/derogatory comments, and personal or political attacks
28 | * Public or private harassment
29 | * Publishing others' private information, such as a physical or electronic
30 | address, without explicit permission
31 | * Other conduct which could reasonably be considered inappropriate in a
32 | professional setting
33 |
34 | ## Our Responsibilities
35 |
36 | Project maintainers are responsible for clarifying the standards of acceptable
37 | behavior and are expected to take appropriate and fair corrective action in
38 | response to any instances of unacceptable behavior.
39 |
40 | Project maintainers have the right and responsibility to remove, edit, or
41 | reject comments, commits, code, wiki edits, issues, and other contributions
42 | that are not aligned to this Code of Conduct, or to ban temporarily or
43 | permanently any contributor for other behaviors that they deem inappropriate,
44 | threatening, offensive, or harmful.
45 |
46 | ## Scope
47 |
48 | This Code of Conduct applies both within project spaces and in public spaces
49 | when an individual is representing the project or its community. Examples of
50 | representing a project or community include using an official project e-mail
51 | address, posting via an official social media account, or acting as an appointed
52 | representative at an online or offline event. Representation of a project may be
53 | further defined and clarified by project maintainers.
54 |
55 | ## Enforcement
56 |
57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
58 | reported by contacting one or more of the project maintainers. All
59 | complaints will be reviewed and investigated and will result in a response that
60 | is deemed necessary and appropriate to the circumstances. The project team is
61 | obligated to maintain confidentiality with regard to the reporter of an incident.
62 | Further details of specific enforcement policies may be posted separately.
63 |
64 | Project maintainers who do not follow or enforce the Code of Conduct in good
65 | faith may face temporary or permanent repercussions as determined by other
66 | members of the project's leadership.
67 |
68 | ## Attribution
69 |
70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
72 |
73 | [homepage]: https://www.contributor-covenant.org
74 |
75 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | ## Git Commit Message Convention
2 |
3 | > This is adapted from [Angular's commit convention](https://github.com/conventional-changelog/conventional-changelog/blob/master/packages/conventional-changelog-angular/convention.md).
4 |
5 | #### Examples
6 |
7 | Appears under "Features" header
8 |
9 | ```
10 | feat: Add support for selecting a color by dblclick
11 | ```
12 |
13 | Appears under "Bug fixes" header, with a link to issue #28:
14 |
15 | ```
16 | fix(rotator): Fix regression in IE and Edge not rotating the el properly
17 |
18 | close #28
19 | ```
20 |
21 | Appears under "Performance improvements" header, and under "Breaking changes" with the breaking change explanation:
22 |
23 | ```
24 | perf: Replace base64 bitmap with polyfilled conic-gradient
25 |
26 | BREAKING CHANGE: wheel.png was removed and is no longer available to be used.
27 | ```
28 |
29 | The following commit and commit `667ecc1` do not appear in the changelog if they are under the same release. If not, the revert commit appears under the "Reverts" header.
30 |
31 | ```
32 | revert: feat: Add support for selecting a color by dblclick
33 |
34 | This reverts commit 667ecc1654a317a13331b17617d973392f415f02.
35 | ```
36 |
37 | ### Full Message Format
38 |
39 | A commit message consists of a **header**, **body** and **footer**. The header has a **type**, **scope** and **subject**:
40 |
41 | ```
42 | ():
43 |
44 |
45 |
46 |
47 | ```
48 |
49 | The **header** is mandatory and the **scope** of the header is optional.
50 |
51 | ### Revert
52 |
53 | If the commit reverts a previous commit, it should begin with `revert: `, followed by the header of the reverted commit. In the body it should say: `This reverts commit .`, where the hash is the SHA of the commit being reverted.
54 |
55 | ### Type
56 |
57 | If the prefix is `feat`, `fix` or `perf`, it will appear in the changelog. However if there is any [BREAKING CHANGE](#footer), the commit will always appear in the changelog.
58 |
59 | Other prefixes are up to your discretion. Suggested prefixes are `docs`, `chore`, `style`, `refactor`, and `test` for non-changelog related tasks.
60 |
61 | ### Scope
62 |
63 | The scope could be anything specifying place of the commit change. For example `core`, `rotator`, `conic-gradient` etc...
64 |
65 | ### Subject
66 |
67 | The subject contains succinct description of the change:
68 |
69 | * use the imperative, present tense: "change" not "changed" nor "changes"
70 | * no dot (.) at the end
71 |
72 | ### Body
73 |
74 | Just as in the **subject**, use the imperative, present tense: "change" not "changed" nor "changes".
75 | The body should include the motivation for the change and contrast this with previous behavior.
76 |
77 | ### Footer
78 |
79 | The footer should contain any information about **Breaking Changes** and is also the place to
80 | reference GitHub issues that this commit **Closes**.
81 |
82 | **Breaking Changes** should start with the word `BREAKING CHANGE:` with a space or two newlines. The rest of the commit message is then used for this.
83 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 Zlati Pehlivanov
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 | ## Angular Radial Color Picker
2 |
3 |
4 |
5 |
6 |
7 | ## Introduction
8 |
9 | Great UX starts with two basic principles - ease of use and simplicity. Selecting a color should be as easy as moving a slider, clicking a checkbox or pressing a key just like other basic form elements behave.
10 |
11 | This is a flexible and elegant material design color picker. Developed with mobile devices and keyboard usage in mind. Key features:
12 | * Small size - 5.4 KB gzipped (JS and CSS combined)
13 | * Supports touch devices
14 | * Responsive size
15 | * Optimized animations
16 | * Supports CommonJS and ES Modules
17 | * Ease of use
18 | * Double click anywhere to move the knob to a color
19 | * Tab to focus the picker
20 | * Up or Right arrow key to increase hue. Hold Ctrl to go quicker
21 | * Bottom or Left arrow key decrease hue. Hold Ctrl to go quicker
22 | * Enter to select a color and close the picker or to open it
23 | * Mouse ScrollUp to increase and ScrollDown to decrease hue (Opt-in)
24 |
25 | ## Quick Links
26 |
27 | * [Demos](#user-content-demos)
28 | * [Usage](#user-content-usage)
29 | * [Options](#user-content-options)
30 | * [Events](#user-content-events)
31 | * [Styling/sizing](#user-content-stylingsizing)
32 | * [FAQ](#user-content-questions)
33 | * [Contribute](#user-content-contributing)
34 |
35 | ## Demos
36 | * Color Picker in a modal window - [GitHub Pages](https://talamaska.github.io/angular-radial-color-picker)
37 | * Barebones example - [Codepen](http://codepen.io/rkunev/pen/evYaBO)
38 |
39 | ## Usage
40 |
41 | #### With Module Build System
42 | Color Picker on [npm](https://www.npmjs.com/package/angular-radial-color-picker)
43 | ```bash
44 | npm install -S angular-radial-color-picker
45 | ```
46 |
47 | And in your app:
48 |
49 | ```javascript
50 | import angular from 'angular';
51 | import colorPicker from 'angular-radial-color-picker';
52 | import 'angular-radial-color-picker/dist/css/color-picker.scss';
53 |
54 | angular.module('app', [colorPicker]);
55 | ```
56 |
57 | Depending on your build tool of choice you have to setup the appropriate Webpack loaders or Rollup plugins. The color picker was tested with the latest versions of [sass-loader](https://github.com/webpack-contrib/sass-loader) and [rollup-plugin-postcss](https://github.com/egoist/rollup-plugin-postcss).
58 |
59 | #### UMD version
60 |
61 | You can also use the minified sources directly:
62 |
63 | ```html
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
75 |
76 | ```
77 |
78 | [Back To Top](#user-content-quick-links)
79 |
80 | ## Options
81 | `` component has several attributes, all of which are optional. [See the example](http://codepen.io/rkunev/pen/evYaBO) which uses all options.
82 |
83 | | Options | Type | Default/Description |
84 | |------------|--------|---------|
85 | | `color` | Object | Object for initializing/changing the color of the picker. Defaults to red: `{hue: 0, saturation: 100, luminosity: 50, alpha: 1}`. |
86 | | `on-select` | Function | Callback which is triggered when a color is selected. |
87 | | `on-color-change` | Function | A function to invoke when color is changed (i.e. on rotation). |
88 | | `mouse-scroll` | Boolean | Use wheel (scroll) event to rotate. Defaults to false. |
89 | | `scroll-sensitivity` | Number | Amount of degrees to rotate the picker with keyboard and/or wheel. Defaults to 2 degrees. |
90 |
91 | [Back To Top](#user-content-quick-links)
92 |
93 | ## Events
94 |
95 | For maximum flexibility the component utilizes the pub/sub pattern. For easier communication a set of events are provided that can even programmatically open or close the picker without interacting with the UI. All events carry the current (selected) color in the event data payload.
96 |
97 | | Name | Description |
98 | |------------|-------------|
99 | | `color-picker.show` | Fires when the color picker is about to show and **before** any animation is started. |
100 | | `color-picker.shown` | Fires when the color picker is shown and has finished animating. |
101 | | `color-picker.selected` | Fires when a color is selected via the middle selector. Event is fired right before `hide`. |
102 | | `color-picker.hide` | Fires when the color picker is about to hide and **before** any animation is started. |
103 | | `color-picker.hidden` | Fires when the color picker is hidden and has finished animating. |
104 | | `color-picker.open` | Programatically opens the color picker if it's not already opened. |
105 | | `color-picker.close` | Programatically closes the color picker if it's not already closed. |
106 |
107 | Example:
108 | ```javascript
109 | // Assign the selected color to the ViewModel and log it to the console
110 | $scope.$on('color-picker.selected', function(ev, color) {
111 | vm.selectedColor = 'hsla(' + color.hue + ', ' + color.saturation + '%, ' + color.luminosity + '%, ' + color.alpha + ')';
112 | console.log('Selected color:', color);
113 | });
114 |
115 | // The good'n'tested "poke-it-with-a-stick" method:
116 | $scope.$emit('color-picker.open');
117 | ```
118 |
119 | [Back To Top](#user-content-quick-links)
120 |
121 | ## Styling/Sizing
122 |
123 | The color picker has a default width/height of 280px, but can also be sized via CSS. For example:
124 | ```css
125 | color-picker {
126 | width: 350px;
127 | height: 350px;
128 | }
129 | ```
130 |
131 | If you want a percentage based size you can use this neat little [trick](https://css-tricks.com/aspect-ratio-boxes/) with 1:1 aspect ratio box of 40% width of the parent element:
132 | ```css
133 | color-picker {
134 | height: 0;
135 | width: 40%;
136 | padding-bottom: 40%;
137 | }
138 | ```
139 |
140 | [Back To Top](#user-content-quick-links)
141 |
142 | ## First Asked Questions
143 |
144 |
145 | Color picker uses hsla()
. How can I use other formats like rgba()
or HEX?
146 | There's a service you can use - ColorPickerService
. It has rgbToHsl()
which can be used to map a color to the hsla()
type that the color picker expects. There's also hslToHex()
, hslToRgb()
and rgbToHex()
which can be used to convert the output of the color picker to other formats.
147 |
148 |
149 |
150 | How to select other shades of the solid colors?
151 | We suggest to add a custom slider for saturation and luminosity or use <input type="range">
.
152 |
153 |
154 |
155 | How can I change the active color of the picker after initialization?
156 | color-picker
component uses $onChanges
to detect changes of the color binding. When using <color-picker color="$ctrl.color"></color-picker>
if you change a property of $ctrl.color
object $onChanges
is not triggered, because angular uses a shallow comparison . To properly update the color you'll have to create a new object with the new values. For example:
157 |
$ctrl.color.hue = 42; // won't work
158 | // use the angular helper
159 | $ctrl.color = angular.extend({}, $ctrl.color, { hue: 42 });
160 | // or create the object manually
161 | $ctrl.color = {
162 | hue: 42,
163 | luminosity: $ctrl.color.luminosity,
164 | saturation: $ctrl.color.saturation,
165 | alpha: $ctrl.color.alpha
166 | };
167 | // or use Stage-3 Object Spread properties
168 | $ctrl.color = { ...$ctrl.color, hue: 42 };
169 | // or use Object.assign
170 | $ctrl.color = Object.assign({}, $ctrl.color, { hue: 42 });
171 |
172 |
173 |
174 |
175 | Why does Google Chrome throw a [Violation] Added non-passive event listener to a scroll-blocking 'touchmove' event.
warning in the console?
176 | touchmove
is used with preventDefault()
to block scrolling on mobile while rotating the color knob. Even the Web Incubator Community Group acknowledges that in some cases a passive event listener can't be used.
177 |
178 |
179 |
180 | Why is the scroll-to-rotate not turned on by default?
181 | It's another non-passive event that could potentially introduce jank on scroll. To rotate the color knob, but stay on the same scrolling position the wheel
event is blocked with preventDefault()
. Thus, if you really want this feature for your users you'll have to explicitly add the mouse-scroll="true"
attribute.
182 |
183 |
184 |
185 | [Back To Top](#user-content-quick-links)
186 |
187 | ## Contribute
188 | If you're interested in the project you can help out with feature requests, bugfixes, documentation improvements or any other helpful contributions. You can use the issue list of this repo for bug reports and feature requests and as well as for questions and support.
189 |
190 | We are also particularly interested in projects you did with this plugin. If you have created something colorful and creative with the color picker and want to show it off send us a quick mail.
191 |
192 | The project is using an adapted version of [Angular's commit convention](https://github.com/conventional-changelog/conventional-changelog/blob/master/packages/conventional-changelog-angular/convention.md) and commit messages should adhere to it.
193 |
194 | [Back To Top](#user-content-quick-links)
195 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-radial-color-picker",
3 | "version": "2.1.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@comandeer/babel-plugin-banner": {
8 | "version": "1.0.0",
9 | "resolved": "https://registry.npmjs.org/@comandeer/babel-plugin-banner/-/babel-plugin-banner-1.0.0.tgz",
10 | "integrity": "sha1-QLzOC77ghLWwJUWjNjXQU8JINW8=",
11 | "dev": true
12 | },
13 | "abbrev": {
14 | "version": "1.1.1",
15 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
16 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
17 | "dev": true
18 | },
19 | "ajv": {
20 | "version": "5.3.0",
21 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz",
22 | "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=",
23 | "dev": true,
24 | "requires": {
25 | "co": "4.6.0",
26 | "fast-deep-equal": "1.0.0",
27 | "fast-json-stable-stringify": "2.0.0",
28 | "json-schema-traverse": "0.3.1"
29 | }
30 | },
31 | "amdefine": {
32 | "version": "1.0.1",
33 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
34 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
35 | "dev": true
36 | },
37 | "ansi-regex": {
38 | "version": "2.1.1",
39 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
40 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
41 | "dev": true
42 | },
43 | "ansi-styles": {
44 | "version": "2.2.1",
45 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
46 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
47 | "dev": true
48 | },
49 | "aproba": {
50 | "version": "1.2.0",
51 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
52 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
53 | "dev": true
54 | },
55 | "are-we-there-yet": {
56 | "version": "1.1.4",
57 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz",
58 | "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
59 | "dev": true,
60 | "requires": {
61 | "delegates": "1.0.0",
62 | "readable-stream": "2.3.3"
63 | },
64 | "dependencies": {
65 | "isarray": {
66 | "version": "1.0.0",
67 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
68 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
69 | "dev": true
70 | },
71 | "readable-stream": {
72 | "version": "2.3.3",
73 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
74 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
75 | "dev": true,
76 | "requires": {
77 | "core-util-is": "1.0.2",
78 | "inherits": "2.0.3",
79 | "isarray": "1.0.0",
80 | "process-nextick-args": "1.0.7",
81 | "safe-buffer": "5.1.1",
82 | "string_decoder": "1.0.3",
83 | "util-deprecate": "1.0.2"
84 | }
85 | },
86 | "string_decoder": {
87 | "version": "1.0.3",
88 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
89 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
90 | "dev": true,
91 | "requires": {
92 | "safe-buffer": "5.1.1"
93 | }
94 | }
95 | }
96 | },
97 | "array-find-index": {
98 | "version": "1.0.2",
99 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
100 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
101 | "dev": true
102 | },
103 | "asn1": {
104 | "version": "0.2.3",
105 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
106 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
107 | "dev": true
108 | },
109 | "assert-plus": {
110 | "version": "1.0.0",
111 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
112 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
113 | "dev": true
114 | },
115 | "async-foreach": {
116 | "version": "0.1.3",
117 | "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
118 | "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
119 | "dev": true
120 | },
121 | "asynckit": {
122 | "version": "0.4.0",
123 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
124 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
125 | "dev": true
126 | },
127 | "aws-sign2": {
128 | "version": "0.7.0",
129 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
130 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
131 | "dev": true
132 | },
133 | "aws4": {
134 | "version": "1.6.0",
135 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
136 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
137 | "dev": true
138 | },
139 | "babel-code-frame": {
140 | "version": "6.26.0",
141 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
142 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
143 | "dev": true,
144 | "requires": {
145 | "chalk": "1.1.3",
146 | "esutils": "2.0.2",
147 | "js-tokens": "3.0.2"
148 | }
149 | },
150 | "babel-core": {
151 | "version": "6.26.0",
152 | "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz",
153 | "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
154 | "dev": true,
155 | "requires": {
156 | "babel-code-frame": "6.26.0",
157 | "babel-generator": "6.26.0",
158 | "babel-helpers": "6.24.1",
159 | "babel-messages": "6.23.0",
160 | "babel-register": "6.26.0",
161 | "babel-runtime": "6.26.0",
162 | "babel-template": "6.26.0",
163 | "babel-traverse": "6.26.0",
164 | "babel-types": "6.26.0",
165 | "babylon": "6.18.0",
166 | "convert-source-map": "1.5.0",
167 | "debug": "2.6.9",
168 | "json5": "0.5.1",
169 | "lodash": "4.17.4",
170 | "minimatch": "3.0.4",
171 | "path-is-absolute": "1.0.1",
172 | "private": "0.1.8",
173 | "slash": "1.0.0",
174 | "source-map": "0.5.7"
175 | },
176 | "dependencies": {
177 | "source-map": {
178 | "version": "0.5.7",
179 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
180 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
181 | "dev": true
182 | }
183 | }
184 | },
185 | "babel-generator": {
186 | "version": "6.26.0",
187 | "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz",
188 | "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=",
189 | "dev": true,
190 | "requires": {
191 | "babel-messages": "6.23.0",
192 | "babel-runtime": "6.26.0",
193 | "babel-types": "6.26.0",
194 | "detect-indent": "4.0.0",
195 | "jsesc": "1.3.0",
196 | "lodash": "4.17.4",
197 | "source-map": "0.5.7",
198 | "trim-right": "1.0.1"
199 | },
200 | "dependencies": {
201 | "source-map": {
202 | "version": "0.5.7",
203 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
204 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
205 | "dev": true
206 | }
207 | }
208 | },
209 | "babel-helper-evaluate-path": {
210 | "version": "0.2.0",
211 | "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.2.0.tgz",
212 | "integrity": "sha512-0EK9TUKMxHL549hWDPkQoS7R0Ozg1CDLheVBHYds2B2qoAvmr9ejY3zOXFsrICK73TN7bPhU14PBeKc8jcBTwg==",
213 | "dev": true
214 | },
215 | "babel-helper-flip-expressions": {
216 | "version": "0.2.0",
217 | "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.2.0.tgz",
218 | "integrity": "sha512-rAsPA1pWBc7e2E6HepkP2e1sXugT+Oq/VCqhyuHJ8aJ2d/ifwnJfd4Qxjm21qlW43AN8tqaeByagKK6wECFMSw==",
219 | "dev": true
220 | },
221 | "babel-helper-is-nodes-equiv": {
222 | "version": "0.0.1",
223 | "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz",
224 | "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=",
225 | "dev": true
226 | },
227 | "babel-helper-is-void-0": {
228 | "version": "0.2.0",
229 | "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.2.0.tgz",
230 | "integrity": "sha512-Axj1AYuD0E3Dl7nT3KxROP7VekEofz3XtEljzURf3fABalLpr8PamtgLFt+zuxtaCxRf9iuZmbAMMYWri5Bazw==",
231 | "dev": true
232 | },
233 | "babel-helper-mark-eval-scopes": {
234 | "version": "0.2.0",
235 | "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.2.0.tgz",
236 | "integrity": "sha512-KJuwrOUcHbvbh6he4xRXZFLaivK9DF9o3CrvpWnK1Wp0B+1ANYABXBMgwrnNFIDK/AvicxQ9CNr8wsgivlp4Aw==",
237 | "dev": true
238 | },
239 | "babel-helper-remove-or-void": {
240 | "version": "0.2.0",
241 | "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.2.0.tgz",
242 | "integrity": "sha512-1Z41upf/XR+PwY7Nd+F15Jo5BiQi5205ZXUuKed3yoyQgDkMyoM7vAdjEJS/T+M6jy32sXjskMUgms4zeiVtRA==",
243 | "dev": true
244 | },
245 | "babel-helper-to-multiple-sequence-expressions": {
246 | "version": "0.2.0",
247 | "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.2.0.tgz",
248 | "integrity": "sha512-ij9lpfdP3+Zc/7kNwa+NXbTrUlsYEWPwt/ugmQO0qflzLrveTIkbfOqQztvitk81aG5NblYDQXDlRohzu3oa8Q==",
249 | "dev": true
250 | },
251 | "babel-helpers": {
252 | "version": "6.24.1",
253 | "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
254 | "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
255 | "dev": true,
256 | "requires": {
257 | "babel-runtime": "6.26.0",
258 | "babel-template": "6.26.0"
259 | }
260 | },
261 | "babel-messages": {
262 | "version": "6.23.0",
263 | "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
264 | "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
265 | "dev": true,
266 | "requires": {
267 | "babel-runtime": "6.26.0"
268 | }
269 | },
270 | "babel-plugin-minify-builtins": {
271 | "version": "0.2.0",
272 | "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.2.0.tgz",
273 | "integrity": "sha512-4i+8ntaS8gwVUcOz5y+zE+55OVOl2nTbmHV51D4wAIiKcRI8U5K//ip1GHfhsgk/NJrrHK7h97Oy5jpqt0Iixg==",
274 | "dev": true,
275 | "requires": {
276 | "babel-helper-evaluate-path": "0.2.0"
277 | }
278 | },
279 | "babel-plugin-minify-constant-folding": {
280 | "version": "0.2.0",
281 | "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.2.0.tgz",
282 | "integrity": "sha512-B3ffQBEUQ8ydlIkYv2MkZtTCbV7FAkWAV7NkyhcXlGpD10PaCxNGQ/B9oguXGowR1m16Q5nGhvNn8Pkn1MO6Hw==",
283 | "dev": true,
284 | "requires": {
285 | "babel-helper-evaluate-path": "0.2.0"
286 | }
287 | },
288 | "babel-plugin-minify-dead-code-elimination": {
289 | "version": "0.2.0",
290 | "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.2.0.tgz",
291 | "integrity": "sha512-zE7y3pRyzA4zK5nBou0kTcwUTSQ/AiFrynt1cIEYN7vcO2gS9ZFZoI0aO9JYLUdct5fsC1vfB35408yrzTyVfg==",
292 | "dev": true,
293 | "requires": {
294 | "babel-helper-evaluate-path": "0.2.0",
295 | "babel-helper-mark-eval-scopes": "0.2.0",
296 | "babel-helper-remove-or-void": "0.2.0",
297 | "lodash.some": "4.6.0"
298 | }
299 | },
300 | "babel-plugin-minify-flip-comparisons": {
301 | "version": "0.2.0",
302 | "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.2.0.tgz",
303 | "integrity": "sha512-QOqXSEmD/LhT3LpM1WCyzAGcQZYYKJF7oOHvS6QbpomHenydrV53DMdPX2mK01icBExKZcJAHF209wvDBa+CSg==",
304 | "dev": true,
305 | "requires": {
306 | "babel-helper-is-void-0": "0.2.0"
307 | }
308 | },
309 | "babel-plugin-minify-guarded-expressions": {
310 | "version": "0.2.0",
311 | "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.2.0.tgz",
312 | "integrity": "sha512-5+NSPdRQ9mnrHaA+zFj+D5OzmSiv90EX5zGH6cWQgR/OUqmCHSDqgTRPFvOctgpo8MJyO7Rt7ajs2UfLnlAwYg==",
313 | "dev": true,
314 | "requires": {
315 | "babel-helper-flip-expressions": "0.2.0"
316 | }
317 | },
318 | "babel-plugin-minify-infinity": {
319 | "version": "0.2.0",
320 | "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.2.0.tgz",
321 | "integrity": "sha512-U694vrla1lN6vDHWGrR832t3a/A2eh+kyl019LxEE2+sS4VTydyOPRsAOIYAdJegWRA4cMX1lm9azAN0cLIr8g==",
322 | "dev": true
323 | },
324 | "babel-plugin-minify-mangle-names": {
325 | "version": "0.2.0",
326 | "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.2.0.tgz",
327 | "integrity": "sha512-Gixuak1/CO7VCdjn15/8Bxe/QsAtDG4zPbnsNoe1mIJGCIH/kcmSjFhMlGJtXDQZd6EKzeMfA5WmX9+jvGRefw==",
328 | "dev": true,
329 | "requires": {
330 | "babel-helper-mark-eval-scopes": "0.2.0"
331 | }
332 | },
333 | "babel-plugin-minify-numeric-literals": {
334 | "version": "0.2.0",
335 | "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.2.0.tgz",
336 | "integrity": "sha512-VcLpb+r1YS7+RIOXdRsFVLLqoh22177USpHf+JM/g1nZbzdqENmfd5v534MLAbRErhbz6SyK+NQViVzVtBxu8g==",
337 | "dev": true
338 | },
339 | "babel-plugin-minify-replace": {
340 | "version": "0.2.0",
341 | "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.2.0.tgz",
342 | "integrity": "sha512-SEW6zoSVxh3OH6E1LCgyhhTWMnCv+JIRu5h5IlJDA11tU4ZeSF7uPQcO4vN/o52+FssRB26dmzJ/8D+z0QPg5Q==",
343 | "dev": true
344 | },
345 | "babel-plugin-minify-simplify": {
346 | "version": "0.2.0",
347 | "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.2.0.tgz",
348 | "integrity": "sha512-Mj3Mwy2zVosMfXDWXZrQH5/uMAyfJdmDQ1NVqit+ArbHC3LlXVzptuyC1JxTyai/wgFvjLaichm/7vSUshkWqw==",
349 | "dev": true,
350 | "requires": {
351 | "babel-helper-flip-expressions": "0.2.0",
352 | "babel-helper-is-nodes-equiv": "0.0.1",
353 | "babel-helper-to-multiple-sequence-expressions": "0.2.0"
354 | }
355 | },
356 | "babel-plugin-minify-type-constructors": {
357 | "version": "0.2.0",
358 | "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.2.0.tgz",
359 | "integrity": "sha512-NiOvvA9Pq6bki6nP4BayXwT5GZadw7DJFDDzHmkpnOQpENWe8RtHtKZM44MG1R6EQ5XxgbLdsdhswIzTkFlO5g==",
360 | "dev": true,
361 | "requires": {
362 | "babel-helper-is-void-0": "0.2.0"
363 | }
364 | },
365 | "babel-plugin-transform-inline-consecutive-adds": {
366 | "version": "0.2.0",
367 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.2.0.tgz",
368 | "integrity": "sha512-GlhOuLOQ28ua9prg0hT33HslCrEmz9xWXy9ZNZSACppCyRxxRW+haYtRgm7uYXCcd0q8ggCWD2pfWEJp5iiZfQ==",
369 | "dev": true
370 | },
371 | "babel-plugin-transform-member-expression-literals": {
372 | "version": "6.8.5",
373 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.8.5.tgz",
374 | "integrity": "sha512-Ux3ligf+ukzWaCbBYOstDuFBhRgMiJHlpJBKV4P47qtzVkd0lg1ddPj9fqIJqAM0n+CvxipyrZrnNnw3CdtQCg==",
375 | "dev": true
376 | },
377 | "babel-plugin-transform-merge-sibling-variables": {
378 | "version": "6.8.6",
379 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.8.6.tgz",
380 | "integrity": "sha512-o5Jioq553HtEAUN5uty7ELJMenXIxHI3PIs1yLqYWYQwP6mg6IPVAJ+U7i4zr9XGF/kb2RGsdehglGTV+vngqA==",
381 | "dev": true
382 | },
383 | "babel-plugin-transform-minify-booleans": {
384 | "version": "6.8.3",
385 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.8.3.tgz",
386 | "integrity": "sha512-bPbUhkeN2Nc0KH0/A19GwQGj8w+CvdJzyu8t59VoEDgsNMQ9Bopzi5DrVkrSsVjbYUaZpzq/DYLrH+wD5K2Tig==",
387 | "dev": true
388 | },
389 | "babel-plugin-transform-property-literals": {
390 | "version": "6.8.5",
391 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.5.tgz",
392 | "integrity": "sha512-MmiQsQ5AcIaRZMJD0zY5C4H3xuHm06/nWgtOsz7AXV44VEIXIlPiJ39IFYJ4Qx67/fEm8zJAedzR8t+B7d10Bg==",
393 | "dev": true,
394 | "requires": {
395 | "esutils": "2.0.2"
396 | }
397 | },
398 | "babel-plugin-transform-regexp-constructors": {
399 | "version": "0.2.0",
400 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.2.0.tgz",
401 | "integrity": "sha512-7IsQ6aQx6LAaOqy97/PthTf+5Nx9grZww3r6E62IdWe76Yr8KsuwVjxzqSPQvESJqTE3EMADQ9S0RtwWDGNG9Q==",
402 | "dev": true
403 | },
404 | "babel-plugin-transform-remove-console": {
405 | "version": "6.8.5",
406 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.8.5.tgz",
407 | "integrity": "sha512-uuCKvtweCyIvvC8fi92EcWRtO2Kt5KMNMRK6BhpDXdeb3sxvGM7453RSmgeu4DlKns3OlvY9Ep5Q9m5a7RQAgg==",
408 | "dev": true
409 | },
410 | "babel-plugin-transform-remove-debugger": {
411 | "version": "6.8.5",
412 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.8.5.tgz",
413 | "integrity": "sha512-InDQDdHPOLJKM+G6oXrEesf+P29QFBmcTXID+TAvZziVz+38xe2VO/Bn3FcRcRtnOOycbgsJkUNp9jIK+ist6g==",
414 | "dev": true
415 | },
416 | "babel-plugin-transform-remove-undefined": {
417 | "version": "0.2.0",
418 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.2.0.tgz",
419 | "integrity": "sha512-O8v57tPMHkp89kA4ZfQEYds/pzgvz/QYerBJjIuL5/Jc7RnvMVRA5gJY9zFKP7WayW8WOSBV4vh8Y8FJRio+ow==",
420 | "dev": true,
421 | "requires": {
422 | "babel-helper-evaluate-path": "0.2.0"
423 | }
424 | },
425 | "babel-plugin-transform-simplify-comparison-operators": {
426 | "version": "6.8.5",
427 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.5.tgz",
428 | "integrity": "sha512-B3HlBZb+Uq86nRj5yNPO6pJ3noEdqHvzYkEYoUWtrsWTv48ZIRatYlumoOiif/v8llF13YjYjx9zhyznDx+N9g==",
429 | "dev": true
430 | },
431 | "babel-plugin-transform-undefined-to-void": {
432 | "version": "6.8.3",
433 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.8.3.tgz",
434 | "integrity": "sha512-goYwp8dMrzHD6x9GjZ2M85Mk2vxf1h85CnUgAjfftUnlJvzF4uj5MrbReHBTbjQ96C8CuRzvhYZ3tv8H3Sc1ZA==",
435 | "dev": true
436 | },
437 | "babel-preset-minify": {
438 | "version": "0.2.0",
439 | "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.2.0.tgz",
440 | "integrity": "sha512-mR8Q44RmMzm18bM2Lqd9uiPopzk5GDCtVuquNbLFmX6lOKnqWoenaNBxnWW0UhBFC75lEHTIgNGCbnsRI0pJVw==",
441 | "dev": true,
442 | "requires": {
443 | "babel-plugin-minify-builtins": "0.2.0",
444 | "babel-plugin-minify-constant-folding": "0.2.0",
445 | "babel-plugin-minify-dead-code-elimination": "0.2.0",
446 | "babel-plugin-minify-flip-comparisons": "0.2.0",
447 | "babel-plugin-minify-guarded-expressions": "0.2.0",
448 | "babel-plugin-minify-infinity": "0.2.0",
449 | "babel-plugin-minify-mangle-names": "0.2.0",
450 | "babel-plugin-minify-numeric-literals": "0.2.0",
451 | "babel-plugin-minify-replace": "0.2.0",
452 | "babel-plugin-minify-simplify": "0.2.0",
453 | "babel-plugin-minify-type-constructors": "0.2.0",
454 | "babel-plugin-transform-inline-consecutive-adds": "0.2.0",
455 | "babel-plugin-transform-member-expression-literals": "6.8.5",
456 | "babel-plugin-transform-merge-sibling-variables": "6.8.6",
457 | "babel-plugin-transform-minify-booleans": "6.8.3",
458 | "babel-plugin-transform-property-literals": "6.8.5",
459 | "babel-plugin-transform-regexp-constructors": "0.2.0",
460 | "babel-plugin-transform-remove-console": "6.8.5",
461 | "babel-plugin-transform-remove-debugger": "6.8.5",
462 | "babel-plugin-transform-remove-undefined": "0.2.0",
463 | "babel-plugin-transform-simplify-comparison-operators": "6.8.5",
464 | "babel-plugin-transform-undefined-to-void": "6.8.3",
465 | "lodash.isplainobject": "4.0.6"
466 | }
467 | },
468 | "babel-register": {
469 | "version": "6.26.0",
470 | "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
471 | "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
472 | "dev": true,
473 | "requires": {
474 | "babel-core": "6.26.0",
475 | "babel-runtime": "6.26.0",
476 | "core-js": "2.5.1",
477 | "home-or-tmp": "2.0.0",
478 | "lodash": "4.17.4",
479 | "mkdirp": "0.5.1",
480 | "source-map-support": "0.4.18"
481 | }
482 | },
483 | "babel-runtime": {
484 | "version": "6.26.0",
485 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
486 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
487 | "dev": true,
488 | "requires": {
489 | "core-js": "2.5.1",
490 | "regenerator-runtime": "0.11.0"
491 | }
492 | },
493 | "babel-template": {
494 | "version": "6.26.0",
495 | "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
496 | "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
497 | "dev": true,
498 | "requires": {
499 | "babel-runtime": "6.26.0",
500 | "babel-traverse": "6.26.0",
501 | "babel-types": "6.26.0",
502 | "babylon": "6.18.0",
503 | "lodash": "4.17.4"
504 | }
505 | },
506 | "babel-traverse": {
507 | "version": "6.26.0",
508 | "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
509 | "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
510 | "dev": true,
511 | "requires": {
512 | "babel-code-frame": "6.26.0",
513 | "babel-messages": "6.23.0",
514 | "babel-runtime": "6.26.0",
515 | "babel-types": "6.26.0",
516 | "babylon": "6.18.0",
517 | "debug": "2.6.9",
518 | "globals": "9.18.0",
519 | "invariant": "2.2.2",
520 | "lodash": "4.17.4"
521 | }
522 | },
523 | "babel-types": {
524 | "version": "6.26.0",
525 | "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
526 | "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
527 | "dev": true,
528 | "requires": {
529 | "babel-runtime": "6.26.0",
530 | "esutils": "2.0.2",
531 | "lodash": "4.17.4",
532 | "to-fast-properties": "1.0.3"
533 | }
534 | },
535 | "babylon": {
536 | "version": "6.18.0",
537 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
538 | "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
539 | "dev": true
540 | },
541 | "balanced-match": {
542 | "version": "1.0.0",
543 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
544 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
545 | "dev": true
546 | },
547 | "bcrypt-pbkdf": {
548 | "version": "1.0.1",
549 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
550 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
551 | "dev": true,
552 | "optional": true,
553 | "requires": {
554 | "tweetnacl": "0.14.5"
555 | }
556 | },
557 | "block-stream": {
558 | "version": "0.0.9",
559 | "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
560 | "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
561 | "dev": true,
562 | "requires": {
563 | "inherits": "2.0.3"
564 | }
565 | },
566 | "boom": {
567 | "version": "4.3.1",
568 | "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
569 | "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
570 | "dev": true,
571 | "requires": {
572 | "hoek": "4.2.0"
573 | }
574 | },
575 | "brace-expansion": {
576 | "version": "1.1.8",
577 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
578 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
579 | "dev": true,
580 | "requires": {
581 | "balanced-match": "1.0.0",
582 | "concat-map": "0.0.1"
583 | }
584 | },
585 | "builtin-modules": {
586 | "version": "1.1.1",
587 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
588 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
589 | "dev": true
590 | },
591 | "camelcase": {
592 | "version": "2.1.1",
593 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
594 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
595 | "dev": true
596 | },
597 | "camelcase-keys": {
598 | "version": "2.1.0",
599 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
600 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
601 | "dev": true,
602 | "requires": {
603 | "camelcase": "2.1.1",
604 | "map-obj": "1.0.1"
605 | }
606 | },
607 | "caseless": {
608 | "version": "0.12.0",
609 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
610 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
611 | "dev": true
612 | },
613 | "chalk": {
614 | "version": "1.1.3",
615 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
616 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
617 | "dev": true,
618 | "requires": {
619 | "ansi-styles": "2.2.1",
620 | "escape-string-regexp": "1.0.5",
621 | "has-ansi": "2.0.0",
622 | "strip-ansi": "3.0.1",
623 | "supports-color": "2.0.0"
624 | }
625 | },
626 | "cliui": {
627 | "version": "3.2.0",
628 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
629 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
630 | "dev": true,
631 | "requires": {
632 | "string-width": "1.0.2",
633 | "strip-ansi": "3.0.1",
634 | "wrap-ansi": "2.1.0"
635 | }
636 | },
637 | "co": {
638 | "version": "4.6.0",
639 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
640 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
641 | "dev": true
642 | },
643 | "code-point-at": {
644 | "version": "1.1.0",
645 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
646 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
647 | "dev": true
648 | },
649 | "combined-stream": {
650 | "version": "1.0.5",
651 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
652 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
653 | "dev": true,
654 | "requires": {
655 | "delayed-stream": "1.0.0"
656 | }
657 | },
658 | "concat-map": {
659 | "version": "0.0.1",
660 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
661 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
662 | "dev": true
663 | },
664 | "console-control-strings": {
665 | "version": "1.1.0",
666 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
667 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
668 | "dev": true
669 | },
670 | "convert-source-map": {
671 | "version": "1.5.0",
672 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz",
673 | "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=",
674 | "dev": true
675 | },
676 | "copyfiles": {
677 | "version": "1.2.0",
678 | "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-1.2.0.tgz",
679 | "integrity": "sha1-qNo6xBqiIgrim9PFi2mEKU8sWTw=",
680 | "dev": true,
681 | "requires": {
682 | "glob": "7.1.2",
683 | "ltcdr": "2.2.1",
684 | "minimatch": "3.0.4",
685 | "mkdirp": "0.5.1",
686 | "noms": "0.0.0",
687 | "through2": "2.0.3"
688 | }
689 | },
690 | "core-js": {
691 | "version": "2.5.1",
692 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz",
693 | "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=",
694 | "dev": true
695 | },
696 | "core-util-is": {
697 | "version": "1.0.2",
698 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
699 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
700 | "dev": true
701 | },
702 | "cross-spawn": {
703 | "version": "3.0.1",
704 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
705 | "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
706 | "dev": true,
707 | "requires": {
708 | "lru-cache": "4.1.1",
709 | "which": "1.3.0"
710 | }
711 | },
712 | "cryptiles": {
713 | "version": "3.1.2",
714 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
715 | "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
716 | "dev": true,
717 | "requires": {
718 | "boom": "5.2.0"
719 | },
720 | "dependencies": {
721 | "boom": {
722 | "version": "5.2.0",
723 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
724 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
725 | "dev": true,
726 | "requires": {
727 | "hoek": "4.2.0"
728 | }
729 | }
730 | }
731 | },
732 | "currently-unhandled": {
733 | "version": "0.4.1",
734 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
735 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
736 | "dev": true,
737 | "requires": {
738 | "array-find-index": "1.0.2"
739 | }
740 | },
741 | "dashdash": {
742 | "version": "1.14.1",
743 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
744 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
745 | "dev": true,
746 | "requires": {
747 | "assert-plus": "1.0.0"
748 | }
749 | },
750 | "debug": {
751 | "version": "2.6.9",
752 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
753 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
754 | "dev": true,
755 | "requires": {
756 | "ms": "2.0.0"
757 | }
758 | },
759 | "decamelize": {
760 | "version": "1.2.0",
761 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
762 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
763 | "dev": true
764 | },
765 | "delayed-stream": {
766 | "version": "1.0.0",
767 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
768 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
769 | "dev": true
770 | },
771 | "delegates": {
772 | "version": "1.0.0",
773 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
774 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
775 | "dev": true
776 | },
777 | "detect-indent": {
778 | "version": "4.0.0",
779 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
780 | "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
781 | "dev": true,
782 | "requires": {
783 | "repeating": "2.0.1"
784 | }
785 | },
786 | "ecc-jsbn": {
787 | "version": "0.1.1",
788 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
789 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
790 | "dev": true,
791 | "optional": true,
792 | "requires": {
793 | "jsbn": "0.1.1"
794 | }
795 | },
796 | "error-ex": {
797 | "version": "1.3.1",
798 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
799 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
800 | "dev": true,
801 | "requires": {
802 | "is-arrayish": "0.2.1"
803 | }
804 | },
805 | "escape-string-regexp": {
806 | "version": "1.0.5",
807 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
808 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
809 | "dev": true
810 | },
811 | "esutils": {
812 | "version": "2.0.2",
813 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
814 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
815 | "dev": true
816 | },
817 | "extend": {
818 | "version": "3.0.1",
819 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
820 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
821 | "dev": true
822 | },
823 | "extsprintf": {
824 | "version": "1.3.0",
825 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
826 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
827 | "dev": true
828 | },
829 | "fast-deep-equal": {
830 | "version": "1.0.0",
831 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
832 | "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=",
833 | "dev": true
834 | },
835 | "fast-json-stable-stringify": {
836 | "version": "2.0.0",
837 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
838 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
839 | "dev": true
840 | },
841 | "find-up": {
842 | "version": "1.1.2",
843 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
844 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
845 | "dev": true,
846 | "requires": {
847 | "path-exists": "2.1.0",
848 | "pinkie-promise": "2.0.1"
849 | }
850 | },
851 | "forever-agent": {
852 | "version": "0.6.1",
853 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
854 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
855 | "dev": true
856 | },
857 | "form-data": {
858 | "version": "2.3.1",
859 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz",
860 | "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=",
861 | "dev": true,
862 | "requires": {
863 | "asynckit": "0.4.0",
864 | "combined-stream": "1.0.5",
865 | "mime-types": "2.1.17"
866 | }
867 | },
868 | "fs.realpath": {
869 | "version": "1.0.0",
870 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
871 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
872 | "dev": true
873 | },
874 | "fstream": {
875 | "version": "1.0.11",
876 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
877 | "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
878 | "dev": true,
879 | "requires": {
880 | "graceful-fs": "4.1.11",
881 | "inherits": "2.0.3",
882 | "mkdirp": "0.5.1",
883 | "rimraf": "2.6.2"
884 | }
885 | },
886 | "gauge": {
887 | "version": "2.7.4",
888 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
889 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
890 | "dev": true,
891 | "requires": {
892 | "aproba": "1.2.0",
893 | "console-control-strings": "1.1.0",
894 | "has-unicode": "2.0.1",
895 | "object-assign": "4.1.1",
896 | "signal-exit": "3.0.2",
897 | "string-width": "1.0.2",
898 | "strip-ansi": "3.0.1",
899 | "wide-align": "1.1.2"
900 | }
901 | },
902 | "gaze": {
903 | "version": "1.1.2",
904 | "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz",
905 | "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=",
906 | "dev": true,
907 | "requires": {
908 | "globule": "1.2.0"
909 | }
910 | },
911 | "get-caller-file": {
912 | "version": "1.0.2",
913 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
914 | "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
915 | "dev": true
916 | },
917 | "get-stdin": {
918 | "version": "4.0.1",
919 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
920 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
921 | "dev": true
922 | },
923 | "getpass": {
924 | "version": "0.1.7",
925 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
926 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
927 | "dev": true,
928 | "requires": {
929 | "assert-plus": "1.0.0"
930 | }
931 | },
932 | "glob": {
933 | "version": "7.1.2",
934 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
935 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
936 | "dev": true,
937 | "requires": {
938 | "fs.realpath": "1.0.0",
939 | "inflight": "1.0.6",
940 | "inherits": "2.0.3",
941 | "minimatch": "3.0.4",
942 | "once": "1.4.0",
943 | "path-is-absolute": "1.0.1"
944 | }
945 | },
946 | "globals": {
947 | "version": "9.18.0",
948 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
949 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
950 | "dev": true
951 | },
952 | "globule": {
953 | "version": "1.2.0",
954 | "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz",
955 | "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=",
956 | "dev": true,
957 | "requires": {
958 | "glob": "7.1.2",
959 | "lodash": "4.17.4",
960 | "minimatch": "3.0.4"
961 | }
962 | },
963 | "graceful-fs": {
964 | "version": "4.1.11",
965 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
966 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
967 | "dev": true
968 | },
969 | "har-schema": {
970 | "version": "2.0.0",
971 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
972 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
973 | "dev": true
974 | },
975 | "har-validator": {
976 | "version": "5.0.3",
977 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
978 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
979 | "dev": true,
980 | "requires": {
981 | "ajv": "5.3.0",
982 | "har-schema": "2.0.0"
983 | }
984 | },
985 | "has-ansi": {
986 | "version": "2.0.0",
987 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
988 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
989 | "dev": true,
990 | "requires": {
991 | "ansi-regex": "2.1.1"
992 | }
993 | },
994 | "has-unicode": {
995 | "version": "2.0.1",
996 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
997 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
998 | "dev": true
999 | },
1000 | "hawk": {
1001 | "version": "6.0.2",
1002 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
1003 | "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
1004 | "dev": true,
1005 | "requires": {
1006 | "boom": "4.3.1",
1007 | "cryptiles": "3.1.2",
1008 | "hoek": "4.2.0",
1009 | "sntp": "2.1.0"
1010 | }
1011 | },
1012 | "hoek": {
1013 | "version": "4.2.0",
1014 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz",
1015 | "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==",
1016 | "dev": true
1017 | },
1018 | "home-or-tmp": {
1019 | "version": "2.0.0",
1020 | "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
1021 | "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
1022 | "dev": true,
1023 | "requires": {
1024 | "os-homedir": "1.0.2",
1025 | "os-tmpdir": "1.0.2"
1026 | }
1027 | },
1028 | "hosted-git-info": {
1029 | "version": "2.5.0",
1030 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
1031 | "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==",
1032 | "dev": true
1033 | },
1034 | "http-signature": {
1035 | "version": "1.2.0",
1036 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
1037 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
1038 | "dev": true,
1039 | "requires": {
1040 | "assert-plus": "1.0.0",
1041 | "jsprim": "1.4.1",
1042 | "sshpk": "1.13.1"
1043 | }
1044 | },
1045 | "in-publish": {
1046 | "version": "2.0.0",
1047 | "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
1048 | "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
1049 | "dev": true
1050 | },
1051 | "indent-string": {
1052 | "version": "2.1.0",
1053 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
1054 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
1055 | "dev": true,
1056 | "requires": {
1057 | "repeating": "2.0.1"
1058 | }
1059 | },
1060 | "inflight": {
1061 | "version": "1.0.6",
1062 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1063 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1064 | "dev": true,
1065 | "requires": {
1066 | "once": "1.4.0",
1067 | "wrappy": "1.0.2"
1068 | }
1069 | },
1070 | "inherits": {
1071 | "version": "2.0.3",
1072 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1073 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
1074 | "dev": true
1075 | },
1076 | "invariant": {
1077 | "version": "2.2.2",
1078 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
1079 | "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
1080 | "dev": true,
1081 | "requires": {
1082 | "loose-envify": "1.3.1"
1083 | }
1084 | },
1085 | "invert-kv": {
1086 | "version": "1.0.0",
1087 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
1088 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
1089 | "dev": true
1090 | },
1091 | "is-arrayish": {
1092 | "version": "0.2.1",
1093 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
1094 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
1095 | "dev": true
1096 | },
1097 | "is-builtin-module": {
1098 | "version": "1.0.0",
1099 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
1100 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
1101 | "dev": true,
1102 | "requires": {
1103 | "builtin-modules": "1.1.1"
1104 | }
1105 | },
1106 | "is-finite": {
1107 | "version": "1.0.2",
1108 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
1109 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
1110 | "dev": true,
1111 | "requires": {
1112 | "number-is-nan": "1.0.1"
1113 | }
1114 | },
1115 | "is-fullwidth-code-point": {
1116 | "version": "1.0.0",
1117 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
1118 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
1119 | "dev": true,
1120 | "requires": {
1121 | "number-is-nan": "1.0.1"
1122 | }
1123 | },
1124 | "is-typedarray": {
1125 | "version": "1.0.0",
1126 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
1127 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
1128 | "dev": true
1129 | },
1130 | "is-utf8": {
1131 | "version": "0.2.1",
1132 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
1133 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
1134 | "dev": true
1135 | },
1136 | "isarray": {
1137 | "version": "0.0.1",
1138 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
1139 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
1140 | "dev": true
1141 | },
1142 | "isexe": {
1143 | "version": "2.0.0",
1144 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1145 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1146 | "dev": true
1147 | },
1148 | "isstream": {
1149 | "version": "0.1.2",
1150 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
1151 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
1152 | "dev": true
1153 | },
1154 | "js-base64": {
1155 | "version": "2.3.2",
1156 | "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.3.2.tgz",
1157 | "integrity": "sha512-Y2/+DnfJJXT1/FCwUebUhLWb3QihxiSC42+ctHLGogmW2jPY6LCapMdFZXRvVP2z6qyKW7s6qncE/9gSqZiArw==",
1158 | "dev": true
1159 | },
1160 | "js-tokens": {
1161 | "version": "3.0.2",
1162 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
1163 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
1164 | "dev": true
1165 | },
1166 | "jsbn": {
1167 | "version": "0.1.1",
1168 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
1169 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
1170 | "dev": true,
1171 | "optional": true
1172 | },
1173 | "jsesc": {
1174 | "version": "1.3.0",
1175 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
1176 | "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
1177 | "dev": true
1178 | },
1179 | "json-schema": {
1180 | "version": "0.2.3",
1181 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
1182 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
1183 | "dev": true
1184 | },
1185 | "json-schema-traverse": {
1186 | "version": "0.3.1",
1187 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
1188 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
1189 | "dev": true
1190 | },
1191 | "json-stringify-safe": {
1192 | "version": "5.0.1",
1193 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
1194 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
1195 | "dev": true
1196 | },
1197 | "json5": {
1198 | "version": "0.5.1",
1199 | "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
1200 | "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
1201 | "dev": true
1202 | },
1203 | "jsprim": {
1204 | "version": "1.4.1",
1205 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
1206 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
1207 | "dev": true,
1208 | "requires": {
1209 | "assert-plus": "1.0.0",
1210 | "extsprintf": "1.3.0",
1211 | "json-schema": "0.2.3",
1212 | "verror": "1.10.0"
1213 | }
1214 | },
1215 | "lcid": {
1216 | "version": "1.0.0",
1217 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
1218 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
1219 | "dev": true,
1220 | "requires": {
1221 | "invert-kv": "1.0.0"
1222 | }
1223 | },
1224 | "load-json-file": {
1225 | "version": "1.1.0",
1226 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
1227 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
1228 | "dev": true,
1229 | "requires": {
1230 | "graceful-fs": "4.1.11",
1231 | "parse-json": "2.2.0",
1232 | "pify": "2.3.0",
1233 | "pinkie-promise": "2.0.1",
1234 | "strip-bom": "2.0.0"
1235 | }
1236 | },
1237 | "lodash": {
1238 | "version": "4.17.4",
1239 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
1240 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
1241 | "dev": true
1242 | },
1243 | "lodash.assign": {
1244 | "version": "4.2.0",
1245 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
1246 | "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
1247 | "dev": true
1248 | },
1249 | "lodash.clonedeep": {
1250 | "version": "4.5.0",
1251 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
1252 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
1253 | "dev": true
1254 | },
1255 | "lodash.isplainobject": {
1256 | "version": "4.0.6",
1257 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
1258 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
1259 | "dev": true
1260 | },
1261 | "lodash.mergewith": {
1262 | "version": "4.6.0",
1263 | "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz",
1264 | "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=",
1265 | "dev": true
1266 | },
1267 | "lodash.some": {
1268 | "version": "4.6.0",
1269 | "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
1270 | "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
1271 | "dev": true
1272 | },
1273 | "loose-envify": {
1274 | "version": "1.3.1",
1275 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
1276 | "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
1277 | "dev": true,
1278 | "requires": {
1279 | "js-tokens": "3.0.2"
1280 | }
1281 | },
1282 | "loud-rejection": {
1283 | "version": "1.6.0",
1284 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
1285 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
1286 | "dev": true,
1287 | "requires": {
1288 | "currently-unhandled": "0.4.1",
1289 | "signal-exit": "3.0.2"
1290 | }
1291 | },
1292 | "lru-cache": {
1293 | "version": "4.1.1",
1294 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
1295 | "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
1296 | "dev": true,
1297 | "requires": {
1298 | "pseudomap": "1.0.2",
1299 | "yallist": "2.1.2"
1300 | }
1301 | },
1302 | "ltcdr": {
1303 | "version": "2.2.1",
1304 | "resolved": "https://registry.npmjs.org/ltcdr/-/ltcdr-2.2.1.tgz",
1305 | "integrity": "sha1-Wrh60dTB2rjowIu/A37gwZAih88=",
1306 | "dev": true
1307 | },
1308 | "map-obj": {
1309 | "version": "1.0.1",
1310 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
1311 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
1312 | "dev": true
1313 | },
1314 | "meow": {
1315 | "version": "3.7.0",
1316 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
1317 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
1318 | "dev": true,
1319 | "requires": {
1320 | "camelcase-keys": "2.1.0",
1321 | "decamelize": "1.2.0",
1322 | "loud-rejection": "1.6.0",
1323 | "map-obj": "1.0.1",
1324 | "minimist": "1.2.0",
1325 | "normalize-package-data": "2.4.0",
1326 | "object-assign": "4.1.1",
1327 | "read-pkg-up": "1.0.1",
1328 | "redent": "1.0.0",
1329 | "trim-newlines": "1.0.0"
1330 | },
1331 | "dependencies": {
1332 | "minimist": {
1333 | "version": "1.2.0",
1334 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
1335 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
1336 | "dev": true
1337 | }
1338 | }
1339 | },
1340 | "mime-db": {
1341 | "version": "1.30.0",
1342 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
1343 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=",
1344 | "dev": true
1345 | },
1346 | "mime-types": {
1347 | "version": "2.1.17",
1348 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
1349 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
1350 | "dev": true,
1351 | "requires": {
1352 | "mime-db": "1.30.0"
1353 | }
1354 | },
1355 | "minimatch": {
1356 | "version": "3.0.4",
1357 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1358 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1359 | "dev": true,
1360 | "requires": {
1361 | "brace-expansion": "1.1.8"
1362 | }
1363 | },
1364 | "minimist": {
1365 | "version": "0.0.8",
1366 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1367 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
1368 | "dev": true
1369 | },
1370 | "mkdirp": {
1371 | "version": "0.5.1",
1372 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1373 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1374 | "dev": true,
1375 | "requires": {
1376 | "minimist": "0.0.8"
1377 | }
1378 | },
1379 | "ms": {
1380 | "version": "2.0.0",
1381 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1382 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1383 | "dev": true
1384 | },
1385 | "nan": {
1386 | "version": "2.7.0",
1387 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz",
1388 | "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=",
1389 | "dev": true
1390 | },
1391 | "node-gyp": {
1392 | "version": "3.6.2",
1393 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz",
1394 | "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=",
1395 | "dev": true,
1396 | "requires": {
1397 | "fstream": "1.0.11",
1398 | "glob": "7.1.2",
1399 | "graceful-fs": "4.1.11",
1400 | "minimatch": "3.0.4",
1401 | "mkdirp": "0.5.1",
1402 | "nopt": "3.0.6",
1403 | "npmlog": "4.1.2",
1404 | "osenv": "0.1.4",
1405 | "request": "2.83.0",
1406 | "rimraf": "2.6.2",
1407 | "semver": "5.3.0",
1408 | "tar": "2.2.1",
1409 | "which": "1.3.0"
1410 | },
1411 | "dependencies": {
1412 | "semver": {
1413 | "version": "5.3.0",
1414 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
1415 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
1416 | "dev": true
1417 | }
1418 | }
1419 | },
1420 | "node-sass": {
1421 | "version": "4.6.0",
1422 | "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.6.0.tgz",
1423 | "integrity": "sha512-rh0CvkxpYdQdbWx4EQfunmG0+99BVyVwQHlFE+yUzc6lteF5K3WUcJ0bdmv9E9CqQA1RfuMyvmpDP99cmBObow==",
1424 | "dev": true,
1425 | "requires": {
1426 | "async-foreach": "0.1.3",
1427 | "chalk": "1.1.3",
1428 | "cross-spawn": "3.0.1",
1429 | "gaze": "1.1.2",
1430 | "get-stdin": "4.0.1",
1431 | "glob": "7.1.2",
1432 | "in-publish": "2.0.0",
1433 | "lodash.assign": "4.2.0",
1434 | "lodash.clonedeep": "4.5.0",
1435 | "lodash.mergewith": "4.6.0",
1436 | "meow": "3.7.0",
1437 | "mkdirp": "0.5.1",
1438 | "nan": "2.7.0",
1439 | "node-gyp": "3.6.2",
1440 | "npmlog": "4.1.2",
1441 | "request": "2.83.0",
1442 | "sass-graph": "2.2.4",
1443 | "stdout-stream": "1.4.0"
1444 | }
1445 | },
1446 | "noms": {
1447 | "version": "0.0.0",
1448 | "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz",
1449 | "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=",
1450 | "dev": true,
1451 | "requires": {
1452 | "inherits": "2.0.3",
1453 | "readable-stream": "1.0.34"
1454 | }
1455 | },
1456 | "nopt": {
1457 | "version": "3.0.6",
1458 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
1459 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
1460 | "dev": true,
1461 | "requires": {
1462 | "abbrev": "1.1.1"
1463 | }
1464 | },
1465 | "normalize-package-data": {
1466 | "version": "2.4.0",
1467 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
1468 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
1469 | "dev": true,
1470 | "requires": {
1471 | "hosted-git-info": "2.5.0",
1472 | "is-builtin-module": "1.0.0",
1473 | "semver": "5.4.1",
1474 | "validate-npm-package-license": "3.0.1"
1475 | }
1476 | },
1477 | "npmlog": {
1478 | "version": "4.1.2",
1479 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
1480 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
1481 | "dev": true,
1482 | "requires": {
1483 | "are-we-there-yet": "1.1.4",
1484 | "console-control-strings": "1.1.0",
1485 | "gauge": "2.7.4",
1486 | "set-blocking": "2.0.0"
1487 | }
1488 | },
1489 | "number-is-nan": {
1490 | "version": "1.0.1",
1491 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
1492 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
1493 | "dev": true
1494 | },
1495 | "oauth-sign": {
1496 | "version": "0.8.2",
1497 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
1498 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
1499 | "dev": true
1500 | },
1501 | "object-assign": {
1502 | "version": "4.1.1",
1503 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1504 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1505 | "dev": true
1506 | },
1507 | "once": {
1508 | "version": "1.4.0",
1509 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1510 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1511 | "dev": true,
1512 | "requires": {
1513 | "wrappy": "1.0.2"
1514 | }
1515 | },
1516 | "os-homedir": {
1517 | "version": "1.0.2",
1518 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
1519 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
1520 | "dev": true
1521 | },
1522 | "os-locale": {
1523 | "version": "1.4.0",
1524 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
1525 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
1526 | "dev": true,
1527 | "requires": {
1528 | "lcid": "1.0.0"
1529 | }
1530 | },
1531 | "os-tmpdir": {
1532 | "version": "1.0.2",
1533 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1534 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
1535 | "dev": true
1536 | },
1537 | "osenv": {
1538 | "version": "0.1.4",
1539 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz",
1540 | "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=",
1541 | "dev": true,
1542 | "requires": {
1543 | "os-homedir": "1.0.2",
1544 | "os-tmpdir": "1.0.2"
1545 | }
1546 | },
1547 | "parse-json": {
1548 | "version": "2.2.0",
1549 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
1550 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
1551 | "dev": true,
1552 | "requires": {
1553 | "error-ex": "1.3.1"
1554 | }
1555 | },
1556 | "path-exists": {
1557 | "version": "2.1.0",
1558 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
1559 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
1560 | "dev": true,
1561 | "requires": {
1562 | "pinkie-promise": "2.0.1"
1563 | }
1564 | },
1565 | "path-is-absolute": {
1566 | "version": "1.0.1",
1567 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1568 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1569 | "dev": true
1570 | },
1571 | "path-type": {
1572 | "version": "1.1.0",
1573 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
1574 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
1575 | "dev": true,
1576 | "requires": {
1577 | "graceful-fs": "4.1.11",
1578 | "pify": "2.3.0",
1579 | "pinkie-promise": "2.0.1"
1580 | }
1581 | },
1582 | "performance-now": {
1583 | "version": "2.1.0",
1584 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1585 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
1586 | "dev": true
1587 | },
1588 | "pify": {
1589 | "version": "2.3.0",
1590 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1591 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
1592 | "dev": true
1593 | },
1594 | "pinkie": {
1595 | "version": "2.0.4",
1596 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
1597 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
1598 | "dev": true
1599 | },
1600 | "pinkie-promise": {
1601 | "version": "2.0.1",
1602 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
1603 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
1604 | "dev": true,
1605 | "requires": {
1606 | "pinkie": "2.0.4"
1607 | }
1608 | },
1609 | "private": {
1610 | "version": "0.1.8",
1611 | "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
1612 | "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
1613 | "dev": true
1614 | },
1615 | "process-nextick-args": {
1616 | "version": "1.0.7",
1617 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
1618 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
1619 | "dev": true
1620 | },
1621 | "pseudomap": {
1622 | "version": "1.0.2",
1623 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
1624 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
1625 | "dev": true
1626 | },
1627 | "punycode": {
1628 | "version": "1.4.1",
1629 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
1630 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
1631 | "dev": true
1632 | },
1633 | "qs": {
1634 | "version": "6.5.1",
1635 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
1636 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
1637 | "dev": true
1638 | },
1639 | "read-pkg": {
1640 | "version": "1.1.0",
1641 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
1642 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
1643 | "dev": true,
1644 | "requires": {
1645 | "load-json-file": "1.1.0",
1646 | "normalize-package-data": "2.4.0",
1647 | "path-type": "1.1.0"
1648 | }
1649 | },
1650 | "read-pkg-up": {
1651 | "version": "1.0.1",
1652 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
1653 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
1654 | "dev": true,
1655 | "requires": {
1656 | "find-up": "1.1.2",
1657 | "read-pkg": "1.1.0"
1658 | }
1659 | },
1660 | "readable-stream": {
1661 | "version": "1.0.34",
1662 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
1663 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
1664 | "dev": true,
1665 | "requires": {
1666 | "core-util-is": "1.0.2",
1667 | "inherits": "2.0.3",
1668 | "isarray": "0.0.1",
1669 | "string_decoder": "0.10.31"
1670 | }
1671 | },
1672 | "redent": {
1673 | "version": "1.0.0",
1674 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
1675 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
1676 | "dev": true,
1677 | "requires": {
1678 | "indent-string": "2.1.0",
1679 | "strip-indent": "1.0.1"
1680 | }
1681 | },
1682 | "regenerator-runtime": {
1683 | "version": "0.11.0",
1684 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz",
1685 | "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==",
1686 | "dev": true
1687 | },
1688 | "repeating": {
1689 | "version": "2.0.1",
1690 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
1691 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
1692 | "dev": true,
1693 | "requires": {
1694 | "is-finite": "1.0.2"
1695 | }
1696 | },
1697 | "request": {
1698 | "version": "2.83.0",
1699 | "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz",
1700 | "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==",
1701 | "dev": true,
1702 | "requires": {
1703 | "aws-sign2": "0.7.0",
1704 | "aws4": "1.6.0",
1705 | "caseless": "0.12.0",
1706 | "combined-stream": "1.0.5",
1707 | "extend": "3.0.1",
1708 | "forever-agent": "0.6.1",
1709 | "form-data": "2.3.1",
1710 | "har-validator": "5.0.3",
1711 | "hawk": "6.0.2",
1712 | "http-signature": "1.2.0",
1713 | "is-typedarray": "1.0.0",
1714 | "isstream": "0.1.2",
1715 | "json-stringify-safe": "5.0.1",
1716 | "mime-types": "2.1.17",
1717 | "oauth-sign": "0.8.2",
1718 | "performance-now": "2.1.0",
1719 | "qs": "6.5.1",
1720 | "safe-buffer": "5.1.1",
1721 | "stringstream": "0.0.5",
1722 | "tough-cookie": "2.3.3",
1723 | "tunnel-agent": "0.6.0",
1724 | "uuid": "3.1.0"
1725 | }
1726 | },
1727 | "require-directory": {
1728 | "version": "2.1.1",
1729 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
1730 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
1731 | "dev": true
1732 | },
1733 | "require-main-filename": {
1734 | "version": "1.0.1",
1735 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
1736 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
1737 | "dev": true
1738 | },
1739 | "rimraf": {
1740 | "version": "2.6.2",
1741 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
1742 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
1743 | "dev": true,
1744 | "requires": {
1745 | "glob": "7.1.2"
1746 | }
1747 | },
1748 | "rollup": {
1749 | "version": "0.50.0",
1750 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.50.0.tgz",
1751 | "integrity": "sha512-7RqCBQ9iwsOBPkjYgoIaeUij606mSkDMExP0NT7QDI3bqkHYQHrQ83uoNIXwPcQm/vP2VbsUz3kiyZZ1qPlLTQ==",
1752 | "dev": true
1753 | },
1754 | "rollup-plugin-babel-minify": {
1755 | "version": "3.1.2",
1756 | "resolved": "https://registry.npmjs.org/rollup-plugin-babel-minify/-/rollup-plugin-babel-minify-3.1.2.tgz",
1757 | "integrity": "sha512-6rEWn3Pf4DTlt0ejNGNhWXEZMTOKV7AfCgF97IuEJRy8U3i2+JgttHpmXkdaldyp7v9sWKRfTwWhn11iIcIY3g==",
1758 | "dev": true,
1759 | "requires": {
1760 | "@comandeer/babel-plugin-banner": "1.0.0",
1761 | "babel-core": "6.26.0",
1762 | "babel-preset-minify": "0.2.0"
1763 | }
1764 | },
1765 | "safe-buffer": {
1766 | "version": "5.1.1",
1767 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
1768 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
1769 | "dev": true
1770 | },
1771 | "sass-graph": {
1772 | "version": "2.2.4",
1773 | "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
1774 | "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
1775 | "dev": true,
1776 | "requires": {
1777 | "glob": "7.1.2",
1778 | "lodash": "4.17.4",
1779 | "scss-tokenizer": "0.2.3",
1780 | "yargs": "7.1.0"
1781 | }
1782 | },
1783 | "scss-tokenizer": {
1784 | "version": "0.2.3",
1785 | "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
1786 | "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
1787 | "dev": true,
1788 | "requires": {
1789 | "js-base64": "2.3.2",
1790 | "source-map": "0.4.4"
1791 | }
1792 | },
1793 | "semver": {
1794 | "version": "5.4.1",
1795 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
1796 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
1797 | "dev": true
1798 | },
1799 | "set-blocking": {
1800 | "version": "2.0.0",
1801 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
1802 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
1803 | "dev": true
1804 | },
1805 | "signal-exit": {
1806 | "version": "3.0.2",
1807 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
1808 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
1809 | "dev": true
1810 | },
1811 | "slash": {
1812 | "version": "1.0.0",
1813 | "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
1814 | "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
1815 | "dev": true
1816 | },
1817 | "sntp": {
1818 | "version": "2.1.0",
1819 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
1820 | "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
1821 | "dev": true,
1822 | "requires": {
1823 | "hoek": "4.2.0"
1824 | }
1825 | },
1826 | "source-map": {
1827 | "version": "0.4.4",
1828 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
1829 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
1830 | "dev": true,
1831 | "requires": {
1832 | "amdefine": "1.0.1"
1833 | }
1834 | },
1835 | "source-map-support": {
1836 | "version": "0.4.18",
1837 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
1838 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
1839 | "dev": true,
1840 | "requires": {
1841 | "source-map": "0.5.7"
1842 | },
1843 | "dependencies": {
1844 | "source-map": {
1845 | "version": "0.5.7",
1846 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
1847 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
1848 | "dev": true
1849 | }
1850 | }
1851 | },
1852 | "spdx-correct": {
1853 | "version": "1.0.2",
1854 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
1855 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
1856 | "dev": true,
1857 | "requires": {
1858 | "spdx-license-ids": "1.2.2"
1859 | }
1860 | },
1861 | "spdx-expression-parse": {
1862 | "version": "1.0.4",
1863 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
1864 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
1865 | "dev": true
1866 | },
1867 | "spdx-license-ids": {
1868 | "version": "1.2.2",
1869 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
1870 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
1871 | "dev": true
1872 | },
1873 | "sshpk": {
1874 | "version": "1.13.1",
1875 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
1876 | "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
1877 | "dev": true,
1878 | "requires": {
1879 | "asn1": "0.2.3",
1880 | "assert-plus": "1.0.0",
1881 | "bcrypt-pbkdf": "1.0.1",
1882 | "dashdash": "1.14.1",
1883 | "ecc-jsbn": "0.1.1",
1884 | "getpass": "0.1.7",
1885 | "jsbn": "0.1.1",
1886 | "tweetnacl": "0.14.5"
1887 | }
1888 | },
1889 | "stdout-stream": {
1890 | "version": "1.4.0",
1891 | "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz",
1892 | "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=",
1893 | "dev": true,
1894 | "requires": {
1895 | "readable-stream": "2.3.3"
1896 | },
1897 | "dependencies": {
1898 | "isarray": {
1899 | "version": "1.0.0",
1900 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1901 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
1902 | "dev": true
1903 | },
1904 | "readable-stream": {
1905 | "version": "2.3.3",
1906 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
1907 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
1908 | "dev": true,
1909 | "requires": {
1910 | "core-util-is": "1.0.2",
1911 | "inherits": "2.0.3",
1912 | "isarray": "1.0.0",
1913 | "process-nextick-args": "1.0.7",
1914 | "safe-buffer": "5.1.1",
1915 | "string_decoder": "1.0.3",
1916 | "util-deprecate": "1.0.2"
1917 | }
1918 | },
1919 | "string_decoder": {
1920 | "version": "1.0.3",
1921 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
1922 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
1923 | "dev": true,
1924 | "requires": {
1925 | "safe-buffer": "5.1.1"
1926 | }
1927 | }
1928 | }
1929 | },
1930 | "string-width": {
1931 | "version": "1.0.2",
1932 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
1933 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
1934 | "dev": true,
1935 | "requires": {
1936 | "code-point-at": "1.1.0",
1937 | "is-fullwidth-code-point": "1.0.0",
1938 | "strip-ansi": "3.0.1"
1939 | }
1940 | },
1941 | "string_decoder": {
1942 | "version": "0.10.31",
1943 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
1944 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
1945 | "dev": true
1946 | },
1947 | "stringstream": {
1948 | "version": "0.0.5",
1949 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
1950 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
1951 | "dev": true
1952 | },
1953 | "strip-ansi": {
1954 | "version": "3.0.1",
1955 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1956 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1957 | "dev": true,
1958 | "requires": {
1959 | "ansi-regex": "2.1.1"
1960 | }
1961 | },
1962 | "strip-bom": {
1963 | "version": "2.0.0",
1964 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
1965 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
1966 | "dev": true,
1967 | "requires": {
1968 | "is-utf8": "0.2.1"
1969 | }
1970 | },
1971 | "strip-indent": {
1972 | "version": "1.0.1",
1973 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
1974 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
1975 | "dev": true,
1976 | "requires": {
1977 | "get-stdin": "4.0.1"
1978 | }
1979 | },
1980 | "supports-color": {
1981 | "version": "2.0.0",
1982 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1983 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
1984 | "dev": true
1985 | },
1986 | "tar": {
1987 | "version": "2.2.1",
1988 | "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
1989 | "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
1990 | "dev": true,
1991 | "requires": {
1992 | "block-stream": "0.0.9",
1993 | "fstream": "1.0.11",
1994 | "inherits": "2.0.3"
1995 | }
1996 | },
1997 | "through2": {
1998 | "version": "2.0.3",
1999 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
2000 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
2001 | "dev": true,
2002 | "requires": {
2003 | "readable-stream": "2.3.3",
2004 | "xtend": "4.0.1"
2005 | },
2006 | "dependencies": {
2007 | "isarray": {
2008 | "version": "1.0.0",
2009 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
2010 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
2011 | "dev": true
2012 | },
2013 | "readable-stream": {
2014 | "version": "2.3.3",
2015 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
2016 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
2017 | "dev": true,
2018 | "requires": {
2019 | "core-util-is": "1.0.2",
2020 | "inherits": "2.0.3",
2021 | "isarray": "1.0.0",
2022 | "process-nextick-args": "1.0.7",
2023 | "safe-buffer": "5.1.1",
2024 | "string_decoder": "1.0.3",
2025 | "util-deprecate": "1.0.2"
2026 | }
2027 | },
2028 | "string_decoder": {
2029 | "version": "1.0.3",
2030 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
2031 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
2032 | "dev": true,
2033 | "requires": {
2034 | "safe-buffer": "5.1.1"
2035 | }
2036 | }
2037 | }
2038 | },
2039 | "to-fast-properties": {
2040 | "version": "1.0.3",
2041 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
2042 | "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
2043 | "dev": true
2044 | },
2045 | "tough-cookie": {
2046 | "version": "2.3.3",
2047 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz",
2048 | "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=",
2049 | "dev": true,
2050 | "requires": {
2051 | "punycode": "1.4.1"
2052 | }
2053 | },
2054 | "trim-newlines": {
2055 | "version": "1.0.0",
2056 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
2057 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
2058 | "dev": true
2059 | },
2060 | "trim-right": {
2061 | "version": "1.0.1",
2062 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
2063 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
2064 | "dev": true
2065 | },
2066 | "tunnel-agent": {
2067 | "version": "0.6.0",
2068 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
2069 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
2070 | "dev": true,
2071 | "requires": {
2072 | "safe-buffer": "5.1.1"
2073 | }
2074 | },
2075 | "tweetnacl": {
2076 | "version": "0.14.5",
2077 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
2078 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
2079 | "dev": true,
2080 | "optional": true
2081 | },
2082 | "util-deprecate": {
2083 | "version": "1.0.2",
2084 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2085 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
2086 | "dev": true
2087 | },
2088 | "uuid": {
2089 | "version": "3.1.0",
2090 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
2091 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==",
2092 | "dev": true
2093 | },
2094 | "validate-npm-package-license": {
2095 | "version": "3.0.1",
2096 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
2097 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
2098 | "dev": true,
2099 | "requires": {
2100 | "spdx-correct": "1.0.2",
2101 | "spdx-expression-parse": "1.0.4"
2102 | }
2103 | },
2104 | "verror": {
2105 | "version": "1.10.0",
2106 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
2107 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
2108 | "dev": true,
2109 | "requires": {
2110 | "assert-plus": "1.0.0",
2111 | "core-util-is": "1.0.2",
2112 | "extsprintf": "1.3.0"
2113 | }
2114 | },
2115 | "which": {
2116 | "version": "1.3.0",
2117 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
2118 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
2119 | "dev": true,
2120 | "requires": {
2121 | "isexe": "2.0.0"
2122 | }
2123 | },
2124 | "which-module": {
2125 | "version": "1.0.0",
2126 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
2127 | "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
2128 | "dev": true
2129 | },
2130 | "wide-align": {
2131 | "version": "1.1.2",
2132 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
2133 | "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
2134 | "dev": true,
2135 | "requires": {
2136 | "string-width": "1.0.2"
2137 | }
2138 | },
2139 | "wrap-ansi": {
2140 | "version": "2.1.0",
2141 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
2142 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
2143 | "dev": true,
2144 | "requires": {
2145 | "string-width": "1.0.2",
2146 | "strip-ansi": "3.0.1"
2147 | }
2148 | },
2149 | "wrappy": {
2150 | "version": "1.0.2",
2151 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2152 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2153 | "dev": true
2154 | },
2155 | "xtend": {
2156 | "version": "4.0.1",
2157 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
2158 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
2159 | "dev": true
2160 | },
2161 | "y18n": {
2162 | "version": "3.2.1",
2163 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
2164 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
2165 | "dev": true
2166 | },
2167 | "yallist": {
2168 | "version": "2.1.2",
2169 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
2170 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
2171 | "dev": true
2172 | },
2173 | "yargs": {
2174 | "version": "7.1.0",
2175 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
2176 | "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
2177 | "dev": true,
2178 | "requires": {
2179 | "camelcase": "3.0.0",
2180 | "cliui": "3.2.0",
2181 | "decamelize": "1.2.0",
2182 | "get-caller-file": "1.0.2",
2183 | "os-locale": "1.4.0",
2184 | "read-pkg-up": "1.0.1",
2185 | "require-directory": "2.1.1",
2186 | "require-main-filename": "1.0.1",
2187 | "set-blocking": "2.0.0",
2188 | "string-width": "1.0.2",
2189 | "which-module": "1.0.0",
2190 | "y18n": "3.2.1",
2191 | "yargs-parser": "5.0.0"
2192 | },
2193 | "dependencies": {
2194 | "camelcase": {
2195 | "version": "3.0.0",
2196 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
2197 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
2198 | "dev": true
2199 | }
2200 | }
2201 | },
2202 | "yargs-parser": {
2203 | "version": "5.0.0",
2204 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
2205 | "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
2206 | "dev": true,
2207 | "requires": {
2208 | "camelcase": "3.0.0"
2209 | },
2210 | "dependencies": {
2211 | "camelcase": {
2212 | "version": "3.0.0",
2213 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
2214 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
2215 | "dev": true
2216 | }
2217 | }
2218 | }
2219 | }
2220 | }
2221 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-radial-color-picker",
3 | "version": "3.0.1",
4 | "description": "Angular-ready radial color picker with some sleek animations.",
5 | "main": "dist/color-picker.cjs.js",
6 | "module": "dist/color-picker.esm.js",
7 | "browser": "dist/color-picker.umd.js",
8 | "files": [
9 | "dist"
10 | ],
11 | "scripts": {
12 | "clean": "rimraf dist && mkdirp dist/css",
13 | "build": "npm run clean && npm run scss && rollup -c",
14 | "dev": "rollup -c -w",
15 | "scss:src": "node-sass -q --output-style expanded src/scss/color-picker.scss dist/css/color-picker.css",
16 | "scss:dist": "node-sass --source-map true --source-map-contents -q --output-style compressed src/scss/color-picker.scss dist/css/color-picker.min.css && copyfiles -f src/scss/color-picker.scss dist/css",
17 | "scss": "mkdirp dist/css && npm run scss:src && npm run scss:dist",
18 | "test": "echo \"Error: no test specified\" && exit 1",
19 | "prepublishOnly": "npm run build"
20 | },
21 | "repository": {
22 | "type": "git",
23 | "url": "git+https://github.com/talamaska/angular-radial-color-picker.git"
24 | },
25 | "author": "Zlati Pehlivanov ",
26 | "contributors": [
27 | "Rosen Kanev "
28 | ],
29 | "keywords": [
30 | "angular",
31 | "material",
32 | "color",
33 | "color picker"
34 | ],
35 | "license": "MIT",
36 | "bugs": {
37 | "url": "https://github.com/talamaska/angular-radial-color-picker/issues"
38 | },
39 | "homepage": "https://github.com/talamaska/angular-radial-color-picker#readme",
40 | "devDependencies": {
41 | "copyfiles": "^1.2.0",
42 | "mkdirp": "^0.5.1",
43 | "node-sass": "^4.6.0",
44 | "rimraf": "^2.6.2",
45 | "rollup": "^0.50.0",
46 | "rollup-plugin-babel-minify": "^3.1.2"
47 | },
48 | "peerDependencies": {
49 | "angular": "^1.5.8"
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/rollup.config.js:
--------------------------------------------------------------------------------
1 | import minify from 'rollup-plugin-babel-minify';
2 | import pkg from './package.json';
3 |
4 | export default [
5 | {
6 | input: 'src/main.js',
7 | name: 'angularRadialColorPicker',
8 | sourcemap: true,
9 | output: {
10 | format: 'umd',
11 | file: 'dist/color-picker.umd.min.js'
12 | },
13 | plugins: [
14 | minify({
15 | comments: false
16 | })
17 | ]
18 | },
19 | {
20 | input: 'src/main.js',
21 | name: 'angularRadialColorPicker',
22 | output: {
23 | format: 'umd',
24 | file: pkg.browser
25 | }
26 | },
27 | {
28 | input: 'src/main.js',
29 | output: [
30 | { file: pkg.main, format: 'cjs' },
31 | { file: pkg.module, format: 'es' }
32 | ]
33 | }
34 | ];
35 |
--------------------------------------------------------------------------------
/screenshots/thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/talamaska/angular-radial-color-picker/7a1344daf02075d22c1eb1ac1dfc1fefdb25c3a0/screenshots/thumbnail.png
--------------------------------------------------------------------------------
/src/color-picker-conic-gradient.directive.js:
--------------------------------------------------------------------------------
1 | import ConicGradient from './conic-gradient.js';
2 |
3 | export default function colorPickerConicGradient() {
4 | return function ($scope, $element) {
5 | var size = $element[0].offsetWidth || 280;
6 | $element[0].style.background = new ConicGradient(size).toString();
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/color-picker-core.module.js:
--------------------------------------------------------------------------------
1 | import ColorPickerService from './color-picker.service.js';
2 | import colorPickerRotator from './color-picker-rotator.directive.js';
3 | import colorPickerConicGradient from './color-picker-conic-gradient.directive.js';
4 | import colorPickerComponent from './color-picker.component.js';
5 |
6 | export default angular
7 | /**
8 | * @ngdoc module
9 | * @name color.picker.core
10 | * @description
11 | *
12 | * Angular Radial Color Picker
13 | */
14 | .module('color.picker.core', [])
15 |
16 | /**
17 | * @ngdoc service
18 | * @namespace Utilities
19 | * @name ColorPickerService
20 | * @module color.picker.core
21 | * @requires $rootScope
22 | *
23 | * @description
24 | * API for intercomponent comunication and color model conversions.
25 | *
26 | * @example
27 | * // Convert RGB color model to hexadecimal string
28 | * ColorPickerService.rgbToHex(255, 0, 0); // returns 'FF0000'
29 | */
30 | .service('ColorPickerService', ColorPickerService)
31 |
32 | /**
33 | * @ngdoc directive
34 | * @name colorPickerRotator
35 | * @module color.picker.core
36 | * @restrict A
37 | *
38 | * @private
39 | *
40 | * @param {expression} [onRotate] Function to invoke when angle changes
41 | * @param {number} [angle] Angle to change the rotator at. A number between 0 and 359
42 | * @param {boolean} [disabled] Reference for the closed state of the picker. When the picker is closed disabled is true. Defaults to false
43 | * @param {boolean} [mouseScroll] Opt-in for using wheel event to rotate. Defaults to falsy value and the wheel event listener is not added
44 | * @param {number} [scrollSensitivity] Amount of degrees to rotate the picker with keyboard and/or wheel. Defaults to 2 degrees
45 | *
46 | * @description
47 | * Provides rotation capabilities to any element. Also supports touch devices.
48 | * Although it's visible to other modules usage of this directive is discouraged by 3rd party users.
49 | * Changes in this directive are considered as breaking and are subject to change at any time.
50 | *
51 | * @example
52 | */
53 | .directive('colorPickerRotator', colorPickerRotator)
54 |
55 | /**
56 | * @ngdoc directive
57 | * @name colorPickerConicGradient
58 | * @module color.picker.core
59 | * @restrict A
60 | *
61 | * @description
62 | * Generates a bitmap conic gradient to polyfill the CSS L4 conic-gradient().
63 | *
64 | * @example
65 | */
66 | .directive('colorPickerConicGradient', colorPickerConicGradient)
67 |
68 | /**
69 | * @ngdoc component
70 | * @name colorPicker
71 | * @module color.picker.core
72 | * @restrict E
73 | *
74 | * @param {expression} [onSelect] A function to invoke when user selects a color
75 | * @param {Object} [color] HSLA color model. If provided will set the picker to the provided color
76 | * Defaults to { hue: 0, saturation: 100, luminosity: 50, alpha: 1 }
77 | * @param {number} color.hue Value between 0 and 359
78 | * @param {number} color.saturation Value between 0 and 100
79 | * @param {number} color.luminosity Value between 0 and 100
80 | * @param {number} color.alpha Value between 0 and 1
81 | * @param {expression} [onColorChange] A function to invoke when color is changed (i.e. on rotation).
82 | * `on-color-change` is like `ng-change` to `ng-model` - triggered every time the color is changed
83 | * @param {boolean} [mouseScroll] Opt-in for using wheel event to rotate.
84 | * Defaults to falsy value and the wheel event listener is not added
85 | * @param {number} [scrollSensitivity] Amount of degrees to rotate the picker with keyboard and/or wheel. Defaults to 2 degrees
86 | *
87 | * @description
88 | * Material design radial color picker. Provides selecting a pure color via dragging the whole color wheel.
89 | * `color` is used to change programatically the active color in the picker. If it's not provided
90 | * the initial color defaults to red (0, 100%, 50%, 1).
91 | *
92 | * The `on-select` attribute is a function which is called when a user a user selects a color with the color
93 | * selector in the middle. The function is invoked only if the color picker is opened.
94 | *
95 | * For easier communication a set of events are provided that can even programatically open or close the picker
96 | * without interacting with the UI. All events are published/subscribed at the $rootScope so that sibling components
97 | * can subscribe to them too. This means that you can subscribe for an event on the $scope too.
98 | * All events carry the current color in the event data payload.
99 | *
100 | * `color-picker.show` - Fires when the color picker is about to show and *before* any animation is started.
101 | * `color-picker.shown` - Fires when the color picker is shown and has finished animating.
102 | *
103 | * `color-picker.selected` - Fires when a color is selected via the middle selector. Event is fired right before `hide`.
104 | *
105 | * `color-picker.hide` - Fires when the color picker is about to hide and *before* any animation is started.
106 | * `color-picker.hidden` - Fires when the color picker is hidden and has finished animating.
107 | *
108 | * `color-picker.open` - Programatically opens the color picker if it's not already open.
109 | * `color-picker.close` - Programatically closes the color picker if it's not already closed.
110 | *
111 | * @example
112 | */
113 | .component('colorPicker', colorPickerComponent);
114 |
--------------------------------------------------------------------------------
/src/color-picker-rotator.directive.js:
--------------------------------------------------------------------------------
1 | import Propeller from './propeller.js';
2 |
3 | colorPickerRotator.$inject = ['ColorPickerService'];
4 | export default function colorPickerRotator(ColorPickerService) {
5 | var directive = {
6 | link: ColorPickerRotatorLink,
7 | restrict: 'A',
8 | scope: {
9 | onRotate: '&',
10 | angle: '<',
11 | isDisabled: '<',
12 | mouseScroll: '<',
13 | scrollSensitivity: '<'
14 | }
15 | };
16 |
17 | return directive;
18 |
19 | function ColorPickerRotatorLink($scope, $element) {
20 | var colorPicker = $element[0].parentElement;
21 | var scrollSensitivity = $scope.scrollSensitivity || 2;
22 | var initialAngle = $scope.angle || 0;
23 |
24 | var propelInstance = new Propeller($element[0], {
25 | angle: initialAngle,
26 | inertia: .7,
27 | speed: 0,
28 | onRotate: function() {
29 | $scope.onRotate({ angle: this.angle });
30 | },
31 | onDragStart: function() {
32 | if (!$scope.isDisabled) {
33 | $element.addClass('dragging');
34 | }
35 | },
36 | onDragStop: function() {
37 | if (!$scope.isDisabled) {
38 | $element.removeClass('dragging');
39 | }
40 | }
41 | });
42 |
43 | colorPicker.addEventListener('keydown', onKeydown);
44 | colorPicker.addEventListener('dblclick', onDblClick, { passive: true });
45 |
46 | if ($scope.mouseScroll) {
47 | colorPicker.addEventListener('wheel', onScroll);
48 | }
49 |
50 | $scope.$watch('angle', function(newAngle, oldAngle) {
51 | if (newAngle !== oldAngle) {
52 | propelInstance.angle = newAngle;
53 | }
54 | });
55 |
56 | $scope.$on('$destroy', function() {
57 | propelInstance.stop();
58 | propelInstance.unbind();
59 | propelInstance = null;
60 |
61 | colorPicker.removeEventListener('keydown', onKeydown);
62 | colorPicker.removeEventListener('dblclick', onDblClick);
63 | colorPicker.removeEventListener('wheel', onScroll);
64 |
65 | colorPicker = null;
66 | });
67 |
68 | function onKeydown(ev) {
69 | if ($scope.isDisabled)
70 | return;
71 |
72 | var multiplier = 0;
73 | var isIncrementing = ColorPickerService.isKey.up(ev.key) || ColorPickerService.isKey.right(ev.key);
74 | var isDecrementing = ColorPickerService.isKey.down(ev.key) || ColorPickerService.isKey.left(ev.key);
75 |
76 | if (isIncrementing) {
77 | multiplier = 1;
78 |
79 | if (ev.ctrlKey) {
80 | multiplier = 6;
81 | } else if (ev.shiftKey) {
82 | multiplier = 3;
83 | }
84 | } else if (isDecrementing) {
85 | multiplier = -1;
86 |
87 | if (ev.ctrlKey) {
88 | multiplier = -6;
89 | } else if (ev.shiftKey) {
90 | multiplier = -3;
91 | }
92 | }
93 |
94 | if (isIncrementing || isDecrementing) {
95 | ev.preventDefault();
96 | propelInstance.angle += scrollSensitivity * multiplier;
97 | }
98 | }
99 |
100 | function onDblClick(ev) {
101 | if ($scope.isDisabled || !ev.target.classList.contains('rotator'))
102 | return;
103 |
104 | var newAngle = propelInstance.getAngleToMouse({
105 | x: ev.clientX,
106 | y: ev.clientY,
107 | });
108 |
109 | propelInstance.angle = newAngle * Propeller.radToDegMulti;
110 | }
111 |
112 | function onScroll(ev) {
113 | if ($scope.isDisabled)
114 | return;
115 |
116 | ev.preventDefault();
117 |
118 | if (ev.deltaY > 0) {
119 | propelInstance.angle += scrollSensitivity;
120 | } else {
121 | propelInstance.angle -= scrollSensitivity;
122 | }
123 | }
124 | }
125 | }
126 |
--------------------------------------------------------------------------------
/src/color-picker.component.js:
--------------------------------------------------------------------------------
1 | export default {
2 | bindings: {
3 | onSelect: '&',
4 | color: '<',
5 | onColorChange: '&',
6 | mouseScroll: '<',
7 | scrollSensitivity: '<'
8 | },
9 | controller: ColorPickerController,
10 | template: '\
11 |
\
12 | \
21 |
\
22 | \
23 | '
24 | };
25 |
26 | ColorPickerController.$inject = ['$element', '$rootScope', 'ColorPickerService'];
27 | function ColorPickerController($element, $rootScope, ColorPickerService) {
28 | var vm = this;
29 |
30 | this.disabled = false;
31 | this.colorModel = { hue: 0, saturation: 100, luminosity: 50, alpha: 1 };
32 |
33 | this.$onInit = $onInit;
34 | this.$onDestroy = $onDestroy;
35 | this.$onChanges = $onChanges;
36 | this.onColorSelClick = onColorSelClick;
37 | this.onRotatorDrag = onRotatorDrag;
38 |
39 | var wrapper, knob, colorSel, ripple, palette;
40 |
41 | ColorPickerService.subscribe('open', openColorPicker);
42 | ColorPickerService.subscribe('close', closeColorPicker);
43 |
44 | function $onInit() {
45 | wrapper = $element[0];
46 | knob = wrapper.querySelector('.knob');
47 | colorSel = wrapper.querySelector('.color');
48 | ripple = wrapper.querySelector('.color-shadow');
49 | palette = wrapper.querySelector('.color-palette');
50 |
51 | wrapper.addEventListener('keyup', _togglePalleteOnEnter);
52 | colorSel.addEventListener('animationend', _onColorSelAnimationEnd);
53 | knob.addEventListener('transitionend', _onKnobTransitionEnd);
54 | ripple.addEventListener('animationend', _onRippleAnimationEnd);
55 | palette.addEventListener('transitionend', _onPaletteTransitionEnd);
56 |
57 | wrapper.setAttribute('tabindex', 0);
58 |
59 | if (vm.color && vm.color.hue) {
60 | vm.angle = vm.color.hue;
61 | _updateColoredElements(vm.color.hue);
62 | } else {
63 | vm.angle = 0;
64 | }
65 | }
66 |
67 | function $onChanges(changeObj) {
68 | if (changeObj.color) {
69 | // on angular > 1.5.3 $onChanges is triggered once before $onInit and then again after $onInit
70 | if (colorSel && ripple) {
71 | vm.angle = vm.color.hue;
72 | _updateColoredElements(vm.color.hue);
73 | }
74 | }
75 | }
76 |
77 | function $onDestroy() {
78 | wrapper.removeEventListener('keyup', _togglePalleteOnEnter);
79 | colorSel.removeEventListener('animationend', _onColorSelAnimationEnd);
80 | knob.removeEventListener('transitionend', _onKnobTransitionEnd);
81 | ripple.removeEventListener('animationend', _onRippleAnimationEnd);
82 | palette.removeEventListener('transitionend', _onPaletteTransitionEnd);
83 |
84 | // clear circular child DOM node references to allow GC to collect them
85 | knob = null; wrapper = null;
86 | colorSel = null; ripple = null;
87 | palette = null;
88 |
89 | ColorPickerService.unsubscribe();
90 | }
91 |
92 | function onColorSelClick() {
93 | colorSel.classList.add('click-color');
94 |
95 | if (!vm.disabled) {
96 | ColorPickerService.publish('selected', vm.colorModel);
97 | vm.onSelect({ color: vm.colorModel });
98 | ColorPickerService.publish('hide', vm.colorModel);
99 | ripple.classList.add('color-shadow-animate');
100 | } else {
101 | ColorPickerService.publish('show', vm.colorModel);
102 | palette.classList.add('blur-palette-in');
103 | palette.classList.remove('blur-palette-out');
104 | }
105 | }
106 |
107 | function onRotatorDrag(angle) {
108 | vm.angle = angle;
109 |
110 | _updateColoredElements(angle);
111 |
112 | $rootScope.$applyAsync(function() {
113 | vm.onColorChange({ color: vm.colorModel });
114 | });
115 | }
116 |
117 | function openColorPicker() {
118 | if (vm.disabled) {
119 | ColorPickerService.publish('show', vm.colorModel);
120 |
121 | // showing palette will also show the knob
122 | palette.classList.add('blur-palette-in');
123 | palette.classList.remove('blur-palette-out');
124 | }
125 | }
126 |
127 | function closeColorPicker() {
128 | if (!vm.disabled) {
129 | ColorPickerService.publish('hide', vm.colorModel);
130 |
131 | // hiding knob will also hide the palette
132 | knob.classList.add('zoom-knob-out');
133 | knob.classList.remove('zoom-knob-in');
134 | }
135 | }
136 |
137 | function _togglePalleteOnEnter(ev) {
138 | if (ColorPickerService.isKey.enter(ev.key)) {
139 | onColorSelClick();
140 | }
141 | }
142 |
143 | function _updateColoredElements(angle) {
144 | var color = '';
145 |
146 | if (vm.color) {
147 | vm.color.hue = angle;
148 | color = 'hsla(' + vm.color.hue + ', ' + vm.color.saturation + '%, ' + vm.color.luminosity + '%, ' + vm.color.alpha + ')';
149 | vm.colorModel = vm.color;
150 | } else {
151 | color = 'hsla(' + angle + ', 100%, 50%, 1)';
152 | vm.colorModel = { hue: angle, saturation: 100, luminosity: 50, alpha: 1 };
153 | }
154 |
155 | colorSel.style.backgroundColor = color;
156 | ripple.style.borderColor = color;
157 | }
158 |
159 | function _onColorSelAnimationEnd() {
160 | if (vm.disabled) {
161 | knob.classList.add('zoom-knob-in');
162 | knob.classList.remove('zoom-knob-out');
163 | } else {
164 | knob.classList.add('zoom-knob-out');
165 | knob.classList.remove('zoom-knob-in');
166 | }
167 |
168 | colorSel.classList.remove('click-color');
169 | }
170 |
171 | function _onKnobTransitionEnd(ev) {
172 | // 'transitionend' fires for every transitioned property
173 | if (ev.propertyName === 'transform') {
174 | if (!vm.disabled) {
175 | palette.classList.add('blur-palette-out');
176 | palette.classList.remove('blur-palette-in');
177 | } else {
178 | vm.disabled = false;
179 | wrapper.classList.remove('disabled');
180 | ColorPickerService.publish('shown', vm.colorModel);
181 | }
182 | }
183 | }
184 |
185 | function _onRippleAnimationEnd() {
186 | ripple.classList.remove('color-shadow-animate');
187 | }
188 |
189 | function _onPaletteTransitionEnd(ev) {
190 | // 'transitionend' fires for every transitioned property
191 | if (ev.propertyName === 'transform') {
192 | if (vm.disabled) {
193 | knob.classList.add('zoom-knob-in');
194 | knob.classList.remove('zoom-knob-out');
195 | } else {
196 | vm.disabled = true;
197 | wrapper.classList.add('disabled');
198 | ColorPickerService.publish('hidden', vm.colorModel);
199 | }
200 | }
201 | }
202 | }
203 |
--------------------------------------------------------------------------------
/src/color-picker.service.js:
--------------------------------------------------------------------------------
1 | ColorPickerService.$inject = ['$rootScope'];
2 | export default function ColorPickerService($rootScope) {
3 | this.publish = publish;
4 | this.subscribe = subscribe;
5 | this.unsubscribe = unsubscribe;
6 |
7 | this.isKey = {
8 | up: function(key) { return key === 'Up' || key === 'ArrowUp' },
9 | down: function(key) { return key === 'Down' || key === 'ArrowDown' },
10 | left: function(key) { return key === 'Left' || key === 'ArrowLeft' },
11 | right: function(key) { return key === 'Right' || key === 'ArrowRight' },
12 | enter: function(key) { return key === 'Enter' }
13 | };
14 |
15 | this.rgbToHex = rgbToHex;
16 | this.rgbToHsl = rgbToHsl;
17 | this.hslToRgb = hslToRgb;
18 | this.hslToHex = hslToHex;
19 |
20 | var subscribers = [];
21 | var eventPrefix = 'color-picker.'
22 |
23 | /**
24 | * Broadcasts an event on the whole app. Uses $rootScope as an event bus
25 | * so that sibling components can catch the event also. $applyAsync is used
26 | * to make sure that the broadcast happens on the earliest next digest cycle.
27 | *
28 | * @memberOf Utilities
29 | *
30 | * @param {string} eventName Sub-topic to broadcast
31 | * @param {*} [data] Any type of payload to broadcast
32 | *
33 | * @return {void}
34 | */
35 | function publish(eventName, data) {
36 | $rootScope.$applyAsync(function() {
37 | // queue up the broadcast in the next digest
38 | $rootScope.$broadcast(eventPrefix + eventName, data);
39 | });
40 | }
41 |
42 | /**
43 | * Facade wrapper for outside world interaction via $rootScope events.
44 | *
45 | * @memberOf Utilities
46 | *
47 | * @param {string} eventName Sub-topic to listen for. Can be 'open' or 'close'
48 | * @param {Function} callback Function to invoke when event gets fired
49 | *
50 | * @return {Function} Unsubscribe function for manual unsubscribtion.
51 | */
52 | function subscribe(eventName, callback) {
53 | var unsubToken = $rootScope.$on(eventPrefix + eventName, callback);
54 |
55 | subscribers.push(unsubToken);
56 |
57 | return unsubToken;
58 | }
59 |
60 | /**
61 | * Removes all event listeners setup with the `.subscribe()` method
62 | *
63 | * @memberOf Utilities
64 | *
65 | * @param {string} eventName Sub-topic to listen for. Can be 'open' or 'close'
66 | * @param {Function} callback Function to invoke when event gets fired
67 | *
68 | * @return {void}
69 | */
70 | function unsubscribe() {
71 | subscribers.forEach(function(unsubscribe) {
72 | unsubscribe();
73 | });
74 | }
75 |
76 | /**
77 | * Converts RGB color model to hexadecimal string.
78 | *
79 | * @memberOf Utilities
80 | *
81 | * @param {number} r Integer between 0 and 255
82 | * @param {number} g Integer between 0 and 255
83 | * @param {number} b Integer between 0 and 255
84 | *
85 | * @return {string} 6 char long hex string
86 | */
87 | function rgbToHex(r, g, b) {
88 | return ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
89 | }
90 |
91 | /**
92 | * Converts RGB color model to HSL model.
93 | *
94 | * @memberOf Utilities
95 | *
96 | * @param {number} r Integer between 0 and 255
97 | * @param {number} g Integer between 0 and 255
98 | * @param {number} b Integer between 0 and 255
99 | *
100 | * @return {Object} The HSL representation containing the hue (in degrees),
101 | * saturation (in percentage) and luminosity (in percentage) fields.
102 | */
103 | function rgbToHsl(r, g, b) {
104 | r = r / 255;
105 | g = g / 255;
106 | b = b / 255;
107 |
108 | var h, s;
109 | var max = Math.max(r, g, b);
110 | var min = Math.min(r, g, b);
111 | var l = (max + min) / 2;
112 |
113 | if (max === min) {
114 | h = s = 0; // achromatic
115 | } else {
116 | var d = max - min;
117 |
118 | s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
119 |
120 | if (max === r) h = (g - b) / d + (g < b ? 6 : 0);
121 | if (max === g) h = (b - r) / d + 2;
122 | if (max === b) h = (r - g) / d + 4;
123 | }
124 |
125 | return {
126 | hue: h * 60,
127 | saturation: s * 100,
128 | luminosity: l * 100
129 | };
130 | }
131 |
132 | /**
133 | * Converts HSL color model to hexademical string.
134 | *
135 | * @memberOf Utilities
136 | *
137 | * @param {number} r Integer between 0 and 255
138 | * @param {number} g Integer between 0 and 255
139 | * @param {number} b Integer between 0 and 255
140 | *
141 | * @return {string} 6 char long hex string
142 | */
143 | function hslToHex(h, s, l) {
144 | var colorModel = hslToRgb(h, s, l);
145 |
146 | return rgbToHex(colorModel.red, colorModel.green, colorModel.blue);
147 | }
148 |
149 | /**
150 | * Converts HSL color model to RGB model.
151 | * Shamelessly taken from http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c
152 | *
153 | * @memberOf Utilities
154 | *
155 | * @param {number} h The hue. Number in the 0-360 range
156 | * @param {number} s The saturation. Number in the 0-100 range
157 | * @param {number} l The luminosity. Number in the 0-100 range
158 | *
159 | * @return {Object} The RGB representation containing the red, green and blue fields
160 | */
161 | function hslToRgb(h, s, l) {
162 | var r, g, b;
163 |
164 | h = h / 360;
165 | s = s / 100;
166 | l = l / 100;
167 |
168 | if (s === 0) {
169 | r = g = b = l; // achromatic
170 | } else {
171 | var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
172 | var p = 2 * l - q;
173 |
174 | r = _hue2rgb(p, q, h + 1/3);
175 | g = _hue2rgb(p, q, h);
176 | b = _hue2rgb(p, q, h - 1/3);
177 | }
178 |
179 | return {
180 | red: Math.round(r * 255),
181 | green: Math.round(g * 255),
182 | blue: Math.round(b * 255)
183 | };
184 | }
185 |
186 | function _hue2rgb(p, q, t) {
187 | if (t < 0) t += 1;
188 | if (t > 1) t -= 1;
189 | if (t < 1/6) return p + (q - p) * 6 * t;
190 | if (t < 1/2) return q;
191 | if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
192 |
193 | return p;
194 | }
195 | }
196 |
--------------------------------------------------------------------------------
/src/conic-gradient.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Modified version of Lea Verou's conic-gradient.
3 | *
4 | * @link https://github.com/leaverou/conic-gradient
5 | */
6 | export default function ConicGradient(size) {
7 | this.canvas = document.createElement('canvas');
8 | this.context = this.canvas.getContext('2d');
9 | this.size = size;
10 | this.canvas.width = this.canvas.height = this.size;
11 | this.from = 0;
12 | this.stops = [
13 | { color: [255, 0, 0, 1], pos: 0 },
14 | { color: [255, 255, 0, 1], pos: 0.16666666666666666 },
15 | { color: [0, 255, 0, 1], pos: 0.33333333333333337 },
16 | { color: [0, 255, 255, 1], pos: 0.5 },
17 | { color: [0, 0, 255, 1], pos: 0.6666666666666666 },
18 | { color: [255, 0, 255, 1], pos: 0.8333333333333333 },
19 | { color: [255, 0, 0, 1], pos: 1 },
20 | ];
21 | this.paint();
22 | }
23 |
24 | ConicGradient.eps = 0.00001;
25 | ConicGradient.deg = Math.PI / 180;
26 |
27 | ConicGradient.prototype = {
28 | toString: function() {
29 | return 'url("' + this.dataURL + '")';
30 | },
31 |
32 | get dataURL() {
33 | // IE/Edge only render data-URI based background-image when the image data
34 | // is escaped.
35 | // Ref: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/#comment-3
36 | return 'data:image/svg+xml,' + encodeURIComponent(this.svg);
37 | },
38 |
39 | get svg() {
40 | return (
41 | '' +
42 | '' +
43 | ' '
46 | );
47 | },
48 |
49 | get png() {
50 | return this.canvas.toDataURL();
51 | },
52 |
53 | get r() {
54 | return Math.sqrt(2) * this.size / 2;
55 | },
56 |
57 | // Paint the conical gradient on the canvas
58 | // Algorithm inspired from http://jsdo.it/akm2/yr9B
59 | paint: function() {
60 | var c = this.context;
61 |
62 | var radius = this.r;
63 | var x = this.size / 2;
64 |
65 | var stopIndex = 0; // The index of the current color
66 | var stop = this.stops[stopIndex],
67 | prevStop;
68 |
69 | var diff, t;
70 |
71 | // Transform coordinate system so that angles start from the top left, like in CSS
72 | c.translate(this.size / 2, this.size / 2);
73 | c.rotate(-90 * ConicGradient.deg);
74 | c.rotate(this.from * ConicGradient.deg);
75 | c.translate(-this.size / 2, -this.size / 2);
76 |
77 | for (var i = 0; i < 360; ) {
78 | if (i / 360 + ConicGradient.eps >= stop.pos) {
79 | // Switch color stop
80 | do {
81 | prevStop = stop;
82 |
83 | stopIndex++;
84 | stop = this.stops[stopIndex];
85 | } while (stop && stop != prevStop && stop.pos === prevStop.pos);
86 |
87 | if (!stop) {
88 | break;
89 | }
90 |
91 | var sameColor = prevStop.color + '' === stop.color + '' && prevStop != stop;
92 |
93 | diff = prevStop.color.map(function(c, i) {
94 | return stop.color[i] - c;
95 | });
96 | }
97 |
98 | t = (i / 360 - prevStop.pos) / (stop.pos - prevStop.pos);
99 |
100 | var interpolated = sameColor
101 | ? stop.color
102 | : diff.map(function(d, i) {
103 | var ret = d * t + prevStop.color[i];
104 |
105 | return i < 3 ? ret & 255 : ret;
106 | });
107 |
108 | // Draw a series of arcs, 1deg each
109 | c.fillStyle = 'rgba(' + interpolated.join(',') + ')';
110 | c.beginPath();
111 | c.moveTo(x, x);
112 |
113 | var theta = sameColor ? 360 * (stop.pos - prevStop.pos) : 0.5;
114 |
115 | var beginArg = i * ConicGradient.deg;
116 | beginArg = Math.min(360 * ConicGradient.deg, beginArg);
117 |
118 | // .02: To prevent empty blank line and corresponding moire
119 | // only non-alpha colors are cared now
120 | var endArg = beginArg + theta * ConicGradient.deg;
121 | endArg = Math.min(360 * ConicGradient.deg, endArg + 0.02);
122 |
123 | c.arc(x, x, radius, beginArg, endArg);
124 |
125 | c.closePath();
126 | c.fill();
127 |
128 | i += theta;
129 | }
130 | },
131 | };
132 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | import colorPickerModule from './color-picker-core.module.js';
2 | export default colorPickerModule.name;
3 |
--------------------------------------------------------------------------------
/src/propeller.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Modified version of Denis Radin's Propeller.
3 | *
4 | * @link https://github.com/PixelsCommander/Propeller
5 | */
6 | export default function Propeller(element, options) {
7 | this.last = 0;
8 | this.active = false;
9 | this.element = element;
10 | this.update = this.update.bind(this);
11 |
12 | this.initAngleGetterSetter();
13 | this.initOptions(options);
14 | this.initHardwareAcceleration();
15 | this.bindHandlers();
16 | this.addListeners();
17 | this.update();
18 | }
19 |
20 | Propeller.prototype.initAngleGetterSetter = function () {
21 | Object.defineProperty(this, 'angle', {
22 | get: function () {
23 | return this.normalizeAngle(this._angle * Propeller.radToDegMulti);
24 | },
25 | set: function (value) {
26 | var rads = value * Propeller.degToRadMulti;
27 |
28 | this._angle = rads;
29 | this.virtualAngle = rads;
30 | this.updateCSS();
31 | }
32 | });
33 | }
34 |
35 | Propeller.prototype.normalizeAngle = function(angle) {
36 | var result = angle % 360;
37 |
38 | if (result < 0) {
39 | result = 360 + result;
40 | }
41 |
42 | return result;
43 | }
44 |
45 | Propeller.prototype.initOptions = function (options) {
46 | var defaults = {
47 | angle: 0,
48 | speed: 0,
49 | inertia: 0,
50 | minimalSpeed: 0.0087, // in rad, (1/2 degree)
51 | minimalAngleChange: 0.0087, // in rad, (1/2 degree)
52 | };
53 |
54 | options = options || defaults;
55 |
56 | this.onRotate = options.onRotate;
57 | this.onStop = options.onStop;
58 | this.onDragStop = options.onDragStop;
59 | this.onDragStart = options.onDragStart;
60 |
61 | this.angle = options.angle || defaults.angle;
62 | this.speed = (options.speed * Propeller.degToRadMulti) || defaults.speed;
63 |
64 | this.inertia = options.inertia || defaults.inertia;
65 | this.minimalSpeed = options.minimalSpeed || defaults.minimalSpeed;
66 | this.lastAppliedAngle = this.virtualAngle = this._angle = (options.angle * Propeller.degToRadMulti) || defaults.angle;
67 | this.minimalAngleChange = options.minimalAngleChange || defaults.minimalAngleChange;
68 | }
69 |
70 | Propeller.prototype.bindHandlers = function () {
71 | this.onRotationStart = this.onRotationStart.bind(this);
72 | this.onRotationStop = this.onRotationStop.bind(this);
73 | this.onRotated = this.onRotated.bind(this);
74 | }
75 |
76 | Propeller.prototype.addListeners = function () {
77 | this.listenersInstalled = true;
78 |
79 | this.element.addEventListener('touchstart', this.onRotationStart, { passive: true });
80 | this.element.addEventListener('touchmove', this.onRotated);
81 | this.element.addEventListener('touchend', this.onRotationStop, { passive: true });
82 | this.element.addEventListener('touchcancel', this.onRotationStop, { passive: true });
83 |
84 | this.element.addEventListener('mousedown', this.onRotationStart, { passive: true });
85 | this.element.addEventListener('mousemove', this.onRotated);
86 | this.element.addEventListener('mouseup', this.onRotationStop, { passive: true });
87 | this.element.addEventListener('mouseleave', this.onRotationStop);
88 | }
89 |
90 | Propeller.prototype.removeListeners = function () {
91 | this.listenersInstalled = false;
92 |
93 | this.element.removeEventListener('touchstart', this.onRotationStart);
94 | this.element.removeEventListener('touchmove', this.onRotated);
95 | this.element.removeEventListener('touchend', this.onRotationStop);
96 | this.element.removeEventListener('touchcancel', this.onRotationStop);
97 |
98 | this.element.removeEventListener('mousedown', this.onRotationStart);
99 | this.element.removeEventListener('mousemove', this.onRotated);
100 | this.element.removeEventListener('mouseup', this.onRotationStop);
101 | this.element.removeEventListener('mouseleave', this.onRotationStop);
102 | }
103 |
104 | Propeller.prototype.bind = function () {
105 | if (this.listenersInstalled !== true) {
106 | this.addListeners();
107 | }
108 | }
109 |
110 | Propeller.prototype.unbind = function () {
111 | if (this.listenersInstalled === true) {
112 | this.removeListeners();
113 | this.onRotationStop();
114 | }
115 | }
116 |
117 | Propeller.prototype.stop = function () {
118 | this.speed = 0;
119 | this.onRotationStop();
120 | }
121 |
122 | Propeller.prototype.onRotationStart = function (event) {
123 | this.initDrag();
124 | this.active = true;
125 |
126 | if (this.onDragStart !== undefined) {
127 | this.onDragStart(event);
128 | }
129 | }
130 |
131 | Propeller.prototype.onRotationStop = function (event) {
132 | if (this.onDragStop !== undefined && this.active === true) {
133 | this.active = false;
134 | this.onDragStop();
135 | }
136 |
137 | this.active = false;
138 | }
139 |
140 | Propeller.prototype.onRotated = function (event) {
141 | event.preventDefault();
142 |
143 | if (this.active === true) {
144 | if (event.targetTouches !== undefined && event.targetTouches[0] !== undefined) {
145 | this.lastMouseEvent = {
146 | x: event.targetTouches[0].clientX,
147 | y: event.targetTouches[0].clientY,
148 | };
149 | } else {
150 | this.lastMouseEvent = {
151 | x: event.clientX,
152 | y: event.clientY,
153 | };
154 | }
155 | }
156 | }
157 |
158 | Propeller.prototype.update = function (now) {
159 | // Calculating angle on requestAnimationFrame only for optimisation purposes
160 | // 8ms is roughly 120fps
161 | if (!this.last || now - this.last >= 8) {
162 | this.last = now;
163 |
164 | if (this.lastMouseEvent !== undefined && this.active === true) {
165 | this.updateAngleToMouse(this.lastMouseEvent);
166 | }
167 |
168 | this._angle = this.virtualAngle;
169 | this.applySpeed();
170 | this.applyInertia();
171 |
172 | // Update rotation until the angle difference between prev and current angle is lower than the minimal angle change
173 | if (Math.abs(this.lastAppliedAngle - this._angle) >= this.minimalAngleChange) {
174 | this.updateCSS();
175 |
176 | if (this.onRotate !== undefined) {
177 | this.onRotate();
178 | }
179 |
180 | this.lastAppliedAngle = this._angle;
181 | }
182 | }
183 |
184 | window.requestAnimationFrame(this.update);
185 | }
186 |
187 | Propeller.prototype.applySpeed = function () {
188 | if (this.inertia > 0 && this.speed !== 0 && this.active === false) {
189 | this.virtualAngle += this.speed;
190 | }
191 | }
192 |
193 | Propeller.prototype.applyInertia = function () {
194 | if (this.inertia > 0) {
195 | if (Math.abs(this.speed) >= this.minimalSpeed) {
196 | this.speed = this.speed * this.inertia;
197 |
198 | // Execute onStop callback when speed is less than the given threshold
199 | if (this.onStop !== undefined && this.active === false && Math.abs(this.speed) < this.minimalSpeed) {
200 | this.onStop();
201 | }
202 | } else {
203 | // Stop rotation when rotation speed gets below a given threshold
204 | this.speed = 0;
205 | }
206 | }
207 | }
208 |
209 | Propeller.prototype.getAngleToMouse = function (newPoint) {
210 | var rect = this.element.getBoundingClientRect();
211 | var center = {
212 | x: rect.left + (rect.width / 2),
213 | y: rect.top + (rect.height / 2),
214 | };
215 |
216 | // atan2 gives values between -180 to 180 deg
217 | // offset the angle by 90 degrees so that it's 0 to 360 deg
218 | return Math.atan2(newPoint.y - center.y, newPoint.x - center.x) + Propeller.rightAngleInRadians;
219 | }
220 |
221 | Propeller.prototype.updateAngleToMouse = function (newPoint) {
222 | var newMouseAngle = this.getAngleToMouse(newPoint);
223 |
224 | if (this.lastMouseAngle === undefined) {
225 | this.lastElementAngle = this.virtualAngle;
226 | this.lastMouseAngle = newMouseAngle;
227 | }
228 |
229 | var oldAngle = this.virtualAngle;
230 | this.mouseDiff = newMouseAngle - this.lastMouseAngle;
231 | this.virtualAngle = this.lastElementAngle + this.mouseDiff;
232 | this.speed = this.differenceBetweenAngles(this.virtualAngle, oldAngle);
233 | }
234 |
235 | Propeller.prototype.differenceBetweenAngles = function (newAngle, oldAngle) {
236 | var delta = newAngle - oldAngle;
237 | var radians = Math.atan2(Math.sin(delta), Math.cos(delta));
238 |
239 | return Math.round(radians * 1000) / 1000;
240 | }
241 |
242 | Propeller.prototype.initDrag = function () {
243 | this.speed = 0;
244 | this.lastMouseAngle = undefined;
245 | this.lastElementAngle = undefined;
246 | this.lastMouseEvent = undefined;
247 | }
248 |
249 | Propeller.prototype.initHardwareAcceleration = function () {
250 | this.element.style.willChange = 'transform';
251 | this.updateCSS();
252 | }
253 |
254 | Propeller.prototype.updateCSS = function () {
255 | this.element.style.transform = 'rotate(' + this._angle + 'rad) ';
256 | }
257 |
258 | Propeller.radToDegMulti = 57.29577951308232; // 180 / Math.PI
259 | Propeller.degToRadMulti = 0.017453292519943295; // Math.PI / 180
260 | Propeller.rightAngleInRadians = 1.5707963267948966; // Math.PI / 2
261 |
--------------------------------------------------------------------------------
/src/scss/color-picker.scss:
--------------------------------------------------------------------------------
1 | color-picker {
2 | $initial-color: #ff0000;
3 | $button-border: #b2b2b2;
4 | $material-curve-angular: cubic-bezier(0.35, 0, 0.25, 1) !default;
5 |
6 | @function z-depth-all($depth: 1) {
7 | $color1: 0.12, 0.19, 0.19, 0.21, 0.22, 0.38;
8 | $blur1: 10px, 20px, 50px, 55px, 77px, 30px;
9 |
10 | $color2: 0.16, 0.2, 0.24, 0.22, 0.2, 0.48;
11 | $blur2: 5px, 17px, 15px, 28px, 24px, 15px;
12 | @return 0 0 nth($blur1, $depth) rgba(0, 0, 0, nth($color1, $depth)), 0 0 nth($blur2, $depth) rgba(0, 0, 0, nth($color2, $depth));
13 | }
14 |
15 | @mixin z-depth-all($depth: 1) {
16 | box-shadow: z-depth-all($depth);
17 | }
18 |
19 | @mixin disable-user-select() {
20 | -webkit-touch-callout: none;
21 | -webkit-user-select: none;
22 | -moz-user-select: none;
23 | -ms-user-select: none;
24 | user-select: none;
25 |
26 | -webkit-tap-highlight-color: transparent;
27 | }
28 |
29 | display: block;
30 | overflow: hidden;
31 | width: 280px;
32 | height: 280px;
33 | position: relative;
34 |
35 | &:focus {
36 | outline: 0;
37 |
38 | .knob {
39 | @include z-depth-all(6);
40 | }
41 | }
42 |
43 | &.disabled {
44 | .rotator {
45 | pointer-events: none;
46 | }
47 | }
48 |
49 | &,
50 | .color-palette,
51 | .rotator,
52 | .color,
53 | .color-shadow,
54 | .knob {
55 | @include disable-user-select();
56 | box-sizing: border-box;
57 |
58 | &::before {
59 | box-sizing: border-box;
60 | }
61 | }
62 |
63 | .color-palette {
64 | position: absolute;
65 | top: 0;
66 | left: 0;
67 | right: 0;
68 | bottom: 0;
69 | width: 100%;
70 | height: 100%;
71 | background-size: 100% 100%;
72 | border-radius: 50%;
73 | will-change: transform, opacity;
74 | transition: transform .5s $material-curve-angular,
75 | opacity .5s $material-curve-angular;
76 |
77 | &::before {
78 | content: '';
79 | display: block;
80 | position: absolute;
81 | width: 76%;
82 | height: 76%;
83 | top: 12%;
84 | left: 12%;
85 | background-color: #fff;
86 | border-radius: 50%;
87 | }
88 |
89 | &.blur-palette-in {
90 | transform: scale(1);
91 | opacity: 1;
92 | }
93 |
94 | &.blur-palette-out {
95 | transform: scale(0);
96 | opacity: 0;
97 | }
98 | }
99 |
100 | .rotator {
101 | width: 100%;
102 | height: 100%;
103 | position: absolute;
104 |
105 | &.dragging {
106 | z-index: 1;
107 | }
108 | }
109 |
110 | .color {
111 | position: absolute;
112 | width: 25%;
113 | height: 25%;
114 | top: 37.5%;
115 | left: 37.5%;
116 | padding: 0;
117 | margin: 0;
118 | border-radius: 50%;
119 | background-color: $initial-color;
120 | outline: 0;
121 | cursor: pointer;
122 | transition: transform .7s $material-curve-angular;
123 | will-change: transform;
124 | overflow: visible;
125 | border: 6px solid #fff;
126 | box-shadow: 0 0 0 1px $button-border;
127 |
128 | &::-moz-focus-inner {
129 | border: 0;
130 | }
131 |
132 | &:hover {
133 | box-shadow: 0 0 1px 1px #333;
134 | }
135 |
136 | &:focus {
137 | box-shadow: 0 0 1px 2px $button-border;
138 | }
139 |
140 | &.zoom-color-in {
141 | transform: scale(1);
142 | }
143 |
144 | &.zoom-color-out {
145 | transform: scale(0);
146 | transition-delay: .5s;
147 | }
148 |
149 | &.click-color {
150 | animation: click-color .4s $material-curve-angular forwards;
151 | }
152 | }
153 |
154 | .color-shadow {
155 | width: 20%;
156 | height: 20%;
157 | border-radius: 50%;
158 | border: $initial-color solid 8px;
159 | opacity: 0;
160 | position: absolute;
161 | top: 40%;
162 | left: 40%;
163 | z-index: -1;
164 | }
165 |
166 | .color-shadow-animate {
167 | z-index: 0;
168 | animation: color-shadow-animation .5s $material-curve-angular forwards;
169 | }
170 |
171 | .knob {
172 | @include z-depth-all(1);
173 | border-radius: 50%;
174 | position: absolute;
175 | width: 7%;
176 | height: 7%;
177 | top: 2.5%;
178 | left: 46.5%;
179 | background-color: #fff;
180 | transition: transform .4s $material-curve-angular;
181 | outline: 0;
182 | border-style: none;
183 |
184 | &.zoom-knob-in {
185 | transform: scale(1);
186 | }
187 |
188 | &.zoom-knob-out {
189 | transform: scale(0);
190 | }
191 | }
192 |
193 | &:not(:focus) .knob:hover {
194 | @include z-depth-all(3);
195 | }
196 |
197 | .dragging .knob {
198 | @include z-depth-all(6);
199 | }
200 | }
201 |
202 | @keyframes color-shadow-animation {
203 | 0% { transform: scale(1); opacity: .3; }
204 | 50% { opacity: .1; }
205 | 100% {
206 | opacity: 0;
207 | border-width: 0;
208 | transform: scale(3.8);
209 | }
210 | }
211 |
212 | @keyframes click-color {
213 | 0% { transform: scale(1); }
214 | 25% { transform: scale(0.8); }
215 | 50% { transform: scale(1); }
216 | 100% { transform: scale(1); }
217 | }
218 |
--------------------------------------------------------------------------------