├── .browserslistrc ├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── README.md ├── build └── rollup.config.js ├── package-lock.json ├── package.json └── src ├── assets ├── Vue_Nuggets.png ├── color_swatch.jpeg └── logo.png ├── entry.js ├── lib-components ├── Alert │ └── Alert.vue ├── BagCount │ └── BagCount.vue ├── Grid │ ├── Grid.vue │ └── GridItem.vue ├── QuantitySelector │ ├── QuantitySelector.spec.js │ └── QuantitySelector.vue ├── ScrollToTop │ ├── ScrollToTop.vue │ └── up-arrow.svg ├── StarRating │ ├── PartialStar.vue │ ├── Star.vue │ └── StarRating.vue ├── VarianceSelector │ └── VarianceSelector.vue └── index.js └── lib-dev.vue /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not ie <= 8 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | "[javascript, vue, css]": { 2 | "editor.formatOnSave": true 3 | } -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | jest: true, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /node_modules 3 | /dist 4 | /src/assets 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | 15 | # Editor directories and files 16 | .idea 17 | .vscode 18 | *.suo 19 | *.ntvs* 20 | *.njsproj 21 | *.sln 22 | *.sw* 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Logo](src/assets/Vue_Nuggets.png) 2 | 3 | ## Library of UI components for e-commerce sites built using VueJs 4 | 5 | ## NPM Package 📦 📦 📦 6 | You can now download the **ecommerece-ui-nuggets** from [NPM](https://www.npmjs.com/package/ecommerce-ui-nuggets) 7 | 8 | ## Installing the Package 9 | Install the package. 10 | ``` javascript 11 | npm install ecommerce-ui-nuggets 12 | ``` 13 | 14 | ## Usage 15 | ``` javascript 16 | import { Component_Name } from 'ecommerce-ui-nuggets' 17 | ``` 18 | 19 | ## Demo Site 📡 20 | https://ecommerce-vue-nuggets.herokuapp.com/ 21 | 22 | ## Storybook (WIP) 📕 23 | https://shreerang.github.io/Vue-Nuggets 24 | 25 | ## 2019 RoadMap 🛣️ 26 | https://github.com/Shreerang/Vue-Nuggets/wiki/Roadmap 27 | 28 | ## You can buy me a KoFi ☕ 29 | Buy me a [cup of Coffee](https://ko-fi.com/shreerangp) if you like my work and if you use any of these components 30 | 31 | ## What is this❓ 32 | I am creating a library of UI components using VueJs targeted towards e-commerce sites..✌️ 33 | 34 | ## Why am I doing this? 🤔 35 | I was doing a comparative study of various e-commerce sites; large and small and I realized 💭 that a lot of things are common to these sites. These things are something that can be componentized 🗃️ and used across sites. ℹ️ 36 | 37 | These comonents are currently being built using [Vue](https://vuejs.org/). I might consider building the same components using [React](https://reactjs.org/) as well. At some point I might even consider creating [Web Components](https://www.webcomponents.org/) for this. 38 | 39 | ## Unit Tests 💉 40 | I will try and keep the test coverage for all of these components at a 100% at all times. 😃 Currently it is very low. 😢 (I promise this will improve) 41 | 42 | ## Browser Support 🌎 43 | **Chrome**, **Firefox** and **Safari** are 100% supported! Not everything will ne supported on IE11 and Edge! 44 | 45 | ## Accessibility ♿ 46 | Web Accessibility is extrememly important! I will make all the efforts to implement and test the components for web accessibility. 47 | 48 | ### List of components 📇 49 | 50 | ## 1. Quantity Selector (Dev Complete) 🍰 51 | ### Usage 52 | ``` javascript 53 | import { QuantitySelector } from 'ecommerce-ui-nuggets'; 54 | 55 | components: { 56 | QuantitySelector, 57 | } 58 | 59 | 60 | ``` 61 | 62 | ### Properties 63 | | Property Name | Default Value | Required | Type | 64 | | ------------------ | :-----------: | :------: | :-----: | 65 | | count | 1 | No | Number | 66 | | maxCount | 6 | No | Number | 67 | | isCountEditable | true | No | Boolean | 68 | | iconDimensions | 15 | No | Number | 69 | | minusIconFillColor | #000 | No | String | 70 | | plusIconFillColor | #000 | No | String | 71 | 72 | Count of the component is emitted to the parent copmponent using a custom event `get-count` 73 | 74 | ## 2. Star Rating (WIP) 🏗️ 75 | ### Usage 76 | ``` javascript 77 | import { StarRating } from 'ecommerce-ui-nuggets'; 78 | 79 | components: { 80 | StarRating, 81 | } 82 | 83 | 84 | ``` 85 | 86 | ### Properties 87 | 88 | | Property Name | Default Value | Required | Type | 89 | | -------------- | :---------------------: | :------: | :------------: | 90 | | totalStars | 5 | No | Number | 91 | | rating | NA | Yes | Number | 92 | | noRatingMsg | Be the first to review! | No | String | 93 | | totalReviews | NA | No | Number/ String | 94 | | fillColor | #42b983 | No | String | 95 | | baseColor | #CCC | No | String | 96 | | iconDimensions | 20 | No | Number | 97 | 98 | ## 3. Responsive Product Grid (Dev Complete) 🍰 99 | I initially started off building a Grid based on what made most sense at that time; defining the number of cells and the number of columns based on the breakpoints. Ans hence the component was this way. 100 | 101 | ### Usage 102 | ``` javascript 103 | 104 | 105 | 106 | 107 | 108 | ``` 109 | I soon realized that this is not what developers would want out of the Grid component. Use cases like a Product Grid (Search/ Browse page), "Suggested Products" or "Similar Products" like scroll, Product Page and so on are all truely data driven. So there is the CSS grid and then the **data** that is the most critical part! 110 | 111 | So I have updated the implementation and the usage is no longer going to look like it appears above! 112 | 113 | ### Usage 114 | ``` javascript 115 | import { Grid, GridItem } from 'ecommerce-ui-nuggets'; 116 | 117 | components: { 118 | Grid, 119 | GridItem 120 | } 121 | 122 | /* Use the following when you want to build a product scroll like feature */ 123 | 124 | 125 |

Content in each cell goes here!

126 |
127 |
128 | 129 | /* Use the following when you want to build a search/ browse page like feature */ 130 | 131 | 132 |

Content in each cell goes here!

133 |
134 |
135 | ``` 136 | 137 | ### Notes 138 | 1. I am making use of 4 CSS break-points, prescribed by [Twitter Bootstrap](https://getbootstrap.com/docs/4.1/layout/overview/). 139 | 2. ```css 140 | /* Extra small devices (portrait phones, less than 576px) */ 141 | @media all and (max-width: 575.98px) { 142 | ...; 143 | } 144 | 145 | /* Small devices (landscape phones, less than 768px) */ 146 | @media all and (max-width: 767.98px) { 147 | ...; 148 | } 149 | 150 | /* Medium devices (tablets, less than 992px) */ 151 | @media (max-width: 991.98px) { 152 | ...; 153 | } 154 | 155 | /* Large devices (desktops, less than 1200px) */ 156 | @media (min-width: 992px) { 157 | ...; 158 | } 159 | 160 | /* Extra large devices (large desktops) 161 | No media query since the extra-large breakpoint has no upper bound on its width */ 162 | ``` 163 | 164 | 3. The columns prop can accept a number or an object in the following format 165 | ```javascript 166 | { 167 | xs: 2, 168 | sm: 3, 169 | md: 4, 170 | lg: 5 171 | } 172 | ``` 173 | 4. The keys **xs**, **sm**, **md** and **lg** correspond to the 4 break points described above. 174 | 5. The values for each of these keys is the number of columns that you would like to display for that break point. 175 | 6. The dashed border on each cell is just representative. Actual component does not have this border. 176 | 7. The number displayed inside of the cell is also represtative. Actual component does not have this number. 177 | 178 | ### Properties 179 | | Property Name | Default Value | Required | Type | 180 | | ------------- | :--------------------------: | :------: | :--------------: | 181 | | columns | {xs: 2, sm: 2, md: 3, lg: 4} | No | Number or Object | 182 | 183 | ## 4. Alerts (errors and warnings) Global/page-level and inline (Dev Complete) 🍰 184 | 185 | ### Usage 186 | ``` javascript 187 | import { Alert } from 'ecommerce-ui-nuggets'; 188 | 189 | components: { 190 | Alert, 191 | } 192 | 193 | 194 | ``` 195 | 196 | ### Properties 197 | | Property Name | Default Value | Required | Type | 198 | | ------------- | :-----------: | :------: | :-----: | 199 | | alertType | error | No | String | 200 | | alertPosition | global | No | String | 201 | | isActive | false | No | Boolean | 202 | | persistFor | NA | No | Number | 203 | 204 | ### Notes 205 | 1. Persistance of the global alert signifies the time for which the alert will be shown and then it will disappear! The time is expected in seconds! The component will convert it to milli-seconds. 206 | 2. In case there is a global error and an inline field level error on the screen, the global error message will always take presidence. Meaning, the screen will scroll to the global error message first. 207 | 208 | ## 5. Bag Count (Dev Complete) 🍰 209 | ### Usage 210 | ```javascript 211 | import { BagCount } from 'ecommerce-ui-nuggets'; 212 | 213 | components: { 214 | BagCount, 215 | } 216 | 217 | 218 | ``` 219 | 220 | ### Properties 221 | | Property Name | Default Value | Required | Type | 222 | | -------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------: | :----: | 223 | | iconDimensions | 20 | No | Number | 224 | | iconPath | M177.91,55.377h-22.589v-1.368C155.311,24.25,131.091,0,101.302,0C71.503,0,47.292,24.25,47.292,54.009v1.368H24.704L11.495,202.614h179.624L177.91,55.377L177.91,55.377z M101.302,6.624c19.687,0,36.619,12.105,43.761,29.232c-9.448-14.137-25.5-23.478-43.761-23.478c-18.231,0-34.313,9.34-43.77,23.507C64.713,18.729,81.635,6.624,101.302,6.624z M57.297,55.377c4.406-20.263,22.481-35.485,44.024-35.485c21.582,0,39.618,15.222,44.024,35.485H57.297z | No | String | 225 | | fillColor | #42b983 | No | String | 226 | | fontSize | 80 | No | Number | 227 | | fontColor | #FFF | No | String | 228 | | bagCount | NA | No | Number | 229 | 230 | ### Notes 231 | 1. The `iconPath` property tells the component about the path the SVG icon needs to draw! This opens up a lot of options for the developers. 232 | 2. When the bag is empty, the bag icon can be different, from when the bag has items! This can be achieved by passing different path values to the `iconPath` property based on the bag count. 233 | 3. Since empty bag can have a different SVG path compared to when the bag count is greater than 0, the `bagCount` property is not required. 234 | 235 | ## 6. Variance Selector - Color & Size Picker (WIP) 🚧 236 | ### Usage 237 | ``` javascript 238 | import { VarianceSelector } from 'ecommerce-ui-nuggets'; 239 | 240 | components: { 241 | VarianceSelector, 242 | } 243 | 244 | /* Use the following when you want to build a size picker */ 245 | 246 | 247 | /* Use the following when you want to build a color picker */ 248 | 249 | ``` 250 | 251 | ### Properties 252 | | Property Name | Default Value | Required | Type | 253 | | ----------------- | :--------------------------------: | :------: | :-------------------------------: | 254 | | labelName | Type | No | String | 255 | | labelDefaultValue | Please select one of the following | No | String | 256 | | varianceData | NA | No | Array | 257 | | shape | square | No | String oneOf ['square', 'circle'] | 258 | 259 | Selected value of the component is emitted to the parent copmponent using a custom event `get-selected-variant` 260 | 261 | ### Notes 262 | ⚠️ Some edge cases are still being worked upon! ⚠️ 263 | 264 | 1. Variance Selector is one of size or color picker. 265 | 2. The label name, and its default value are configurable. 266 | 3. There are 2 supported shapes - square (for size picker) and circle (for color picker) 267 | 4. This component is extremely data driven and hence value of `varianceData` defines the component. Pay special attention to #5 and #6 below. 268 | 5. The `varianceData` prop is an Array or objects that would look something like this in case of the **size-picker**. 269 | 270 | ``` javascript 271 | [ 272 | { name: 'Xtra Small', value: 'XS' }, 273 | { name: 'Small', value: 'S', availability: false }, 274 | { name: 'Medium', value: 'M', availability: false }, 275 | { name: 'Large', value: 'L' }, 276 | { name: 'Xtra Large', value: 'XL' }, 277 | { name: 'Double XL', value: 'XLL' }, 278 | ]; 279 | ``` 280 | 281 | - Here, the `value` will always be shown within the box and the `name`, if available; will be shown in place of `labelDefaultValue` when it is selected. 282 | - If `name` is not available we will show the `value` in place of `labelDefaultValue` when selected. 283 | - The `availability` key needs to passed as `false` only when the product in that particular size is unavailable, so that the component can style the unavailable sized box accordingly. 284 | - When the `availability` key is not present or when is passed as `true` we will assume that the size is available. 285 | 286 | 6. The `varianceData` prop is an Array or objects that would look something like this in case of the **color-picker**. 287 | 288 | ```javascript 289 | [ 290 | { name: 'Black/Red', image: { background: swatchImg, position: '-0px 0' } }, 291 | { name: 'Black/Pink', availability: false, image: { background: swatchImg, position: '-56px 0' } }, 292 | { name: 'Black/Tan', availability: false, image: { background: swatchImg, position: '-112px 0' } }, 293 | { name: 'Black/Tan/Purple', value: 'BTP', image: { background: swatchImg, position: '-168px 0' } }, 294 | { name: 'Magnta Multi', value: 'MM', image: { background: swatchImg, position: '-224px 0' } }, 295 | ]; 296 | ``` 297 | 298 | - Here, `name` will always be shown in place of `labelDefaultValue`, even if `value` is available. In case `name` is unavaialble `value` will be shown in place of `labelDefaultValue` when selected. 299 | - The important thing to note here is the `image` object. This object expects 2 keys - `background` which is the route to the image and `position` which is required to define the background position of the image. 300 | 301 | ## 7. Layout switcher (Planned) 🔮 302 | 303 | ## 8. Image Carousel (Planned) 🔮 304 | 305 | ## 9. Modal (Planned) 🔮 306 | 307 | ## 10. Infinite Scroll (Planned) 🔮 308 | 309 | ## 11. Scroll to Top (Dev Complete) 🍰 310 | ### Usage 311 | ```javascript 312 | import { ScrollToTop } from 'ecommerce-ui-nuggets'; 313 | 314 | components: { 315 | ScrollToTop, 316 | } 317 | 318 | 319 | ``` 320 | 321 | ### Properties 322 | | Property Name | Default Value | Required | Type | 323 | | -------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------: | :----: | 324 | | iconDimensions | 20 | No | Number | 325 | | iconPath | M5.906,34.998c-1.352,1.338-3.541,1.338-4.893,0c-1.35-1.338-1.352-3.506,0-4.846l19.54-19.148c1.352-1.338,3.543-1.338,4.895,0l19.539,19.148c1.352,1.34,1.352,3.506,0,4.846c-1.352,1.338-3.541,1.338-4.893,0L23,19.295L5.906,34.998z | No | String | 326 | | fillColor | #42b983 | No | String | 327 | | iconViewBox | 0 0 46.001 46.001 | No | String | 328 | 329 | ## Note ⚠️ 330 | If you would like to suggest more components. Please add a issue on Github and use tag component-request. -------------------------------------------------------------------------------- /build/rollup.config.js: -------------------------------------------------------------------------------- 1 | // rollup.config.js 2 | import vue from 'rollup-plugin-vue'; 3 | import buble from 'rollup-plugin-buble'; 4 | import replace from 'rollup-plugin-replace'; 5 | import uglify from 'rollup-plugin-uglify-es'; 6 | import minimist from 'minimist'; 7 | 8 | const argv = minimist(process.argv.slice(2)); 9 | 10 | const config = { 11 | input: 'src/entry.js', 12 | output: { 13 | name: 'Nuggets', 14 | exports: 'named', 15 | }, 16 | plugins: [ 17 | replace({ 18 | 'process.env.NODE_ENV': JSON.stringify('production'), 19 | }), 20 | vue({ 21 | css: true, 22 | compileTemplate: true, 23 | template: { 24 | isProduction: true, 25 | }, 26 | }), 27 | buble(), 28 | ], 29 | }; 30 | 31 | // Only minify browser (iife) version 32 | if (argv.format === 'iife') { 33 | config.plugins.push(uglify()); 34 | } 35 | 36 | export default config; 37 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ecommerce-ui-nuggets", 3 | "version": "0.1.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/runtime": { 8 | "version": "7.2.0", 9 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.2.0.tgz", 10 | "integrity": "sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==", 11 | "dev": true, 12 | "requires": { 13 | "regenerator-runtime": "^0.12.0" 14 | } 15 | }, 16 | "@types/estree": { 17 | "version": "0.0.39", 18 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", 19 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 20 | "dev": true 21 | }, 22 | "@types/node": { 23 | "version": "10.12.18", 24 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", 25 | "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", 26 | "dev": true 27 | }, 28 | "@vue/component-compiler": { 29 | "version": "3.6.0", 30 | "resolved": "https://registry.npmjs.org/@vue/component-compiler/-/component-compiler-3.6.0.tgz", 31 | "integrity": "sha512-NIA0vmOI4zbtJAn69iZls8IJ8VxmguswAuiUdu8TcR+YYTYzntfw290HUCSFjzAdRg+FUWZv8r+wc3TzJ/IjwA==", 32 | "dev": true, 33 | "requires": { 34 | "@vue/component-compiler-utils": "^2.1.0", 35 | "clean-css": "^4.1.11", 36 | "hash-sum": "^1.0.2", 37 | "postcss-modules-sync": "^1.0.0", 38 | "source-map": "0.6.*" 39 | }, 40 | "dependencies": { 41 | "source-map": { 42 | "version": "0.6.1", 43 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 44 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 45 | "dev": true 46 | } 47 | } 48 | }, 49 | "@vue/component-compiler-utils": { 50 | "version": "2.5.0", 51 | "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-2.5.0.tgz", 52 | "integrity": "sha512-mSB8jWmE/ZeYZHPDEx9hNiiRh5P2V1Q0tObxEQWtxxfXtkIAvPnj7oucGm5SO8Y/QwIlDJgAGqHfj5MCjoKoOg==", 53 | "dev": true, 54 | "requires": { 55 | "consolidate": "^0.15.1", 56 | "hash-sum": "^1.0.2", 57 | "lru-cache": "^4.1.2", 58 | "merge-source-map": "^1.1.0", 59 | "postcss": "^7.0.7", 60 | "postcss-selector-parser": "^5.0.0", 61 | "prettier": "1.13.7", 62 | "source-map": "^0.7.3", 63 | "vue-template-es2015-compiler": "^1.6.0" 64 | }, 65 | "dependencies": { 66 | "prettier": { 67 | "version": "1.13.7", 68 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.13.7.tgz", 69 | "integrity": "sha512-KIU72UmYPGk4MujZGYMFwinB7lOf2LsDNGSOC8ufevsrPLISrZbNJlWstRi3m0AMuszbH+EFSQ/r6w56RSPK6w==", 70 | "dev": true 71 | }, 72 | "source-map": { 73 | "version": "0.7.3", 74 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", 75 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", 76 | "dev": true 77 | } 78 | } 79 | }, 80 | "ansi-regex": { 81 | "version": "2.1.1", 82 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 83 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 84 | "dev": true 85 | }, 86 | "ansi-styles": { 87 | "version": "3.2.1", 88 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 89 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 90 | "dev": true, 91 | "requires": { 92 | "color-convert": "^1.9.0" 93 | } 94 | }, 95 | "arr-diff": { 96 | "version": "2.0.0", 97 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 98 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", 99 | "dev": true, 100 | "requires": { 101 | "arr-flatten": "^1.0.1" 102 | } 103 | }, 104 | "arr-flatten": { 105 | "version": "1.1.0", 106 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 107 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 108 | "dev": true 109 | }, 110 | "array-unique": { 111 | "version": "0.2.1", 112 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 113 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", 114 | "dev": true 115 | }, 116 | "balanced-match": { 117 | "version": "1.0.0", 118 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 119 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 120 | "dev": true 121 | }, 122 | "big.js": { 123 | "version": "3.2.0", 124 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", 125 | "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", 126 | "dev": true 127 | }, 128 | "bluebird": { 129 | "version": "3.5.3", 130 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", 131 | "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", 132 | "dev": true 133 | }, 134 | "brace-expansion": { 135 | "version": "1.1.11", 136 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 137 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 138 | "dev": true, 139 | "requires": { 140 | "balanced-match": "^1.0.0", 141 | "concat-map": "0.0.1" 142 | } 143 | }, 144 | "braces": { 145 | "version": "1.8.5", 146 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 147 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", 148 | "dev": true, 149 | "requires": { 150 | "expand-range": "^1.8.1", 151 | "preserve": "^0.2.0", 152 | "repeat-element": "^1.1.2" 153 | } 154 | }, 155 | "buble": { 156 | "version": "0.19.6", 157 | "resolved": "https://registry.npmjs.org/buble/-/buble-0.19.6.tgz", 158 | "integrity": "sha512-9kViM6nJA1Q548Jrd06x0geh+BG2ru2+RMDkIHHgJY/8AcyCs34lTHwra9BX7YdPrZXd5aarkpr/SY8bmPgPdg==", 159 | "dev": true, 160 | "requires": { 161 | "chalk": "^2.4.1", 162 | "magic-string": "^0.25.1", 163 | "minimist": "^1.2.0", 164 | "os-homedir": "^1.0.1", 165 | "regexpu-core": "^4.2.0", 166 | "vlq": "^1.0.0" 167 | } 168 | }, 169 | "chalk": { 170 | "version": "2.4.2", 171 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 172 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 173 | "dev": true, 174 | "requires": { 175 | "ansi-styles": "^3.2.1", 176 | "escape-string-regexp": "^1.0.5", 177 | "supports-color": "^5.3.0" 178 | } 179 | }, 180 | "clean-css": { 181 | "version": "4.2.1", 182 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", 183 | "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", 184 | "dev": true, 185 | "requires": { 186 | "source-map": "~0.6.0" 187 | }, 188 | "dependencies": { 189 | "source-map": { 190 | "version": "0.6.1", 191 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 192 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 193 | "dev": true 194 | } 195 | } 196 | }, 197 | "color-convert": { 198 | "version": "1.9.3", 199 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 200 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 201 | "dev": true, 202 | "requires": { 203 | "color-name": "1.1.3" 204 | } 205 | }, 206 | "color-name": { 207 | "version": "1.1.3", 208 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 209 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 210 | "dev": true 211 | }, 212 | "commander": { 213 | "version": "2.9.0", 214 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", 215 | "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", 216 | "dev": true, 217 | "requires": { 218 | "graceful-readlink": ">= 1.0.0" 219 | } 220 | }, 221 | "concat-map": { 222 | "version": "0.0.1", 223 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 224 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 225 | "dev": true 226 | }, 227 | "consolidate": { 228 | "version": "0.15.1", 229 | "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", 230 | "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", 231 | "dev": true, 232 | "requires": { 233 | "bluebird": "^3.1.1" 234 | } 235 | }, 236 | "cross-env": { 237 | "version": "5.2.0", 238 | "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz", 239 | "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==", 240 | "dev": true, 241 | "requires": { 242 | "cross-spawn": "^6.0.5", 243 | "is-windows": "^1.0.0" 244 | } 245 | }, 246 | "cross-spawn": { 247 | "version": "6.0.5", 248 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 249 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 250 | "dev": true, 251 | "requires": { 252 | "nice-try": "^1.0.4", 253 | "path-key": "^2.0.1", 254 | "semver": "^5.5.0", 255 | "shebang-command": "^1.2.0", 256 | "which": "^1.2.9" 257 | } 258 | }, 259 | "css-selector-tokenizer": { 260 | "version": "0.7.1", 261 | "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", 262 | "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", 263 | "dev": true, 264 | "requires": { 265 | "cssesc": "^0.1.0", 266 | "fastparse": "^1.1.1", 267 | "regexpu-core": "^1.0.0" 268 | }, 269 | "dependencies": { 270 | "cssesc": { 271 | "version": "0.1.0", 272 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", 273 | "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", 274 | "dev": true 275 | }, 276 | "regexpu-core": { 277 | "version": "1.0.0", 278 | "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", 279 | "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", 280 | "dev": true, 281 | "requires": { 282 | "regenerate": "^1.2.1", 283 | "regjsgen": "^0.2.0", 284 | "regjsparser": "^0.1.4" 285 | } 286 | }, 287 | "regjsgen": { 288 | "version": "0.2.0", 289 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", 290 | "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", 291 | "dev": true 292 | }, 293 | "regjsparser": { 294 | "version": "0.1.5", 295 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", 296 | "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", 297 | "dev": true, 298 | "requires": { 299 | "jsesc": "~0.5.0" 300 | } 301 | } 302 | } 303 | }, 304 | "cssesc": { 305 | "version": "2.0.0", 306 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", 307 | "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", 308 | "dev": true 309 | }, 310 | "de-indent": { 311 | "version": "1.0.2", 312 | "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", 313 | "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", 314 | "dev": true 315 | }, 316 | "debug": { 317 | "version": "2.6.9", 318 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 319 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 320 | "dev": true, 321 | "requires": { 322 | "ms": "2.0.0" 323 | } 324 | }, 325 | "emojis-list": { 326 | "version": "2.1.0", 327 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", 328 | "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", 329 | "dev": true 330 | }, 331 | "escape-string-regexp": { 332 | "version": "1.0.5", 333 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 334 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 335 | "dev": true 336 | }, 337 | "estree-walker": { 338 | "version": "0.5.2", 339 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", 340 | "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", 341 | "dev": true 342 | }, 343 | "expand-brackets": { 344 | "version": "0.1.5", 345 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 346 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", 347 | "dev": true, 348 | "requires": { 349 | "is-posix-bracket": "^0.1.0" 350 | } 351 | }, 352 | "expand-range": { 353 | "version": "1.8.2", 354 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 355 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", 356 | "dev": true, 357 | "requires": { 358 | "fill-range": "^2.1.0" 359 | } 360 | }, 361 | "extglob": { 362 | "version": "0.3.2", 363 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 364 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", 365 | "dev": true, 366 | "requires": { 367 | "is-extglob": "^1.0.0" 368 | } 369 | }, 370 | "fastparse": { 371 | "version": "1.1.2", 372 | "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", 373 | "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", 374 | "dev": true 375 | }, 376 | "filename-regex": { 377 | "version": "2.0.1", 378 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 379 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", 380 | "dev": true 381 | }, 382 | "fill-range": { 383 | "version": "2.2.4", 384 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", 385 | "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", 386 | "dev": true, 387 | "requires": { 388 | "is-number": "^2.1.0", 389 | "isobject": "^2.0.0", 390 | "randomatic": "^3.0.0", 391 | "repeat-element": "^1.1.2", 392 | "repeat-string": "^1.5.2" 393 | } 394 | }, 395 | "for-in": { 396 | "version": "1.0.2", 397 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 398 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 399 | "dev": true 400 | }, 401 | "for-own": { 402 | "version": "0.1.5", 403 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 404 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 405 | "dev": true, 406 | "requires": { 407 | "for-in": "^1.0.1" 408 | } 409 | }, 410 | "generic-names": { 411 | "version": "1.0.3", 412 | "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", 413 | "integrity": "sha1-LXhqEhruUIh2eWk56OO/+DbCCRc=", 414 | "dev": true, 415 | "requires": { 416 | "loader-utils": "^0.2.16" 417 | } 418 | }, 419 | "glob-base": { 420 | "version": "0.3.0", 421 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 422 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", 423 | "dev": true, 424 | "requires": { 425 | "glob-parent": "^2.0.0", 426 | "is-glob": "^2.0.0" 427 | } 428 | }, 429 | "glob-parent": { 430 | "version": "2.0.0", 431 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 432 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", 433 | "dev": true, 434 | "requires": { 435 | "is-glob": "^2.0.0" 436 | } 437 | }, 438 | "graceful-readlink": { 439 | "version": "1.0.1", 440 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 441 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", 442 | "dev": true 443 | }, 444 | "has-ansi": { 445 | "version": "2.0.0", 446 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 447 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 448 | "dev": true, 449 | "requires": { 450 | "ansi-regex": "^2.0.0" 451 | } 452 | }, 453 | "has-flag": { 454 | "version": "3.0.0", 455 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 456 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 457 | "dev": true 458 | }, 459 | "hash-sum": { 460 | "version": "1.0.2", 461 | "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", 462 | "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", 463 | "dev": true 464 | }, 465 | "he": { 466 | "version": "1.2.0", 467 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 468 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 469 | "dev": true 470 | }, 471 | "icss-replace-symbols": { 472 | "version": "1.1.0", 473 | "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", 474 | "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", 475 | "dev": true 476 | }, 477 | "indexes-of": { 478 | "version": "1.0.1", 479 | "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", 480 | "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", 481 | "dev": true 482 | }, 483 | "is-buffer": { 484 | "version": "1.1.6", 485 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 486 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 487 | "dev": true 488 | }, 489 | "is-dotfile": { 490 | "version": "1.0.3", 491 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 492 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", 493 | "dev": true 494 | }, 495 | "is-equal-shallow": { 496 | "version": "0.1.3", 497 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 498 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", 499 | "dev": true, 500 | "requires": { 501 | "is-primitive": "^2.0.0" 502 | } 503 | }, 504 | "is-extendable": { 505 | "version": "0.1.1", 506 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 507 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 508 | "dev": true 509 | }, 510 | "is-extglob": { 511 | "version": "1.0.0", 512 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 513 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 514 | "dev": true 515 | }, 516 | "is-glob": { 517 | "version": "2.0.1", 518 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 519 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 520 | "dev": true, 521 | "requires": { 522 | "is-extglob": "^1.0.0" 523 | } 524 | }, 525 | "is-number": { 526 | "version": "2.1.0", 527 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 528 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", 529 | "dev": true, 530 | "requires": { 531 | "kind-of": "^3.0.2" 532 | } 533 | }, 534 | "is-posix-bracket": { 535 | "version": "0.1.1", 536 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 537 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", 538 | "dev": true 539 | }, 540 | "is-primitive": { 541 | "version": "2.0.0", 542 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 543 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", 544 | "dev": true 545 | }, 546 | "is-windows": { 547 | "version": "1.0.2", 548 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 549 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 550 | "dev": true 551 | }, 552 | "isarray": { 553 | "version": "1.0.0", 554 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 555 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 556 | "dev": true 557 | }, 558 | "isexe": { 559 | "version": "2.0.0", 560 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 561 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 562 | "dev": true 563 | }, 564 | "isobject": { 565 | "version": "2.1.0", 566 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 567 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 568 | "dev": true, 569 | "requires": { 570 | "isarray": "1.0.0" 571 | } 572 | }, 573 | "js-base64": { 574 | "version": "2.5.0", 575 | "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.0.tgz", 576 | "integrity": "sha512-wlEBIZ5LP8usDylWbDNhKPEFVFdI5hCHpnVoT/Ysvoi/PRhJENm/Rlh9TvjYB38HFfKZN7OzEbRjmjvLkFw11g==", 577 | "dev": true 578 | }, 579 | "jsesc": { 580 | "version": "0.5.0", 581 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", 582 | "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", 583 | "dev": true 584 | }, 585 | "json5": { 586 | "version": "0.5.1", 587 | "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", 588 | "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", 589 | "dev": true 590 | }, 591 | "kind-of": { 592 | "version": "3.2.2", 593 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 594 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 595 | "dev": true, 596 | "requires": { 597 | "is-buffer": "^1.1.5" 598 | } 599 | }, 600 | "loader-utils": { 601 | "version": "0.2.17", 602 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", 603 | "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", 604 | "dev": true, 605 | "requires": { 606 | "big.js": "^3.1.3", 607 | "emojis-list": "^2.0.0", 608 | "json5": "^0.5.0", 609 | "object-assign": "^4.0.1" 610 | } 611 | }, 612 | "lru-cache": { 613 | "version": "4.1.5", 614 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 615 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 616 | "dev": true, 617 | "requires": { 618 | "pseudomap": "^1.0.2", 619 | "yallist": "^2.1.2" 620 | } 621 | }, 622 | "magic-string": { 623 | "version": "0.25.1", 624 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", 625 | "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", 626 | "dev": true, 627 | "requires": { 628 | "sourcemap-codec": "^1.4.1" 629 | } 630 | }, 631 | "math-random": { 632 | "version": "1.0.4", 633 | "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", 634 | "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", 635 | "dev": true 636 | }, 637 | "merge-source-map": { 638 | "version": "1.1.0", 639 | "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", 640 | "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", 641 | "dev": true, 642 | "requires": { 643 | "source-map": "^0.6.1" 644 | }, 645 | "dependencies": { 646 | "source-map": { 647 | "version": "0.6.1", 648 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 649 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 650 | "dev": true 651 | } 652 | } 653 | }, 654 | "micromatch": { 655 | "version": "2.3.11", 656 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 657 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", 658 | "dev": true, 659 | "requires": { 660 | "arr-diff": "^2.0.0", 661 | "array-unique": "^0.2.1", 662 | "braces": "^1.8.2", 663 | "expand-brackets": "^0.1.4", 664 | "extglob": "^0.3.1", 665 | "filename-regex": "^2.0.0", 666 | "is-extglob": "^1.0.0", 667 | "is-glob": "^2.0.1", 668 | "kind-of": "^3.0.2", 669 | "normalize-path": "^2.0.1", 670 | "object.omit": "^2.0.0", 671 | "parse-glob": "^3.0.4", 672 | "regex-cache": "^0.4.2" 673 | } 674 | }, 675 | "minimatch": { 676 | "version": "3.0.4", 677 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 678 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 679 | "dev": true, 680 | "requires": { 681 | "brace-expansion": "^1.1.7" 682 | } 683 | }, 684 | "minimist": { 685 | "version": "1.2.0", 686 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 687 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 688 | "dev": true 689 | }, 690 | "ms": { 691 | "version": "2.0.0", 692 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 693 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 694 | "dev": true 695 | }, 696 | "nice-try": { 697 | "version": "1.0.5", 698 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 699 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 700 | "dev": true 701 | }, 702 | "normalize-path": { 703 | "version": "2.1.1", 704 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 705 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 706 | "dev": true, 707 | "requires": { 708 | "remove-trailing-separator": "^1.0.1" 709 | } 710 | }, 711 | "object-assign": { 712 | "version": "4.1.1", 713 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 714 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 715 | "dev": true 716 | }, 717 | "object.omit": { 718 | "version": "2.0.1", 719 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 720 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", 721 | "dev": true, 722 | "requires": { 723 | "for-own": "^0.1.4", 724 | "is-extendable": "^0.1.1" 725 | } 726 | }, 727 | "os-homedir": { 728 | "version": "1.0.2", 729 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 730 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 731 | "dev": true 732 | }, 733 | "parse-glob": { 734 | "version": "3.0.4", 735 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 736 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", 737 | "dev": true, 738 | "requires": { 739 | "glob-base": "^0.3.0", 740 | "is-dotfile": "^1.0.0", 741 | "is-extglob": "^1.0.0", 742 | "is-glob": "^2.0.0" 743 | } 744 | }, 745 | "path-key": { 746 | "version": "2.0.1", 747 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 748 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 749 | "dev": true 750 | }, 751 | "postcss": { 752 | "version": "7.0.13", 753 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.13.tgz", 754 | "integrity": "sha512-h8SY6kQTd1wISHWjz+E6cswdhMuyBZRb16pSTv3W4zYZ3/YbyWeJdNUeOXB5IdZqE1U76OUEjjjqsC3z2f3hVg==", 755 | "dev": true, 756 | "requires": { 757 | "chalk": "^2.4.2", 758 | "source-map": "^0.6.1", 759 | "supports-color": "^6.1.0" 760 | }, 761 | "dependencies": { 762 | "source-map": { 763 | "version": "0.6.1", 764 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 765 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 766 | "dev": true 767 | }, 768 | "supports-color": { 769 | "version": "6.1.0", 770 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", 771 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", 772 | "dev": true, 773 | "requires": { 774 | "has-flag": "^3.0.0" 775 | } 776 | } 777 | } 778 | }, 779 | "postcss-modules-local-by-default": { 780 | "version": "1.2.0", 781 | "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", 782 | "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", 783 | "dev": true, 784 | "requires": { 785 | "css-selector-tokenizer": "^0.7.0", 786 | "postcss": "^6.0.1" 787 | }, 788 | "dependencies": { 789 | "postcss": { 790 | "version": "6.0.23", 791 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", 792 | "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", 793 | "dev": true, 794 | "requires": { 795 | "chalk": "^2.4.1", 796 | "source-map": "^0.6.1", 797 | "supports-color": "^5.4.0" 798 | } 799 | }, 800 | "source-map": { 801 | "version": "0.6.1", 802 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 803 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 804 | "dev": true 805 | } 806 | } 807 | }, 808 | "postcss-modules-scope": { 809 | "version": "1.1.0", 810 | "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", 811 | "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", 812 | "dev": true, 813 | "requires": { 814 | "css-selector-tokenizer": "^0.7.0", 815 | "postcss": "^6.0.1" 816 | }, 817 | "dependencies": { 818 | "postcss": { 819 | "version": "6.0.23", 820 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", 821 | "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", 822 | "dev": true, 823 | "requires": { 824 | "chalk": "^2.4.1", 825 | "source-map": "^0.6.1", 826 | "supports-color": "^5.4.0" 827 | } 828 | }, 829 | "source-map": { 830 | "version": "0.6.1", 831 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 832 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 833 | "dev": true 834 | } 835 | } 836 | }, 837 | "postcss-modules-sync": { 838 | "version": "1.0.0", 839 | "resolved": "https://registry.npmjs.org/postcss-modules-sync/-/postcss-modules-sync-1.0.0.tgz", 840 | "integrity": "sha1-YZpxnPeN0WpINBNRQLMkz3czS+E=", 841 | "dev": true, 842 | "requires": { 843 | "generic-names": "^1.0.2", 844 | "icss-replace-symbols": "^1.0.2", 845 | "postcss": "^5.2.5", 846 | "postcss-modules-local-by-default": "^1.1.1", 847 | "postcss-modules-scope": "^1.0.2", 848 | "string-hash": "^1.1.0" 849 | }, 850 | "dependencies": { 851 | "ansi-styles": { 852 | "version": "2.2.1", 853 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 854 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 855 | "dev": true 856 | }, 857 | "chalk": { 858 | "version": "1.1.3", 859 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 860 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 861 | "dev": true, 862 | "requires": { 863 | "ansi-styles": "^2.2.1", 864 | "escape-string-regexp": "^1.0.2", 865 | "has-ansi": "^2.0.0", 866 | "strip-ansi": "^3.0.0", 867 | "supports-color": "^2.0.0" 868 | }, 869 | "dependencies": { 870 | "supports-color": { 871 | "version": "2.0.0", 872 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 873 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 874 | "dev": true 875 | } 876 | } 877 | }, 878 | "has-flag": { 879 | "version": "1.0.0", 880 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", 881 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", 882 | "dev": true 883 | }, 884 | "postcss": { 885 | "version": "5.2.18", 886 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", 887 | "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", 888 | "dev": true, 889 | "requires": { 890 | "chalk": "^1.1.3", 891 | "js-base64": "^2.1.9", 892 | "source-map": "^0.5.6", 893 | "supports-color": "^3.2.3" 894 | } 895 | }, 896 | "supports-color": { 897 | "version": "3.2.3", 898 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", 899 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", 900 | "dev": true, 901 | "requires": { 902 | "has-flag": "^1.0.0" 903 | } 904 | } 905 | } 906 | }, 907 | "postcss-selector-parser": { 908 | "version": "5.0.0", 909 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", 910 | "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", 911 | "dev": true, 912 | "requires": { 913 | "cssesc": "^2.0.0", 914 | "indexes-of": "^1.0.1", 915 | "uniq": "^1.0.1" 916 | } 917 | }, 918 | "preserve": { 919 | "version": "0.2.0", 920 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 921 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", 922 | "dev": true 923 | }, 924 | "pseudomap": { 925 | "version": "1.0.2", 926 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 927 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 928 | "dev": true 929 | }, 930 | "querystring": { 931 | "version": "0.2.0", 932 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 933 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 934 | "dev": true 935 | }, 936 | "randomatic": { 937 | "version": "3.1.1", 938 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", 939 | "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", 940 | "dev": true, 941 | "requires": { 942 | "is-number": "^4.0.0", 943 | "kind-of": "^6.0.0", 944 | "math-random": "^1.0.1" 945 | }, 946 | "dependencies": { 947 | "is-number": { 948 | "version": "4.0.0", 949 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", 950 | "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", 951 | "dev": true 952 | }, 953 | "kind-of": { 954 | "version": "6.0.2", 955 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 956 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", 957 | "dev": true 958 | } 959 | } 960 | }, 961 | "regenerate": { 962 | "version": "1.4.0", 963 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", 964 | "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", 965 | "dev": true 966 | }, 967 | "regenerate-unicode-properties": { 968 | "version": "7.0.0", 969 | "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", 970 | "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", 971 | "dev": true, 972 | "requires": { 973 | "regenerate": "^1.4.0" 974 | } 975 | }, 976 | "regenerator-runtime": { 977 | "version": "0.12.1", 978 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", 979 | "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", 980 | "dev": true 981 | }, 982 | "regex-cache": { 983 | "version": "0.4.4", 984 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", 985 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", 986 | "dev": true, 987 | "requires": { 988 | "is-equal-shallow": "^0.1.3" 989 | } 990 | }, 991 | "regexpu-core": { 992 | "version": "4.4.0", 993 | "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz", 994 | "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==", 995 | "dev": true, 996 | "requires": { 997 | "regenerate": "^1.4.0", 998 | "regenerate-unicode-properties": "^7.0.0", 999 | "regjsgen": "^0.5.0", 1000 | "regjsparser": "^0.6.0", 1001 | "unicode-match-property-ecmascript": "^1.0.4", 1002 | "unicode-match-property-value-ecmascript": "^1.0.2" 1003 | } 1004 | }, 1005 | "regjsgen": { 1006 | "version": "0.5.0", 1007 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", 1008 | "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", 1009 | "dev": true 1010 | }, 1011 | "regjsparser": { 1012 | "version": "0.6.0", 1013 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", 1014 | "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", 1015 | "dev": true, 1016 | "requires": { 1017 | "jsesc": "~0.5.0" 1018 | } 1019 | }, 1020 | "remove-trailing-separator": { 1021 | "version": "1.1.0", 1022 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 1023 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 1024 | "dev": true 1025 | }, 1026 | "repeat-element": { 1027 | "version": "1.1.3", 1028 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", 1029 | "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", 1030 | "dev": true 1031 | }, 1032 | "repeat-string": { 1033 | "version": "1.6.1", 1034 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1035 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 1036 | "dev": true 1037 | }, 1038 | "rollup": { 1039 | "version": "0.67.4", 1040 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.67.4.tgz", 1041 | "integrity": "sha512-AVuP73mkb4BBMUmksQ3Jw0jTrBTU1i7rLiUYjFxLZGb3xiFmtVEg40oByphkZAsiL0bJC3hRAJUQos/e5EBd+w==", 1042 | "dev": true, 1043 | "requires": { 1044 | "@types/estree": "0.0.39", 1045 | "@types/node": "*" 1046 | } 1047 | }, 1048 | "rollup-plugin-buble": { 1049 | "version": "0.19.6", 1050 | "resolved": "https://registry.npmjs.org/rollup-plugin-buble/-/rollup-plugin-buble-0.19.6.tgz", 1051 | "integrity": "sha512-El5Fut4/wEO17ZN/n9BZvqd7DXXB2WbJr/DKvr89LXChC/cHllE0XwiUDeAalrTkgr0WrnyLDTCQvEv+cGywWQ==", 1052 | "dev": true, 1053 | "requires": { 1054 | "buble": "^0.19.6", 1055 | "rollup-pluginutils": "^2.3.3" 1056 | } 1057 | }, 1058 | "rollup-plugin-replace": { 1059 | "version": "2.1.0", 1060 | "resolved": "https://registry.npmjs.org/rollup-plugin-replace/-/rollup-plugin-replace-2.1.0.tgz", 1061 | "integrity": "sha512-SxrAIgpH/B5/W4SeULgreOemxcpEgKs2gcD42zXw50bhqGWmcnlXneVInQpAqzA/cIly4bJrOpeelmB9p4YXSQ==", 1062 | "dev": true, 1063 | "requires": { 1064 | "magic-string": "^0.25.1", 1065 | "minimatch": "^3.0.2", 1066 | "rollup-pluginutils": "^2.0.1" 1067 | } 1068 | }, 1069 | "rollup-plugin-uglify-es": { 1070 | "version": "0.0.1", 1071 | "resolved": "https://registry.npmjs.org/rollup-plugin-uglify-es/-/rollup-plugin-uglify-es-0.0.1.tgz", 1072 | "integrity": "sha1-5FZE8raFpZq9uTY0ByB6A6e1qbc=", 1073 | "dev": true, 1074 | "requires": { 1075 | "uglify-es": "3.0.3" 1076 | } 1077 | }, 1078 | "rollup-plugin-vue": { 1079 | "version": "4.3.2", 1080 | "resolved": "https://registry.npmjs.org/rollup-plugin-vue/-/rollup-plugin-vue-4.3.2.tgz", 1081 | "integrity": "sha512-XPd7bE8O8W1c2fkRwUmlKioXEjE3Zvn/ksbwPkPsyoT+Wik0XVtzyDjoHg/qYcqNm+gzc8idBo3/fgNkTCiSTA==", 1082 | "dev": true, 1083 | "requires": { 1084 | "@babel/runtime": "^7.0.0-beta.46", 1085 | "@vue/component-compiler": "^3.4.4", 1086 | "@vue/component-compiler-utils": "^2.1.0", 1087 | "debug": "^2.6.0", 1088 | "hash-sum": "^1.0.2", 1089 | "querystring": "^0.2.0", 1090 | "rollup-pluginutils": "^2.0.1" 1091 | } 1092 | }, 1093 | "rollup-pluginutils": { 1094 | "version": "2.3.3", 1095 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz", 1096 | "integrity": "sha512-2XZwja7b6P5q4RZ5FhyX1+f46xi1Z3qBKigLRZ6VTZjwbN0K1IFGMlwm06Uu0Emcre2Z63l77nq/pzn+KxIEoA==", 1097 | "dev": true, 1098 | "requires": { 1099 | "estree-walker": "^0.5.2", 1100 | "micromatch": "^2.3.11" 1101 | } 1102 | }, 1103 | "semver": { 1104 | "version": "5.6.0", 1105 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 1106 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", 1107 | "dev": true 1108 | }, 1109 | "shebang-command": { 1110 | "version": "1.2.0", 1111 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1112 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1113 | "dev": true, 1114 | "requires": { 1115 | "shebang-regex": "^1.0.0" 1116 | } 1117 | }, 1118 | "shebang-regex": { 1119 | "version": "1.0.0", 1120 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1121 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1122 | "dev": true 1123 | }, 1124 | "source-map": { 1125 | "version": "0.5.7", 1126 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1127 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1128 | "dev": true 1129 | }, 1130 | "sourcemap-codec": { 1131 | "version": "1.4.4", 1132 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", 1133 | "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", 1134 | "dev": true 1135 | }, 1136 | "string-hash": { 1137 | "version": "1.1.3", 1138 | "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", 1139 | "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", 1140 | "dev": true 1141 | }, 1142 | "strip-ansi": { 1143 | "version": "3.0.1", 1144 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1145 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1146 | "dev": true, 1147 | "requires": { 1148 | "ansi-regex": "^2.0.0" 1149 | } 1150 | }, 1151 | "supports-color": { 1152 | "version": "5.5.0", 1153 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1154 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1155 | "dev": true, 1156 | "requires": { 1157 | "has-flag": "^3.0.0" 1158 | } 1159 | }, 1160 | "uglify-es": { 1161 | "version": "3.0.3", 1162 | "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.0.3.tgz", 1163 | "integrity": "sha1-Y8yEqpRos0lzpIh3h8ZMAaiodXY=", 1164 | "dev": true, 1165 | "requires": { 1166 | "commander": "~2.9.0", 1167 | "source-map": "~0.5.1", 1168 | "uglify-to-browserify": "~1.0.0" 1169 | } 1170 | }, 1171 | "uglify-to-browserify": { 1172 | "version": "1.0.2", 1173 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 1174 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 1175 | "dev": true, 1176 | "optional": true 1177 | }, 1178 | "unicode-canonical-property-names-ecmascript": { 1179 | "version": "1.0.4", 1180 | "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", 1181 | "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", 1182 | "dev": true 1183 | }, 1184 | "unicode-match-property-ecmascript": { 1185 | "version": "1.0.4", 1186 | "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", 1187 | "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", 1188 | "dev": true, 1189 | "requires": { 1190 | "unicode-canonical-property-names-ecmascript": "^1.0.4", 1191 | "unicode-property-aliases-ecmascript": "^1.0.4" 1192 | } 1193 | }, 1194 | "unicode-match-property-value-ecmascript": { 1195 | "version": "1.0.2", 1196 | "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", 1197 | "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==", 1198 | "dev": true 1199 | }, 1200 | "unicode-property-aliases-ecmascript": { 1201 | "version": "1.0.4", 1202 | "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", 1203 | "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", 1204 | "dev": true 1205 | }, 1206 | "uniq": { 1207 | "version": "1.0.1", 1208 | "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", 1209 | "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", 1210 | "dev": true 1211 | }, 1212 | "vlq": { 1213 | "version": "1.0.0", 1214 | "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.0.tgz", 1215 | "integrity": "sha512-o3WmXySo+oI5thgqr7Qy8uBkT/v9Zr+sRyrh1lr8aWPUkgDWdWt4Nae2WKBrLsocgE8BuWWD0jLc+VW8LeU+2g==", 1216 | "dev": true 1217 | }, 1218 | "vue": { 1219 | "version": "2.5.22", 1220 | "resolved": "https://registry.npmjs.org/vue/-/vue-2.5.22.tgz", 1221 | "integrity": "sha512-pxY3ZHlXNJMFQbkjEgGVMaMMkSV1ONpz+4qB55kZuJzyJOhn6MSy/YZdzhdnumegNzVTL/Dn3Pp4UrVBYt1j/g==" 1222 | }, 1223 | "vue-template-compiler": { 1224 | "version": "2.5.22", 1225 | "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.5.22.tgz", 1226 | "integrity": "sha512-1VTw/NPTUeHNiwhkq6NkFzO7gYLjFCueBN0FX8NEiQIemd5EUMQ5hxrF7O0zCPo5tae+U9S/scETPea+hIz8Eg==", 1227 | "dev": true, 1228 | "requires": { 1229 | "de-indent": "^1.0.2", 1230 | "he": "^1.1.0" 1231 | } 1232 | }, 1233 | "vue-template-es2015-compiler": { 1234 | "version": "1.8.1", 1235 | "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.8.1.tgz", 1236 | "integrity": "sha512-mxBBMuSaPG9+NkVMbh28r8gvWQJ8UXxqDxVNeLy2KBUZiSNxZsagjYwLL8gjROb4oaaYtwRv3K8gAmw76I/U7Q==", 1237 | "dev": true 1238 | }, 1239 | "which": { 1240 | "version": "1.3.1", 1241 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1242 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1243 | "dev": true, 1244 | "requires": { 1245 | "isexe": "^2.0.0" 1246 | } 1247 | }, 1248 | "yallist": { 1249 | "version": "2.1.2", 1250 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1251 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 1252 | "dev": true 1253 | } 1254 | } 1255 | } 1256 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ecommerce-ui-nuggets", 3 | "version": "0.1.4", 4 | "description": "A library of UI components built specifically for E-commerce sites using VueJs", 5 | "keywords": [ 6 | "vuejs", 7 | "retail", 8 | "ecommerce", 9 | "ui-components", 10 | "vue-components" 11 | ], 12 | "homepage": "https://github.com/Shreerang/Vue-Nuggets", 13 | "bugs": "https://github.com/Shreerang/Vue-Nuggets/issues?utf8=%E2%9C%93&q=is%3Aissue", 14 | "license": "MIT", 15 | "author": { 16 | "name": "Shreerang Patwardhan", 17 | "email": "patwardhan.shreerang@gmail.com", 18 | "url": "https://twitter.com/shreerangp" 19 | }, 20 | "main": "dist/ecommerce-ui-nuggets.umd.js", 21 | "module": "dist/ecommerce-ui-nuggets.esm.js", 22 | "unpkg": "dist/ecommerce-ui-nuggets.min.js", 23 | "files": [ 24 | "dist/*", 25 | "src/*", 26 | "!src/lib-dev.vue" 27 | ], 28 | "scripts": { 29 | "build": "npm run build:unpkg & npm run build:es & npm run build:umd", 30 | "build:umd": "cross-env NODE_ENV=production rollup --config build/rollup.config.js --format umd --file dist/ecommerce-ui-nuggets.umd.js", 31 | "build:es": "cross-env NODE_ENV=production rollup --config build/rollup.config.js --format es --file dist/ecommerce-ui-nuggets.esm.js", 32 | "build:unpkg": "cross-env NODE_ENV=production rollup --config build/rollup.config.js --format iife --file dist/ecommerce-ui-nuggets.min.js" 33 | }, 34 | "dependencies": { 35 | "vue": "^2.5.22" 36 | }, 37 | "devDependencies": { 38 | "cross-env": "^5.2.0", 39 | "minimist": "^1.2.0", 40 | "rollup": "^0.67.4", 41 | "rollup-plugin-buble": "^0.19.6", 42 | "rollup-plugin-replace": "^2.1.0", 43 | "rollup-plugin-uglify-es": "0.0.1", 44 | "rollup-plugin-vue": "4.3.2", 45 | "vue-template-compiler": "^2.5.21" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/assets/Vue_Nuggets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shreerang/Vue-Nuggets/cd571f0c953709d870227791e94c7a7be4d7b6d1/src/assets/Vue_Nuggets.png -------------------------------------------------------------------------------- /src/assets/color_swatch.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shreerang/Vue-Nuggets/cd571f0c953709d870227791e94c7a7be4d7b6d1/src/assets/color_swatch.jpeg -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shreerang/Vue-Nuggets/cd571f0c953709d870227791e94c7a7be4d7b6d1/src/assets/logo.png -------------------------------------------------------------------------------- /src/entry.js: -------------------------------------------------------------------------------- 1 | // Import vue components 2 | import * as components from './lib-components/index'; 3 | 4 | // install function executed by Vue.use() 5 | function install(Vue) { 6 | if (install.installed) return; 7 | install.installed = true; 8 | Object.keys(components).forEach((componentName) => { 9 | Vue.component(componentName, components[componentName]); 10 | }); 11 | } 12 | 13 | // Create module definition for Vue.use() 14 | const plugin = { 15 | install, 16 | }; 17 | 18 | // To auto-install when vue is found 19 | /* global window global */ 20 | let GlobalVue = null; 21 | if (typeof window !== 'undefined') { 22 | GlobalVue = window.Vue; 23 | } else if (typeof global !== 'undefined') { 24 | GlobalVue = global.Vue; 25 | } 26 | if (GlobalVue) { 27 | GlobalVue.use(plugin); 28 | } 29 | 30 | // Default export is library as a whole, registered via Vue.use() 31 | export default plugin; 32 | 33 | // To allow individual component use, export components 34 | // each can be registered via Vue.component() 35 | export * from './lib-components/index'; 36 | -------------------------------------------------------------------------------- /src/lib-components/Alert/Alert.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 102 | 103 | 115 | -------------------------------------------------------------------------------- /src/lib-components/BagCount/BagCount.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | -------------------------------------------------------------------------------- /src/lib-components/Grid/Grid.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 43 | 44 | 84 | -------------------------------------------------------------------------------- /src/lib-components/Grid/GridItem.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | 19 | -------------------------------------------------------------------------------- /src/lib-components/QuantitySelector/QuantitySelector.spec.js: -------------------------------------------------------------------------------- 1 | import { mount, shallowMount } from '@vue/test-utils'; 2 | import QuantitySelector from '@/components/QuantitySelector/QuantitySelector.vue'; 3 | 4 | describe('Quantity Selector', () => { 5 | describe('Global component tests', () => { 6 | // The componnet renders 7 | it('renders', () => { 8 | const wrapper = shallowMount(QuantitySelector); 9 | expect(wrapper.findAll('div').length).toBe(3); 10 | expect(wrapper.findAll('input').length).toBe(1); 11 | }); 12 | 13 | // The componnet can accepts properties 14 | it('accepts properties', () => { 15 | const maxCount = 12; 16 | const wrapper = shallowMount(QuantitySelector, { 17 | propsData: { 18 | maxCount: maxCount, 19 | }, 20 | }); 21 | expect(wrapper.props().maxCount).toBe(12); 22 | wrapper.setProps({ maxCount: 15 }); 23 | expect(wrapper.props().maxCount).toEqual(15); 24 | }); 25 | }); 26 | 27 | describe('Default component state test', () => { 28 | // The component does not have to accept any properties 29 | it('Renders a default quantity selector with the max count set to 6', () => { 30 | const wrapper = shallowMount(QuantitySelector); 31 | 32 | // Make sure the - icon is greyed out 33 | expect( 34 | wrapper 35 | .findAll('div') 36 | .at(0) 37 | .find('path') 38 | .attributes('fill', '#CCC') 39 | ); 40 | 41 | // Make sure the value of input box is initialized to 1 42 | wrapper.find('input[type="number"]').setValue('1'); 43 | expect(Number(wrapper.find('input[type="number"]').element.value)).toBe(1); 44 | 45 | // Make sure the + icon is not greyed out 46 | expect( 47 | wrapper 48 | .findAll('div') 49 | .at(2) 50 | .find('path') 51 | .attributes('fill', '#000') 52 | ); 53 | 54 | // Increment the count by 1 55 | wrapper 56 | .findAll('div') 57 | .at(2) 58 | .trigger('click'); 59 | expect(wrapper.vm.countData).toBe(2); 60 | wrapper.find('input[type="number"]').setValue(wrapper.vm.countData); 61 | expect(Number(wrapper.find('input[type="number"]').element.value)).toBe(2); 62 | expect( 63 | wrapper 64 | .findAll('div') 65 | .at(0) 66 | .find('path') 67 | .attributes('fill', '#000') 68 | ); 69 | expect( 70 | wrapper 71 | .findAll('div') 72 | .at(2) 73 | .find('path') 74 | .attributes('fill', '#000') 75 | ); 76 | 77 | // Increment the count by 1 upto 6 which is the maxCount 78 | wrapper 79 | .findAll('div') 80 | .at(2) 81 | .trigger('click'); 82 | expect(wrapper.vm.countData).toBe(3); 83 | wrapper 84 | .findAll('div') 85 | .at(2) 86 | .trigger('click'); 87 | expect(wrapper.vm.countData).toBe(4); 88 | wrapper 89 | .findAll('div') 90 | .at(2) 91 | .trigger('click'); 92 | expect(wrapper.vm.countData).toBe(5); 93 | wrapper 94 | .findAll('div') 95 | .at(2) 96 | .trigger('click'); 97 | expect(wrapper.vm.countData).toBe(6); 98 | wrapper.find('input[type="number"]').setValue(wrapper.vm.countData); 99 | expect(Number(wrapper.find('input[type="number"]').element.value)).toBe(6); 100 | expect( 101 | wrapper 102 | .findAll('div') 103 | .at(0) 104 | .find('path') 105 | .attributes('fill', '#000') 106 | ); 107 | expect( 108 | wrapper 109 | .findAll('div') 110 | .at(2) 111 | .find('path') 112 | .attributes('fill', '#CCC') 113 | ); 114 | 115 | // Increment the count by 1, which will try and set the countData to more than maxCount 116 | wrapper 117 | .findAll('div') 118 | .at(2) 119 | .trigger('click'); 120 | expect(wrapper.vm.countData).toBe(6); 121 | wrapper.find('input[type="number"]').setValue(wrapper.vm.countData); 122 | expect(Number(wrapper.find('input[type="number"]').element.value)).toBe(6); 123 | expect( 124 | wrapper 125 | .findAll('div') 126 | .at(0) 127 | .find('path') 128 | .attributes('fill', '#000') 129 | ); 130 | expect( 131 | wrapper 132 | .findAll('div') 133 | .at(2) 134 | .find('path') 135 | .attributes('fill', '#CCC') 136 | ); 137 | 138 | // Decrement the count by 1 139 | wrapper 140 | .findAll('div') 141 | .at(1) 142 | .trigger('click'); 143 | expect(wrapper.vm.countData).toBe(5); 144 | wrapper.find('input[type="number"]').setValue(wrapper.vm.countData); 145 | expect(Number(wrapper.find('input[type="number"]').element.value)).toBe(5); 146 | expect( 147 | wrapper 148 | .findAll('div') 149 | .at(0) 150 | .find('path') 151 | .attributes('fill', '#000') 152 | ); 153 | expect( 154 | wrapper 155 | .findAll('div') 156 | .at(2) 157 | .find('path') 158 | .attributes('fill', '#000') 159 | ); 160 | 161 | // Decrement the count by 1 upto 1 which is the minCount 162 | wrapper 163 | .findAll('div') 164 | .at(1) 165 | .trigger('click'); 166 | expect(wrapper.vm.countData).toBe(4); 167 | wrapper 168 | .findAll('div') 169 | .at(1) 170 | .trigger('click'); 171 | expect(wrapper.vm.countData).toBe(3); 172 | wrapper 173 | .findAll('div') 174 | .at(1) 175 | .trigger('click'); 176 | expect(wrapper.vm.countData).toBe(2); 177 | wrapper 178 | .findAll('div') 179 | .at(1) 180 | .trigger('click'); 181 | expect(wrapper.vm.countData).toBe(1); 182 | wrapper.find('input[type="number"]').setValue(wrapper.vm.countData); 183 | expect(Number(wrapper.find('input[type="number"]').element.value)).toBe(1); 184 | expect( 185 | wrapper 186 | .findAll('div') 187 | .at(0) 188 | .find('path') 189 | .attributes('fill', '#CCC') 190 | ); 191 | expect( 192 | wrapper 193 | .findAll('div') 194 | .at(2) 195 | .find('path') 196 | .attributes('fill', '#000') 197 | ); 198 | 199 | // Decrement the count by 1, which will try and set the countData to less than minCount 200 | wrapper 201 | .findAll('div') 202 | .at(1) 203 | .trigger('click'); 204 | expect(wrapper.vm.countData).toBe(1); 205 | wrapper.find('input[type="number"]').setValue(wrapper.vm.countData); 206 | expect(Number(wrapper.find('input[type="number"]').element.value)).toBe(1); 207 | expect( 208 | wrapper 209 | .findAll('div') 210 | .at(0) 211 | .find('path') 212 | .attributes('fill', '#CCC') 213 | ); 214 | expect( 215 | wrapper 216 | .findAll('div') 217 | .at(2) 218 | .find('path') 219 | .attributes('fill', '#000') 220 | ); 221 | }); 222 | }); 223 | }); 224 | -------------------------------------------------------------------------------- /src/lib-components/QuantitySelector/QuantitySelector.vue: -------------------------------------------------------------------------------- 1 | 52 | 53 | 159 | 160 | 230 | -------------------------------------------------------------------------------- /src/lib-components/ScrollToTop/ScrollToTop.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 63 | 64 | 79 | -------------------------------------------------------------------------------- /src/lib-components/ScrollToTop/up-arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/lib-components/StarRating/PartialStar.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 59 | 60 | 62 | -------------------------------------------------------------------------------- /src/lib-components/StarRating/Star.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 35 | 36 | 38 | -------------------------------------------------------------------------------- /src/lib-components/StarRating/StarRating.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 83 | 84 | 96 | -------------------------------------------------------------------------------- /src/lib-components/VarianceSelector/VarianceSelector.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 117 | 118 | 173 | -------------------------------------------------------------------------------- /src/lib-components/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/prefer-default-export */ 2 | import Alert from './Alert/Alert.vue'; 3 | import BagCount from './BagCount/BagCount.vue'; 4 | import Grid from './Grid/Grid.vue'; 5 | import GridItem from './Grid/GridItem.vue'; 6 | import QuantitySelector from './QuantitySelector/QuantitySelector.vue'; 7 | import ScrollToTop from './ScrollToTop/ScrollToTop.vue'; 8 | import StarRating from './StarRating/StarRating.vue'; 9 | import Star from './StarRating/Star.vue'; 10 | import PartialStar from './StarRating/PartialStar.vue'; 11 | import VarianceSelector from './VarianceSelector/VarianceSelector.vue'; 12 | 13 | export { 14 | Alert, 15 | BagCount, 16 | Grid, 17 | GridItem, 18 | QuantitySelector, 19 | ScrollToTop, 20 | StarRating, 21 | Star, 22 | PartialStar, 23 | VarianceSelector, 24 | }; 25 | -------------------------------------------------------------------------------- /src/lib-dev.vue: -------------------------------------------------------------------------------- 1 | 299 | 300 | 406 | 407 | 464 | --------------------------------------------------------------------------------