commit 8e72ca4939ea95f0b924b83bcd75e87207d5f6ce Author: krish@sentientgeeks.com Date: Wed Mar 3 16:55:40 2021 +0530 initial commit diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1d1f035 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Angular University + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..eb5adc8 --- /dev/null +++ b/README.md @@ -0,0 +1,67 @@ + +## Important Information +This repository is exclusively meant for presenting samples of code. + +The Files and Codes present in this repository are part of a running project. In order to ensure the security of the project several files have been intentionally removed. The codes are exclusively for viewing purpose and will not execute properly if tried. + +# Installation pre-requisites + +For taking the course we recommend installing Node 12. These are some tutorials to install node in different operating systems: + +- [Install Node and NPM on Windows](https://www.youtube.com/watch?v=8ODS6RM6x7g) +- [Install Node and NPM on Linux](https://www.youtube.com/watch?v=yUdHk-Dk_BY) +- [Install Node and NPM on Mac](https://www.youtube.com/watch?v=Imj8PgG3bZU) + +To easily switch between node versions on your machine, we recommend using a node virtual environment tool such as [nave](https://www.npmjs.com/package/nave) or [nvm-windows](https://github.com/coreybutler/nvm-windows), depending on your operating system. + +For example, here is how you switch to a new node version using nave: + + # note that you don't even need to update your node version before installing nave + npm install -g nave + + nave use 12.3.1 + node -v + v12.3.1 + +# Installing the Angular CLI + +With the following command the angular-cli will be installed globally in your machine: + + npm install -g @angular/cli + + +# How To install this repository + +We can install the master branch using the following commands: + + git clone https://github.com/angular-university/ngrx-course.git + +This repository is made of several separate npm modules, that are installable separately. For example, to run the au-input module, we can do the following: + + cd ngrx-course + npm install + +Its also possible to install the modules as usual using npm: + + npm install + +This should take a couple of minutes. If there are issues, please post the complete error message in the Questions section of the course. + +# To Run the Development Backend Server + +We can start the sample application backend with the following command: + + npm run server + +This is a small Node REST API server. + +# To run the Development UI Server + +To run the frontend part of our code, we will use the Angular CLI: + + npm start + +The application is visible at port 4200: [http://localhost:4200](http://localhost:4200) + + + diff --git a/angular.json b/angular.json new file mode 100644 index 0000000..fddb5c2 --- /dev/null +++ b/angular.json @@ -0,0 +1,143 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "angular-ngrx-course": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "aot": true, + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "tsConfig": "src/tsconfig.app.json", + "polyfills": "src/polyfills.ts", + "assets": [ + "src/assets", + "src/favicon.ico" + ], + "styles": [ + "src/assets/styles/app.scss" + ], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "anyComponentStyle", + "maximumWarning": "6kb" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "angular-ngrx-course:build" + }, + "configurations": { + "production": { + "browserTarget": "angular-ngrx-course:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "angular-ngrx-course:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "karmaConfig": "./karma.conf.js", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.spec.json", + "scripts": [], + "styles": [ + "src/styles.scss" + ], + "assets": [ + "src/assets", + "src/favicon.ico" + ] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "src/tsconfig.app.json", + "src/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "angular-ngrx-course-e2e": { + "root": "", + "sourceRoot": "", + "projectType": "application", + "architect": { + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "./protractor.conf.js", + "devServerTarget": "angular-ngrx-course:serve" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "e2e/tsconfig.e2e.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + } + }, + "defaultProject": "angular-ngrx-course", + "schematics": { + "@ngrx/schematics:component": { + "prefix": "", + "styleext": "scss" + }, + "@ngrx/schematics:directive": { + "prefix": "" + } + }, + "cli": { + "defaultCollection": "@ngrx/schematics", + "analytics": "78da76fb-38f9-4848-a7fe-1767a6672d4a" + } +} \ No newline at end of file diff --git a/e2e/app.po.ts b/e2e/app.po.ts new file mode 100644 index 0000000..82ea75b --- /dev/null +++ b/e2e/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get('/'); + } + + getParagraphText() { + return element(by.css('app-root h1')).getText(); + } +} diff --git a/e2e/tsconfig.e2e.json b/e2e/tsconfig.e2e.json new file mode 100644 index 0000000..8cc9c0d --- /dev/null +++ b/e2e/tsconfig.e2e.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "baseUrl": "./", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000..84af9d1 --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,33 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client:{ + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ], + fixWebpackSourcePaths: true + }, + angularCli: { + environment: 'dev' + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..c422b68 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,15329 @@ +{ + "name": "sgeeks-starter-v2", + "version": "0.0.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.1000.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1000.0.tgz", + "integrity": "sha512-luzBYe7t994ebq6xIfYJudxOkMBO0bywafk6sQqb+bOaBQAran4orF1R/zEx6f8TJzEoXELjUvxm/ePSqZdpKg==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "rxjs": "6.5.5" + }, + "dependencies": { + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + } + } + }, + "@angular-devkit/build-angular": { + "version": "0.1000.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1000.0.tgz", + "integrity": "sha512-bU3Xq0evtX1xqD0KSY1lSwDQkz82AKZSKFv7fq+OL6+xrALG5DTtZq2SBwpTsy5AQ/Aq027GX2eMTrczWzQ4KA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1000.0", + "@angular-devkit/build-optimizer": "0.1000.0", + "@angular-devkit/build-webpack": "0.1000.0", + "@angular-devkit/core": "10.0.0", + "@babel/core": "7.9.6", + "@babel/generator": "7.9.6", + "@babel/plugin-transform-runtime": "7.9.6", + "@babel/preset-env": "7.9.6", + "@babel/runtime": "7.9.6", + "@babel/template": "7.8.6", + "@jsdevtools/coverage-istanbul-loader": "3.0.3", + "@ngtools/webpack": "10.0.0", + "ajv": "6.12.2", + "autoprefixer": "9.8.0", + "babel-loader": "8.1.0", + "browserslist": "^4.9.1", + "cacache": "15.0.3", + "caniuse-lite": "^1.0.30001032", + "circular-dependency-plugin": "5.2.0", + "copy-webpack-plugin": "6.0.2", + "core-js": "3.6.4", + "css-loader": "3.5.3", + "cssnano": "4.1.10", + "file-loader": "6.0.0", + "find-cache-dir": "3.3.1", + "glob": "7.1.6", + "jest-worker": "26.0.0", + "karma-source-map-support": "1.4.0", + "less-loader": "6.1.0", + "license-webpack-plugin": "2.2.0", + "loader-utils": "2.0.0", + "mini-css-extract-plugin": "0.9.0", + "minimatch": "3.0.4", + "open": "7.0.4", + "parse5": "4.0.0", + "pnp-webpack-plugin": "1.6.4", + "postcss": "7.0.31", + "postcss-import": "12.0.1", + "postcss-loader": "3.0.0", + "raw-loader": "4.0.1", + "regenerator-runtime": "0.13.5", + "resolve-url-loader": "3.1.1", + "rimraf": "3.0.2", + "rollup": "2.10.9", + "rxjs": "6.5.5", + "sass": "1.26.5", + "sass-loader": "8.0.2", + "semver": "7.3.2", + "source-map": "0.7.3", + "source-map-loader": "1.0.0", + "source-map-support": "0.5.19", + "speed-measure-webpack-plugin": "1.3.3", + "style-loader": "1.2.1", + "stylus": "0.54.7", + "stylus-loader": "3.0.2", + "terser": "4.7.0", + "terser-webpack-plugin": "3.0.1", + "tree-kill": "1.2.2", + "webpack": "4.43.0", + "webpack-dev-middleware": "3.7.2", + "webpack-dev-server": "3.11.0", + "webpack-merge": "4.2.2", + "webpack-sources": "1.4.3", + "webpack-subresource-integrity": "1.4.1", + "worker-plugin": "4.0.3" + }, + "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.1000.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1000.0.tgz", + "integrity": "sha512-WrC/PX/ORAoqKP6FsrWsmzfic0mHyLAZ6XgNNr3RY4xxvBe4+K7FGoG+PaIwD4tILvO6QwwJ1wwBbnGIqQLIHA==", + "dev": true, + "requires": { + "loader-utils": "2.0.0", + "source-map": "0.7.3", + "tslib": "2.0.0", + "webpack-sources": "1.4.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==", + "dev": true + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.1000.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1000.0.tgz", + "integrity": "sha512-5SGcc9YzGK1DQ3/2/gOnVpJIwmOvywE9OB/J7IFR1uRYxQ4fSdOZvHZJ4DvqwfFExGIFeSBnfxIs8nefT+s8Nw==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1000.0", + "@angular-devkit/core": "10.0.0", + "rxjs": "6.5.5" + }, + "dependencies": { + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + } + } + }, + "@angular-devkit/core": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.0.tgz", + "integrity": "sha512-IvX9IMaCjDkN9vDVnYcgWbSBinlUUb7jdFhDGeTtK6rGSnjX1GoLvWneVI2hoccS07fPbnfMoYXBoZLwVxiIxw==", + "dev": true, + "requires": { + "ajv": "6.12.2", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.5.5", + "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + } + } + }, + "@angular-devkit/schematics": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.2.0.tgz", + "integrity": "sha512-TQI5NnE6iM3ChF5gZQ9qb+lZgMWa7aLoF5ksOyT3zrmOuICiQYJhA6SsjV95q7J4M55qYymwBib8KTqU/xuQww==", + "requires": { + "@angular-devkit/core": "10.2.0", + "ora": "5.0.0", + "rxjs": "6.6.2" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.0.tgz", + "integrity": "sha512-XAszFhSF3mZw1VjoOsYGbArr5NJLcStjOvcCGjBPl1UBM2AKpuCQXHxI9XJGYKL3B93Vp5G58d8qkHvamT53OA==", + "requires": { + "ajv": "6.12.4", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.2", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "rxjs": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@angular/animations": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.0.2.tgz", + "integrity": "sha512-3fMR574KnaeAon7ZlwYCB2qkUoZ255Y2KwU6Z/ki37U66QZc8XMqf/d4oUiTZgLsJG4a5Whse0IX8Jz5/HAvQQ==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + } + } + }, + "@angular/cdk": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-10.0.1.tgz", + "integrity": "sha512-tEgaTDQplptbOf4cHHdVScH0h5QNvkWDhabAWpWaT4/dVXEsp+p2E9Pzkemesi/gNmUIetVjGaicX5VqsijZSQ==", + "requires": { + "parse5": "^5.0.0", + "tslib": "^2.0.0" + } + }, + "@angular/cli": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.0.0.tgz", + "integrity": "sha512-I+2cltQCmThgrnHwsG5AX0hQ9z6rK/8ysRWWeiJXHtEtqupW9eNzXX1QfXWxWB3o6oIKgijvnLlp04BUlWCyXA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1000.0", + "@angular-devkit/core": "10.0.0", + "@angular-devkit/schematics": "10.0.0", + "@schematics/angular": "10.0.0", + "@schematics/update": "0.1000.0", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.1.1", + "ini": "1.3.5", + "inquirer": "7.1.0", + "npm-package-arg": "8.0.1", + "npm-pick-manifest": "6.1.0", + "open": "7.0.4", + "pacote": "9.5.12", + "read-package-tree": "5.3.1", + "rimraf": "3.0.2", + "semver": "7.3.2", + "symbol-observable": "1.2.0", + "universal-analytics": "0.4.20", + "uuid": "8.1.0" + }, + "dependencies": { + "@angular-devkit/schematics": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.0.0.tgz", + "integrity": "sha512-FJ/dY18M+cnAT9RkVjVRJ0PMFZci3ok0WoOosW25Fk68jwNSbGCeF8k8NcD6YE60+CfF4/0LxQWgFagr/wdEhw==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "ora": "4.0.4", + "rxjs": "6.5.5" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "ora": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.4.tgz", + "integrity": "sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "uuid": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz", + "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==", + "dev": true + } + } + }, + "@angular/common": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.0.2.tgz", + "integrity": "sha512-zpNB2XD6jinXZjfihoO5Q1Yg7urfpZTt/fitdmwFHCcQ/1qZ9T2BVh8+VqVRkh6Pjxmtvu0uPnJ1a/aZ5f9r9A==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + } + } + }, + "@angular/compiler": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.2.tgz", + "integrity": "sha512-TNE5ESDlRCVneb/K62HOEgLpxuZZTlw8RcmOy5vt3SngEVc576OE/aYsEA6MCwTlqj16GLSS3jGm9HBJcBKUVw==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + } + } + }, + "@angular/compiler-cli": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.0.2.tgz", + "integrity": "sha512-LGX86k1hOyaw5aPCjFfoLuPhVLKMENOdCBeNBzZB+H2CUGHfv8OWFB1EzjZO1N07VGR7JoMx9ZWSP7ornhuS4Q==", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "fs-extra": "4.0.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "semver": "^6.3.0", + "source-map": "^0.6.1", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.0.0", + "yargs": "15.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", + "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.0" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "@angular/core": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.0.2.tgz", + "integrity": "sha512-r4M1D2NOdkmmFyvYLHRYSIBKTGNXQarZHDZcm5oEq2eTsRVe2u9MYIeOpHKeVQCQK7XKQVB13IZQP3XpUvljFg==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + } + } + }, + "@angular/flex-layout": { + "version": "10.0.0-beta.32", + "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-10.0.0-beta.32.tgz", + "integrity": "sha512-JvuY4dUoy5jyCTIrFiq7n30Znakh1pD3nbg0h0hs2r3t1OiDQb0ZSI1wcumosG/vYHsuJQTuNhbfaIZzA1x8nA==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/forms": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.0.2.tgz", + "integrity": "sha512-qnfApb5Q58SFdl8za8i6ijvP0UfVGxxTtIVnf8czVU5Jz5/KYDbPeChVw/aPl3hfXq8jt0Q6Yl99aAm/BNyhpQ==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + } + } + }, + "@angular/language-service": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-10.0.2.tgz", + "integrity": "sha512-kEMJ3DkprpoGJvEjvH/PZrBKtgCbLtFYtrXHRDy2+92vgCT0Xz6TwzZ2qlwlQSijffOgsV5LwdjI4oxpgVKReQ==", + "dev": true + }, + "@angular/material": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-10.0.1.tgz", + "integrity": "sha512-4xGIupOiPbyYG/tTbVhgjATRZSRf+Xj2FGkX3csSlIOvhrFtN1B9gTlcbOjzWHPpWTFChZALzMXA/841KA9QqA==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/material-moment-adapter": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-10.0.1.tgz", + "integrity": "sha512-cVcn+GZNPxnKtf8wTnjS6pLO3WPHYXZXbabldyGbPOqDa+BrKoZ5+MHohGGkyy5NG3GFwqB9RjfSBK4szGNFTA==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@angular/platform-browser": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.0.2.tgz", + "integrity": "sha512-FLS3fYSuWvrDc7PiVCvs4joWZZxDe9+alJi90Sub1oBS/EnxmZpkS0Gr7zQv4MjAvVhNCVoTzL3CaV/SIoZqaw==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + } + } + }, + "@angular/platform-browser-dynamic": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.2.tgz", + "integrity": "sha512-R1rt1/Ynm0DHgzMBcduCPoDg2y3MrYZVgT+N0DLobr2nCaVD74vGsJBVCRv7/m1sdCxyhPlOvq8Bm5sRauw2fw==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + } + } + }, + "@angular/router": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.0.2.tgz", + "integrity": "sha512-IcA3W+r5T0NC8TM4J9F0VOxG0wr7nJOSef6Qek6utZd6ByLlXxOhBrPIC5Ou+QNZeg9OuI2FBt6coea9jgmNOA==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + } + } + }, + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.4.tgz", + "integrity": "sha512-t+rjExOrSVvjQQXNp5zAIYDp00KjdvGl/TpDX5REPr0S9IAIPQMTilcfG6q8c0QFmj9lSTVySV2VTsyggvtNIw==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/core": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz", + "integrity": "sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.6", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.6", + "@babel/parser": "^7.9.6", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", + "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", + "dev": true, + "requires": { + "@babel/types": "^7.9.6", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/helper-define-map": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.4.tgz", + "integrity": "sha512-nIij0oKErfCnLUCWaCaHW0Bmtl2RO9cN7+u2QT8yqTywgALKlyUVOvHDElh+b5DwVC6YB1FOYFOTWcN/+41EDA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.4", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", + "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", + "dev": true, + "requires": { + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + } + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", + "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz", + "integrity": "sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.4.tgz", + "integrity": "sha512-inWpnHGgtg5NOF0eyHlC0/74/VkdRITY9dtTpB2PrxKKn+AkVMRiZz/Adrx+Ssg+MLDesi2zohBW6MVq6b4pOQ==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", + "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + } + } + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + } + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, + "@babel/parser": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz", + "integrity": "sha512-MJbxGSmejEFVOANAezdO39SObkURO5o/8b6fSH6D1pi9RZQt+ldppKPXfqgUWpSQ9asM6xaSaSJIaeWMDRP0Zg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz", + "integrity": "sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz", + "integrity": "sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.4.tgz", + "integrity": "sha512-J3b5CluMg3hPUii2onJDRiaVbPtKFPLEaV5dOPY5OeAbDi1iU/UbbFFTgwb7WnanaDy7bjU35kc26W3eM5Qa0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.4.tgz", + "integrity": "sha512-3Fw+H3WLUrTlzi3zMiZWp3AR4xadAEMv6XRCYnd5jAlLM61Rn+CRJaZMaNvIpcJpQ3vs1kyifYvEVPFfoSkKOA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.4.tgz", + "integrity": "sha512-Tb28LlfxrTiOTGtZFsvkjpyjCl9IoaRI52AEU/VIwOwvDQWtbNJsAqTXzh+5R7i74e/OZHH2c2w2fsOqAfnQYQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.4.tgz", + "integrity": "sha512-RurVtZ/D5nYfEg0iVERXYKEgDFeesHrHfx8RT05Sq57ucj2eOYAP6eu5fynL4Adju4I/mP/I6SO0DqNWAXjfLQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.6.tgz", + "integrity": "sha512-qcmiECD0mYOjOIt8YHNsAP1SxPooC/rDmfmiSK9BNY72EitdSc7l44WTEklaWuFtbOEBjNhWWyph/kOImbNJ4w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz", + "integrity": "sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.4.tgz", + "integrity": "sha512-4NErciJkAYe+xI5cqfS8pV/0ntlY5N5Ske/4ImxAVX7mk9Rxt2bwDTGv1Msc2BRJvWQcmYEC+yoMLdX22aE4VQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.6.tgz", + "integrity": "sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.9.6", + "@babel/helper-compilation-targets": "^7.9.6", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-numeric-separator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.9.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.9.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.9.5", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.9.5", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.9.0", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.9.6", + "@babel/plugin-transform-modules-commonjs": "^7.9.6", + "@babel/plugin-transform-modules-systemjs": "^7.9.6", + "@babel/plugin-transform-modules-umd": "^7.9.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.9.5", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.7", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.9.6", + "browserslist": "^4.11.1", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", + "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + } + } + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/traverse": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@jsdevtools/coverage-istanbul-loader": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.3.tgz", + "integrity": "sha512-TAdNkeGB5Fe4Og+ZkAr1Kvn9by2sfL44IAHFtxlh1BA1XJ5cLpO9iSNki5opWESv3l3vSHsZ9BNKuqFKbEbFaA==", + "dev": true, + "requires": { + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.1", + "loader-utils": "^1.4.0", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.6.4" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@ngrx/data": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/data/-/data-8.0.1.tgz", + "integrity": "sha512-+vXN2czCi8qKNnZvV452TwKYbv5WrC4d5RIR5k5QrkbS8gL6v2hOB9aUo+1jbZ+r4wLxeUtqHzPrBC174PdXJA==" + }, + "@ngrx/effects": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-8.0.1.tgz", + "integrity": "sha512-f15SjzZ670HdHVpu3byOiP5R6MOxh/DMQgP8PynKtmadmkKkM69imGsp+8qDEQNABw5O8oJGAn8aLm76QGPnjQ==" + }, + "@ngrx/entity": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/entity/-/entity-8.0.1.tgz", + "integrity": "sha512-mdsrKHxo/uYP+sIjgIWmVbIKrLpqvcUlUamV+QfMPTxQXN9nmFsvNsemcOHN1fCklaGWzLo0tfoF/NVwdhJb5w==" + }, + "@ngrx/router-store": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-8.0.1.tgz", + "integrity": "sha512-ItgyqjPtjpUmMRKe48pyBMzrntimJwImttxqRa0uMWooPGIJB6zAmbgjn2AtyUqX63IRl8BGT8V3pJ4FLrxIow==" + }, + "@ngrx/schematics": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/schematics/-/schematics-8.0.1.tgz", + "integrity": "sha512-BnHYRHkzAqXKDRQW5WZoSOwxJkHmwsd/bEJ5wRinplVRSUJY0BYgCVe1by1hj37/FAsRH5E6WBtoOgUyn0i/MQ==", + "dev": true + }, + "@ngrx/store": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-8.0.1.tgz", + "integrity": "sha512-B6HY8TCFZ4+bUfJAJatF42+F33Qboo7zKc+gxTi6eEioKvNqWkb22K4De5HV2j/l/blXvMOPMSO1Rf/sGqID0w==" + }, + "@ngrx/store-devtools": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-8.0.1.tgz", + "integrity": "sha512-TxOksSARaQ1hCZM0/qMCun6axbSFuhSEmuW9YLRhuU5m3gvJN4cr5tk960DDVGl8/06YX6Q2CQ7uIgx5qCwbsg==" + }, + "@ngtools/webpack": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.0.0.tgz", + "integrity": "sha512-2mnuzkCokn84PrBIiSwUqZImd5uKdsdZcpnuvgABmbxe3bAPxbOgzud/bLxG1/ynLvk/vd/FCNeDcY6HylB8OQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "enhanced-resolve": "4.1.1", + "rxjs": "6.5.5", + "webpack-sources": "1.4.3" + }, + "dependencies": { + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "@schematics/angular": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.0.0.tgz", + "integrity": "sha512-m7Pxz4guAMbe7NASKCPUNxvUX/LeieDjGsXwIt09tVE4dEi9yqJP5zq8kOnZEiLKKflP7GoB65RNex4dTxsydw==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "@angular-devkit/schematics": "10.0.0" + }, + "dependencies": { + "@angular-devkit/schematics": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.0.0.tgz", + "integrity": "sha512-FJ/dY18M+cnAT9RkVjVRJ0PMFZci3ok0WoOosW25Fk68jwNSbGCeF8k8NcD6YE60+CfF4/0LxQWgFagr/wdEhw==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "ora": "4.0.4", + "rxjs": "6.5.5" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "ora": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.4.tgz", + "integrity": "sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@schematics/update": { + "version": "0.1000.0", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1000.0.tgz", + "integrity": "sha512-snjz7sQCOn4Xi66XQREXZx9K6R/vAnUfdyO5nXekls8+E+MIowlP+gqHM0whi8qJDwCLd9maYmeVsD6XZaGImQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "@angular-devkit/schematics": "10.0.0", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "npm-package-arg": "^8.0.0", + "pacote": "9.5.12", + "rxjs": "6.5.5", + "semver": "7.3.2", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "@angular-devkit/schematics": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.0.0.tgz", + "integrity": "sha512-FJ/dY18M+cnAT9RkVjVRJ0PMFZci3ok0WoOosW25Fk68jwNSbGCeF8k8NcD6YE60+CfF4/0LxQWgFagr/wdEhw==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.0.0", + "ora": "4.0.4", + "rxjs": "6.5.5" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "ora": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.4.tgz", + "integrity": "sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@swimlane/ngx-datatable": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@swimlane/ngx-datatable/-/ngx-datatable-18.0.0.tgz", + "integrity": "sha512-secqjzlLpGJqoXjcoCoTf8ClnVlZAENJcXvuBfseGenOD+evGNXc4UTZhwCPDUBlJ4xnMZHUWK6IVk5sXe+WlQ==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@types/body-parser": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", + "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/chart.js": { + "version": "2.9.27", + "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.27.tgz", + "integrity": "sha512-b3ho2RpPLWzLzOXKkFwpvlRDEVWQrCknu2/p90mLY5v2DO8owk0OwWkv4MqAC91kJL52bQGXkVw/De+N/0/1+A==", + "requires": { + "moment": "^2.10.2" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/connect": { + "version": "3.4.32", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", + "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.1.tgz", + "integrity": "sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.6.tgz", + "integrity": "sha512-8wr3CA/EMybyb6/V8qvTRKiNkPmgUA26uA9XWD6hlA0yFDuqi4r2L0C2B0U2HAYltJamoYJszlkaWM31vrKsHg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/range-parser": "*" + } + }, + "@types/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "2.5.54", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.54.tgz", + "integrity": "sha512-B9YofFbUljs19g5gBKUYeLIulsh31U5AK70F41BImQRHEZQGm4GcN922UvnYwkduMqbC/NH+9fruWa/zrqvHIg==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.6.tgz", + "integrity": "sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "dev": true + }, + "@types/mime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", + "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "12.12.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.27.tgz", + "integrity": "sha512-odQFl/+B9idbdS0e8IxDl2ia/LP8KZLXhV3BUeI98TrZp0uoIzQPhGd+5EtzHmT0SMOIaPd7jfz6pOHLWTtl7A==", + "dev": true + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "dev": true + }, + "@types/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/mime": "*" + } + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/webpack-sources": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", + "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "adjust-sourcemap-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", + "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", + "dev": true, + "requires": { + "assert": "1.4.1", + "camelcase": "5.0.0", + "loader-utils": "1.2.3", + "object-path": "0.11.4", + "regex-parser": "2.2.10" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + } + } + }, + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.0.tgz", + "integrity": "sha512-eyoaac3btgU8eJlvh01En8OCKzRqlLe2G5jDsCr3RiE2uLGMEEB1aaGwVVpwR8M95956tGH6R+9edC++OvzaVw==", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "app-root-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", + "dev": true + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz", + "integrity": "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001061", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.30", + "postcss-value-parser": "^4.1.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "browserify-sign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.2.tgz", + "integrity": "sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001088", + "electron-to-chromium": "^1.3.483", + "escalade": "^3.0.1", + "node-releases": "^1.1.58" + } + }, + "browserstack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.0.tgz", + "integrity": "sha512-HJDJ0TSlmkwnt9RZ+v5gFpa1XZTBYTj0ywvLwJ3241J7vMw2jAsGNVhKHtmCOyg+VxeLZyaibO9UL71AsUeDIw==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacache": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.3.tgz", + "integrity": "sha512-bc3jKYjqv7k4pWh7I/ixIjfcjPul4V4jme/WbjvwGS5LzoPL/GzXr4C5EgPNLO/QEZl9Oi61iGitYEdwcrwLCQ==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "move-file": "^2.0.0", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "tar": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", + "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001091", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001091.tgz", + "integrity": "sha512-ECd8gfBBpv0GKsEYY5052+8PBjExiugDoi3dfkJcxujh2mf7kiuDvb1o27GXlOOGopKiIPYEX8XDPYj7eo3E9w==", + "dev": true + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + } + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-dependency-plugin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", + "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==" + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "codelyzer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.1.tgz", + "integrity": "sha512-awBZXFcJUyC5HMYXiHzjr3D24tww2l1D1OqtfA9vUhEtYr32a65A+Gblm/OvsO+HuKLYzn8EDMw1inSM3VbxWA==", + "dev": true, + "requires": { + "app-root-path": "^2.2.1", + "aria-query": "^3.0.0", + "axobject-query": "2.0.2", + "css-selector-tokenizer": "^0.7.1", + "cssauron": "^1.4.0", + "damerau-levenshtein": "^1.0.4", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "dev": true, + "requires": { + "arity-n": "^1.0.4" + } + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + } + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.2.tgz", + "integrity": "sha512-9Gm8X0c6eXlKnmltMPFCBeGOKjtcRIyTt4VaO3k1TkNgVTe5Ov2lYsYVuyLp0kp8DItO3apewflM+1GYgh6V2Q==", + "dev": true, + "requires": { + "cacache": "^15.0.4", + "fast-glob": "^3.2.2", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^2.3.0", + "schema-utils": "^2.7.0", + "serialize-javascript": "^3.1.0", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "cacache": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.4.tgz", + "integrity": "sha512-YlnKQqTbD/6iyoJvEY3KJftjrdBYroCbxxYXzhOzsFLWlp6KX4BOlEf4mTx0cMUfVaTS3ENL2QtDWeRYoGLkkw==", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "tar": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", + "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + }, + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-loader": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.3.tgz", + "integrity": "sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.27", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.3", + "schema-utils": "^2.6.6", + "semver": "^6.3.0" + }, + "dependencies": { + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "requires": { + "css": "^2.0.0" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + } + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-what": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", + "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", + "dev": true + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" + } + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.39" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "dev": true, + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "damerau-levenshtein": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "date-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.483", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.483.tgz", + "integrity": "sha512-+05RF8S9rk8S0G8eBCqBRBaRq7+UN3lDs2DAvnG8SBSgQO3hjy0+qt4CmRk5eiuGbTcaicgXfPmBi31a+BD3lg==", + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", + "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "0.3.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "^7.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "engine.io-client": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz", + "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", + "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escalade": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", + "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "fastq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz", + "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.5" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "dev": true, + "requires": { + "debug": "^3.2.6" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } + } + }, + "fs-minipass": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", + "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "highlight.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.3.1.tgz", + "integrity": "sha512-jeW8rdPdhshYKObedYg5XGbpVgb1/DT4AHvDFXhkU7UnGSIjy9kkJ7zHG7qplhFHMitTSzh5/iClKQk3Kb2RFQ==" + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.4.tgz", + "integrity": "sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==", + "dev": true, + "requires": { + "lru-cache": "^5.1.1" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-entities": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", + "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz", + "integrity": "sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g==", + "dev": true, + "requires": { + "colors": "1.4.0" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "jest-worker": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", + "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", + "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "karma": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/karma/-/karma-5.0.9.tgz", + "integrity": "sha512-dUA5z7Lo7G4FRSe1ZAXqOINEEWxmCjDBbfRBmU/wYlSMwxUQJP/tEEP90yJt3Uqo03s9rCgVnxtlfq+uDhxSPg==", + "dev": true, + "requires": { + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.0.0", + "colors": "^1.4.0", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "flatted": "^2.0.2", + "glob": "^7.1.6", + "graceful-fs": "^4.2.4", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.6", + "lodash": "^4.17.15", + "log4js": "^6.2.1", + "mime": "^2.4.5", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^2.3.0", + "source-map": "^0.6.1", + "tmp": "0.2.1", + "ua-parser-js": "0.7.21", + "yargs": "^15.3.1" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "dev": true, + "requires": { + "which": "^1.2.1" + } + }, + "karma-cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", + "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", + "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^3.0.2", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-3.3.1.tgz", + "integrity": "sha512-Nxh7eX9mOQMyK0VSsMxdod+bcqrR/ikrmEiWj5M6fwuQ7oI+YEF1FckaDsWfs6TIpULm9f0fTKMjF7XcrvWyqQ==", + "dev": true, + "requires": { + "jasmine-core": "^3.5.0" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", + "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", + "dev": true + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "less": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/less/-/less-3.11.3.tgz", + "integrity": "sha512-VkZiTDdtNEzXA3LgjQiC3D7/ejleBPFVvq+aRI9mIj+Zhmif5TvFPM244bT4rzkvOCvJ9q4zAztok1M7Nygagw==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "less-loader": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-6.1.0.tgz", + "integrity": "sha512-/jLzOwLyqJ7Kt3xg5sHHkXtOyShWwFj410K9Si9WO+/h8rmYxxkSR0A3/hFEntWudE20zZnWMtpMYnLzqTVdUA==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "less": "^3.11.1", + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.6" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "license-webpack-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.2.0.tgz", + "integrity": "sha512-XPsdL/0brSHf+7dXIlRqotnCQ58RX2au6otkOg4U3dm8uH+Ka/fW4iukEs95uXm+qKe/SBs+s1Ll/aQddKG+tg==", + "dev": true, + "requires": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash-es": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", + "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log4js": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "dev": true, + "requires": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "make-fetch-happen": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + }, + "dependencies": { + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-pipeline": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz", + "integrity": "sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ==", + "dev": true, + "requires": { + "path-exists": "^4.0.0" + }, + "dependencies": { + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "ng2-charts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-2.4.2.tgz", + "integrity": "sha512-mY3C2uKCaApHCQizS2YxEOqQ7sSZZLxdV6N1uM9u/VvUgVtYvlPtdcXbKpN52ak93ZE22I73DiLWVDnDNG4/AQ==", + "requires": { + "@types/chart.js": "^2.9.24", + "lodash-es": "^4.17.15", + "tslib": "^2.0.0" + } + }, + "ng2-file-upload": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ng2-file-upload/-/ng2-file-upload-1.4.0.tgz", + "integrity": "sha512-3J/KPU/tyh/ad6TFeUbrxX+SihUj0iOEt2Zsg4EX7mB3GFiQscXOfcUOxCkBtPWWWaqt3azrYbVGzsYa3/7NzQ==", + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "ngx-custom-validators": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/ngx-custom-validators/-/ngx-custom-validators-9.1.0.tgz", + "integrity": "sha512-vvTcpPgqZDAVLP7UkIpeMsZE4BkNPVOYryuOoE3xnOT6fB6HuOHmSgTCCb4sIyUKtDwTGQ0JB9OqPRzUUGE9VQ==", + "requires": { + "@angular/common": "~9.1.0", + "@angular/compiler": "~9.1.0", + "@angular/core": "~9.1.0", + "@angular/forms": "~9.1.0", + "@angular/platform-browser": "~9.1.0", + "@angular/platform-browser-dynamic": "~9.1.0", + "@angular/router": "~9.1.0", + "moment": "^2.24.0", + "rxjs": "~6.5.4", + "tslib": "^1.10.0", + "zone.js": "~0.10.2" + }, + "dependencies": { + "@angular/common": { + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.12.tgz", + "integrity": "sha512-XSIqkbM6VV1yixF9zuzeE5eqN1VsiXS517K2VU0XgCRSAzhVhLOeKsdYjeLf7PdSu/HgW/Tr81H+isi9A9I0YA==" + }, + "@angular/compiler": { + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.12.tgz", + "integrity": "sha512-suefk0OFkaJpUUKnV+phbL4T8fmVGHvzkereY5eqybQlumOez8NPL1PJcygAylh/E6OIAYm8SWookYwM6ZY9dg==" + }, + "@angular/core": { + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.12.tgz", + "integrity": "sha512-WVA/eh3fzjx0apOzkKot4YRRUsGkHj50zFQWrAOMgivGaj1YVrvhf+m3hpglj5fn/BkLiFDl8RT0wAE8z9X+gQ==" + }, + "@angular/forms": { + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.12.tgz", + "integrity": "sha512-LhjnZlC4WEsEsAJfOZLte+Lks3WBAFVeRv2lzoQNFVr/IMzBNDVfjEaaSqKF1cei3cjY39Df2nYDMJM7HfqbJA==" + }, + "@angular/platform-browser": { + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.12.tgz", + "integrity": "sha512-rPa/hJcLfdId6bYB0b6pFUo3QIgjZlvUlmtKMGdrLNLYR8XQxPa2Y/UdN/5YeZ12htGw6GXrX9U8U7nTbUSpkw==" + }, + "@angular/platform-browser-dynamic": { + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.12.tgz", + "integrity": "sha512-NmwUZaQeMnA6f+vP9Fp9P+qjL72H8dKlxLS76ujlKHVf75pP5oahWS8wfl7KXel1tKW3FQWMMffmKf5/NHRiSw==" + }, + "@angular/router": { + "version": "9.1.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.12.tgz", + "integrity": "sha512-+qCaXa9y0nsRhzjAYBqmGoQ2YkrdXgftZwuFDf6t4qEi30EXa0oS97KrlFq0M5GKdLIDGrbUm9PcdHSTOI+ZhA==" + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "ngx-perfect-scrollbar": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ngx-perfect-scrollbar/-/ngx-perfect-scrollbar-10.0.1.tgz", + "integrity": "sha512-01Li+Cx1OwNQ3WPHeavImS+p1ifK2UEdKly6JkdVw/s7rMxbjXkraOcj7FH+I141lpvxCmNlsWS5iiIA5GAnDg==", + "requires": { + "perfect-scrollbar": "1.5.0", + "resize-observer-polyfill": "^1.5.0", + "tslib": "^2.0.0" + } + }, + "ngx-quill": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/ngx-quill/-/ngx-quill-12.0.1.tgz", + "integrity": "sha512-XSyj1ABpfdoIsRguV4vCemOUU0VnDeISBtF6O6XU11AUYSSP1Eh58x0ct2SEJuNIW/qruEGexQvLAYHkuA6+Xw==", + "requires": { + "tslib": "^2.0.0" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-fetch-npm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + } + } + }, + "node-releases": { + "version": "1.1.58", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", + "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-package-arg": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", + "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.2", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", + "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" + } + }, + "npm-registry-fetch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.5.tgz", + "integrity": "sha512-yQ0/U4fYpCCqmueB2g8sc+89ckQ3eXpmU4+Yi2j5o/r0WkKvE2+Y0tK3DEILAtn2UaQTkjTHxIXe2/CSdit+/Q==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-path": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.4.tgz", + "integrity": "sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + } + } + }, + "ora": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.0.0.tgz", + "integrity": "sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw==", + "requires": { + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.4.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pacote": { + "version": "9.5.12", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz", + "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-normalize-package-bin": "^1.0.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^3.0.0", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.10", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-pick-manifest": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } + } + } + } + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "perfect-scrollbar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.0.tgz", + "integrity": "sha512-NrNHJn5mUGupSiheBTy6x+6SXCFbLlm8fVZh9moIzw/LgqElN5q4ncR4pbCBCYuCJ8Kcl9mYM0NgDxvW+b4LxA==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "dev": true, + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "portfinder": { + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz", + "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.31.tgz", + "integrity": "sha512-a937VDHE1ftkjk+8/7nj/mrjtmkn69xxzJgRETXdAUU+IgOYPQNJF17haGWbeDxSyk++HA14UA98FurvPyBJOA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-calc": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", + "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "dependencies": { + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + } + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + } + } + }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "protractor": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", + "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", + "dev": true, + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.1.7", + "yargs": "^15.3.1" + }, + "dependencies": { + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "webdriver-manager": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", + "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + } + } + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "psl": { + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", + "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "raw-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.1.tgz", + "integrity": "sha512-baolhQBSi3iNh1cglJjA0mYzga+wePk7vdEX//1dTFd+v4TsQlQE0jitJSNF1OIP82rdYulH7otaVmdlDaJ64A==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.5" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-package-json": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.1.tgz", + "integrity": "sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", + "dev": true, + "requires": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regex-parser": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", + "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "resolve-url-loader": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", + "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", + "dev": true, + "requires": { + "adjust-sourcemap-loader": "2.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.21", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "postcss": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "dev": true, + "requires": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", + "dev": true + } + } + }, + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", + "dev": true + }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rollup": { + "version": "2.10.9", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.10.9.tgz", + "integrity": "sha512-dY/EbjiWC17ZCUSyk14hkxATAMAShkMsD43XmZGWjLrgFj15M3Dw2kEkA9ns64BiLFm9PKN6vTQw8neHwK74eg==", + "dev": true, + "requires": { + "fsevents": "~2.1.2" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sass": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.5.tgz", + "integrity": "sha512-FG2swzaZUiX53YzZSjSakzvGtlds0lcbF+URuU9mxOv7WBh7NhXEVDa4kPKN4hN6fC2TkOTOKqiqp6d53N9X5Q==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dev": true, + "requires": { + "semver": "^5.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", + "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", + "dev": true, + "requires": { + "debug": "~4.1.0", + "engine.io": "~3.4.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.3.0", + "socket.io-parser": "~3.4.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "socket.io-client": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + } + } + }, + "socket.io-parser": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + }, + "source-map-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.0.0.tgz", + "integrity": "sha512-ZayyQCSCrQazN50aCvuS84lJT4xc1ZAcykH5blHaBdVveSwjiFK8UGMPvao0ho54DTb0Jf7m57uRRG/YYUZ2Fg==", + "dev": true, + "requires": { + "data-urls": "^2.0.0", + "iconv-lite": "^0.5.1", + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.6", + "source-map": "^0.6.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", + "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "speed-measure-webpack-plugin": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.3.tgz", + "integrity": "sha512-2ljD4Ch/rz2zG3HsLsnPfp23osuPBS0qPuz9sGpkNXTN1Ic4M+W9xB8l8rS8ob2cO4b1L+WTJw/0AJwWYVgcxQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "streamroller": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", + "dev": true, + "requires": { + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "style-loader": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz", + "integrity": "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.6" + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "stylus": { + "version": "0.54.7", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.7.tgz", + "integrity": "sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==", + "dev": true, + "requires": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.3", + "mkdirp": "~0.5.x", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.0.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", + "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.1.tgz", + "integrity": "sha512-eFDtq8qPUEa9hXcUzTwKXTnugIVtlqc1Z/ZVhG8LmRT3lgRY13+pQTnFLY2N7ATB6TKCHuW/IGjoAnZz9wOIqw==", + "dev": true, + "requires": { + "cacache": "^15.0.3", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.0.0", + "p-limit": "^2.3.0", + "schema-utils": "^2.6.6", + "serialize-javascript": "^3.0.0", + "source-map": "^0.6.1", + "terser": "^4.6.13", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "ts-node": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.2.2.tgz", + "integrity": "sha1-u9KOOK9Kqj6WB2xGbhsiAZfBo84=", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "chalk": "^2.0.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.0", + "tsconfig": "^6.0.0", + "v8flags": "^3.0.0", + "yn": "^2.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + } + } + }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "dev": true + }, + "tsconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", + "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + }, + "tslint": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.2.tgz", + "integrity": "sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.10.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", + "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.21", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", + "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universal-analytics": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", + "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", + "dev": true, + "requires": { + "debug": "^3.0.0", + "request": "^2.88.0", + "uuid": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "v8flags": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", + "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", + "dev": true, + "requires": { + "chokidar": "^3.4.0", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "requires": { + "defaults": "^1.0.3" + } + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + }, + "webpack": { + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", + "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.1", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "terser-webpack-plugin": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", + "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^3.1.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.20", + "sockjs-client": "1.4.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "loglevel": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.4.1.tgz", + "integrity": "sha512-XMLFInbGbB1HV7K4vHWANzc1CN0t/c4bBvnlvGxGwV45yE/S/feAXIm8dJsCkzqWtSKnmaEgTp/meyeThxG4Iw==", + "dev": true, + "requires": { + "webpack-sources": "^1.3.0" + } + }, + "websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true, + "requires": { + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz", + "integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^5.0.0" + } + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "worker-plugin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-4.0.3.tgz", + "integrity": "sha512-7hFDYWiKcE3yHZvemsoM9lZis/PzurHAEX1ej8PLCu818Rt6QqUAiDdxHPCKZctzmhqzPpcFSgvMCiPbtooqAg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", + "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + }, + "zone.js": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", + "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..aa75251 --- /dev/null +++ b/package.json @@ -0,0 +1,74 @@ +{ + "name": "sgeeks-starter-v2", + "version": "0.0.2", + "license": "MIT", + "scripts": { + "ng": "ng", + "start": "ng serve --proxy-config ./proxy.json", + "server": "ts-node -P ./server/server.tsconfig.json ./server/server.ts", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular-devkit/schematics": "^10.2.0", + "@angular/animations": "^10.0.2", + "@angular/cdk": "^10.0.1", + "@angular/common": "^10.0.2", + "@angular/compiler": "^10.0.2", + "@angular/core": "^10.0.2", + "@angular/flex-layout": "^10.0.0-beta.32", + "@angular/forms": "^10.0.2", + "@angular/material": "^10.0.1", + "@angular/material-moment-adapter": "^10.0.1", + "@angular/platform-browser": "^10.0.2", + "@angular/platform-browser-dynamic": "^10.0.2", + "@angular/router": "^10.0.2", + "@ngrx/data": "^8.0.1", + "@ngrx/effects": "^8.0.1", + "@ngrx/entity": "^8.0.1", + "@ngrx/router-store": "^8.0.1", + "@ngrx/store": "^8.0.1", + "@ngrx/store-devtools": "^8.0.1", + "@swimlane/ngx-datatable": "^18.0.0", + "body-parser": "^1.18.2", + "core-js": "^2.4.1", + "express": "^4.16.2", + "highlight.js": "^10.3.1", + "moment": "^2.22.2", + "ng2-file-upload": "^1.4.0", + "ngx-custom-validators": "^9.1.0", + "ngx-perfect-scrollbar": "^10.0.1", + "perfect-scrollbar": "^1.5.0", + "rxjs": "^6.6.3", + "tinycolor2": "^1.4.2", + "tslib": "^2.0.0", + "zone.js": "~0.10.3" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~0.1000.0", + "@angular/cli": "^10.0.0", + "@angular/compiler-cli": "^10.0.2", + "@angular/language-service": "^10.0.2", + "@ngrx/schematics": "^8.0.1", + "@types/express": "^4.0.39", + "@types/jasmine": "~2.5.53", + "@types/jasminewd2": "~2.0.2", + "@types/node": "^12.11.1", + "codelyzer": "^5.1.2", + "jasmine-core": "~3.5.0", + "jasmine-spec-reporter": "~5.0.0", + "karma": "~5.0.0", + "karma-chrome-launcher": "~3.1.0", + "karma-cli": "~1.0.1", + "karma-coverage-istanbul-reporter": "~3.0.2", + "karma-jasmine": "~3.3.0", + "karma-jasmine-html-reporter": "^1.5.0", + "protractor": "~7.0.0", + "ts-node": "~3.2.0", + "tslint": "~6.1.0", + "typescript": "~3.9.5" + } +} diff --git a/protractor.conf.js b/protractor.conf.js new file mode 100644 index 0000000..7ee3b5e --- /dev/null +++ b/protractor.conf.js @@ -0,0 +1,28 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './e2e/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: 'e2e/tsconfig.e2e.json' + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; diff --git a/proxy.json b/proxy.json new file mode 100644 index 0000000..33a4f78 --- /dev/null +++ b/proxy.json @@ -0,0 +1,6 @@ +{ + "/api": { + "target": "http://localhost:9000", + "secure": false + } +} \ No newline at end of file diff --git a/server/auth.route.ts b/server/auth.route.ts new file mode 100644 index 0000000..82d8ade --- /dev/null +++ b/server/auth.route.ts @@ -0,0 +1,26 @@ + + +import {Request, Response} from 'express'; +import {authenticate} from "./db-data"; + + + + +export function loginUser(req: Request, res: Response) { + + console.log("User login attempt ..."); + + const {email, password} = req.body; + + const user = authenticate(email, password); + + if (user) { + res.status(200).json({id:user.id, email: user.email}); + } + else { + res.sendStatus(403); + } + +} + + diff --git a/server/create-course.route.ts b/server/create-course.route.ts new file mode 100644 index 0000000..3f73565 --- /dev/null +++ b/server/create-course.route.ts @@ -0,0 +1,29 @@ +import {Request, Response} from 'express'; +import {COURSES} from './db-data'; + +export var coursesKeyCounter = 100; + +export function createCourse(req: Request, res: Response) { + + console.log("Creating new course ..."); + + const changes = req.body; + + const newCourse = { + id: coursesKeyCounter, + seqNo: coursesKeyCounter, + ...changes + }; + + COURSES[newCourse.id] = newCourse; + + coursesKeyCounter += 1; + + setTimeout(() => { + + res.status(200).json(newCourse); + + }, 2000); + +} + diff --git a/server/db-data.ts b/server/db-data.ts new file mode 100644 index 0000000..57656f7 --- /dev/null +++ b/server/db-data.ts @@ -0,0 +1,630 @@ +export const USERS = { + 1: { + id: 1, + email: 'test@angular-university.io', + password: 'test' + } + +}; + + +export const COURSES: any = { + + 4: { + id: 4, + description: 'NgRx (with NgRx Data) - The Complete Guide', + longDescription: 'Learn the modern Ngrx Ecosystem, including NgRx Data, Store, Effects, Router Store, Ngrx Entity, and Dev Tools.', + iconUrl: 'https://angular-university.s3-us-west-1.amazonaws.com/course-images/ngrx-v2.png', + category: 'BEGINNER', + lessonsCount: 10, + seqNo: 0, + url: 'ngrx-course' + }, + + 2: { + id: 2, + description: 'Angular Core Deep Dive', + longDescription: 'A detailed walk-through of the most important part of Angular - the Core and Common modules', + iconUrl: 'https://s3-us-west-1.amazonaws.com/angular-university/course-images/angular-core-in-depth-small.png', + lessonsCount: 10, + category: 'BEGINNER', + seqNo: 1, + url: 'angular-core-course' + }, + + 3: { + id: 3, + description: 'RxJs In Practice Course', + longDescription: 'Understand the RxJs Observable pattern, learn the RxJs Operators via practical examples', + iconUrl: 'https://s3-us-west-1.amazonaws.com/angular-university/course-images/rxjs-in-practice-course.png', + category: 'BEGINNER', + lessonsCount: 10, + seqNo: 2, + url: 'rxjs-course' + }, + + 1: { + id: 1, + description: 'Serverless Angular with Firebase Course', + longDescription: 'Serveless Angular with Firestore, Firebase Storage & Hosting, Firebase Cloud Functions & AngularFire', + iconUrl: 'https://s3-us-west-1.amazonaws.com/angular-university/course-images/serverless-angular-small.png', + lessonsCount: 10, + category: 'BEGINNER', + seqNo: 4, + url: 'serverless-angular' + }, + + /* + + + 5: { + id: 5, + description: 'Angular for Beginners', + longDescription: "Establish a solid layer of fundamentals, learn what's under the hood of Angular", + iconUrl: 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-for-beginners-small-v2.png', + category: 'BEGINNER', + lessonsCount: 10, + seqNo: 5, + url: 'angular-for-beginners' + }, + +*/ + + 12: { + id: 12, + description: 'Angular Testing Course', + longDescription: 'In-depth guide to Unit Testing and E2E Testing of Angular Applications', + iconUrl: 'https://s3-us-west-1.amazonaws.com/angular-university/course-images/angular-testing-small.png', + category: 'BEGINNER', + seqNo: 6, + url: 'angular-testing-course', + lessonsCount: 10, + }, + + 6: { + id: 6, + description: 'Angular Security Course - Web Security Fundamentals', + longDescription: 'Learn Web Security Fundamentals and apply them to defend an Angular / Node Application from multiple types of attacks.', + iconUrl: 'https://s3-us-west-1.amazonaws.com/angular-university/course-images/security-cover-small-v2.png', + category: 'ADVANCED', + lessonsCount: 11, + seqNo: 7, + url: 'angular-security-course' + }, + + 7: { + id: 7, + description: 'Angular PWA - Progressive Web Apps Course', + longDescription: 'Learn Angular Progressive Web Applications, build the future of the Web Today.', + iconUrl: 'https://s3-us-west-1.amazonaws.com/angular-university/course-images/angular-pwa-course.png', + category: 'ADVANCED', + lessonsCount: 8, + seqNo: 8, + url: 'angular-pwa-course' + }, + + 8: { + id: 8, + description: 'Angular Advanced Library Laboratory: Build Your Own Library', + longDescription: 'Learn Advanced Angular functionality typically used in Library Development. Advanced Components, Directives, Testing, Npm', + iconUrl: 'https://angular-academy.s3.amazonaws.com/thumbnails/advanced_angular-small-v3.png', + category: 'ADVANCED', + seqNo: 9, + url: 'angular-advanced-course' + }, + + 9: { + id: 9, + description: 'The Complete Typescript Course', + longDescription: 'Complete Guide to Typescript From Scratch: Learn the language in-depth and use it to build a Node REST API.', + iconUrl: 'https://angular-academy.s3.amazonaws.com/thumbnails/typescript-2-small.png', + category: 'BEGINNER', + seqNo: 10, + url: 'typescript-course' + }, + + 10: { + id: 10, + description: 'Rxjs and Reactive Patterns Angular Architecture Course', + longDescription: 'Learn the core RxJs Observable Pattern as well and many other Design Patterns for building Reactive Angular Applications.', + iconUrl: 'https://s3-us-west-1.amazonaws.com/angular-academy/blog/images/rxjs-reactive-patterns-small.png', + category: 'BEGINNER', + seqNo: 11, + url: 'rxjs-patterns-course' + }, + + 11: { + id: 11, + description: 'Angular Material Course', + longDescription: 'Build Applications with the official Angular Widget Library', + iconUrl: 'https://s3-us-west-1.amazonaws.com/angular-university/course-images/material_design.png', + category: 'BEGINNER', + seqNo: 12, + url: 'angular-material-course' + } + +}; + + +export const LESSONS = { + + 1: { + id: 1, + 'description': 'Angular Tutorial For Beginners - Build Your First App - Hello World Step By Step', + 'duration': '4:17', + 'seqNo': 1, + courseId: 5 + }, + 2: { + id: 2, + 'description': 'Building Your First Component - Component Composition', + 'duration': '2:07', + 'seqNo': 2, + courseId: 5 + }, + 3: { + id: 3, + 'description': 'Component @Input - How To Pass Input Data To an Component', + 'duration': '2:33', + 'seqNo': 3, + courseId: 5 + }, + 4: { + id: 4, + 'description': ' Component Events - Using @Output to create custom events', + 'duration': '4:44', + 'seqNo': 4, + courseId: 5 + }, + 5: { + id: 5, + 'description': ' Component Templates - Inline Vs External', + 'duration': '2:55', + 'seqNo': 5, + courseId: 5 + }, + 6: { + id: 6, + 'description': 'Styling Components - Learn About Component Style Isolation', + 'duration': '3:27', + 'seqNo': 6, + courseId: 5 + }, + 7: { + id: 7, + 'description': ' Component Interaction - Extended Components Example', + 'duration': '9:22', + 'seqNo': 7, + courseId: 5 + }, + 8: { + id: 8, + 'description': ' Components Tutorial For Beginners - Components Exercise !', + 'duration': '1:26', + 'seqNo': 8, + courseId: 5 + }, + 9: { + id: 9, + 'description': ' Components Tutorial For Beginners - Components Exercise Solution Inside', + 'duration': '2:08', + 'seqNo': 9, + courseId: 5 + }, + 10: { + id: 10, + 'description': ' Directives - Inputs, Output Event Emitters and How To Export Template References', + 'duration': '4:01', + 'seqNo': 10, + courseId: 5 + }, + + + // Security Course + 11: { + id: 11, + 'description': 'Course Helicopter View', + 'duration': '08:19', + 'seqNo': 1, + courseId: 6 + }, + + 12: { + id: 12, + 'description': 'Installing Git, Node, NPM and Choosing an IDE', + 'duration': '04:17', + 'seqNo': 2, + courseId: 6 + }, + + 13: { + id: 13, + 'description': 'Installing The Lessons Code - Learn Why Its Essential To Use NPM 5', + 'duration': '06:05', + 'seqNo': 3, + courseId: 6 + }, + + 14: { + id: 14, + 'description': 'How To Run Node In TypeScript With Hot Reloading', + 'duration': '03:57', + 'seqNo': 4, + courseId: 6 + }, + + 15: { + id: 15, + 'description': 'Guided Tour Of The Sample Application', + 'duration': '06:00', + 'seqNo': 5, + courseId: 6 + }, + 16: { + id: 16, + 'description': 'Client Side Authentication Service - API Design', + 'duration': '04:53', + 'seqNo': 6, + courseId: 6 + }, + 17: { + id: 17, + 'description': 'Client Authentication Service - Design and Implementation', + 'duration': '09:14', + 'seqNo': 7, + courseId: 6 + }, + 18: { + id: 18, + 'description': 'The New Angular HTTP Client - Doing a POST Call To The Server', + 'duration': '06:08', + 'seqNo': 8, + courseId: 6 + }, + 19: { + id: 19, + 'description': 'User Sign Up Server-Side Implementation in Express', + 'duration': '08:50', + 'seqNo': 9, + courseId: 6 + }, + 20: { + id: 20, + 'description': 'Introduction To Cryptographic Hashes - A Running Demo', + 'duration': '05:46', + 'seqNo': 10, + courseId: 6 + }, + 21: { + id: 21, + 'description': 'Some Interesting Properties Of Hashing Functions - Validating Passwords', + 'duration': '06:31', + 'seqNo': 11, + courseId: 6 + }, + + + // PWA course + + 22: { + id: 22, + 'description': 'Course Kick-Off - Install Node, NPM, IDE And Service Workers Section Code', + 'duration': '07:19', + 'seqNo': 1, + courseId: 7 + }, + 23: { + id: 23, + 'description': 'Service Workers In a Nutshell - Service Worker Registration', + 'duration': '6:59', + 'seqNo': 2, + courseId: 7 + }, + 24: { + id: 24, + 'description': 'Service Workers Hello World - Lifecycle Part 1 and PWA Chrome Dev Tools', + 'duration': '7:28', + 'seqNo': 3, + courseId: 7 + }, + 25: { + id: 25, + 'description': 'Service Workers and Application Versioning - Install & Activate Lifecycle Phases', + 'duration': '10:17', + 'seqNo': 4, + courseId: 7 + }, + + 26: { + id: 26, + 'description': 'Downloading The Offline Page - The Service Worker Installation Phase', + 'duration': '09:50', + 'seqNo': 5, + courseId: 7 + }, + 27: { + id: 27, + 'description': 'Introduction to the Cache Storage PWA API', + 'duration': '04:44', + 'seqNo': 6, + courseId: 7 + }, + 28: { + id: 28, + 'description': 'View Service Workers HTTP Interception Features In Action', + 'duration': '06:07', + 'seqNo': 7, + courseId: 7 + }, + 29: { + id: 29, + 'description': 'Service Workers Error Handling - Serving The Offline Page', + 'duration': '5:38', + 'seqNo': 8, + courseId: 7 + }, + + // Serverless Angular with Firebase Course + + 30: { + id: 30, + description: 'Development Environment Setup', + 'duration': '5:38', + 'seqNo': 1, + courseId: 1 + }, + + 31: { + id: 31, + description: 'Introduction to the Firebase Ecosystem', + 'duration': '5:12', + 'seqNo': 2, + courseId: 1 + }, + + 32: { + id: 32, + description: 'Importing Data into Firestore', + 'duration': '4:07', + 'seqNo': 3, + courseId: 1 + }, + + 33: { + id: 33, + description: 'Firestore Documents in Detail', + 'duration': '7:32', + 'seqNo': 4, + courseId: 1 + }, + + 34: { + id: 34, + description: 'Firestore Collections in Detail', + 'duration': '6:28', + 'seqNo': 5, + courseId: 1 + }, + + 35: { + id: 35, + description: 'Firestore Unique Identifiers', + 'duration': '4:38', + 'seqNo': 6, + courseId: 1 + }, + + 36: { + id: 36, + description: 'Querying Firestore Collections', + 'duration': '7:54', + 'seqNo': 7, + courseId: 1 + }, + + 37: { + id: 37, + description: 'Firebase Security Rules In Detail', + 'duration': '5:31', + 'seqNo': 8, + courseId: 1 + }, + + 38: { + id: 38, + description: 'Firebase Cloud Functions In Detail', + 'duration': '8:19', + 'seqNo': 9, + courseId: 1 + }, + + 39: { + id: 39, + description: 'Firebase Storage In Detail', + 'duration': '7:05', + 'seqNo': 10, + courseId: 1 + }, + + + // Angular Testing Course + + 40: { + id: 40, + description: 'Angular Testing Course - Helicopter View', + 'duration': '5:38', + 'seqNo': 1, + courseId: 12 + }, + + 41: { + id: 41, + description: 'Setting Up the Development Environment', + 'duration': '5:12', + 'seqNo': 2, + courseId: 12 + }, + + 42: { + id: 42, + description: 'Introduction to Jasmine, Spies and specs', + 'duration': '4:07', + 'seqNo': 3, + courseId: 12 + }, + + 43: { + id: 43, + description: 'Introduction to Service Testing', + 'duration': '7:32', + 'seqNo': 4, + courseId: 12 + }, + + 44: { + id: 44, + description: 'Settting up the Angular TestBed', + 'duration': '6:28', + 'seqNo': 5, + courseId: 12 + }, + + 45: { + id: 45, + description: 'Mocking Angular HTTP requests', + 'duration': '4:38', + 'seqNo': 6, + courseId: 12 + }, + + 46: { + id: 46, + description: 'Simulating Failing HTTP Requests', + 'duration': '7:54', + 'seqNo': 7, + courseId: 12 + }, + + 47: { + id: 47, + description: 'Introduction to Angular Component Testing', + 'duration': '5:31', + 'seqNo': 8, + courseId: 12 + }, + + 48: { + id: 48, + description: 'Testing Angular Components without the DOM', + 'duration': '8:19', + 'seqNo': 9, + courseId: 12 + }, + + 49: { + id: 49, + description: 'Testing Angular Components with the DOM', + 'duration': '7:05', + 'seqNo': 10, + courseId: 12 + }, + + + // Ngrx Course + 50: { + id: 50, + "description": "Welcome to the Angular Ngrx Course", + "duration": "6:53", + "seqNo": 1, + courseId: 4 + + }, + 51: { + id: 51, + "description": "The Angular Ngrx Architecture Course - Helicopter View", + "duration": "5:52", + "seqNo": 2, + courseId: 4 + }, + 52: { + id: 52, + "description": "The Origins of Flux - Understanding the Famous Facebook Bug Problem", + "duration": "8:17", + "seqNo": 3, + courseId: 4 + }, + 53: { + id: 53, + "description": "Custom Global Events - Why Don't They Scale In Complexity?", + "duration": "7:47", + "seqNo": 4, + courseId: 4 + }, + 54: { + id: 54, + "description": "The Flux Architecture - How Does it Solve Facebook Counter Problem?", + "duration": "9:22", + "seqNo": 5, + courseId: 4 + }, + 55: { + id: 55, + "description": "Unidirectional Data Flow And The Angular Development Mode", + "duration": "7:07", + "seqNo": 6, + courseId: 4 + }, + + 56: { + id: 56, + "description": "Dispatching an Action - Implementing the Login Component", + "duration": "4:39", + "seqNo": 7, + courseId: 4 + }, + 57: { + id: 57, + "description": "Setting Up the Ngrx DevTools - Demo", + "duration": "4:44", + "seqNo": 8, + courseId: 4 + }, + 58: { + id: 58, + "description": "Understanding Reducers - Writing Our First Reducer", + "duration": "9:10", + "seqNo": 9, + courseId: 4 + }, + 59: { + id: 59, + "description": "How To Define the Store Initial AppState", + "duration": "9:10", + "seqNo": 10, + courseId: 4 + } + + +}; + + +export function findCourseById(courseId: number) { + return COURSES[courseId]; +} + +export function findLessonsForCourse(courseId: number) { + return Object.values(LESSONS).filter(lesson => lesson.courseId == courseId); +} + + +export function authenticate(email: string, password: string) { + + const user: any = Object.values(USERS).find(user => user.email === email); + + if (user && user.password == password) { + return user; + } else { + return undefined; + } + +} diff --git a/server/delete-course.route.ts b/server/delete-course.route.ts new file mode 100644 index 0000000..72ca792 --- /dev/null +++ b/server/delete-course.route.ts @@ -0,0 +1,22 @@ +import {Request, Response} from 'express'; +import {COURSES} from "./db-data"; + + +export function deleteCourse(req: Request, res: Response) { + + console.log("Deleting course ..."); + + const id = req.params["id"]; + + const course = COURSES[id]; + + delete COURSES[id]; + + setTimeout(() => { + + res.status(200).json({id}); + + }, 2000); + +} + diff --git a/server/get-courses.route.ts b/server/get-courses.route.ts new file mode 100644 index 0000000..daa6988 --- /dev/null +++ b/server/get-courses.route.ts @@ -0,0 +1,38 @@ + + +import {Request, Response} from 'express'; +import {COURSES} from "./db-data"; + + + +export function getAllCourses(req: Request, res: Response) { + + console.log("Retrieving courses data ..."); + + setTimeout(() => { + + res.status(200).json({payload:Object.values(COURSES)}); + + }, 1000); + + + +} + + +export function getCourseByUrl(req: Request, res: Response) { + + const courseUrl = req.params["courseUrl"]; + + const courses:any = Object.values(COURSES); + + const course = courses.find(course => course.url == courseUrl); + + setTimeout(() => { + + res.status(200).json(course); + + }, 1000); + + +} diff --git a/server/save-course.route.ts b/server/save-course.route.ts new file mode 100644 index 0000000..d5cb4ab --- /dev/null +++ b/server/save-course.route.ts @@ -0,0 +1,24 @@ +import {Request, Response} from 'express'; +import {COURSES} from "./db-data"; + + +export function saveCourse(req: Request, res: Response) { + + console.log("Saving course ..."); + + const id = req.params["id"], + changes = req.body; + + COURSES[id] = { + ...COURSES[id], + ...changes + }; + + setTimeout(() => { + + res.status(200).json(COURSES[id]); + + }, 2000); + +} + diff --git a/server/search-lessons.route.ts b/server/search-lessons.route.ts new file mode 100644 index 0000000..29f34b6 --- /dev/null +++ b/server/search-lessons.route.ts @@ -0,0 +1,40 @@ + + + +import {Request, Response} from 'express'; +import {LESSONS} from "./db-data"; +import {setTimeout} from "timers"; + + + +export function searchLessons(req: Request, res: Response) { + + console.log('Searching for lessons ...'); + + const queryParams = req.query; + + const courseId = queryParams.courseId, + filter = queryParams.filter || '', + sortOrder = queryParams.sortOrder || 'asc', + pageNumber = parseInt(queryParams.pageNumber) || 0, + pageSize = parseInt(queryParams.pageSize); + + let lessons = Object.values(LESSONS).filter(lesson => lesson.courseId == courseId).sort((l1, l2) => l1.id - l2.id); + + if (filter) { + lessons = lessons.filter(lesson => lesson.description.trim().toLowerCase().search(filter.toLowerCase()) >= 0); + } + + if (sortOrder == "desc") { + lessons = lessons.reverse(); + } + + const initialPos = pageNumber * pageSize; + + console.log(`Retrieving lessons page starting at position ${initialPos}, page size ${pageSize} for course ${courseId}`); + + const lessonsPage = lessons.slice(initialPos, initialPos + pageSize); + + res.status(200).json(lessonsPage); + +} diff --git a/server/server.ts b/server/server.ts new file mode 100644 index 0000000..7534ea8 --- /dev/null +++ b/server/server.ts @@ -0,0 +1,45 @@ + + +import * as express from 'express'; +import {Application} from "express"; +import {getAllCourses, getCourseByUrl} from "./get-courses.route"; +import {searchLessons} from "./search-lessons.route"; +import {loginUser} from "./auth.route"; +import {saveCourse} from "./save-course.route"; +import {createCourse} from './create-course.route'; +import {deleteCourse} from './delete-course.route'; + +const bodyParser = require('body-parser'); + + + +const app: Application = express(); + + +app.use(bodyParser.json()); + + +app.route('/api/login').post(loginUser); + +app.route('/api/courses').get(getAllCourses); + +app.route('/api/course').post(createCourse); + +app.route('/api/course/:id').put(saveCourse); + +app.route('/api/course/:id').delete(deleteCourse); + +app.route('/api/courses/:courseUrl').get(getCourseByUrl); + +app.route('/api/lessons').get(searchLessons); + + + + +const httpServer:any = app.listen(9000, () => { + console.log("HTTP REST API Server running at http://localhost:" + httpServer.address().port); +}); + + + + diff --git a/server/server.tsconfig.json b/server/server.tsconfig.json new file mode 100644 index 0000000..36d0c71 --- /dev/null +++ b/server/server.tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": ["es2017"] + } +} diff --git a/src/app/app.component.css b/src/app/app.component.css new file mode 100644 index 0000000..c9345a5 --- /dev/null +++ b/src/app/app.component.css @@ -0,0 +1,17 @@ + +>>> body { + margin: 0; +} + +main { + margin: 30px; +} + +.menu-button { + background: rgba(255, 170, 0, 0.76); + color: white; + border: none; + cursor:pointer; + outline:none; +} + diff --git a/src/app/app.component.html b/src/app/app.component.html new file mode 100644 index 0000000..90c6b64 --- /dev/null +++ b/src/app/app.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 0000000..9b40124 --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,73 @@ +import {Component, OnInit} from '@angular/core'; +import {select, Store} from '@ngrx/store'; +import {Observable} from 'rxjs'; +import {distinctUntilChanged, map} from 'rxjs/operators'; +import {NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router} from '@angular/router'; +import {AppState} from './reducers'; +import {isLoggedIn, isLoggedOut} from './auth/auth.selectors'; +import {login, logout} from './auth/auth.actions'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'] +}) +export class AppComponent implements OnInit { + + loading = true; + + isLoggedIn$: Observable; + + isLoggedOut$: Observable; + + constructor(private router: Router, + private store: Store) { + + } + + ngOnInit() { + + // const userProfile = localStorage.getItem("user"); + + // if (userProfile) { + // this.store.dispatch(login({user: JSON.parse(userProfile)})); + // } + + // this.router.events.subscribe(event => { + // switch (true) { + // case event instanceof NavigationStart: { + // this.loading = true; + // break; + // } + + // case event instanceof NavigationEnd: + // case event instanceof NavigationCancel: + // case event instanceof NavigationError: { + // this.loading = false; + // break; + // } + // default: { + // break; + // } + // } + // }); + + // this.isLoggedIn$ = this.store + // .pipe( + // select(isLoggedIn) + // ); + + // this.isLoggedOut$ = this.store + // .pipe( + // select(isLoggedOut) + // ); + + } + + logout() { + + this.store.dispatch(logout()); + + } + +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts new file mode 100644 index 0000000..1599e95 --- /dev/null +++ b/src/app/app.module.ts @@ -0,0 +1,71 @@ +import {BrowserModule} from '@angular/platform-browser'; +import {NgModule} from '@angular/core'; + +import {AppComponent} from './app.component'; +import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; +import {MatMenuModule} from '@angular/material/menu'; +import {MatIconModule} from '@angular/material/icon'; + +import {MatListModule} from '@angular/material/list'; +import {MatSidenavModule} from '@angular/material/sidenav'; +import {MatToolbarModule} from '@angular/material/toolbar'; +import {HttpClientModule} from '@angular/common/http'; + +import {RouterModule, Routes} from '@angular/router'; +import {AuthModule} from './auth/auth.module'; +import {StoreModule} from '@ngrx/store'; +import {StoreDevtoolsModule} from '@ngrx/store-devtools'; +import {environment} from '../environments/environment'; +import {RouterState, StoreRouterConnectingModule} from '@ngrx/router-store'; + +import {EffectsModule} from '@ngrx/effects'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import {metaReducers, reducers} from './reducers'; +import {AuthGuard} from './auth/auth.guard'; +import {EntityDataModule} from '@ngrx/data'; +import { rootRouterConfig } from './app.routing'; +import { SharedModule } from './shared/shared.module'; + + + + +@NgModule({ + declarations: [ + AppComponent + ], + imports: [ + BrowserModule, + BrowserAnimationsModule, + HttpClientModule, + MatMenuModule, + MatIconModule, + MatSidenavModule, + MatProgressSpinnerModule, + MatListModule, + MatToolbarModule, + SharedModule, + //AuthModule.forRoot(), + StoreModule.forRoot(reducers, { + metaReducers, + runtimeChecks : { + strictStateImmutability: true, + strictActionImmutability: true, + strictActionSerializability: true, + strictStateSerializability: true + } + }), + StoreDevtoolsModule.instrument({maxAge: 25, logOnly: environment.production}), + EffectsModule.forRoot([]), + EntityDataModule.forRoot({}), + StoreRouterConnectingModule.forRoot({ + stateKey: 'router', + routerState: RouterState.Minimal + }), + RouterModule.forRoot(rootRouterConfig, { useHash: false }) + ], + bootstrap: [AppComponent], +providers:[AuthGuard] + +}) +export class AppModule { +} diff --git a/src/app/app.routing.ts b/src/app/app.routing.ts new file mode 100644 index 0000000..a2db4ce --- /dev/null +++ b/src/app/app.routing.ts @@ -0,0 +1,80 @@ +import { Routes } from '@angular/router'; +import { AdminLayoutComponent } from './shared/components/layouts/admin-layout/admin-layout.component'; +import { AuthLayoutComponent } from './shared/components/layouts/auth-layout/auth-layout.component'; +import { AuthGuard } from './shared/guards/auth.guard'; + +export const rootRouterConfig: Routes = [ + { + path: '', + redirectTo: '/dashboard/analytics', + pathMatch: 'full', + }, + + { + path: '', + component: AdminLayoutComponent, + canActivate: [AuthGuard], + children: [ + { + path: 'dashboard', + loadChildren: () => + import('./views/dashboard/dashboard.module').then( + (m) => m.DashboardModule + ), + }, + { + path: 'mat-kits', + loadChildren: () => + import('./views/material-components/material-components.module').then( + (m) => m.MaterialComponentsModule + ), + data: { title: 'Material Coponents', breadcrumb: 'Material Coponents' }, + }, + { + path: 'pages', + loadChildren: () => + import('./views/others/others.module').then((m) => m.OthersModule), + data: { title: 'Pages', breadcrumb: 'Pages' }, + }, + { + path: 'tables', + loadChildren: () => + import('./views/tables/tables.module').then((m) => m.TablesModule), + data: { title: 'Tables', breadcrumb: 'Tables' }, + }, + { + path: 'forms', + loadChildren: () => + import('./views/forms/forms.module').then((m) => m.AppFormsModule), + data: { title: 'Forms', breadcrumb: 'Forms' }, + }, + + { + path: 'search', + loadChildren: () => + import('./views/search-view/search-view.module').then( + (m) => m.SearchViewModule + ), + }, + + { + path: 'orders', + loadChildren: () => + import('./views/order/order.module').then((m) => m.OrderModule), + data: { title: 'Orders', breadcrumb: 'Orders' }, + }, + { + path: 'icons', + loadChildren: () => + import('./views/mat-icons/mat-icons.module').then( + (m) => m.MatIconsModule + ), + data: { title: 'Icons', breadcrumb: 'Mat icons' }, + }, + ], + }, + { + path: '**', + redirectTo: 'sessions/404', + }, +]; diff --git a/src/app/auth/action-types.ts b/src/app/auth/action-types.ts new file mode 100644 index 0000000..0e5353f --- /dev/null +++ b/src/app/auth/action-types.ts @@ -0,0 +1,5 @@ + + +import * as AuthActions from './auth.actions'; + +export {AuthActions}; diff --git a/src/app/auth/auth.actions.ts b/src/app/auth/auth.actions.ts new file mode 100644 index 0000000..ef07b2c --- /dev/null +++ b/src/app/auth/auth.actions.ts @@ -0,0 +1,14 @@ +import {createAction, props} from '@ngrx/store'; +import {User} from './model/user.model'; + + +export const login = createAction( + "[Login Page] User Login", + props<{user: User}>() +); + + + +export const logout = createAction( + "[Top Menu] Logout" +); diff --git a/src/app/auth/auth.effects.ts b/src/app/auth/auth.effects.ts new file mode 100644 index 0000000..82c820c --- /dev/null +++ b/src/app/auth/auth.effects.ts @@ -0,0 +1,39 @@ +import {Injectable} from '@angular/core'; +import {Actions, createEffect, ofType} from '@ngrx/effects'; +import {AuthActions} from './action-types'; +import {tap} from 'rxjs/operators'; +import {Router} from '@angular/router'; + + +@Injectable() +export class AuthEffects { + + login$ = createEffect(() => + this.actions$ + .pipe( + ofType(AuthActions.login), + tap(action => localStorage.setItem('user', + JSON.stringify(action.user)) + ) + ) + , + {dispatch: false}); + + logout$ = createEffect(() => + this.actions$ + .pipe( + ofType(AuthActions.logout), + tap(action => { + localStorage.removeItem('user'); + this.router.navigateByUrl('/login'); + }) + ) + , {dispatch: false}); + + + constructor(private actions$: Actions, + private router: Router) { + + } + +} diff --git a/src/app/auth/auth.guard.ts b/src/app/auth/auth.guard.ts new file mode 100644 index 0000000..27d7561 --- /dev/null +++ b/src/app/auth/auth.guard.ts @@ -0,0 +1,37 @@ +import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot} from '@angular/router'; +import {Injectable} from '@angular/core'; +import {Observable} from 'rxjs'; +import {AppState} from '../reducers'; +import {select, Store} from '@ngrx/store'; +import {isLoggedIn} from './auth.selectors'; +import {tap} from 'rxjs/operators'; +import {login, logout} from './auth.actions'; + + +@Injectable() +export class AuthGuard implements CanActivate { + + constructor( + private store: Store, + private router: Router) { + + } + + canActivate( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot): Observable { + + return this.store + .pipe( + select(isLoggedIn), + tap(loggedIn => { + if (!loggedIn) { + this.router.navigateByUrl('/login'); + } + }) + ) + + + } + +} diff --git a/src/app/auth/auth.module.ts b/src/app/auth/auth.module.ts new file mode 100644 index 0000000..22ce104 --- /dev/null +++ b/src/app/auth/auth.module.ts @@ -0,0 +1,51 @@ +import {ModuleWithProviders, NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {LoginComponent} from './login/login.component'; +import {MatCardModule} from '@angular/material/card'; +import { MatInputModule } from '@angular/material/input'; +import {RouterModule} from '@angular/router'; +import {ReactiveFormsModule} from '@angular/forms'; +import {MatButtonModule} from '@angular/material/button'; +import { StoreModule } from '@ngrx/store'; +import {AuthService} from './auth.service'; +import * as fromAuth from './reducers'; +import {authReducer} from './reducers'; +import {AuthGuard} from './auth.guard'; +import {EffectsModule} from '@ngrx/effects'; +import {AuthEffects} from './auth.effects'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { ButtonLoadingComponent } from 'app/shared/components/button-loading/button-loading.component'; +import { SharedComponentsModule } from '../shared/components/shared-components.module'; +import { SharedMaterialModule } from '../shared/shared-material.module'; +import { FlexLayoutModule } from '@angular/flex-layout'; + +@NgModule({ + imports: [ + CommonModule, + ReactiveFormsModule, + MatCardModule, + MatInputModule, + MatButtonModule, + SharedComponentsModule, + BrowserAnimationsModule, + SharedMaterialModule, + FlexLayoutModule, + RouterModule.forChild([{path: '', component: LoginComponent}]), + StoreModule.forFeature('auth', authReducer), + EffectsModule.forFeature([AuthEffects]), + + ], + declarations: [LoginComponent], + exports: [LoginComponent] +}) +export class AuthModule { + static forRoot(): ModuleWithProviders { + return { + ngModule: AuthModule, + providers: [ + AuthService, + AuthGuard + ] + } + } +} diff --git a/src/app/auth/auth.selectors.ts b/src/app/auth/auth.selectors.ts new file mode 100644 index 0000000..81e784b --- /dev/null +++ b/src/app/auth/auth.selectors.ts @@ -0,0 +1,19 @@ +import {createFeatureSelector, createSelector} from '@ngrx/store'; +import {AuthState} from './reducers'; + + +export const selectAuthState = + createFeatureSelector("auth"); + + +export const isLoggedIn = createSelector( + selectAuthState, + auth => !!auth.user + +); + + +export const isLoggedOut = createSelector( + isLoggedIn, + loggedIn => !loggedIn +); diff --git a/src/app/auth/auth.service.ts b/src/app/auth/auth.service.ts new file mode 100644 index 0000000..6542bed --- /dev/null +++ b/src/app/auth/auth.service.ts @@ -0,0 +1,20 @@ +import {Injectable} from '@angular/core'; +import {HttpClient} from '@angular/common/http'; +import {Observable} from 'rxjs'; +import {User} from './model/user.model'; + + + + +@Injectable() +export class AuthService { + + constructor(private http: HttpClient) { + + } + + login(email:string, password: string): Observable { + return this.http.post('/api/login', {email, password}); + } + +} diff --git a/src/app/auth/login/login.component.html b/src/app/auth/login/login.component.html new file mode 100644 index 0000000..bc95450 --- /dev/null +++ b/src/app/auth/login/login.component.html @@ -0,0 +1,92 @@ +
+
+ +
+
+ +
+
+ + +
+
+ + Email + + + + + Password + + + + + +
+ Sign in + or + Sign Up +
+ + +
+
+
+
diff --git a/src/app/auth/login/login.component.scss b/src/app/auth/login/login.component.scss new file mode 100644 index 0000000..259f011 --- /dev/null +++ b/src/app/auth/login/login.component.scss @@ -0,0 +1,11 @@ + + +.login-page { + max-width: 350px; + margin: 50px auto 0 auto; +} + +.login-form { + display: flex; + flex-direction: column; +} \ No newline at end of file diff --git a/src/app/auth/login/login.component.ts b/src/app/auth/login/login.component.ts new file mode 100644 index 0000000..bb522e4 --- /dev/null +++ b/src/app/auth/login/login.component.ts @@ -0,0 +1,152 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import {FormBuilder, FormControl, FormGroup, Validators} from '@angular/forms'; + +import {Store} from '@ngrx/store'; + +import {AuthService} from '../auth.service'; +import {takeUntil, tap} from 'rxjs/operators'; +import {noop, Subject} from 'rxjs'; +import {ActivatedRoute, Router} from '@angular/router'; +import {AppState} from '../../reducers'; +import {login} from '../auth.actions'; +import {AuthActions} from '../action-types'; +import { matxAnimations } from 'app/shared/animations/matx-animations'; +import { AppLoaderService } from 'app/shared/services/app-loader/app-loader.service'; + +@Component({ + selector: 'app-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.scss'], + animations: matxAnimations + +}) +export class LoginComponent implements OnInit { + signinForm: FormGroup; + errorMsg = ''; + return: string; + loading: Boolean; + + private _unsubscribeAll: Subject; + constructor( + private auth: AuthService, + private matxLoader: AppLoaderService, + private router: Router, + private route: ActivatedRoute, + private store: Store + ) { + this._unsubscribeAll = new Subject(); + } + + ngOnInit() { + this.signinForm = new FormGroup({ + username: new FormControl('Watson', Validators.required), + password: new FormControl('12345678', Validators.required), + //rememberMe: new FormControl(true) + }); + + this.route.queryParams + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(params => this.return = params['return'] || '/'); + } + + ngAfterViewInit() { + // setTimeout(() => { + //this.autoSignIn(); + // }) + } + + // tslint:disable-next-line: use-lifecycle-interface + ngOnDestroy() { + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + signin() { + // const signinData = this.signinForm.value; + // this.loading = true; + // this.jwtAuth.signin(signinData.username, signinData.password) + // .subscribe(response => { + // this.loading = false; + // this.router.navigateByUrl(this.return); + // }, err => { + // this.loading = false; + // this.errorMsg = err.message; + // }) + const val = this.signinForm.value; + + this.auth.login(val.email, val.password) + .pipe( + tap(user => { + + console.log(user); + + this.store.dispatch(login({user})); + + this.router.navigateByUrl('/dashboard/analytics'); + + }) + ) + .subscribe( + noop, + () => alert('Login Failed') + ); + + } + + autoSignIn() { + if (this.return === '/') { + return; + } + this.matxLoader.open(`Automatically Signing you in! \n Return url: ${this.return.substring(0, 20)}...`, {width: '320px'}); + setTimeout(() => { + this.signin(); + console.log('autoSignIn'); + this.matxLoader.close(); + }, 2000); + } +// form: FormGroup; + +// constructor( +// private fb: FormBuilder, +// private auth: AuthService, +// private router: Router, +// private store: Store) { + +// this.form = fb.group({ +// email: ['test@angular-university.io', [Validators.required]], +// password: ['test', [Validators.required]] +// }); + +// } + +// ngOnInit() { + +// } + +// login() { + +// const val = this.form.value; + +// this.auth.login(val.email, val.password) +// .pipe( +// tap(user => { + +// console.log(user); + +// this.store.dispatch(login({user})); + +// this.router.navigateByUrl('/dashboard/analytics'); + +// }) +// ) +// .subscribe( +// noop, +// () => alert('Login Failed') +// ); + + + +// } + +} + diff --git a/src/app/auth/model/user.model.ts b/src/app/auth/model/user.model.ts new file mode 100644 index 0000000..6bf68e4 --- /dev/null +++ b/src/app/auth/model/user.model.ts @@ -0,0 +1,6 @@ + + +export interface User { + id: string; + email: string; +} diff --git a/src/app/auth/reducers/index.ts b/src/app/auth/reducers/index.ts new file mode 100644 index 0000000..75bf90a --- /dev/null +++ b/src/app/auth/reducers/index.ts @@ -0,0 +1,40 @@ +import { + ActionReducer, + ActionReducerMap, + createFeatureSelector, createReducer, + createSelector, + MetaReducer, on +} from '@ngrx/store'; +import {User} from '../model/user.model'; +import {AuthActions} from '../action-types'; + + + +export interface AuthState { + user: User +} + +export const initialAuthState: AuthState = { + user: undefined +}; + +export const authReducer = createReducer( + + initialAuthState, + + on(AuthActions.login, (state, action) => { + return { + user: action.user + } + }), + + on(AuthActions.logout, (state, action) => { + return { + user: undefined + } + }) + + + +); + diff --git a/src/app/courses/course/course.component.css b/src/app/courses/course/course.component.css new file mode 100644 index 0000000..a846c4e --- /dev/null +++ b/src/app/courses/course/course.component.css @@ -0,0 +1,56 @@ + +.course { + text-align: center; + max-width: 390px; + margin: 0 auto; +} + +.course-thumbnail { + width: 175px; + margin: 20px auto 0 auto; + display: block; + border-radius: 4px; +} + +.description-cell { + text-align: left; + margin: 10px auto; +} + +.duration-cell { + text-align: center; +} + +.duration-cell mat-icon { + display: inline-block; + vertical-align: middle; + font-size: 20px; +} + +.lessons-table { + min-height: 360px; + margin-top: 10px; +} + +.spinner-container mat-spinner { + margin: 95px auto 0 auto; +} + +.action-toolbar { + margin-top: 20px; +} + +h2 { + font-family: "Roboto"; +} + + +.bottom-toolbar { + margin-top: 20px; + margin-bottom: 200px; +} + + +.spinner-container { + width:390px; +} diff --git a/src/app/courses/course/course.component.html b/src/app/courses/course/course.component.html new file mode 100644 index 0000000..97f480b --- /dev/null +++ b/src/app/courses/course/course.component.html @@ -0,0 +1,51 @@ +
+ +

{{course?.description}}

+ + + +
+ + + +
+ + + + + + # + + {{lesson.seqNo}} + + + + + + Description + + {{lesson.description}} + + + + + + Duration + + {{lesson.duration}} + + + + + + + + + + + + +
diff --git a/src/app/courses/course/course.component.ts b/src/app/courses/course/course.component.ts new file mode 100644 index 0000000..c1949f2 --- /dev/null +++ b/src/app/courses/course/course.component.ts @@ -0,0 +1,73 @@ +import {AfterViewInit, ChangeDetectionStrategy, Component, OnInit} from '@angular/core'; +import {ActivatedRoute} from '@angular/router'; +import {Course} from '../model/course'; +import {Observable, of} from 'rxjs'; +import {Lesson} from '../model/lesson'; +import {concatMap, delay, filter, first, map, shareReplay, tap, withLatestFrom} from 'rxjs/operators'; +import {CoursesHttpService} from '../services/courses-http.service'; +import {CourseEntityService} from '../services/course-entity.service'; +import {LessonEntityService} from '../services/lesson-entity.service'; + + +@Component({ + selector: 'course', + templateUrl: './course.component.html', + styleUrls: ['./course.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class CourseComponent implements OnInit { + + course$: Observable; + + loading$: Observable; + + lessons$: Observable; + + displayedColumns = ['seqNo', 'description', 'duration']; + + nextPage = 0; + + constructor( + private coursesService: CourseEntityService, + private lessonsService: LessonEntityService, + private route: ActivatedRoute) { + + } + + ngOnInit() { + + const courseUrl = this.route.snapshot.paramMap.get('courseUrl'); + + this.course$ = this.coursesService.entities$ + .pipe( + map(courses => courses.find(course => course.url == courseUrl)) + ); + + this.lessons$ = this.lessonsService.entities$ + .pipe( + withLatestFrom(this.course$), + tap(([lessons, course]) => { + if (this.nextPage == 0) { + this.loadLessonsPage(course); + } + }), + map(([lessons, course]) => + lessons.filter(lesson => lesson.courseId == course.id)) + ); + + this.loading$ = this.lessonsService.loading$.pipe(delay(0)); + + } + + loadLessonsPage(course: Course) { + this.lessonsService.getWithQuery({ + 'courseId': course.id.toString(), + 'pageNumber': this.nextPage.toString(), + 'pageSize': '3' + }); + + this.nextPage += 1; + + } + +} diff --git a/src/app/courses/courses-card-list/courses-card-list.component.css b/src/app/courses/courses-card-list/courses-card-list.component.css new file mode 100644 index 0000000..111d591 --- /dev/null +++ b/src/app/courses/courses-card-list/courses-card-list.component.css @@ -0,0 +1,15 @@ + + +.course-card { + margin: 20px 10px; +} + +.course-actions { + text-align: center; + +} + +.course-actions button { + margin-right: 10px; +} + diff --git a/src/app/courses/courses-card-list/courses-card-list.component.html b/src/app/courses/courses-card-list/courses-card-list.component.html new file mode 100644 index 0000000..502c78d --- /dev/null +++ b/src/app/courses/courses-card-list/courses-card-list.component.html @@ -0,0 +1,33 @@ + + + + + + + {{course.description}} + + + + + + +

{{course.longDescription}}

+
+ + + + + + + + + + + +
diff --git a/src/app/courses/courses-card-list/courses-card-list.component.ts b/src/app/courses/courses-card-list/courses-card-list.component.ts new file mode 100644 index 0000000..33915e3 --- /dev/null +++ b/src/app/courses/courses-card-list/courses-card-list.component.ts @@ -0,0 +1,67 @@ +import {ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation} from '@angular/core'; +import {Course} from "../model/course"; +import { MatDialog, MatDialogConfig } from "@angular/material/dialog"; +import {EditCourseDialogComponent} from "../edit-course-dialog/edit-course-dialog.component"; +import {defaultDialogConfig} from '../shared/default-dialog-config'; +import {CourseEntityService} from '../services/course-entity.service'; + +@Component({ + selector: 'courses-card-list', + templateUrl: './courses-card-list.component.html', + styleUrls: ['./courses-card-list.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class CoursesCardListComponent implements OnInit { + + @Input() + courses: Course[]; + + @Output() + courseChanged = new EventEmitter(); + + constructor( + private dialog: MatDialog, + private courseService: CourseEntityService) { + } + + ngOnInit() { + + } + + editCourse(course:Course) { + + const dialogConfig = defaultDialogConfig(); + + dialogConfig.data = { + dialogTitle:"Edit Course", + course, + mode: 'update' + }; + + this.dialog.open(EditCourseDialogComponent, dialogConfig) + .afterClosed() + .subscribe(() => this.courseChanged.emit()); + + } + + onDeleteCourse(course:Course) { + + this.courseService.delete(course) + .subscribe( + () => console.log("Delete completed"), + err => console.log("Deleted failed", err) + ); + + + } + +} + + + + + + + + + diff --git a/src/app/courses/courses.module.ts b/src/app/courses/courses.module.ts new file mode 100644 index 0000000..97a84a3 --- /dev/null +++ b/src/app/courses/courses.module.ts @@ -0,0 +1,120 @@ +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {HomeComponent} from './home/home.component'; +import {CoursesCardListComponent} from './courses-card-list/courses-card-list.component'; +import {EditCourseDialogComponent} from './edit-course-dialog/edit-course-dialog.component'; +import {CoursesHttpService} from './services/courses-http.service'; +import {CourseComponent} from './course/course.component'; +import {MatDatepickerModule} from '@angular/material/datepicker'; +import {MatDialogModule} from '@angular/material/dialog'; +import {MatInputModule} from '@angular/material/input'; +import {MatPaginatorModule} from '@angular/material/paginator'; +import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; +import {MatSelectModule} from '@angular/material/select'; +import {MatSlideToggleModule} from '@angular/material/slide-toggle'; +import {MatSortModule} from '@angular/material/sort'; +import {MatTableModule} from '@angular/material/table'; +import {MatTabsModule} from '@angular/material/tabs'; +import {ReactiveFormsModule} from '@angular/forms'; +import {MatMomentDateModule} from '@angular/material-moment-adapter'; +import {MatCardModule} from '@angular/material/card'; +import {MatButtonModule} from '@angular/material/button'; +import {MatIconModule} from '@angular/material/icon'; +import {RouterModule, Routes} from '@angular/router'; +import {EntityDataService, EntityDefinitionService, EntityMetadataMap} from '@ngrx/data'; +import {compareCourses, Course} from './model/course'; + +import {compareLessons, Lesson} from './model/lesson'; +import {CourseEntityService} from './services/course-entity.service'; +import {CoursesResolver} from './services/courses.resolver'; +import {CoursesDataService} from './services/courses-data.service'; +import {LessonEntityService} from './services/lesson-entity.service'; + + +export const coursesRoutes: Routes = [ + { + path: '', + component: HomeComponent, + resolve: { + courses: CoursesResolver + } + }, + { + path: ':courseUrl', + component: CourseComponent, + resolve: { + courses: CoursesResolver + } + } +]; + +const entityMetadata: EntityMetadataMap = { + Course: { + sortComparer: compareCourses, + entityDispatcherOptions: { + optimisticUpdate: true + } + }, + Lesson: { + sortComparer: compareLessons + } +}; + + +@NgModule({ + imports: [ + CommonModule, + MatButtonModule, + MatIconModule, + MatCardModule, + MatTabsModule, + MatInputModule, + MatTableModule, + MatPaginatorModule, + MatSortModule, + MatProgressSpinnerModule, + MatSlideToggleModule, + MatDialogModule, + MatSelectModule, + MatDatepickerModule, + MatMomentDateModule, + ReactiveFormsModule, + RouterModule.forChild(coursesRoutes) + ], + declarations: [ + HomeComponent, + CoursesCardListComponent, + EditCourseDialogComponent, + CourseComponent + ], + exports: [ + HomeComponent, + CoursesCardListComponent, + + EditCourseDialogComponent, + CourseComponent + ], + entryComponents: [EditCourseDialogComponent], + providers: [ + CoursesHttpService, + CourseEntityService, + LessonEntityService, + CoursesResolver, + CoursesDataService + ] +}) +export class CoursesModule { + + constructor( + private eds: EntityDefinitionService, + private entityDataService: EntityDataService, + private coursesDataService: CoursesDataService) { + + eds.registerMetadataMap(entityMetadata); + + entityDataService.registerService('Course', coursesDataService); + + } + + +} diff --git a/src/app/courses/edit-course-dialog/edit-course-dialog.component.css b/src/app/courses/edit-course-dialog/edit-course-dialog.component.css new file mode 100644 index 0000000..a6ca8f0 --- /dev/null +++ b/src/app/courses/edit-course-dialog/edit-course-dialog.component.css @@ -0,0 +1,10 @@ + + +.mat-form-field { + display: block; +} + +textarea { + height: 100px; + resize: vertical; +} diff --git a/src/app/courses/edit-course-dialog/edit-course-dialog.component.html b/src/app/courses/edit-course-dialog/edit-course-dialog.component.html new file mode 100644 index 0000000..21351cb --- /dev/null +++ b/src/app/courses/edit-course-dialog/edit-course-dialog.component.html @@ -0,0 +1,95 @@ + +

{{dialogTitle}}

+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Beginner + + Intermediate + + Advanced + + + + + + Promotion On + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + diff --git a/src/app/courses/edit-course-dialog/edit-course-dialog.component.ts b/src/app/courses/edit-course-dialog/edit-course-dialog.component.ts new file mode 100644 index 0000000..ebe2353 --- /dev/null +++ b/src/app/courses/edit-course-dialog/edit-course-dialog.component.ts @@ -0,0 +1,91 @@ +import {ChangeDetectionStrategy, Component, Inject} from '@angular/core'; +import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; +import {Course} from '../model/course'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {Observable} from 'rxjs'; +import {CoursesHttpService} from '../services/courses-http.service'; +import {CourseEntityService} from '../services/course-entity.service'; + +@Component({ + selector: 'course-dialog', + templateUrl: './edit-course-dialog.component.html', + styleUrls: ['./edit-course-dialog.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class EditCourseDialogComponent { + + form: FormGroup; + + dialogTitle: string; + + course: Course; + + mode: 'create' | 'update'; + + loading$: Observable; + + constructor( + private fb: FormBuilder, + private dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) data, + private coursesService: CourseEntityService) { + + this.dialogTitle = data.dialogTitle; + this.course = data.course; + this.mode = data.mode; + + const formControls = { + description: ['', Validators.required], + category: ['', Validators.required], + longDescription: ['', Validators.required], + promo: ['', []] + }; + + if (this.mode == 'update') { + this.form = this.fb.group(formControls); + this.form.patchValue({...data.course}); + } else if (this.mode == 'create') { + this.form = this.fb.group({ + ...formControls, + url: ['', Validators.required], + iconUrl: ['', Validators.required] + }); + } + } + + onClose() { + this.dialogRef.close(); + } + + onSave() { + + const course: Course = { + ...this.course, + ...this.form.value + }; + + if (this.mode == 'update') { + + this.coursesService.update(course); + + this.dialogRef.close(); + } else if (this.mode == 'create') { + + this.coursesService.add(course) + .subscribe( + newCourse => { + + console.log('New Course', newCourse); + + this.dialogRef.close(); + + } + ); + + } + + + } + + +} diff --git a/src/app/courses/home/home.component.css b/src/app/courses/home/home.component.css new file mode 100644 index 0000000..6c18b26 --- /dev/null +++ b/src/app/courses/home/home.component.css @@ -0,0 +1,38 @@ + + +.title { + text-align: center; + margin-right: 15px; + +} + +.courses-panel { + max-width: 350px; + margin: 0 auto; +} + + +.counters { + display: flex; +} + +.filler { + flex: 1 1 auto; +} + +h2 { + font-family: "Roboto"; +} + +.header { + display: flex; + justify-content: center; + align-items: center; + +} + + + +.spinner-container { + margin-top: 100px; +} diff --git a/src/app/courses/home/home.component.html b/src/app/courses/home/home.component.html new file mode 100644 index 0000000..2e2d4b8 --- /dev/null +++ b/src/app/courses/home/home.component.html @@ -0,0 +1,41 @@ +
+ +
+ +

All Courses

+ + + +
+ +
+

In Promo: {{promoTotal$ | async}}

+
+ + + + + + + + + + + + + + + + + + + + +
+ diff --git a/src/app/courses/home/home.component.ts b/src/app/courses/home/home.component.ts new file mode 100644 index 0000000..0b286ec --- /dev/null +++ b/src/app/courses/home/home.component.ts @@ -0,0 +1,68 @@ +import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core'; +import {Course} from '../model/course'; +import {Observable} from 'rxjs'; +import {defaultDialogConfig} from '../shared/default-dialog-config'; +import {EditCourseDialogComponent} from '../edit-course-dialog/edit-course-dialog.component'; +import { MatDialog } from '@angular/material/dialog'; +import {map} from 'rxjs/operators'; +import {CourseEntityService} from '../services/course-entity.service'; + + +@Component({ + selector: 'home', + templateUrl: './home.component.html', + styleUrls: ['./home.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class HomeComponent implements OnInit { + + promoTotal$: Observable; + + beginnerCourses$: Observable; + + advancedCourses$: Observable; + + constructor( + private dialog: MatDialog, + private coursesService: CourseEntityService) { + + } + + ngOnInit() { + this.reload(); + } + + reload() { + + this.beginnerCourses$ = this.coursesService.entities$ + .pipe( + map(courses => courses.filter(course => course.category == 'BEGINNER')) + ); + + this.advancedCourses$ = this.coursesService.entities$ + .pipe( + map(courses => courses.filter(course => course.category == 'ADVANCED')) + ); + + this.promoTotal$ = this.coursesService.entities$ + .pipe( + map(courses => courses.filter(course => course.promo).length) + ); + + } + + onAddCourse() { + + const dialogConfig = defaultDialogConfig(); + + dialogConfig.data = { + dialogTitle:"Create Course", + mode: 'create' + }; + + this.dialog.open(EditCourseDialogComponent, dialogConfig); + + } + + +} diff --git a/src/app/courses/model/course.ts b/src/app/courses/model/course.ts new file mode 100644 index 0000000..b863fb0 --- /dev/null +++ b/src/app/courses/model/course.ts @@ -0,0 +1,28 @@ + +export interface Course { + id: number; + seqNo:number; + url:string; + iconUrl: string; + courseListIcon: string; + description: string; + longDescription?: string; + category: string; + lessonsCount: number; + promo: boolean; +} + + +export function compareCourses(c1:Course, c2: Course) { + + const compare = c1.seqNo - c2.seqNo; + + if (compare > 0) { + return 1; + } + else if ( compare < 0) { + return -1; + } + else return 0; + +} diff --git a/src/app/courses/model/lesson.ts b/src/app/courses/model/lesson.ts new file mode 100644 index 0000000..7654526 --- /dev/null +++ b/src/app/courses/model/lesson.ts @@ -0,0 +1,26 @@ + + +export interface Lesson { + id: number; + description: string; + duration: string; + seqNo: number; + courseId: number; +} + + +export function compareLessons(l1:Lesson, l2: Lesson) { + + const compareCourses = l1.courseId - l2.courseId; + + if (compareCourses > 0) { + return 1; + } + else if (compareCourses < 0){ + return -1; + } + else { + return l1.seqNo - l2.seqNo; + } + +} diff --git a/src/app/courses/services/course-entity.service.ts b/src/app/courses/services/course-entity.service.ts new file mode 100644 index 0000000..1cda64c --- /dev/null +++ b/src/app/courses/services/course-entity.service.ts @@ -0,0 +1,19 @@ +import {Injectable} from '@angular/core'; +import {EntityCollectionServiceBase, EntityCollectionServiceElementsFactory} from '@ngrx/data'; +import {Course} from '../model/course'; + + +@Injectable() +export class CourseEntityService + extends EntityCollectionServiceBase { + + constructor( + serviceElementsFactory: + EntityCollectionServiceElementsFactory) { + + super('Course', serviceElementsFactory); + + } + +} + diff --git a/src/app/courses/services/courses-data.service.ts b/src/app/courses/services/courses-data.service.ts new file mode 100644 index 0000000..b02ebb6 --- /dev/null +++ b/src/app/courses/services/courses-data.service.ts @@ -0,0 +1,26 @@ +import {Injectable} from '@angular/core'; +import {DefaultDataService, HttpUrlGenerator} from '@ngrx/data'; +import {Course} from '../model/course'; +import {HttpClient} from '@angular/common/http'; +import {Observable} from 'rxjs'; +import {map} from 'rxjs/operators'; + + + +@Injectable() +export class CoursesDataService extends DefaultDataService { + + + constructor(http:HttpClient, httpUrlGenerator: HttpUrlGenerator) { + super('Course', http, httpUrlGenerator); + + } + + getAll(): Observable { + return this.http.get('/api/courses') + .pipe( + map(res => res["payload"]) + ); + } + +} diff --git a/src/app/courses/services/courses-http.service.ts b/src/app/courses/services/courses-http.service.ts new file mode 100644 index 0000000..e8a6cea --- /dev/null +++ b/src/app/courses/services/courses-http.service.ts @@ -0,0 +1,48 @@ + + +import {Injectable} from '@angular/core'; +import {HttpClient, HttpParams} from '@angular/common/http'; +import {Observable} from 'rxjs'; +import {Course} from '../model/course'; +import {map} from 'rxjs/operators'; +import {Lesson} from '../model/lesson'; + + +@Injectable() +export class CoursesHttpService { + + constructor(private http:HttpClient) { + + } + + findAllCourses(): Observable { + return this.http.get('/api/courses') + .pipe( + map(res => res['payload']) + ); + } + + findCourseByUrl(courseUrl: string): Observable { + return this.http.get(`/api/courses/${courseUrl}`); + } + + findLessons( + courseId:number, + pageNumber = 0, pageSize = 3): Observable { + + return this.http.get('/api/lessons', { + params: new HttpParams() + .set('courseId', courseId.toString()) + .set('sortOrder', 'asc') + .set('pageNumber', pageNumber.toString()) + .set('pageSize', pageSize.toString()) + }); + } + + + saveCourse(courseId: string | number, changes: Partial) { + return this.http.put('/api/course/' + courseId, changes); + } + + +} diff --git a/src/app/courses/services/courses.resolver.ts b/src/app/courses/services/courses.resolver.ts new file mode 100644 index 0000000..a59a13c --- /dev/null +++ b/src/app/courses/services/courses.resolver.ts @@ -0,0 +1,31 @@ +import {Injectable} from '@angular/core'; +import {ActivatedRouteSnapshot, Resolve, RouterStateSnapshot} from '@angular/router'; +import {Observable} from 'rxjs'; +import {CourseEntityService} from './course-entity.service'; +import {filter, first, map, tap} from 'rxjs/operators'; + + +@Injectable() +export class CoursesResolver implements Resolve { + + constructor(private coursesService: CourseEntityService) { + + } + + resolve(route: ActivatedRouteSnapshot, + state: RouterStateSnapshot): Observable { + + return this.coursesService.loaded$ + .pipe( + tap(loaded => { + if (!loaded) { + this.coursesService.getAll(); + } + }), + filter(loaded => !!loaded), + first() + ); + + } + +} diff --git a/src/app/courses/services/lesson-entity.service.ts b/src/app/courses/services/lesson-entity.service.ts new file mode 100644 index 0000000..66cd01a --- /dev/null +++ b/src/app/courses/services/lesson-entity.service.ts @@ -0,0 +1,13 @@ +import {Injectable} from '@angular/core'; +import {EntityCollectionServiceBase, EntityCollectionServiceElementsFactory} from '@ngrx/data'; +import {Lesson} from '../model/lesson'; + + +@Injectable() +export class LessonEntityService extends EntityCollectionServiceBase { + + constructor(serviceElementsFactory: EntityCollectionServiceElementsFactory) { + super('Lesson', serviceElementsFactory); + } + +} diff --git a/src/app/courses/shared/default-dialog-config.ts b/src/app/courses/shared/default-dialog-config.ts new file mode 100644 index 0000000..18814c7 --- /dev/null +++ b/src/app/courses/shared/default-dialog-config.ts @@ -0,0 +1,12 @@ +import { MatDialogConfig } from '@angular/material/dialog'; + + +export function defaultDialogConfig() { + const dialogConfig = new MatDialogConfig(); + + dialogConfig.disableClose = true; + dialogConfig.autoFocus = true; + dialogConfig.width = '400px'; + + return dialogConfig; +} diff --git a/src/app/reducers/index.ts b/src/app/reducers/index.ts new file mode 100644 index 0000000..74aa93b --- /dev/null +++ b/src/app/reducers/index.ts @@ -0,0 +1,20 @@ +import { + ActionReducer, + ActionReducerMap, + createFeatureSelector, + createSelector, + MetaReducer +} from '@ngrx/store'; +import { environment } from '../../environments/environment'; +import {routerReducer} from '@ngrx/router-store'; + +export interface AppState { + +} + + + +export const metaReducers: MetaReducer[] = + !environment.production ? [logger] : []; + + diff --git a/src/app/shared/animations/matx-animations.ts b/src/app/shared/animations/matx-animations.ts new file mode 100644 index 0000000..3bd84b4 --- /dev/null +++ b/src/app/shared/animations/matx-animations.ts @@ -0,0 +1,53 @@ +import { + trigger, + animate, + style, + transition, + state, + animation, + useAnimation +} from "@angular/animations"; + +const reusable = animation( + [ + style({ + opacity: "{{opacity}}", + transform: "scale({{scale}}) translate3d({{x}}, {{y}}, {{z}})" + }), + animate("{{duration}} {{delay}} cubic-bezier(0.0, 0.0, 0.2, 1)", style("*")) + ], + { + params: { + duration: "200ms", + delay: "0ms", + opacity: "0", + scale: "1", + x: "0", + y: "0", + z: "0" + } + } +); + +export const matxAnimations = [ + trigger("animate", [transition("void => *", [useAnimation(reusable)])]), + + trigger("fadeInOut", [ + state( + "0", + style({ + opacity: 0, + display: "none" + }) + ), + state( + "1", + style({ + opacity: 1, + display: "block" + }) + ), + transition("0 => 1", animate("300ms")), + transition("1 => 0", animate("300ms")) + ]) +]; diff --git a/src/app/shared/components/breadcrumb/breadcrumb.component.html b/src/app/shared/components/breadcrumb/breadcrumb.component.html new file mode 100644 index 0000000..886904a --- /dev/null +++ b/src/app/shared/components/breadcrumb/breadcrumb.component.html @@ -0,0 +1,12 @@ + + + \ No newline at end of file diff --git a/src/app/shared/components/breadcrumb/breadcrumb.component.scss b/src/app/shared/components/breadcrumb/breadcrumb.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/shared/components/breadcrumb/breadcrumb.component.ts b/src/app/shared/components/breadcrumb/breadcrumb.component.ts new file mode 100644 index 0000000..5c47cbc --- /dev/null +++ b/src/app/shared/components/breadcrumb/breadcrumb.component.ts @@ -0,0 +1,66 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { Router, NavigationEnd, ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router'; +import { RoutePartsService } from '../../../shared/services/route-parts.service'; +import { LayoutService } from '../../../shared/services/layout.service'; +import { Subscription } from "rxjs"; +import { filter } from 'rxjs/operators'; + +@Component({ + selector: 'app-breadcrumb', + templateUrl: './breadcrumb.component.html', + styleUrls: ['./breadcrumb.component.scss'] +}) +export class BreadcrumbComponent implements OnInit, OnDestroy { + routeParts:any[]; + routerEventSub: Subscription; + // public isEnabled: boolean = true; + constructor( + private router: Router, + private routePartsService: RoutePartsService, + private activeRoute: ActivatedRoute, + public layout: LayoutService + ) { + this.routeParts = this.routePartsService.generateRouteParts(this.activeRoute.snapshot); + + this.routerEventSub = this.router.events + .pipe(filter(event => event instanceof NavigationEnd)) + .subscribe((routeChange) => { + this.routeParts = this.routePartsService.generateRouteParts(this.activeRoute.snapshot); + // generate url from parts + this.routeParts.reverse().map((item, i) => { + item.breadcrumb = this.parseText(item); + item.urlSegments.forEach((urlSegment, j) => { + if(j === 0) + return item.url = `${urlSegment.path}`; + item.url += `/${urlSegment.path}` + }); + if(i === 0) { + return item; + } + // prepend previous part to current part + item.url = `${this.routeParts[i - 1].url}/${item.url}`; + return item; + }); + }); + } + + ngOnInit() { + } + ngOnDestroy() { + if(this.routerEventSub) { + this.routerEventSub.unsubscribe() + } + } + + parseText(part) { + if(!part.breadcrumb) { + return '' + } + part.breadcrumb = part.breadcrumb.replace(/{{([^{}]*)}}/g, function (a, b) { + var r = part.params[b]; + return typeof r === 'string' ? r : a; + }); + return part.breadcrumb; + } + +} diff --git a/src/app/shared/components/button-loading/button-loading.component.html b/src/app/shared/components/button-loading/button-loading.component.html new file mode 100644 index 0000000..87a5f62 --- /dev/null +++ b/src/app/shared/components/button-loading/button-loading.component.html @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/src/app/shared/components/button-loading/button-loading.component.scss b/src/app/shared/components/button-loading/button-loading.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/shared/components/button-loading/button-loading.component.spec.ts b/src/app/shared/components/button-loading/button-loading.component.spec.ts new file mode 100644 index 0000000..fec4f91 --- /dev/null +++ b/src/app/shared/components/button-loading/button-loading.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ButtonLoadingComponent } from './button-loading.component'; + +describe('ButtonLoadingComponent', () => { + let component: ButtonLoadingComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ButtonLoadingComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ButtonLoadingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/button-loading/button-loading.component.ts b/src/app/shared/components/button-loading/button-loading.component.ts new file mode 100644 index 0000000..a53a14c --- /dev/null +++ b/src/app/shared/components/button-loading/button-loading.component.ts @@ -0,0 +1,23 @@ +import { Component, OnInit, Input } from '@angular/core'; + +@Component({ + selector: 'button-loading', + templateUrl: './button-loading.component.html', + styleUrls: ['./button-loading.component.scss'] +}) +export class ButtonLoadingComponent implements OnInit { + + @Input('loading') loading: boolean; + @Input('btnClass') btnClass: string; + @Input('raised') raised: boolean = true; + @Input('loadingText') loadingText = 'Please wait'; + @Input('type') type: 'button' | 'submit' = 'submit'; + @Input('color') color: 'primary' | 'accent' | 'warn'; + + constructor() { + } + + ngOnInit() { + } + +} diff --git a/src/app/shared/components/customizer/customizer.component.html b/src/app/shared/components/customizer/customizer.component.html new file mode 100644 index 0000000..bf1f244 --- /dev/null +++ b/src/app/shared/components/customizer/customizer.component.html @@ -0,0 +1,131 @@ +
+ +
+
+ + +
+ + + apps + + + settings + + + code + + + + + + + +
+
+ + What is this? +
+
+ + + +
+
+
+ + + + +
+
+
+ +
+ + + + +
+
Header Colors
+ +
+
+ check +
+
+
+ +
+
Sidebar colors
+
+
+ check +
+
+
+ +
+
Material Themes
+
+
+ check +
+
+
+ +
+
Footer Colors
+
+ Fixed Footer +
+ +
+
+ check +
+
+
+ +
+
Breadcrumb
+
+ Use breadcrumb +
+ Breadcrumb types + + Simple + Simple with title + +
+ +
+ Custom scrollbar +
+ +
+ +
+
\ No newline at end of file diff --git a/src/app/shared/components/customizer/customizer.component.scss b/src/app/shared/components/customizer/customizer.component.scss new file mode 100644 index 0000000..5de12ff --- /dev/null +++ b/src/app/shared/components/customizer/customizer.component.scss @@ -0,0 +1,118 @@ +.handle { + position: fixed; + bottom: 90px; + right: 30px; + z-index: 99; +} +#app-customizer { + position: fixed; + bottom: 0px; + top: 0; + right: 0; + min-width: 180px; + max-width: 280px; + z-index: 999; + .title { + text-transform: uppercase; + font-size: 12px; + font-weight: bold; + margin: 0 0 1rem; + } + .mat-card { + margin: 0; + border-radius: 0; + } + .mat-card-content { + position: relative; + padding: 1rem 1.5rem 2rem; + height: calc(100vh - 120px); + } +} +.pos-rel { + position: relative; + z-index: 99; + .olay { + position: absolute; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, .5); + z-index: 100; + } +} + +.colors { + display: flex; + flex-wrap: wrap; + .color { + position: relative; + width: 36px; + height: 36px; + display: inline-block; + border-radius: 50%; + margin: 8px; + text-align: center; + box-shadow: 0 4px 20px 1px rgba(0,0,0,.06), 0 1px 4px rgba(0,0,0,.03); + cursor: pointer; + .active-icon { + position: absolute; + left: 0; + right: 0; + margin: auto; + top: 6px; + } + } +} + +.layout-box { + width: 100%; + margin: 16px 0; + max-height: 150px; + border-radius: 8px; + overflow: hidden; + cursor: pointer; + > div { + overflow: hidden; + display: flex; + position: relative; + // height: 76px; + width: 100%; + &:hover { + &::before, + .layout-name { + display: block; + } + } + &::before, + .layout-name { + text-align: center; + position: absolute; + top: 0; + left: 0; + right: 0; + display: none; + } + &::before { + content: " "; + width: 100%; + height: 100%; + background: rgba(0,0,0,0.3); + } + .layout-name { + color: #ffffff; + top: calc(50% - 18px) + } + img { + // position: absolute; + top: 0; + left: 0; + } + } +} + +// [dir="rtl"] { +// .handle {} +// #app-customizer { +// right: auto; +// left: 0; +// } +// } \ No newline at end of file diff --git a/src/app/shared/components/customizer/customizer.component.ts b/src/app/shared/components/customizer/customizer.component.ts new file mode 100644 index 0000000..781af68 --- /dev/null +++ b/src/app/shared/components/customizer/customizer.component.ts @@ -0,0 +1,80 @@ +import { Component, OnInit, Input, Renderer2 } from "@angular/core"; +import { NavigationService } from "../../../shared/services/navigation.service"; +import { LayoutService } from "../../../shared/services/layout.service"; +import PerfectScrollbar from "perfect-scrollbar"; +import { CustomizerService } from "app/shared/services/customizer.service"; +import { ThemeService, ITheme } from "app/shared/services/theme.service"; + +@Component({ + selector: "app-customizer", + templateUrl: "./customizer.component.html", + styleUrls: ["./customizer.component.scss"] +}) +export class CustomizerComponent implements OnInit { + isCustomizerOpen: boolean = false; + // viewMode: 'options' | 'json' | 'demos' = 'demos'; + sidenavTypes = [ + { + name: "Default Menu", + value: "default-menu" + }, + { + name: "Separator Menu", + value: "separator-menu" + }, + { + name: "Icon Menu", + value: "icon-menu" + } + ]; + sidebarColors: any[]; + topbarColors: any[]; + + layoutConf; + selectedMenu: string = "icon-menu"; + selectedLayout: string; + isTopbarFixed = false; + isFooterFixed = false; + isRTL = false; + matxThemes: ITheme[]; + perfectScrollbarEnabled: boolean = true; + + constructor( + private navService: NavigationService, + public layout: LayoutService, + private themeService: ThemeService, + public customizer: CustomizerService, + private renderer: Renderer2 + ) {} + + ngOnInit() { + this.layoutConf = this.layout.layoutConf; + this.selectedLayout = this.layoutConf.navigationPos; + this.isTopbarFixed = this.layoutConf.topbarFixed; + this.isRTL = this.layoutConf.dir === "rtl"; + this.matxThemes = this.themeService.matxThemes; + } + changeTheme(theme) { + // this.themeService.changeTheme(theme); + this.layout.publishLayoutChange({matTheme: theme.name}) + } + changeLayoutStyle(data) { + this.layout.publishLayoutChange({ navigationPos: this.selectedLayout }); + } + changeSidenav(data) { + this.navService.publishNavigationChange(data.value); + } + toggleBreadcrumb(data) { + this.layout.publishLayoutChange({ useBreadcrumb: data.checked }); + } + toggleTopbarFixed(data) { + this.layout.publishLayoutChange({ topbarFixed: data.checked }); + } + toggleDir(data) { + + } + tooglePerfectScrollbar(data) { + this.layout.publishLayoutChange({perfectScrollbar: this.perfectScrollbarEnabled}) + } + +} diff --git a/src/app/shared/components/footer/footer.component.html b/src/app/shared/components/footer/footer.component.html new file mode 100644 index 0000000..e3ae63f --- /dev/null +++ b/src/app/shared/components/footer/footer.component.html @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/src/app/shared/components/footer/footer.component.scss b/src/app/shared/components/footer/footer.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/shared/components/footer/footer.component.spec.ts b/src/app/shared/components/footer/footer.component.spec.ts new file mode 100644 index 0000000..2ca6c45 --- /dev/null +++ b/src/app/shared/components/footer/footer.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FooterComponent } from './footer.component'; + +describe('FooterComponent', () => { + let component: FooterComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FooterComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FooterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/components/footer/footer.component.ts b/src/app/shared/components/footer/footer.component.ts new file mode 100644 index 0000000..da17d82 --- /dev/null +++ b/src/app/shared/components/footer/footer.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-footer', + templateUrl: './footer.component.html', + styleUrls: ['./footer.component.scss'] +}) +export class FooterComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/shared/components/header-side/header-side.component.ts b/src/app/shared/components/header-side/header-side.component.ts new file mode 100644 index 0000000..686fd01 --- /dev/null +++ b/src/app/shared/components/header-side/header-side.component.ts @@ -0,0 +1,75 @@ +import { Component, OnInit, EventEmitter, Input, Output, Renderer2 } from '@angular/core'; +import { ThemeService } from '../../services/theme.service'; +import { LayoutService } from '../../services/layout.service'; +import { JwtAuthService } from 'app/shared/services/auth/jwt-auth.service'; + +@Component({ + selector: 'app-header-side', + templateUrl: './header-side.template.html' +}) +export class HeaderSideComponent implements OnInit { + @Input() notificPanel; + public availableLangs = [{ + name: 'EN', + code: 'en', + flag: 'flag-icon-us' + }, { + name: 'ES', + code: 'es', + flag: 'flag-icon-es' + }] + currentLang = this.availableLangs[0]; + + public matxThemes; + public layoutConf:any; + constructor( + private themeService: ThemeService, + private layout: LayoutService, + private renderer: Renderer2, + public jwtAuth: JwtAuthService + ) {} + ngOnInit() { + this.matxThemes = this.themeService.matxThemes; + this.layoutConf = this.layout.layoutConf; + } + setLang(lng) { + + } + changeTheme(theme) { + // this.themeService.changeTheme(theme); + } + toggleNotific() { + this.notificPanel.toggle(); + } + toggleSidenav() { + if(this.layoutConf.sidebarStyle === 'closed') { + return this.layout.publishLayoutChange({ + sidebarStyle: 'full' + }) + } + this.layout.publishLayoutChange({ + sidebarStyle: 'closed' + }) + } + + toggleCollapse() { + // compact --> full + if(this.layoutConf.sidebarStyle === 'compact') { + return this.layout.publishLayoutChange({ + sidebarStyle: 'full', + sidebarCompactToggle: false + }, {transitionClass: true}) + } + + // * --> compact + this.layout.publishLayoutChange({ + sidebarStyle: 'compact', + sidebarCompactToggle: true + }, {transitionClass: true}) + + } + + onSearch(e) { + // console.log(e) + } +} \ No newline at end of file diff --git a/src/app/shared/components/header-side/header-side.template.html b/src/app/shared/components/header-side/header-side.template.html new file mode 100644 index 0000000..9296859 --- /dev/null +++ b/src/app/shared/components/header-side/header-side.template.html @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/app/shared/components/layouts/admin-layout/admin-layout.component.ts b/src/app/shared/components/layouts/admin-layout/admin-layout.component.ts new file mode 100644 index 0000000..5488e53 --- /dev/null +++ b/src/app/shared/components/layouts/admin-layout/admin-layout.component.ts @@ -0,0 +1,138 @@ +import { Component, OnInit, AfterViewInit, ViewChild, HostListener, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; +import { + Router, + NavigationEnd, + RouteConfigLoadStart, + RouteConfigLoadEnd, + ResolveStart, + ResolveEnd +} from '@angular/router'; +import { Subscription } from "rxjs"; +import { ThemeService } from '../../../services/theme.service'; +import { LayoutService } from '../../../services/layout.service'; +import { filter } from 'rxjs/operators'; +import { JwtAuthService } from '../../../services/auth/jwt-auth.service'; + +@Component({ + selector: 'app-admin-layout', + templateUrl: './admin-layout.template.html', + // changeDetection: ChangeDetectionStrategy.OnPush +}) +export class AdminLayoutComponent implements OnInit, AfterViewInit { + public isModuleLoading: Boolean = false; + private moduleLoaderSub: Subscription; + private layoutConfSub: Subscription; + private routerEventSub: Subscription; + + public scrollConfig = {} + public layoutConf: any = {}; + public adminContainerClasses: any = {}; + + constructor( + private router: Router, + public themeService: ThemeService, + private layout: LayoutService, + private cdr: ChangeDetectorRef, + private jwtAuth: JwtAuthService + ) { + // Check Auth Token is valid + this.jwtAuth.checkTokenIsValid().subscribe(); + + // Close sidenav after route change in mobile + this.routerEventSub = router.events.pipe(filter(event => event instanceof NavigationEnd)) + .subscribe((routeChange: NavigationEnd) => { + this.layout.adjustLayout({ route: routeChange.url }); + this.scrollToTop(); + }); + } + + ngOnInit() { + // this.layoutConf = this.layout.layoutConf; + this.layoutConfSub = this.layout.layoutConf$.subscribe((layoutConf) => { + this.layoutConf = layoutConf; + // console.log(this.layoutConf); + + this.adminContainerClasses = this.updateAdminContainerClasses(this.layoutConf); + this.cdr.markForCheck(); + }); + + // FOR MODULE LOADER FLAG + this.moduleLoaderSub = this.router.events.subscribe(event => { + if(event instanceof RouteConfigLoadStart || event instanceof ResolveStart) { + this.isModuleLoading = true; + } + if(event instanceof RouteConfigLoadEnd || event instanceof ResolveEnd) { + this.isModuleLoading = false; + } + }); + } + @HostListener('window:resize', ['$event']) + onResize(event) { + this.layout.adjustLayout(event); + } + + ngAfterViewInit() { + + } + + scrollToTop() { + if(document) { + setTimeout(() => { + let element; + if(this.layoutConf.topbarFixed) { + element = document.querySelector('#rightside-content-hold'); + } else { + element = document.querySelector('#main-content-wrap'); + } + element.scrollTop = 0; + }) + } + } + ngOnDestroy() { + if(this.moduleLoaderSub) { + this.moduleLoaderSub.unsubscribe(); + } + if(this.layoutConfSub) { + this.layoutConfSub.unsubscribe(); + } + if(this.routerEventSub) { + this.routerEventSub.unsubscribe(); + } + } + closeSidebar() { + this.layout.publishLayoutChange({ + sidebarStyle: 'closed' + }) + } + + sidebarMouseenter(e) { + // console.log(this.layoutConf); + if(this.layoutConf.sidebarStyle === 'compact') { + this.layout.publishLayoutChange({sidebarStyle: 'full'}, {transitionClass: true}); + } + } + + sidebarMouseleave(e) { + // console.log(this.layoutConf); + if ( + this.layoutConf.sidebarStyle === 'full' && + this.layoutConf.sidebarCompactToggle + ) { + this.layout.publishLayoutChange({sidebarStyle: 'compact'}, {transitionClass: true}); + } + } + + updateAdminContainerClasses(layoutConf) { + return { + 'navigation-top': layoutConf.navigationPos === 'top', + 'sidebar-full': layoutConf.sidebarStyle === 'full', + 'sidebar-compact': layoutConf.sidebarStyle === 'compact' && layoutConf.navigationPos === 'side', + 'compact-toggle-active': layoutConf.sidebarCompactToggle, + 'sidebar-compact-big': layoutConf.sidebarStyle === 'compact-big' && layoutConf.navigationPos === 'side', + 'sidebar-opened': layoutConf.sidebarStyle !== 'closed' && layoutConf.navigationPos === 'side', + 'sidebar-closed': layoutConf.sidebarStyle === 'closed', + 'fixed-topbar': layoutConf.topbarFixed && layoutConf.navigationPos === 'side' + } + } + +} \ No newline at end of file diff --git a/src/app/shared/components/layouts/admin-layout/admin-layout.template.html b/src/app/shared/components/layouts/admin-layout/admin-layout.template.html new file mode 100644 index 0000000..c6557a0 --- /dev/null +++ b/src/app/shared/components/layouts/admin-layout/admin-layout.template.html @@ -0,0 +1,66 @@ +
+ + + + + + + + + +
+ + + + + +
+ +
+
+
+
+
+
+ + + + + + +
+ + +
+ + + + +
+ + + + +
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/src/app/shared/components/layouts/auth-layout/auth-layout.component.html b/src/app/shared/components/layouts/auth-layout/auth-layout.component.html new file mode 100644 index 0000000..90c6b64 --- /dev/null +++ b/src/app/shared/components/layouts/auth-layout/auth-layout.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/shared/components/layouts/auth-layout/auth-layout.component.ts b/src/app/shared/components/layouts/auth-layout/auth-layout.component.ts new file mode 100644 index 0000000..a7a1cb6 --- /dev/null +++ b/src/app/shared/components/layouts/auth-layout/auth-layout.component.ts @@ -0,0 +1,14 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-auth-layout', + templateUrl: './auth-layout.component.html' +}) +export class AuthLayoutComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/shared/components/notifications/notifications.component.html b/src/app/shared/components/notifications/notifications.component.html new file mode 100644 index 0000000..9caa516 --- /dev/null +++ b/src/app/shared/components/notifications/notifications.component.html @@ -0,0 +1,18 @@ +
+
Notifications
+
+ + + + {{n.icon}} + +
+

{{n.message}}

+ {{n.time}} +
+
+
+
+ \ No newline at end of file diff --git a/src/app/shared/components/notifications/notifications.component.ts b/src/app/shared/components/notifications/notifications.component.ts new file mode 100644 index 0000000..467aa07 --- /dev/null +++ b/src/app/shared/components/notifications/notifications.component.ts @@ -0,0 +1,46 @@ +import { Component, OnInit, ViewChild, Input } from '@angular/core'; +import { MatSidenav } from '@angular/material/sidenav'; +import { Router, NavigationEnd } from '@angular/router'; + +@Component({ + selector: 'app-notifications', + templateUrl: './notifications.component.html' +}) +export class NotificationsComponent implements OnInit { + @Input() notificPanel; + + // Dummy notifications + notifications = [{ + message: 'New contact added', + icon: 'assignment_ind', + time: '1 min ago', + route: '/inbox', + color: 'primary' + }, { + message: 'New message', + icon: 'chat', + time: '4 min ago', + route: '/chat', + color: 'accent' + }, { + message: 'Server rebooted', + icon: 'settings_backup_restore', + time: '12 min ago', + route: '/charts', + color: 'warn' + }] + + constructor(private router: Router) {} + + ngOnInit() { + this.router.events.subscribe((routeChange) => { + if (routeChange instanceof NavigationEnd) { + this.notificPanel.close(); + } + }); + } + clearAll(e) { + e.preventDefault(); + this.notifications = []; + } +} diff --git a/src/app/shared/components/shared-components.module.ts b/src/app/shared/components/shared-components.module.ts new file mode 100644 index 0000000..f0111b6 --- /dev/null +++ b/src/app/shared/components/shared-components.module.ts @@ -0,0 +1,66 @@ +import { NgModule } from "@angular/core"; +import { RouterModule } from "@angular/router"; +import { SharedMaterialModule } from "../shared-material.module"; +import { CommonModule } from "@angular/common"; +import { FormsModule } from "@angular/forms"; +import { PerfectScrollbarModule } from "ngx-perfect-scrollbar"; +import { SearchModule } from "../search/search.module"; +import { SharedPipesModule } from "../pipes/shared-pipes.module"; +import { FlexLayoutModule } from "@angular/flex-layout"; +import { SharedDirectivesModule } from "../directives/shared-directives.module"; + +// ONLY REQUIRED FOR **SIDE** NAVIGATION LAYOUT +import { HeaderSideComponent } from "./header-side/header-side.component"; +import { SidebarSideComponent } from "./sidebar-side/sidebar-side.component"; + +// ONLY FOR DEMO +import { CustomizerComponent } from "./customizer/customizer.component"; + +// ALWAYS REQUIRED +import { AdminLayoutComponent } from "./layouts/admin-layout/admin-layout.component"; +import { AuthLayoutComponent } from "./layouts/auth-layout/auth-layout.component"; +import { NotificationsComponent } from "./notifications/notifications.component"; +import { SidenavComponent } from "./sidenav/sidenav.component"; +import { FooterComponent } from "./footer/footer.component"; +import { BreadcrumbComponent } from "./breadcrumb/breadcrumb.component"; +import { AppComfirmComponent } from "../services/app-confirm/app-confirm.component"; +import { AppLoaderComponent } from "../services/app-loader/app-loader.component"; + +import { ButtonLoadingComponent } from "./button-loading/button-loading.component"; + + +const components = [ + SidenavComponent, + NotificationsComponent, + SidebarSideComponent, + HeaderSideComponent, + AdminLayoutComponent, + AuthLayoutComponent, + BreadcrumbComponent, + AppComfirmComponent, + AppLoaderComponent, + ButtonLoadingComponent, + CustomizerComponent, + FooterComponent, +]; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + RouterModule, + FlexLayoutModule, + PerfectScrollbarModule, + SearchModule, + SharedPipesModule, + SharedDirectivesModule, + SharedMaterialModule + ], + declarations: components, + entryComponents: [ + AppComfirmComponent, + AppLoaderComponent + ], + exports: components +}) +export class SharedComponentsModule {} diff --git a/src/app/shared/components/sidebar-side/sidebar-side.component.html b/src/app/shared/components/sidebar-side/sidebar-side.component.html new file mode 100644 index 0000000..74ff1fa --- /dev/null +++ b/src/app/shared/components/sidebar-side/sidebar-side.component.html @@ -0,0 +1,95 @@ + diff --git a/src/app/shared/components/sidebar-side/sidebar-side.component.ts b/src/app/shared/components/sidebar-side/sidebar-side.component.ts new file mode 100644 index 0000000..d453bcb --- /dev/null +++ b/src/app/shared/components/sidebar-side/sidebar-side.component.ts @@ -0,0 +1,48 @@ +import { Component, OnInit, OnDestroy, AfterViewInit } from "@angular/core"; +import { NavigationService } from "../../../shared/services/navigation.service"; +import { ThemeService } from "../../services/theme.service"; +import { Subscription } from "rxjs"; +import { ILayoutConf, LayoutService } from "app/shared/services/layout.service"; +import { JwtAuthService } from "app/shared/services/auth/jwt-auth.service"; + +@Component({ + selector: "app-sidebar-side", + templateUrl: "./sidebar-side.component.html" +}) +export class SidebarSideComponent implements OnInit, OnDestroy, AfterViewInit { + public menuItems: any[]; + public hasIconTypeMenuItem: boolean; + public iconTypeMenuTitle: string; + private menuItemsSub: Subscription; + public layoutConf: ILayoutConf; + + constructor( + private navService: NavigationService, + public themeService: ThemeService, + private layout: LayoutService, + public jwtAuth: JwtAuthService + ) {} + + ngOnInit() { + this.iconTypeMenuTitle = this.navService.iconTypeMenuTitle; + this.menuItemsSub = this.navService.menuItems$.subscribe(menuItem => { + this.menuItems = menuItem; + //Checks item list has any icon type. + this.hasIconTypeMenuItem = !!this.menuItems.filter( + item => item.type === "icon" + ).length; + }); + this.layoutConf = this.layout.layoutConf; + } + ngAfterViewInit() {} + ngOnDestroy() { + if (this.menuItemsSub) { + this.menuItemsSub.unsubscribe(); + } + } + toggleCollapse() { + this.layout.publishLayoutChange({ + sidebarCompactToggle: !this.layoutConf.sidebarCompactToggle + }); + } +} diff --git a/src/app/shared/components/sidenav/sidenav.component.ts b/src/app/shared/components/sidenav/sidenav.component.ts new file mode 100644 index 0000000..e2b6b0b --- /dev/null +++ b/src/app/shared/components/sidenav/sidenav.component.ts @@ -0,0 +1,29 @@ +import { Component, OnInit, Input } from "@angular/core"; + +@Component({ + selector: "app-sidenav", + templateUrl: "./sidenav.template.html" +}) +export class SidenavComponent { + @Input("items") public menuItems: any[] = []; + @Input("hasIconMenu") public hasIconTypeMenuItem: boolean; + @Input("iconMenuTitle") public iconTypeMenuTitle: string; + + constructor() {} + ngOnInit() {} + + // Only for demo purpose + addMenuItem() { + this.menuItems.push({ + name: "ITEM", + type: "dropDown", + tooltip: "Item", + icon: "done", + state: "material", + sub: [ + { name: "SUBITEM", state: "cards" }, + { name: "SUBITEM", state: "buttons" } + ] + }); + } +} diff --git a/src/app/shared/components/sidenav/sidenav.template.html b/src/app/shared/components/sidenav/sidenav.template.html new file mode 100644 index 0000000..1217df8 --- /dev/null +++ b/src/app/shared/components/sidenav/sidenav.template.html @@ -0,0 +1,133 @@ + diff --git a/src/app/shared/directives/dropdown-anchor.directive.ts b/src/app/shared/directives/dropdown-anchor.directive.ts new file mode 100644 index 0000000..7ab3aba --- /dev/null +++ b/src/app/shared/directives/dropdown-anchor.directive.ts @@ -0,0 +1,19 @@ +import { Directive, HostListener, Inject } from '@angular/core'; +import { DropdownLinkDirective } from './dropdown-link.directive'; + +@Directive({ + selector: '[appDropdownToggle]' +}) +export class DropdownAnchorDirective { + + protected navlink: DropdownLinkDirective; + + constructor( @Inject(DropdownLinkDirective) navlink: DropdownLinkDirective) { + this.navlink = navlink; + } + + @HostListener('click', ['$event']) + onClick(e: any) { + this.navlink.toggle(); + } +} diff --git a/src/app/shared/directives/dropdown-link.directive.ts b/src/app/shared/directives/dropdown-link.directive.ts new file mode 100644 index 0000000..ca31be4 --- /dev/null +++ b/src/app/shared/directives/dropdown-link.directive.ts @@ -0,0 +1,46 @@ +import { + Directive, HostBinding, Inject, Input, OnInit, OnDestroy +} from '@angular/core'; + +import { AppDropdownDirective } from './dropdown.directive'; + +@Directive({ + selector: '[appDropdownLink]' +}) +export class DropdownLinkDirective { + + @Input() public group: any; + + @HostBinding('class.open') + @Input() + get open(): boolean { + return this._open; + } + + set open(value: boolean) { + this._open = value; + if (value) { + this.nav.closeOtherLinks(this); + } + } + + protected _open: boolean; + protected nav: AppDropdownDirective; + + public constructor(@Inject(AppDropdownDirective) nav: AppDropdownDirective) { + this.nav = nav; + } + + public ngOnInit(): any { + this.nav.addLink(this); + } + + public ngOnDestroy(): any { + this.nav.removeGroup(this); + } + + public toggle(): any { + this.open = !this.open; + } + +} diff --git a/src/app/shared/directives/dropdown.directive.ts b/src/app/shared/directives/dropdown.directive.ts new file mode 100644 index 0000000..0e75fe1 --- /dev/null +++ b/src/app/shared/directives/dropdown.directive.ts @@ -0,0 +1,55 @@ +import { Directive } from '@angular/core'; +import { Router, NavigationEnd } from '@angular/router'; +import { DropdownLinkDirective } from './dropdown-link.directive'; +import { Subscription } from 'rxjs'; +import { filter } from 'rxjs/operators'; + +@Directive({ + selector: '[appDropdown]' +}) +export class AppDropdownDirective { + protected navlinks: Array = []; + + private _router: Subscription; + + public closeOtherLinks(openLink: DropdownLinkDirective): void { + this.navlinks.forEach((link: DropdownLinkDirective) => { + if (link !== openLink) { + link.open = false; + } + }); + } + + public addLink(link: DropdownLinkDirective): void { + this.navlinks.push(link); + } + + public removeGroup(link: DropdownLinkDirective): void { + const index = this.navlinks.indexOf(link); + if (index !== -1) { + this.navlinks.splice(index, 1); + } + } + + public getUrl() { + return this.router.url; + } + + public ngOnInit(): any { + this._router = this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe((event: NavigationEnd) => { + this.navlinks.forEach((link: DropdownLinkDirective) => { + if (link.group) { + const routeUrl = this.getUrl(); + const currentUrl = routeUrl.split('/'); + if (currentUrl.indexOf( link.group ) > 0) { + link.open = true; + this.closeOtherLinks(link); + } + } + }); + }); + } + + constructor( private router: Router) {} + +} diff --git a/src/app/shared/directives/font-size.directive.ts b/src/app/shared/directives/font-size.directive.ts new file mode 100644 index 0000000..acf8060 --- /dev/null +++ b/src/app/shared/directives/font-size.directive.ts @@ -0,0 +1,9 @@ +import { Directive, ElementRef, Attribute, OnInit } from '@angular/core'; + +@Directive({ selector: '[fontSize]' }) +export class FontSizeDirective implements OnInit { + constructor( @Attribute('fontSize') public fontSize: string, private el: ElementRef) { } + ngOnInit() { + this.el.nativeElement.fontSize = this.fontSize; + } +} diff --git a/src/app/shared/directives/matx-highlight.directive.ts b/src/app/shared/directives/matx-highlight.directive.ts new file mode 100644 index 0000000..f922b62 --- /dev/null +++ b/src/app/shared/directives/matx-highlight.directive.ts @@ -0,0 +1,82 @@ +import { + Directive, + ElementRef, + Attribute, + OnInit, + Input, + Renderer2, + NgZone, + SimpleChanges, + OnChanges, + OnDestroy, + ChangeDetectorRef +} from "@angular/core"; +import * as hl from "highlight.js"; +import { HttpClient } from "@angular/common/http"; +import { Subject } from "rxjs"; +import { takeUntil } from "rxjs/operators"; + +@Directive({ + host: { + "[class.hljs]": "true", + "[innerHTML]": "highlightedCode" + }, + selector: "[matxHighlight]" +}) +export class MatXHighlightDirective implements OnInit, OnChanges, OnDestroy { + constructor( + private el: ElementRef, + private cdr: ChangeDetectorRef, + private _zone: NgZone, + private http: HttpClient + ) { + this.unsubscribeAll = new Subject(); + } + // Inner highlighted html + highlightedCode: string; + + @Input() path: string; + @Input("matxHighlight") code: string; + private unsubscribeAll: Subject; + @Input() languages: string[]; + + ngOnInit() { + if (this.code) { + this.highlightElement(this.code); + } + if (this.path) { + this.highlightedCode = "Loading..." + this.http + .get(this.path, { responseType: "text" }) + .pipe(takeUntil(this.unsubscribeAll)) + .subscribe(response => { + this.highlightElement(response, this.languages); + }); + } + } + + ngOnDestroy() { + this.unsubscribeAll.next(); + this.unsubscribeAll.complete(); + } + + ngOnChanges(changes: SimpleChanges) { + if ( + changes["code"] && + changes["code"].currentValue && + changes["code"].currentValue !== changes["code"].previousValue + ) { + this.highlightElement(this.code); + // console.log('hljs on change', changes) + } + } + + highlightElement(code: string, languages?: string[]) { + this._zone.runOutsideAngular(() => { + const res = hl.highlightAuto(code); + this.highlightedCode = res.value; + // this.cdr.detectChanges(); + // console.log(languages) + }); + } +} diff --git a/src/app/shared/directives/matx-side-nav-toggle.directive.ts b/src/app/shared/directives/matx-side-nav-toggle.directive.ts new file mode 100644 index 0000000..10bfce8 --- /dev/null +++ b/src/app/shared/directives/matx-side-nav-toggle.directive.ts @@ -0,0 +1,46 @@ +import { Directive, Host, Self, Optional, OnDestroy, OnInit } from '@angular/core'; +import { MediaChange, MediaObserver } from "@angular/flex-layout"; +import { Subscription } from "rxjs"; +import { MatSidenav } from '@angular/material/sidenav'; + + +@Directive({ + selector: '[MatXSideNavToggle]' +}) +export class MatXSideNavToggleDirective implements OnInit, OnDestroy { + isMobile; + screenSizeWatcher: Subscription; + constructor( + private mediaObserver: MediaObserver, + @Host() @Self() @Optional() public sideNav: MatSidenav + ) { + } + + ngOnInit() { + this.initSideNav(); + } + + ngOnDestroy() { + if(this.screenSizeWatcher) { + this.screenSizeWatcher.unsubscribe() + } + } + + updateSidenav() { + var self = this; + setTimeout(() => { + self.sideNav.opened = !self.isMobile; + self.sideNav.mode = self.isMobile ? 'over' : 'side'; + }) + } + initSideNav() { + this.isMobile = this.mediaObserver.isActive('xs') || this.mediaObserver.isActive('sm'); + // console.log(this.isMobile) + this.updateSidenav(); + this.screenSizeWatcher = this.mediaObserver.media$.subscribe((change: MediaChange) => { + this.isMobile = (change.mqAlias == 'xs') || (change.mqAlias == 'sm'); + this.updateSidenav(); + }); + } + +} diff --git a/src/app/shared/directives/matx-sidenav-helper/matx-sidenav-helper.directive.ts b/src/app/shared/directives/matx-sidenav-helper/matx-sidenav-helper.directive.ts new file mode 100644 index 0000000..7b20977 --- /dev/null +++ b/src/app/shared/directives/matx-sidenav-helper/matx-sidenav-helper.directive.ts @@ -0,0 +1,91 @@ +import { + Directive, + OnInit, + OnDestroy, + HostBinding, + Input, + HostListener +} from "@angular/core"; +import { takeUntil } from "rxjs/operators"; +import { Subject } from "rxjs"; +import { MatchMediaService } from "app/shared/services/match-media.service"; +import { MatXSidenavHelperService } from "./matx-sidenav-helper.service"; +import { MatSidenav } from "@angular/material/sidenav"; +import { MediaObserver } from "@angular/flex-layout"; + +@Directive({ + selector: "[matxSidenavHelper]" +}) +export class MatXSidenavHelperDirective implements OnInit, OnDestroy { + @HostBinding("class.is-open") + isOpen: boolean; + + @Input("matxSidenavHelper") + id: string; + + @Input("isOpen") + isOpenBreakpoint: string; + + private unsubscribeAll: Subject; + + constructor( + private matchMediaService: MatchMediaService, + private matxSidenavHelperService: MatXSidenavHelperService, + private matSidenav: MatSidenav, + private mediaObserver: MediaObserver + ) { + // Set the default value + this.isOpen = true; + + this.unsubscribeAll = new Subject(); + } + + ngOnInit(): void { + this.matxSidenavHelperService.setSidenav(this.id, this.matSidenav); + + if (this.mediaObserver.isActive(this.isOpenBreakpoint)) { + this.isOpen = true; + this.matSidenav.mode = "side"; + this.matSidenav.toggle(true); + } else { + this.isOpen = false; + this.matSidenav.mode = "over"; + this.matSidenav.toggle(false); + } + + this.matchMediaService.onMediaChange + .pipe(takeUntil(this.unsubscribeAll)) + .subscribe(() => { + if (this.mediaObserver.isActive(this.isOpenBreakpoint)) { + this.isOpen = true; + this.matSidenav.mode = "side"; + this.matSidenav.toggle(true); + } else { + this.isOpen = false; + this.matSidenav.mode = "over"; + this.matSidenav.toggle(false); + } + }); + } + + ngOnDestroy(): void { + this.unsubscribeAll.next(); + this.unsubscribeAll.complete(); + } +} + +@Directive({ + selector: "[matxSidenavToggler]" +}) +export class MatXSidenavTogglerDirective { + @Input("matxSidenavToggler") + public id: any; + + constructor(private matxSidenavHelperService: MatXSidenavHelperService) {} + + @HostListener("click") + onClick() { + // console.log(this.matxSidenavHelperService.getSidenav(this.id)) + this.matxSidenavHelperService.getSidenav(this.id).toggle(); + } +} diff --git a/src/app/shared/directives/matx-sidenav-helper/matx-sidenav-helper.service.ts b/src/app/shared/directives/matx-sidenav-helper/matx-sidenav-helper.service.ts new file mode 100644 index 0000000..73066e4 --- /dev/null +++ b/src/app/shared/directives/matx-sidenav-helper/matx-sidenav-helper.service.ts @@ -0,0 +1,21 @@ +import { Injectable } from "@angular/core"; +import { MatSidenav } from "@angular/material/sidenav"; + +@Injectable({ + providedIn: "root" +}) +export class MatXSidenavHelperService { + sidenavList: MatSidenav[]; + + constructor() { + this.sidenavList = []; + } + + setSidenav(id, sidenav): void { + this.sidenavList[id] = sidenav; + } + + getSidenav(id): any { + return this.sidenavList[id]; + } +} diff --git a/src/app/shared/directives/scroll-to.directive.ts b/src/app/shared/directives/scroll-to.directive.ts new file mode 100644 index 0000000..171355b --- /dev/null +++ b/src/app/shared/directives/scroll-to.directive.ts @@ -0,0 +1,64 @@ +import { Directive, ElementRef, Attribute, OnInit, HostListener } from '@angular/core'; + +@Directive({ selector: '[scrollTo]' }) +export class ScrollToDirective implements OnInit { + constructor( @Attribute('scrollTo') public elmID: string, private el: ElementRef) { } + + ngOnInit() {} + + currentYPosition() { + // Firefox, Chrome, Opera, Safari + if (self.pageYOffset) return self.pageYOffset; + // Internet Explorer 6 - standards mode + if (document.documentElement && document.documentElement.scrollTop) + return document.documentElement.scrollTop; + // Internet Explorer 6, 7 and 8 + if (document.body.scrollTop) return document.body.scrollTop; + return 0; + }; + + elmYPosition(eID) { + var elm = document.getElementById(eID); + var y = elm.offsetTop; + var node: any = elm; + while (node.offsetParent && node.offsetParent != document.body) { + node = node.offsetParent; + y += node.offsetTop; + } + return y; + }; + + @HostListener('click', ['$event']) + smoothScroll() { + if(!this.elmID) + return; + var startY = this.currentYPosition(); + var stopY = this.elmYPosition(this.elmID); + var distance = stopY > startY ? stopY - startY : startY - stopY; + if (distance < 100) { + scrollTo(0, stopY); + return; + } + var speed = Math.round(distance / 50); + if (speed >= 20) speed = 20; + var step = Math.round(distance / 25); + var leapY = stopY > startY ? startY + step : startY - step; + var timer = 0; + if (stopY > startY) { + for (var i = startY; i < stopY; i += step) { + setTimeout("window.scrollTo(0, " + leapY + ")", timer * speed); + leapY += step; + if (leapY > stopY) leapY = stopY; + timer++; + } + return; + } + for (var i = startY; i > stopY; i -= step) { + setTimeout("window.scrollTo(0, " + leapY + ")", timer * speed); + leapY -= step; + if (leapY < stopY) leapY = stopY; + timer++; + } + return false; + }; +} \ No newline at end of file diff --git a/src/app/shared/directives/shared-directives.module.ts b/src/app/shared/directives/shared-directives.module.ts new file mode 100644 index 0000000..e267728 --- /dev/null +++ b/src/app/shared/directives/shared-directives.module.ts @@ -0,0 +1,33 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { FontSizeDirective } from './font-size.directive'; +import { ScrollToDirective } from './scroll-to.directive'; +import { AppDropdownDirective } from './dropdown.directive'; +import { DropdownAnchorDirective } from './dropdown-anchor.directive'; +import { DropdownLinkDirective } from './dropdown-link.directive'; +import { MatXSideNavToggleDirective } from './matx-side-nav-toggle.directive'; +import { MatXSidenavHelperDirective, MatXSidenavTogglerDirective } from './matx-sidenav-helper/matx-sidenav-helper.directive'; +import { MatXHighlightDirective } from './matx-highlight.directive'; + + +const directives = [ + FontSizeDirective, + ScrollToDirective, + AppDropdownDirective, + DropdownAnchorDirective, + DropdownLinkDirective, + MatXSideNavToggleDirective, + MatXSidenavHelperDirective, + MatXSidenavTogglerDirective, + MatXHighlightDirective +] + +@NgModule({ + imports: [ + CommonModule + ], + declarations: directives, + exports: directives +}) +export class SharedDirectivesModule {} \ No newline at end of file diff --git a/src/app/shared/guards/auth.guard.ts b/src/app/shared/guards/auth.guard.ts new file mode 100644 index 0000000..d97239d --- /dev/null +++ b/src/app/shared/guards/auth.guard.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; +import { + CanActivate, + ActivatedRouteSnapshot, + RouterStateSnapshot, + Router, +} from '@angular/router'; +import { JwtAuthService } from '../services/auth/jwt-auth.service'; + +@Injectable() +export class AuthGuard implements CanActivate { + + constructor(private router: Router, private jwtAuth: JwtAuthService) {} + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { + if (this.jwtAuth.isLoggedIn()) { + return true; + } else { + this.router.navigate(['/sessions/signin'], { + queryParams: { + return: state.url + } + }); + return false; + } + } +} \ No newline at end of file diff --git a/src/app/shared/guards/user-role.guard.ts b/src/app/shared/guards/user-role.guard.ts new file mode 100644 index 0000000..386a60d --- /dev/null +++ b/src/app/shared/guards/user-role.guard.ts @@ -0,0 +1,31 @@ +import { Injectable } from "@angular/core"; +import { + CanActivate, + ActivatedRouteSnapshot, + RouterStateSnapshot +} from "@angular/router"; +import { JwtAuthService } from "../services/auth/jwt-auth.service"; +import { MatSnackBar } from "@angular/material/snack-bar"; + +@Injectable() +export class UserRoleGuard implements CanActivate { + constructor( + private jwtAuth: JwtAuthService, + private snack: MatSnackBar + ) {} + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { + var user = this.jwtAuth.getUser(); + + if (route?.data?.roles?.includes(user.role)) { + return true; + } else { + this.snack.open("You do not have access to this page!", "View Documentaion") + .onAction() + .subscribe(() => { + window.open('http://demos.ui-lib.com/matx-angular-doc/authentication.html', '_blank'); + }); + return false; + } + } +} diff --git a/src/app/shared/helpers/url.helper.ts b/src/app/shared/helpers/url.helper.ts new file mode 100644 index 0000000..fd0c26d --- /dev/null +++ b/src/app/shared/helpers/url.helper.ts @@ -0,0 +1,10 @@ +export function getQueryParam(prop) { + var params = {}; + var search = decodeURIComponent(window.location.href.slice(window.location.href.indexOf('?') + 1)); + var definitions = search.split('&'); + definitions.forEach(function (val, key) { + var parts = val.split('=', 2); + params[parts[0]] = parts[1]; + }); + return (prop && prop in params) ? params[prop] : params; +} \ No newline at end of file diff --git a/src/app/shared/helpers/utils.ts b/src/app/shared/helpers/utils.ts new file mode 100644 index 0000000..64248af --- /dev/null +++ b/src/app/shared/helpers/utils.ts @@ -0,0 +1,81 @@ +export function getIndexBy(array: Array<{}>, { name, value }): number { + for (let i = 0; i < array.length; i++) { + if (array[i][name] === value) { + return i; + } + } + return -1; +} + +function currentYPosition() { + if (!window) { + return; + } + // Firefox, Chrome, Opera, Safari + if (window.pageYOffset) return window.pageYOffset; + // Internet Explorer 6 - standards mode + if (document.documentElement && document.documentElement.scrollTop) + return document.documentElement.scrollTop; + // Internet Explorer 6, 7 and 8 + if (document.body.scrollTop) return document.body.scrollTop; + return 0; +} + +function elmYPosition(elm) { + var y = elm.offsetTop; + var node = elm; + while (node.offsetParent && node.offsetParent !== document.body) { + node = node.offsetParent; + y += node.offsetTop; + } + return y; +} + +export function scrollTo(selector) { + var elm = document.querySelector(selector); + if (!selector || !elm) { + return; + } + var startY = currentYPosition(); + var stopY = elmYPosition(elm); + var distance = stopY > startY ? stopY - startY : startY - stopY; + if (distance < 100) { + window.scrollTo(0, stopY); + return; + } + var speed = Math.round(distance / 50); + if (speed >= 20) speed = 20; + var step = Math.round(distance / 25); + var leapY = stopY > startY ? startY + step : startY - step; + var timer = 0; + if (stopY > startY) { + for (var i = startY; i < stopY; i += step) { + setTimeout( + (function(leapY) { + return () => { + window.scrollTo(0, leapY); + }; + })(leapY), + timer * speed + ); + leapY += step; + if (leapY > stopY) leapY = stopY; + timer++; + } + return; + } + for (let i = startY; i > stopY; i -= step) { + setTimeout( + (function(leapY) { + return () => { + window.scrollTo(0, leapY); + }; + })(leapY), + timer * speed + ); + leapY -= step; + if (leapY < stopY) leapY = stopY; + timer++; + } + return false; +} \ No newline at end of file diff --git a/src/app/shared/helpers/window.helper.ts b/src/app/shared/helpers/window.helper.ts new file mode 100644 index 0000000..40a8d2f --- /dev/null +++ b/src/app/shared/helpers/window.helper.ts @@ -0,0 +1,32 @@ +import { ClassProvider, FactoryProvider, InjectionToken } from "@angular/core"; + +export function _window(): any { + return window; +} +export const WINDOW = new InjectionToken("WindowToken"); +export abstract class WindowRef { + get nativeWindow(): Window { + throw new Error("Not implemented."); + } +} +export class BrowserWindowRef extends WindowRef { + constructor() { + super(); + } + get nativeWindow(): Window { + return _window(); + } +} +const browserWindowProvider: ClassProvider = { + provide: WindowRef, + useClass: BrowserWindowRef +}; +export const windowProvider: FactoryProvider = { + provide: WINDOW, + useFactory: _window, + deps: [] +}; +export const WINDOW_PROVIDERS = [ + browserWindowProvider, + windowProvider +]; diff --git a/src/app/shared/inmemory-db/calendarEvents.ts b/src/app/shared/inmemory-db/calendarEvents.ts new file mode 100644 index 0000000..7e553a1 --- /dev/null +++ b/src/app/shared/inmemory-db/calendarEvents.ts @@ -0,0 +1,58 @@ +import { + startOfDay, + endOfDay, + subDays, + addDays, + endOfMonth, + isSameDay, + isSameMonth, + addHours +} from 'date-fns'; +import { MatXCalendarEvent } from '../../shared/models/event.model'; + +export class CalendarEventDB { + private colors: any = { + red: { + primary: '#f44336', + secondary: '#FAE3E3' + }, + blue: { + primary: '#247ba0 ', + secondary: '#D1E8FF' + }, + yellow: { + primary: '#ffd97d', + secondary: '#FDF1BA' + } + }; + + public events: any[] = [{ + _id: '100', + start: subDays(startOfDay(new Date()), 1), + end: addDays(new Date(), 1), + title: 'A 3 day event', + color: this.colors.red + }, { + _id: '101', + start: startOfDay(new Date()), + title: 'An event with no end date', + color: this.colors.yellow + }, { + _id: '102', + start: subDays(endOfMonth(new Date()), 3), + end: addDays(endOfMonth(new Date()), 3), + title: 'A long event that spans 2 months', + color: this.colors.blue + }, { + _id: '103', + start: addHours(startOfDay(new Date()), 2), + end: new Date(), + title: 'A draggable and resizable event', + color: this.colors.yellow, + resizable: { + beforeStart: true, + afterEnd: true + }, + draggable: true + }]; +} \ No newline at end of file diff --git a/src/app/shared/inmemory-db/chat-db.ts b/src/app/shared/inmemory-db/chat-db.ts new file mode 100644 index 0000000..e667c7f --- /dev/null +++ b/src/app/shared/inmemory-db/chat-db.ts @@ -0,0 +1,177 @@ +export class ChatDB { + public static user = [ + { + id: "7863a6802ez0e277a0f98534", + name: "John Doe", + avatar: "assets/images/face-1.jpg", + status: "online", + chatInfo: [ + { + chatId: "89564a680b3249760ea21fe77", + contactId: "323sa680b3249760ea21rt47", + contactName: "Frank Powell", + unread: 4, + lastChatTime: "2017-06-12T02:10:18.931Z" + }, + { + chatId: "3289564a680b2134760ea21fe7753", + contactId: "14663a3406eb47ffa63d4fec9429cb71", + contactName: "Betty Diaz", + unread: 0, + lastChatTime: "2019-03-10T02:10:18.931Z" + } + ] + } + ]; + public static contacts = [ + { + id: "323sa680b3249760ea21rt47", + name: "Frank Powell", + avatar: "assets/images/faces/13.jpg", + status: "online", + mood: "" + }, + { + id: "14663a3406eb47ffa63d4fec9429cb71", + name: "Betty Diaz", + avatar: "assets/images/faces/12.jpg", + status: "online", + mood: "" + }, + { + id: "43bd9bc59d164b5aea498e3ae1c24c3c", + name: "Brian Stephens", + avatar: "assets/images/faces/3.jpg", + status: "online", + mood: "" + }, + { + id: "3fc8e01f3ce649d1caf884fbf4f698e4", + name: "Jacqueline Day", + avatar: "assets/images/faces/16.jpg", + status: "offline", + mood: "" + }, + { + id: "e929b1d790ab49968ed8e34648553df4", + name: "Arthur Mendoza", + avatar: "assets/images/faces/10.jpg", + status: "online", + mood: "" + }, + { + id: "d6caf04bba614632b5fecf91aebf4564", + name: "Jeremy Lee", + avatar: "assets/images/faces/9.jpg", + status: "offline", + mood: "" + }, + { + id: "be0fb188c8e242f097fafa24632107e4", + name: "Johnny Newman", + avatar: "assets/images/faces/5.jpg", + status: "offline", + mood: "" + }, + { + id: "dea902191b964a68ba5f2d93cff37e13", + name: "Jeffrey Little", + avatar: "assets/images/faces/15.jpg", + status: "online", + mood: "" + }, + { + id: "0bf58f5ccc4543a9f8747350b7bda3c7", + name: "Barbara Romero", + avatar: "assets/images/faces/4.jpg", + status: "offline", + mood: "" + }, + { + id: "c5d7498bbcb84d81fc72168871ac6a6e", + name: "Daniel James", + avatar: "assets/images/faces/2.jpg", + status: "offline", + mood: "" + }, + { + id: "97bfbdd9413e46efdaca2010400fe18c", + name: "Alice Sanders", + avatar: "assets/images/faces/17.jpg", + status: "offline", + mood: "" + } + ]; + public static chatCollection = [ + { + id: "89564a680b3249760ea21fe77", + chats: [ + { + contactId: "323sa680b3249760ea21rt47", + text: "Do you ever find yourself falling into the “discount trap?”", + time: "2018-02-10T08:45:28.291Z" + }, + { + contactId: "7863a6802ez0e277a0f98534", + text: "Giving away your knowledge or product just to gain clients?", + time: "2018-02-10T08:45:28.291Z" + }, + { + contactId: "323sa680b3249760ea21rt47", + text: "Yes", + time: "2018-02-10T08:45:28.291Z" + }, + { + contactId: "7863a6802ez0e277a0f98534", + text: "Don’t feel bad. It happens to a lot of us", + time: "2018-02-10T08:45:28.291Z" + }, + { + contactId: "323sa680b3249760ea21rt47", + text: "Do you ever find yourself falling into the “discount trap?”", + time: "2018-02-10T08:45:28.291Z" + }, + { + contactId: "7863a6802ez0e277a0f98534", + text: "Giving away your knowledge or product just to gain clients?", + time: "2018-02-10T08:45:28.291Z" + }, + { + contactId: "323sa680b3249760ea21rt47", + text: "Yes", + time: "2018-02-10T08:45:28.291Z" + }, + { + contactId: "7863a6802ez0e277a0f98534", + text: "Don’t feel bad. It happens to a lot of us", + time: "2018-02-10T08:45:28.291Z" + } + ] + }, + { + id: "3289564a680b2134760ea21fe7753", + chats: [ + { + contactId: "14663a3406eb47ffa63d4fec9429cb71", + text: "Do you ever find yourself falling into the “discount trap?”", + time: "2019-03-10T08:45:28.291Z" + }, + { + contactId: "7863a6802ez0e277a0f98534", + text: "Giving away your knowledge or product just to gain clients?", + time: "2019-03-10T08:45:28.291Z" + }, + { + contactId: "14663a3406eb47ffa63d4fec9429cb71", + text: "Yes", + time: "2019-03-10T08:45:28.291Z" + }, + { + contactId: "7863a6802ez0e277a0f98534", + text: "Don’t feel bad. It happens to a lot of us", + time: "2019-03-10T08:45:28.291Z" + } + ] + } + ]; +} diff --git a/src/app/shared/inmemory-db/countries.ts b/src/app/shared/inmemory-db/countries.ts new file mode 100644 index 0000000..9fa7bd6 --- /dev/null +++ b/src/app/shared/inmemory-db/countries.ts @@ -0,0 +1,247 @@ +export class CountryDB { + public countries = [ + { name: 'Afghanistan', code: 'AF' }, + { name: 'Åland Islands', code: 'AX' }, + { name: 'Albania', code: 'AL' }, + { name: 'Algeria', code: 'DZ' }, + { name: 'American Samoa', code: 'AS' }, + { name: 'AndorrA', code: 'AD' }, + { name: 'Angola', code: 'AO' }, + { name: 'Anguilla', code: 'AI' }, + { name: 'Antarctica', code: 'AQ' }, + { name: 'Antigua and Barbuda', code: 'AG' }, + { name: 'Argentina', code: 'AR' }, + { name: 'Armenia', code: 'AM' }, + { name: 'Aruba', code: 'AW' }, + { name: 'Australia', code: 'AU' }, + { name: 'Austria', code: 'AT' }, + { name: 'Azerbaijan', code: 'AZ' }, + { name: 'Bahamas', code: 'BS' }, + { name: 'Bahrain', code: 'BH' }, + { name: 'Bangladesh', code: 'BD' }, + { name: 'Barbados', code: 'BB' }, + { name: 'Belarus', code: 'BY' }, + { name: 'Belgium', code: 'BE' }, + { name: 'Belize', code: 'BZ' }, + { name: 'Benin', code: 'BJ' }, + { name: 'Bermuda', code: 'BM' }, + { name: 'Bhutan', code: 'BT' }, + { name: 'Bolivia', code: 'BO' }, + { name: 'Bosnia and Herzegovina', code: 'BA' }, + { name: 'Botswana', code: 'BW' }, + { name: 'Bouvet Island', code: 'BV' }, + { name: 'Brazil', code: 'BR' }, + { name: 'British Indian Ocean Territory', code: 'IO' }, + { name: 'Brunei Darussalam', code: 'BN' }, + { name: 'Bulgaria', code: 'BG' }, + { name: 'Burkina Faso', code: 'BF' }, + { name: 'Burundi', code: 'BI' }, + { name: 'Cambodia', code: 'KH' }, + { name: 'Cameroon', code: 'CM' }, + { name: 'Canada', code: 'CA' }, + { name: 'Cape Verde', code: 'CV' }, + { name: 'Cayman Islands', code: 'KY' }, + { name: 'Central African Republic', code: 'CF' }, + { name: 'Chad', code: 'TD' }, + { name: 'Chile', code: 'CL' }, + { name: 'China', code: 'CN' }, + { name: 'Christmas Island', code: 'CX' }, + { name: 'Cocos (Keeling) Islands', code: 'CC' }, + { name: 'Colombia', code: 'CO' }, + { name: 'Comoros', code: 'KM' }, + { name: 'Congo', code: 'CG' }, + { name: 'Congo, The Democratic Republic of the', code: 'CD' }, + { name: 'Cook Islands', code: 'CK' }, + { name: 'Costa Rica', code: 'CR' }, + { name: 'Cote D\'Ivoire', code: 'CI' }, + { name: 'Croatia', code: 'HR' }, + { name: 'Cuba', code: 'CU' }, + { name: 'Cyprus', code: 'CY' }, + { name: 'Czech Republic', code: 'CZ' }, + { name: 'Denmark', code: 'DK' }, + { name: 'Djibouti', code: 'DJ' }, + { name: 'Dominica', code: 'DM' }, + { name: 'Dominican Republic', code: 'DO' }, + { name: 'Ecuador', code: 'EC' }, + { name: 'Egypt', code: 'EG' }, + { name: 'El Salvador', code: 'SV' }, + { name: 'Equatorial Guinea', code: 'GQ' }, + { name: 'Eritrea', code: 'ER' }, + { name: 'Estonia', code: 'EE' }, + { name: 'Ethiopia', code: 'ET' }, + { name: 'Falkland Islands (Malvinas)', code: 'FK' }, + { name: 'Faroe Islands', code: 'FO' }, + { name: 'Fiji', code: 'FJ' }, + { name: 'Finland', code: 'FI' }, + { name: 'France', code: 'FR' }, + { name: 'French Guiana', code: 'GF' }, + { name: 'French Polynesia', code: 'PF' }, + { name: 'French Southern Territories', code: 'TF' }, + { name: 'Gabon', code: 'GA' }, + { name: 'Gambia', code: 'GM' }, + { name: 'Georgia', code: 'GE' }, + { name: 'Germany', code: 'DE' }, + { name: 'Ghana', code: 'GH' }, + { name: 'Gibraltar', code: 'GI' }, + { name: 'Greece', code: 'GR' }, + { name: 'Greenland', code: 'GL' }, + { name: 'Grenada', code: 'GD' }, + { name: 'Guadeloupe', code: 'GP' }, + { name: 'Guam', code: 'GU' }, + { name: 'Guatemala', code: 'GT' }, + { name: 'Guernsey', code: 'GG' }, + { name: 'Guinea', code: 'GN' }, + { name: 'Guinea-Bissau', code: 'GW' }, + { name: 'Guyana', code: 'GY' }, + { name: 'Haiti', code: 'HT' }, + { name: 'Heard Island and Mcdonald Islands', code: 'HM' }, + { name: 'Holy See (Vatican City State)', code: 'VA' }, + { name: 'Honduras', code: 'HN' }, + { name: 'Hong Kong', code: 'HK' }, + { name: 'Hungary', code: 'HU' }, + { name: 'Iceland', code: 'IS' }, + { name: 'India', code: 'IN' }, + { name: 'Indonesia', code: 'ID' }, + { name: 'Iran, Islamic Republic Of', code: 'IR' }, + { name: 'Iraq', code: 'IQ' }, + { name: 'Ireland', code: 'IE' }, + { name: 'Isle of Man', code: 'IM' }, + { name: 'Israel', code: 'IL' }, + { name: 'Italy', code: 'IT' }, + { name: 'Jamaica', code: 'JM' }, + { name: 'Japan', code: 'JP' }, + { name: 'Jersey', code: 'JE' }, + { name: 'Jordan', code: 'JO' }, + { name: 'Kazakhstan', code: 'KZ' }, + { name: 'Kenya', code: 'KE' }, + { name: 'Kiribati', code: 'KI' }, + { name: 'Korea, Democratic People\'S Republic of', code: 'KP' }, + { name: 'Korea, Republic of', code: 'KR' }, + { name: 'Kuwait', code: 'KW' }, + { name: 'Kyrgyzstan', code: 'KG' }, + { name: 'Lao People\'S Democratic Republic', code: 'LA' }, + { name: 'Latvia', code: 'LV' }, + { name: 'Lebanon', code: 'LB' }, + { name: 'Lesotho', code: 'LS' }, + { name: 'Liberia', code: 'LR' }, + { name: 'Libyan Arab Jamahiriya', code: 'LY' }, + { name: 'Liechtenstein', code: 'LI' }, + { name: 'Lithuania', code: 'LT' }, + { name: 'Luxembourg', code: 'LU' }, + { name: 'Macao', code: 'MO' }, + { name: 'Macedonia, The Former Yugoslav Republic of', code: 'MK' }, + { name: 'Madagascar', code: 'MG' }, + { name: 'Malawi', code: 'MW' }, + { name: 'Malaysia', code: 'MY' }, + { name: 'Maldives', code: 'MV' }, + { name: 'Mali', code: 'ML' }, + { name: 'Malta', code: 'MT' }, + { name: 'Marshall Islands', code: 'MH' }, + { name: 'Martinique', code: 'MQ' }, + { name: 'Mauritania', code: 'MR' }, + { name: 'Mauritius', code: 'MU' }, + { name: 'Mayotte', code: 'YT' }, + { name: 'Mexico', code: 'MX' }, + { name: 'Micronesia, Federated States of', code: 'FM' }, + { name: 'Moldova, Republic of', code: 'MD' }, + { name: 'Monaco', code: 'MC' }, + { name: 'Mongolia', code: 'MN' }, + { name: 'Montserrat', code: 'MS' }, + { name: 'Morocco', code: 'MA' }, + { name: 'Mozambique', code: 'MZ' }, + { name: 'Myanmar', code: 'MM' }, + { name: 'Namibia', code: 'NA' }, + { name: 'Nauru', code: 'NR' }, + { name: 'Nepal', code: 'NP' }, + { name: 'Netherlands', code: 'NL' }, + { name: 'Netherlands Antilles', code: 'AN' }, + { name: 'New Caledonia', code: 'NC' }, + { name: 'New Zealand', code: 'NZ' }, + { name: 'Nicaragua', code: 'NI' }, + { name: 'Niger', code: 'NE' }, + { name: 'Nigeria', code: 'NG' }, + { name: 'Niue', code: 'NU' }, + { name: 'Norfolk Island', code: 'NF' }, + { name: 'Northern Mariana Islands', code: 'MP' }, + { name: 'Norway', code: 'NO' }, + { name: 'Oman', code: 'OM' }, + { name: 'Pakistan', code: 'PK' }, + { name: 'Palau', code: 'PW' }, + { name: 'Palestinian Territory, Occupied', code: 'PS' }, + { name: 'Panama', code: 'PA' }, + { name: 'Papua New Guinea', code: 'PG' }, + { name: 'Paraguay', code: 'PY' }, + { name: 'Peru', code: 'PE' }, + { name: 'Philippines', code: 'PH' }, + { name: 'Pitcairn', code: 'PN' }, + { name: 'Poland', code: 'PL' }, + { name: 'Portugal', code: 'PT' }, + { name: 'Puerto Rico', code: 'PR' }, + { name: 'Qatar', code: 'QA' }, + { name: 'Reunion', code: 'RE' }, + { name: 'Romania', code: 'RO' }, + { name: 'Russian Federation', code: 'RU' }, + { name: 'RWANDA', code: 'RW' }, + { name: 'Saint Helena', code: 'SH' }, + { name: 'Saint Kitts and Nevis', code: 'KN' }, + { name: 'Saint Lucia', code: 'LC' }, + { name: 'Saint Pierre and Miquelon', code: 'PM' }, + { name: 'Saint Vincent and the Grenadines', code: 'VC' }, + { name: 'Samoa', code: 'WS' }, + { name: 'San Marino', code: 'SM' }, + { name: 'Sao Tome and Principe', code: 'ST' }, + { name: 'Saudi Arabia', code: 'SA' }, + { name: 'Senegal', code: 'SN' }, + { name: 'Serbia and Montenegro', code: 'CS' }, + { name: 'Seychelles', code: 'SC' }, + { name: 'Sierra Leone', code: 'SL' }, + { name: 'Singapore', code: 'SG' }, + { name: 'Slovakia', code: 'SK' }, + { name: 'Slovenia', code: 'SI' }, + { name: 'Solomon Islands', code: 'SB' }, + { name: 'Somalia', code: 'SO' }, + { name: 'South Africa', code: 'ZA' }, + { name: 'South Georgia and the South Sandwich Islands', code: 'GS' }, + { name: 'Spain', code: 'ES' }, + { name: 'Sri Lanka', code: 'LK' }, + { name: 'Sudan', code: 'SD' }, + { name: 'Suriname', code: 'SR' }, + { name: 'Svalbard and Jan Mayen', code: 'SJ' }, + { name: 'Swaziland', code: 'SZ' }, + { name: 'Sweden', code: 'SE' }, + { name: 'Switzerland', code: 'CH' }, + { name: 'Syrian Arab Republic', code: 'SY' }, + { name: 'Taiwan, Province of China', code: 'TW' }, + { name: 'Tajikistan', code: 'TJ' }, + { name: 'Tanzania, United Republic of', code: 'TZ' }, + { name: 'Thailand', code: 'TH' }, + { name: 'Timor-Leste', code: 'TL' }, + { name: 'Togo', code: 'TG' }, + { name: 'Tokelau', code: 'TK' }, + { name: 'Tonga', code: 'TO' }, + { name: 'Trinidad and Tobago', code: 'TT' }, + { name: 'Tunisia', code: 'TN' }, + { name: 'Turkey', code: 'TR' }, + { name: 'Turkmenistan', code: 'TM' }, + { name: 'Turks and Caicos Islands', code: 'TC' }, + { name: 'Tuvalu', code: 'TV' }, + { name: 'Uganda', code: 'UG' }, + { name: 'Ukraine', code: 'UA' }, + { name: 'United Arab Emirates', code: 'AE' }, + { name: 'United Kingdom', code: 'GB' }, + { name: 'United States', code: 'US' }, + { name: 'United States Minor Outlying Islands', code: 'UM' }, + { name: 'Uruguay', code: 'UY' }, + { name: 'Uzbekistan', code: 'UZ' }, + { name: 'Vanuatu', code: 'VU' }, + { name: 'Venezuela', code: 'VE' }, + { name: 'Viet Nam', code: 'VN' }, + { name: 'Virgin Islands, British', code: 'VG' }, + { name: 'Virgin Islands, U.S.', code: 'VI' }, + { name: 'Wallis and Futuna', code: 'WF' }, + { name: 'Western Sahara', code: 'EH' }, + { name: 'Yemen', code: 'YE' }, + { name: 'Zambia', code: 'ZM' }, + { name: 'Zimbabwe', code: 'ZW' } + ] +} \ No newline at end of file diff --git a/src/app/shared/inmemory-db/inbox.ts b/src/app/shared/inmemory-db/inbox.ts new file mode 100644 index 0000000..681415d --- /dev/null +++ b/src/app/shared/inmemory-db/inbox.ts @@ -0,0 +1,321 @@ +export class InboxDB { + public messages = [ + { + sender: { + name: 'Henrik Gevorg', + photo: 'assets/images/face-1.jpg' + }, + date: new Date('1/25/2018'), + selected: false, + subject: 'Welcome to Angular MatX', + message: `

Natus consequuntur perspiciatis esse beatae illo quos eaque.

+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +
+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.


+ Thanks
+ Jhone` + }, + { + sender: { + name: 'Gevorg Spartak', + photo: 'assets/images/face-2.jpg' + }, + date: new Date('4/3/2017'), + selected: false, + subject: 'Confirm your email address', + message: `

Natus consequuntur perspiciatis esse beatae illo quos eaque.

+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +
+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +

+ Thanks
+ Mark` + + }, + { + sender: { + name: 'Petros Toros', + photo: 'assets/images/face-3.jpg' + }, + date: new Date('1/20/2017'), + selected: false, + subject: 'New order informations', + message: `

Natus consequuntur perspiciatis esse beatae illo quos eaque.

+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +
+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.


+ Thanks
+ Jhone` + + }, + { + sender: { + name: 'Henrik Gevorg', + photo: 'assets/images/face-1.jpg' + }, + date: new Date('1/8/2017'), + selected: false, + subject: 'Welcome to Angular MatX', + message: `

Natus consequuntur perspiciatis esse beatae illo quos eaque.

+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +
+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.


+ Thanks
+ Jhone` + }, + { + sender: { + name: 'Gevorg Spartak', + photo: 'assets/images/face-2.jpg' + }, + date: new Date('10/3/2016'), + selected: false, + subject: 'Confirm your email address', + message: `

Natus consequuntur perspiciatis esse beatae illo quos eaque.

+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +
+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +

+ Thanks
+ Mark` + + }, + { + sender: { + name: 'Petros Toros', + photo: 'assets/images/face-4.jpg' + }, + date: new Date('10/3/2015'), + selected: false, + subject: 'New order informations', + message: `

Natus consequuntur perspiciatis esse beatae illo quos eaque.

+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +
+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.


+ Thanks
+ Jhone` + + }, + { + sender: { + name: 'Henrik Gevorg', + photo: 'assets/images/face-1.jpg' + }, + date: new Date('10/3/2015'), + selected: false, + subject: 'Welcome to Angular MatX', + message: `

Natus consequuntur perspiciatis esse beatae illo quos eaque.

+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +
+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.


+ Thanks
+ Jhone` + }, + { + sender: { + name: 'Gevorg Spartak', + photo: 'assets/images/face-2.jpg' + }, + date: new Date('10/3/2015'), + selected: false, + subject: 'Confirm your email address', + message: `

Natus consequuntur perspiciatis esse beatae illo quos eaque.

+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +
+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +

+ Thanks
+ Mark` + + }, + { + sender: { + name: 'Petros Toros', + photo: 'assets/images/face-4.jpg' + }, + date: new Date('10/3/2015'), + selected: false, + subject: 'New order informations', + message: `

Natus consequuntur perspiciatis esse beatae illo quos eaque.

+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +
+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.


+ Thanks
+ Jhone` + + }, + { + sender: { + name: 'Gevorg Spartak', + photo: 'assets/images/face-2.jpg' + }, + date: new Date('10/3/2015'), + selected: false, + subject: 'Confirm your email address', + message: `

Natus consequuntur perspiciatis esse beatae illo quos eaque.

+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +
+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +

+ Thanks
+ Mark` + + }, + { + sender: { + name: 'Petros Toros', + photo: 'assets/images/face-4.jpg' + }, + date: new Date('10/3/2015'), + selected: false, + subject: 'New order informations', + message: `

Natus consequuntur perspiciatis esse beatae illo quos eaque.

+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +
+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.


+ Thanks
+ Jhone` + + }, + { + sender: { + name: 'Gevorg Spartak', + photo: 'assets/images/face-2.jpg' + }, + date: new Date('10/3/2012'), + selected: false, + subject: 'Confirm your email address', + message: `

Natus consequuntur perspiciatis esse beatae illo quos eaque.

+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +
+

Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. Iusto ipsam, nihil? Eveniet modi maxime animi excepturi a dignissimos doloribus, + inventore sed ratione, ducimus atque earum maiores tenetur officia commodi dicta tempora consequatur non nesciunt ipsam, + consequuntur quia fuga aspernatur impedit et? Natus, earum.

+
+ Earum, quisquam, fugit? Numquam dolor magni nisi? Suscipit odit, ipsam iusto enim culpa, + temporibus vero possimus error voluptates sequi. +

+ Thanks
+ Mark` + + } + ] +} \ No newline at end of file diff --git a/src/app/shared/inmemory-db/inmemory-db.service.ts b/src/app/shared/inmemory-db/inmemory-db.service.ts new file mode 100644 index 0000000..c2b1930 --- /dev/null +++ b/src/app/shared/inmemory-db/inmemory-db.service.ts @@ -0,0 +1,17 @@ +import { InMemoryDbService } from 'angular-in-memory-web-api'; +import { ChatDB } from './chat-db'; +import { InvoiceDB } from './invoices'; +import { Todo, TodoTag } from './todo'; + +export class InMemoryDataService implements InMemoryDbService { + createDb() { + return { + 'contacts': ChatDB.contacts, + 'chat-collections': ChatDB.chatCollection, + 'chat-user': ChatDB.user, + 'invoices': InvoiceDB.invoices, + 'todoList': Todo.todoList, + 'todoTag': TodoTag.tag + } + } +} \ No newline at end of file diff --git a/src/app/shared/inmemory-db/invoices.ts b/src/app/shared/inmemory-db/invoices.ts new file mode 100644 index 0000000..f5b86bc --- /dev/null +++ b/src/app/shared/inmemory-db/invoices.ts @@ -0,0 +1,104 @@ +export class InvoiceDB { + static invoices = [ + { + id: '5a9ae2106518248b68251fd1', + orderNo: '232', + status: 'pending', + date: (new Date()), + currency: '$', + vat: 10, + buyer: { + name: 'Schoen, Conn and Mills', + address: 'rodriguez.trent@senger.com \n 61 Johnson St. Shirley, NY 11967. \n \n +202-555-0170', + }, + seller: { + name: 'UI Lib', + address: 'sales@ui-lib.com \n 8254 S. Garfield Street. Villa Rica, GA 30180. \n \n +1-202-555-0170', + }, + item: [{ + name: 'Item 1', + unit: 9, + price: 200 + }, { + name: 'Item 2', + unit: 15, + price: 300 + }] + }, + { + id: '5a9ae2106518248b68251fd2', + orderNo: '233', + status: 'processing', + date: (new Date()), + currency: '$', + vat: 10, + buyer: { + name: 'New Age Inc.', + address: 'this is a test address \n 7664 Rockcrest Road. Longview, TX 75604. \n \n +1-202-555-0153', + }, + seller: { + name: 'UI Lib', + address: 'sales@ui-lib.com \n 8254 S. Garfield Street. Villa Rica, GA 30180. \n \n +1-202-555-0170', + }, + item: [{ + name: 'Item 1', + unit: 3, + price: 2000 + }, { + name: 'Item 2', + unit: 2, + price: 4000 + }] + }, + { + id: '5a9ae2106518248b68251fd3', + orderNo: '234', + status: 'delivered', + date: (new Date()), + currency: '$', + vat: 10, + buyer: { + name: 'Predovic, Schowalter and Haag', + address: 'linwood53@price.com \n 7178 Plumb Branch Dr. South Bend, IN 46614 \n \n +999 9999 9999', + }, + seller: { + name: 'UI Lib', + address: 'sales@ui-lib.com \n 8254 S. Garfield Street. Villa Rica, GA 30180. \n \n +1-202-555-0170', + }, + item: [{ + name: 'Item 1', + unit: 5, + price: 1000 + }, { + name: 'Item 2', + unit: 2, + price: 4000 + }] + }, + { + id: '5a9ae2106518248b68251fd4', + orderNo: '235', + status: 'delivered', + date: (new Date()), + currency: '$', + vat: 10, + buyer: { + name: 'Hane PLC', + address: 'nader.savanna@lindgren.org \n 858 8th St. Nanuet, NY 10954. \n \n +202-555-0131', + }, + seller: { + name: 'UI Lib', + address: 'sales@ui-lib.com \n 8254 S. Garfield Street. Villa Rica, GA 30180. \n \n +1-202-555-0170', + }, + item: [{ + name: 'Item 1', + unit: 3, + price: 4000 + }, { + name: 'Item 2', + unit: 1, + price: 5000 + }] + } + ] +} \ No newline at end of file diff --git a/src/app/shared/inmemory-db/orders.ts b/src/app/shared/inmemory-db/orders.ts new file mode 100644 index 0000000..49fe355 --- /dev/null +++ b/src/app/shared/inmemory-db/orders.ts @@ -0,0 +1,8 @@ +export class OrderDB { + static orders = [ + { + id: 1, + + } + ] +} \ No newline at end of file diff --git a/src/app/shared/inmemory-db/products.ts b/src/app/shared/inmemory-db/products.ts new file mode 100644 index 0000000..f0227e3 --- /dev/null +++ b/src/app/shared/inmemory-db/products.ts @@ -0,0 +1,698 @@ +export class ProductDB { + public products = [ + { + '_id': '5a9ae2106518248b68251fdf', + 'name': 'Wireless Bluetooth V4.0 Portable Speaker with HD Sound and Bass', + 'subtitle': 'Admodum assentior ad duo', + 'description': 'Lorem ipsum dolor sit amet, et nec putent quodsi, admodum assentior ad duo. Pri ad sapientem ocurreret incorrupte', + 'category': 'speaker', + 'tags': [ + 'sunt', + 'sunt', + 'culpa' + ], + 'price': { + 'sale': 32, + 'previous': 54 + }, + 'ratings': { + 'rating': 3.86, + 'ratingCount': 26 + }, + 'features': [ + 'aliquip aliquip', + 'nulla laboris', + 'pariatur consequat' + ], + 'photo': '../../../../assets/images/products/speaker-1.jpg', + 'gallery': [ + '../../../../assets/images/products/speaker-1.jpg', + '../../../../assets/images/products/speaker-2.jpg' + ], + 'badge': { + 'text': '20% off', + 'color': '#0D47A1' + } + }, + { + '_id': '5a9ae210b7b4d3ad2f048bbe', + 'name': 'Portable Speaker with HD Sound', + 'subtitle': 'Admodum assentior ad duo', + 'description': 'cillum eiusmod', + 'category': 'speaker', + 'tags': [ + 'Lorem', + 'nisi', + 'ad' + ], + 'price': { + 'sale': 25, + 'previous': 43 + }, + 'ratings': { + 'rating': 3.72, + 'ratingCount': 18 + }, + 'features': [ + 'magna est', + 'consectetur dolor', + 'est proident' + ], + 'photo': '../../../../assets/images/products/speaker-2.jpg', + 'gallery': [ + '../../../../assets/images/products/speaker-1.jpg', + '../../../../assets/images/products/speaker-2.jpg' + ], + 'badge': { + 'text': 'Sale', + 'color': '#DD2C00' + } + }, + { + '_id': '5a9ae210d9a8d6dda7256417', + 'name': 'Lightweight On-Ear Headphones - Black', + 'subtitle': 'On-ear fit to minimize noise so you can hear every beat', + 'description': 'sit laborum', + 'category': 'headphone', + 'tags': [ + 'eu', + 'irure', + 'proident' + ], + 'price': { + 'sale': 29, + 'previous': 55 + }, + 'ratings': { + 'rating': 3.79, + 'ratingCount': 77 + }, + 'features': [ + 'laboris id', + 'magna eu', + 'sint quis' + ], + 'photo': '../../../../assets/images/products/headphone-2.jpg', + 'gallery': [ + '../../../../assets/images/products/headphone-1.jpg', + '../../../../assets/images/products/headphone-2.jpg', + '../../../../assets/images/products/headphone-3.jpg', + '../../../../assets/images/products/headphone-4.jpg' + ], + 'badge': { + 'text': '-40%', + 'color': '#0288D1' + } + }, + { + '_id': '5a9ae210e8329237332e56d7', + 'name': 'Automatic-self-wind mens Watch 5102PR-001 (Certified Pre-owned)', + 'subtitle': 'Admodum assentior ad duo', + 'description': 'eiusmod elit', + 'category': 'watch', + 'tags': [ + 'laborum', + 'minim', + 'tempor' + ], + 'price': { + 'sale': 33, + 'previous': 58 + }, + 'ratings': { + 'rating': 4.74, + 'ratingCount': 64 + }, + 'features': [ + 'cillum ullamco', + 'ad minim', + 'duis exercitation' + ], + 'photo': '../../../../assets/images/products/watch-1.jpg', + 'gallery': [ + '../../../../assets/images/products/watch-1.jpg', + '../../../../assets/images/products/watch-2.jpg' + ], + 'badge': { + 'text': '', + 'color': 'red' + } + }, + { + '_id': '5a9ae210cb9937d28c6eca1a', + 'name': 'Automatic-self-wind mens Watch 5102PR-001', + 'subtitle': 'Admodum assentior ad duo', + 'description': 'dolore tempor', + 'category': 'watch', + 'tags': [ + 'Lorem', + 'dolor', + 'duis' + ], + 'price': { + 'sale': 38, + 'previous': 50 + }, + 'ratings': { + 'rating': 4.43, + 'ratingCount': 98 + }, + 'features': [ + 'aliquip consequat', + 'excepteur non', + 'aliquip eu' + ], + 'photo': '../../../../assets/images/products/watch-2.jpg', + 'gallery': [ + '../../../../assets/images/products/watch-1.jpg', + '../../../../assets/images/products/watch-2.jpg' + ], + 'badge': { + 'text': '', + 'color': 'red' + } + }, + { + '_id': '5a9ae2106f155194e5c95d67', + 'name': 'On-Ear Headphones - Black', + 'subtitle': 'Admodum assentior ad duo', + 'description': 'elit Lorem', + 'category': 'headphone', + 'tags': [ + 'magna', + 'veniam', + 'sunt' + ], + 'price': { + 'sale': 38, + 'previous': 54 + }, + 'ratings': { + 'rating': 4.84, + 'ratingCount': 52 + }, + 'features': [ + 'est mollit', + 'adipisicing exercitation', + 'esse incididunt' + ], + 'photo': '../../../../assets/images/products/headphone-3.jpg', + 'gallery': [ + '../../../../assets/images/products/headphone-1.jpg', + '../../../../assets/images/products/headphone-2.jpg', + '../../../../assets/images/products/headphone-3.jpg', + '../../../../assets/images/products/headphone-4.jpg' + ], + 'badge': { + 'text': '', + 'color': 'red' + } + }, + { + '_id': '5a9ae2101625a02fee92e27f', + 'name': 'In-Ear Headphone', + 'subtitle': 'Admodum assentior ad duo', + 'description': 'proident non', + 'category': 'headphone', + 'tags': [ + 'Lorem', + 'occaecat', + 'laborum' + ], + 'price': { + 'sale': 31, + 'previous': 58 + }, + 'ratings': { + 'rating': 3.18, + 'ratingCount': 90 + }, + 'features': [ + 'ullamco quis', + 'veniam laboris', + 'nulla sunt' + ], + 'photo': '../../../../assets/images/products/headphone-4.jpg', + 'gallery': [ + '../../../../assets/images/products/headphone-1.jpg', + '../../../../assets/images/products/headphone-2.jpg', + '../../../../assets/images/products/headphone-3.jpg', + '../../../../assets/images/products/headphone-4.jpg' + ], + 'badge': { + 'text': '', + 'color': 'red' + } + }, + { + '_id': '5a9ae2108970b01447ec34aa', + 'name': 'Duis exercitation nostrud anim', + 'subtitle': 'Admodum assentior ad duo', + 'description': 'dolore enim', + 'category': 'phone', + 'tags': [ + 'do', + 'aliqua', + 'irure' + ], + 'price': { + 'sale': 22, + 'previous': 44 + }, + 'ratings': { + 'rating': 3.53, + 'ratingCount': 47 + }, + 'features': [ + 'sunt laboris', + 'incididunt nulla', + 'ullamco qui' + ], + 'photo': '../../../../assets/images/products/iphone-2.jpg', + 'gallery': [ + '../../../../assets/images/products/iphone-1.jpg', + '../../../../assets/images/products/iphone-2.jpg' + ], + 'badge': { + 'text': '', + 'color': 'red' + } + }, + { + '_id': '5a9ae2103c04707145e21300', + 'name': 'Dolor eu nostrud excepteur', + 'description': 'enim fugiat', + 'category': 'phone', + 'tags': [ + 'laborum', + 'nulla', + 'sit' + ], + 'price': { + 'sale': 31, + 'previous': 40 + }, + 'ratings': { + 'rating': 3.42, + 'ratingCount': 35 + }, + 'features': [ + 'exercitation excepteur', + 'eiusmod mollit', + 'irure adipisicing' + ], + 'photo': '../../../../assets/images/products/iphone-1.jpg', + 'gallery': [ + '../../../../assets/images/products/iphone-1.jpg', + '../../../../assets/images/products/iphone-2.jpg' + ], + 'badge': { + 'text': '', + 'color': 'red' + } + }, + { + '_id': '5a9ae21021b2911c97ad6c5b', + 'name': 'Over-Ear Headphones, Stereo Lightweight Adjustable Wired Headset', + 'subtitle': 'Admodum assentior ad duo', + 'description': 'sit commodo', + 'category': 'headphone', + 'tags': [ + 'adipisicing', + 'labore', + 'voluptate' + ], + 'price': { + 'sale': 33, + 'previous': 57 + }, + 'ratings': { + 'rating': 3.51, + 'ratingCount': 60 + }, + 'features': [ + 'culpa id', + 'eu excepteur', + 'incididunt aute' + ], + 'photo': '../../../../assets/images/products/headphone-1.jpg', + 'gallery': [ + '../../../../assets/images/products/headphone-1.jpg', + '../../../../assets/images/products/headphone-2.jpg', + '../../../../assets/images/products/headphone-3.jpg', + '../../../../assets/images/products/headphone-4.jpg' + ], + 'badge': { + 'text': '', + 'color': 'red' + } + },{ + '_id': '5a9ae2106518248b68251fdf', + 'name': 'Wireless Bluetooth V4.0 Portable Speaker with HD Sound and Bass', + 'subtitle': 'Admodum assentior ad duo', + 'description': 'Lorem ipsum dolor sit amet, et nec putent quodsi, admodum assentior ad duo. Pri ad sapientem ocurreret incorrupte', + 'category': 'speaker', + 'tags': [ + 'sunt', + 'sunt', + 'culpa' + ], + 'price': { + 'sale': 32, + 'previous': 54 + }, + 'ratings': { + 'rating': 3.86, + 'ratingCount': 26 + }, + 'features': [ + 'aliquip aliquip', + 'nulla laboris', + 'pariatur consequat' + ], + 'photo': '../../../../assets/images/products/speaker-1.jpg', + 'gallery': [ + '../../../../assets/images/products/speaker-1.jpg', + '../../../../assets/images/products/speaker-2.jpg' + ], + 'badge': { + 'text': '20% off', + 'color': '#0D47A1' + } + }, + { + '_id': '5a9ae210b7b4d3ad2f048dsbbe', + 'name': 'Portable Speaker with HD Sound', + 'subtitle': 'Admodum assentior ad duo', + 'description': 'cillum eiusmod', + 'category': 'speaker', + 'tags': [ + 'Lorem', + 'nisi', + 'ad' + ], + 'price': { + 'sale': 25, + 'previous': 43 + }, + 'ratings': { + 'rating': 3.72, + 'ratingCount': 18 + }, + 'features': [ + 'magna est', + 'consectetur dolor', + 'est proident' + ], + 'photo': '../../../../assets/images/products/speaker-2.jpg', + 'gallery': [ + '../../../../assets/images/products/speaker-1.jpg', + '../../../../assets/images/products/speaker-2.jpg' + ], + 'badge': { + 'text': 'Sale', + 'color': '#DD2C00' + } + }, + { + '_id': '5a9ae2sd10d9a8d6dda7256417', + 'name': 'Lightweight On-Ear Headphones - Black', + 'subtitle': 'On-ear fit to minimize noise so you can hear every beat', + 'description': 'sit laborum', + 'category': 'headphone', + 'tags': [ + 'eu', + 'irure', + 'proident' + ], + 'price': { + 'sale': 29, + 'previous': 55 + }, + 'ratings': { + 'rating': 3.79, + 'ratingCount': 77 + }, + 'features': [ + 'laboris id', + 'magna eu', + 'sint quis' + ], + 'photo': '../../../../assets/images/products/headphone-2.jpg', + 'gallery': [ + '../../../../assets/images/products/headphone-1.jpg', + '../../../../assets/images/products/headphone-2.jpg', + '../../../../assets/images/products/headphone-3.jpg', + '../../../../assets/images/products/headphone-4.jpg' + ], + 'badge': { + 'text': '-40%', + 'color': '#0288D1' + } + }, + { + '_id': '5a9ae210e8329fs237332e56d7', + 'name': 'Automatic-self-wind mens Watch 5102PR-001 (Certified Pre-owned)', + 'subtitle': 'Admodum assentior ad duo', + 'description': 'eiusmod elit', + 'category': 'watch', + 'tags': [ + 'laborum', + 'minim', + 'tempor' + ], + 'price': { + 'sale': 33, + 'previous': 58 + }, + 'ratings': { + 'rating': 4.74, + 'ratingCount': 64 + }, + 'features': [ + 'cillum ullamco', + 'ad minim', + 'duis exercitation' + ], + 'photo': '../../../../assets/images/products/watch-1.jpg', + 'gallery': [ + '../../../../assets/images/products/watch-1.jpg', + '../../../../assets/images/products/watch-2.jpg' + ], + 'badge': { + 'text': '', + 'color': 'red' + } + }, + { + '_id': '5a9ae210cba9937d28c6eca1a', + 'name': 'Automatic-self-wind mens Watch 5102PR-001', + 'subtitle': 'Admodum assentior ad duo', + 'description': 'dolore tempor', + 'category': 'watch', + 'tags': [ + 'Lorem', + 'dolor', + 'duis' + ], + 'price': { + 'sale': 38, + 'previous': 50 + }, + 'ratings': { + 'rating': 4.43, + 'ratingCount': 98 + }, + 'features': [ + 'aliquip consequat', + 'excepteur non', + 'aliquip eu' + ], + 'photo': '../../../../assets/images/products/watch-2.jpg', + 'gallery': [ + '../../../../assets/images/products/watch-1.jpg', + '../../../../assets/images/products/watch-2.jpg' + ], + 'badge': { + 'text': '', + 'color': 'red' + } + }, + { + '_id': '5ad9ae2106f155194e5c95d67', + 'name': 'On-Ear Headphones - Black', + 'subtitle': 'Admodum assentior ad duo', + 'description': 'elit Lorem', + 'category': 'headphone', + 'tags': [ + 'magna', + 'veniam', + 'sunt' + ], + 'price': { + 'sale': 38, + 'previous': 54 + }, + 'ratings': { + 'rating': 4.84, + 'ratingCount': 52 + }, + 'features': [ + 'est mollit', + 'adipisicing exercitation', + 'esse incididunt' + ], + 'photo': '../../../../assets/images/products/headphone-3.jpg', + 'gallery': [ + '../../../../assets/images/products/headphone-1.jpg', + '../../../../assets/images/products/headphone-2.jpg', + '../../../../assets/images/products/headphone-3.jpg', + '../../../../assets/images/products/headphone-4.jpg' + ], + 'badge': { + 'text': '', + 'color': 'red' + } + }, + { + '_id': '5a9ae2101625a02fee92fe27f', + 'name': 'In-Ear Headphone', + 'subtitle': 'Admodum assentior ad duo', + 'description': 'proident non', + 'category': 'headphone', + 'tags': [ + 'Lorem', + 'occaecat', + 'laborum' + ], + 'price': { + 'sale': 31, + 'previous': 58 + }, + 'ratings': { + 'rating': 3.18, + 'ratingCount': 90 + }, + 'features': [ + 'ullamco quis', + 'veniam laboris', + 'nulla sunt' + ], + 'photo': '../../../../assets/images/products/headphone-4.jpg', + 'gallery': [ + '../../../../assets/images/products/headphone-1.jpg', + '../../../../assets/images/products/headphone-2.jpg', + '../../../../assets/images/products/headphone-3.jpg', + '../../../../assets/images/products/headphone-4.jpg' + ], + 'badge': { + 'text': '', + 'color': 'red' + } + }, + { + '_id': '5a9ae2108970bs01447ec34aa', + 'name': 'Duis exercitation nostrud anim', + 'subtitle': 'Admodum assentior ad duo', + 'description': 'dolore enim', + 'category': 'phone', + 'tags': [ + 'do', + 'aliqua', + 'irure' + ], + 'price': { + 'sale': 22, + 'previous': 44 + }, + 'ratings': { + 'rating': 3.53, + 'ratingCount': 47 + }, + 'features': [ + 'sunt laboris', + 'incididunt nulla', + 'ullamco qui' + ], + 'photo': '../../../../assets/images/products/iphone-2.jpg', + 'gallery': [ + '../../../../assets/images/products/iphone-1.jpg', + '../../../../assets/images/products/iphone-2.jpg' + ], + 'badge': { + 'text': '', + 'color': 'red' + } + }, + { + '_id': '5a9ae2103c0470f7145e21300', + 'name': 'Dolor eu nostrud excepteur', + 'description': 'enim fugiat', + 'category': 'phone', + 'tags': [ + 'laborum', + 'nulla', + 'sit' + ], + 'price': { + 'sale': 31, + 'previous': 40 + }, + 'ratings': { + 'rating': 3.42, + 'ratingCount': 35 + }, + 'features': [ + 'exercitation excepteur', + 'eiusmod mollit', + 'irure adipisicing' + ], + 'photo': '../../../../assets/images/products/iphone-1.jpg', + 'gallery': [ + '../../../../assets/images/products/iphone-1.jpg', + '../../../../assets/images/products/iphone-2.jpg' + ], + 'badge': { + 'text': '', + 'color': 'red' + } + }, + { + '_id': '5a9aef21021b2911c97ad6c5b', + 'name': 'Over-Ear Headphones, Stereo Lightweight Adjustable Wired Headset', + 'subtitle': 'Admodum assentior ad duo', + 'description': 'sit commodo', + 'category': 'headphone', + 'tags': [ + 'adipisicing', + 'labore', + 'voluptate' + ], + 'price': { + 'sale': 33, + 'previous': 57 + }, + 'ratings': { + 'rating': 3.51, + 'ratingCount': 60 + }, + 'features': [ + 'culpa id', + 'eu excepteur', + 'incididunt aute' + ], + 'photo': '../../../../assets/images/products/headphone-1.jpg', + 'gallery': [ + '../../../../assets/images/products/headphone-1.jpg', + '../../../../assets/images/products/headphone-2.jpg', + '../../../../assets/images/products/headphone-3.jpg', + '../../../../assets/images/products/headphone-4.jpg' + ], + 'badge': { + 'text': '', + 'color': 'red' + } + } + + ] +} \ No newline at end of file diff --git a/src/app/shared/inmemory-db/todo.ts b/src/app/shared/inmemory-db/todo.ts new file mode 100644 index 0000000..458f233 --- /dev/null +++ b/src/app/shared/inmemory-db/todo.ts @@ -0,0 +1,87 @@ +export class Todo { + static todoList = [ + { + id: 1, + title: "API problem", + note: "API is malfunctioning. kindly fix it", + important: true, + starred: true, + done: false, + read: false, + selected: false, + startDate: new Date().toISOString(), + dueDate: new Date().toISOString(), + + tag: [1, 2] + }, + { + id: 2, + title: "Mobile problem", + note: "Mobile is malfunctioning. fix it", + important: false, + starred: false, + done: true, + read: true, + selected: false, + startDate: new Date().toISOString(), + dueDate: new Date().toISOString(), + + tag: [2] + }, + { + id: 3, + title: "API problem", + note: "API is malfunctioning. fix it", + important: false, + starred: false, + done: true, + read: false, + selected: false, + startDate: new Date().toISOString(), + dueDate: new Date().toISOString(), + + tag: [1] + }, + { + id: 4, + title: "API problem", + note: "API is malfunctioning. fix it", + important: false, + starred: false, + done: false, + read: true, + selected: false, + startDate: new Date().toISOString(), + dueDate: new Date().toISOString(), + + tag: [1, 2, 3] + } + ]; + read: any; +} + +// ============================================ +export class TodoTag { + static tag = [ + { + id: 1, + name: "frontend" + }, + { + id: 2, + name: "backend" + }, + { + id: 3, + name: "API" + }, + { + id: 4, + name: "issue" + }, + { + id: 5, + name: "mobile" + } + ]; +} diff --git a/src/app/shared/inmemory-db/users.ts b/src/app/shared/inmemory-db/users.ts new file mode 100644 index 0000000..27e372f --- /dev/null +++ b/src/app/shared/inmemory-db/users.ts @@ -0,0 +1,1024 @@ +export class UserDB { + public users = [ + { + '_id': '5a7b73f76bed15c94d1e46d4', + 'index': 0, + 'guid': 'c01da2d1-07f8-4acc-a1e3-72dda7310af8', + 'isActive': false, + 'balance': 2838.08, + 'age': 30, + 'name': 'Stefanie Marsh', + 'gender': 'female', + 'company': 'ACIUM', + 'email': 'stefaniemarsh@acium.com', + 'phone': '+1 (857) 535-2066', + 'address': '163 Poplar Avenue, Cliffside, Virginia, 4592', + 'bd': '2015-02-08T04:28:44 -06:00' + }, + { + '_id': '5a7b73f7f79f4250b96a355a', + 'index': 1, + 'guid': '3f04aa40-62da-466d-ac14-2b8a5da3d1ce', + 'isActive': true, + 'balance': 3043.81, + 'age': 39, + 'name': 'Elena Bennett', + 'gender': 'female', + 'company': 'FIBRODYNE', + 'email': 'elenabennett@fibrodyne.com', + 'phone': '+1 (994) 570-2070', + 'address': '526 Grace Court, Cherokee, Oregon, 7017', + 'bd': '2017-11-15T09:04:57 -06:00' + }, + { + '_id': '5a7b73f78b64a02a67204d6e', + 'index': 2, + 'guid': 'e7d9d61e-b657-4fcf-b069-2eb9bfdc44fa', + 'isActive': true, + 'balance': 1796.92, + 'age': 23, + 'name': 'Joni Cabrera', + 'gender': 'female', + 'company': 'POWERNET', + 'email': 'jonicabrera@powernet.com', + 'phone': '+1 (848) 410-2368', + 'address': '554 Barlow Drive, Alamo, Michigan, 3686', + 'bd': '2017-10-15T12:55:51 -06:00' + }, + { + '_id': '5a7b73f7572e59b231149b94', + 'index': 3, + 'guid': '47673d82-ab31-48a1-8a16-2c6701573c67', + 'isActive': false, + 'balance': 2850.27, + 'age': 37, + 'name': 'Gallagher Shaw', + 'gender': 'male', + 'company': 'ZILLAR', + 'email': 'gallaghershaw@zillar.com', + 'phone': '+1 (896) 422-3786', + 'address': '111 Argyle Road, Graball, Idaho, 7272', + 'bd': '2017-11-19T03:38:30 -06:00' + }, + { + '_id': '5a7b73f70f9d074552e13090', + 'index': 4, + 'guid': 'bc9c7cd3-04e0-4095-a933-af28efaf3b3e', + 'isActive': false, + 'balance': 3743.48, + 'age': 26, + 'name': 'Blanchard Knapp', + 'gender': 'male', + 'company': 'ACRODANCE', + 'email': 'blanchardknapp@acrodance.com', + 'phone': '+1 (867) 542-2772', + 'address': '707 Malta Street, Yukon, Wyoming, 6861', + 'bd': '2014-05-28T01:33:58 -06:00' + }, + { + '_id': '5a7b73f78988bd6e92650473', + 'index': 5, + 'guid': '08cb947c-e49c-4736-9687-0fca0992ec38', + 'isActive': false, + 'balance': 3453.79, + 'age': 34, + 'name': 'Parker Rivas', + 'gender': 'male', + 'company': 'SLAMBDA', + 'email': 'parkerrivas@slambda.com', + 'phone': '+1 (997) 413-2418', + 'address': '543 Roosevelt Place, Tibbie, Minnesota, 6944', + 'bd': '2015-01-05T09:55:23 -06:00' + }, + { + '_id': '5a7b73f72488770f90649570', + 'index': 6, + 'guid': '771c85d5-7762-4bae-96fd-09892a9c4374', + 'isActive': false, + 'balance': 3334.73, + 'age': 20, + 'name': 'Alexandria Forbes', + 'gender': 'female', + 'company': 'EQUITOX', + 'email': 'alexandriaforbes@equitox.com', + 'phone': '+1 (869) 521-2533', + 'address': '663 Minna Street, Omar, Alabama, 5265', + 'bd': '2017-03-09T05:48:57 -06:00' + }, + { + '_id': '5a7b73f7c576e368b321a705', + 'index': 7, + 'guid': '2455a7ef-a537-46e1-a210-75e5e2187460', + 'isActive': false, + 'balance': 3488.64, + 'age': 37, + 'name': 'Lessie Wise', + 'gender': 'female', + 'company': 'AFFLUEX', + 'email': 'lessiewise@affluex.com', + 'phone': '+1 (820) 404-2967', + 'address': '752 Woodhull Street, Utting, Oklahoma, 2739', + 'bd': '2014-10-21T03:09:34 -06:00' + }, + { + '_id': '5a7b73f705f8a9c6e35c8ca2', + 'index': 8, + 'guid': 'a90d65a8-681d-462f-bf08-eceeef366375', + 'isActive': true, + 'balance': 3786.67, + 'age': 36, + 'name': 'Carrie Gates', + 'gender': 'female', + 'company': 'VIRVA', + 'email': 'carriegates@virva.com', + 'phone': '+1 (845) 463-3986', + 'address': '561 Boulevard Court, Rote, Louisiana, 8458', + 'bd': '2017-03-30T02:06:23 -06:00' + }, + { + '_id': '5a7b73f7a3e2be2dbb7b093e', + 'index': 9, + 'guid': 'fb3d0f97-91ae-4336-b0b4-19f4a00fe567', + 'isActive': false, + 'balance': 3335.5, + 'age': 33, + 'name': 'Dalton Spears', + 'gender': 'male', + 'company': 'MIRACLIS', + 'email': 'daltonspears@miraclis.com', + 'phone': '+1 (919) 541-3528', + 'address': '167 Lester Court, Glasgow, Arkansas, 6311', + 'bd': '2017-04-01T01:41:12 -06:00' + }, + { + '_id': '5a7b73f716de69a9217c1273', + 'index': 10, + 'guid': '129a92fd-848f-48eb-98a1-aebf6e92b079', + 'isActive': false, + 'balance': 3811.15, + 'age': 30, + 'name': 'Delia Merrill', + 'gender': 'female', + 'company': 'COMTEST', + 'email': 'deliamerrill@comtest.com', + 'phone': '+1 (879) 401-2304', + 'address': '761 Polhemus Place, Kidder, Puerto Rico, 5901', + 'bd': '2014-08-29T08:42:59 -06:00' + }, + { + '_id': '5a7b73f7ed19007bed2d29fb', + 'index': 11, + 'guid': 'd799b69a-192d-4ee3-9a69-9e8e5afc45b0', + 'isActive': false, + 'balance': 3935.82, + 'age': 28, + 'name': 'Vance Aguilar', + 'gender': 'male', + 'company': 'CYCLONICA', + 'email': 'vanceaguilar@cyclonica.com', + 'phone': '+1 (972) 549-2681', + 'address': '653 Billings Place, Gardners, Connecticut, 7805', + 'bd': '2015-02-21T03:06:14 -06:00' + }, + { + '_id': '5a7b73f78d0dc0858a70c44a', + 'index': 12, + 'guid': '8cbb37bb-7644-4993-b48b-df3a69deb339', + 'isActive': true, + 'balance': 3868.95, + 'age': 28, + 'name': 'Adams Harper', + 'gender': 'male', + 'company': 'NORSUP', + 'email': 'adamsharper@norsup.com', + 'phone': '+1 (824) 494-3395', + 'address': '571 Turner Place, Norris, Mississippi, 3829', + 'bd': '2014-01-30T02:05:53 -06:00' + }, + { + '_id': '5a7b73f7e929494a8568a885', + 'index': 13, + 'guid': '22ec32d7-0ba9-4366-b6d8-ca16389a2cd9', + 'isActive': false, + 'balance': 3954.41, + 'age': 34, + 'name': 'Bass Sexton', + 'gender': 'male', + 'company': 'CIRCUM', + 'email': 'basssexton@circum.com', + 'phone': '+1 (930) 476-3634', + 'address': '563 Victor Road, Richmond, Kansas, 7742', + 'bd': '2014-05-04T10:16:32 -06:00' + }, + { + '_id': '5a7b73f767e97ce3136444fd', + 'index': 14, + 'guid': '031d282f-0be9-49e1-a211-9aa59d449d91', + 'isActive': false, + 'balance': 3287.33, + 'age': 24, + 'name': 'Howard Velez', + 'gender': 'male', + 'company': 'ECOSYS', + 'email': 'howardvelez@ecosys.com', + 'phone': '+1 (920) 556-2885', + 'address': '378 Grimes Road, Websterville, Marshall Islands, 3506', + 'bd': '2015-12-19T08:17:58 -06:00' + }, + { + '_id': '5a7b73f7fba076653cc18925', + 'index': 15, + 'guid': 'd76ab6d6-d1db-4286-8516-ce6c9db3972a', + 'isActive': false, + 'balance': 3279.98, + 'age': 21, + 'name': 'Lola Morton', + 'gender': 'female', + 'company': 'PROVIDCO', + 'email': 'lolamorton@providco.com', + 'phone': '+1 (963) 458-2788', + 'address': '991 Ashland Place, Richville, New York, 3529', + 'bd': '2016-11-29T07:58:24 -06:00' + }, + { + '_id': '5a7b73f7c6d408bc853be87c', + 'index': 16, + 'guid': '30c2d1c7-770b-4adb-b6df-cc205d748323', + 'isActive': false, + 'balance': 3955.55, + 'age': 37, + 'name': 'Bishop Rutledge', + 'gender': 'male', + 'company': 'DAYCORE', + 'email': 'bishoprutledge@daycore.com', + 'phone': '+1 (886) 539-3156', + 'address': '870 Vanderveer Place, Bridgetown, California, 7593', + 'bd': '2014-11-10T04:47:00 -06:00' + }, + { + '_id': '5a7b73f7abe6c78719d2f494', + 'index': 17, + 'guid': '2d8e77a1-4a88-4642-b6a8-693de296661c', + 'isActive': true, + 'balance': 1832.83, + 'age': 23, + 'name': 'Lea Reese', + 'gender': 'female', + 'company': 'GLUID', + 'email': 'leareese@gluid.com', + 'phone': '+1 (866) 413-2199', + 'address': '811 Dunne Place, Vowinckel, Rhode Island, 8646', + 'bd': '2014-03-16T04:30:06 -06:00' + }, + { + '_id': '5a7b73f72d64af126b8080be', + 'index': 18, + 'guid': 'e1e8ee63-6d08-48fc-a077-2265cee34f23', + 'isActive': true, + 'balance': 2419.18, + 'age': 23, + 'name': 'Knox Moses', + 'gender': 'male', + 'company': 'BRAINCLIP', + 'email': 'knoxmoses@brainclip.com', + 'phone': '+1 (982) 519-2486', + 'address': '917 Turnbull Avenue, Shasta, Virgin Islands, 7016', + 'bd': '2015-11-09T10:11:15 -06:00' + }, + { + '_id': '5a7b73f789b4e9086d34b255', + 'index': 19, + 'guid': '13552b7d-928c-4b92-a2ae-5ccbee807594', + 'isActive': false, + 'balance': 1220.91, + 'age': 22, + 'name': 'Marsha Jacobs', + 'gender': 'female', + 'company': 'COMSTAR', + 'email': 'marshajacobs@comstar.com', + 'phone': '+1 (858) 511-2546', + 'address': '580 Hampton Avenue, Ilchester, New Hampshire, 2191', + 'bd': '2016-02-11T01:34:23 -06:00' + }, + { + '_id': '5a7b73f737eea8e94089b7b4', + 'index': 20, + 'guid': 'cf577c87-b40c-4c09-9fac-d04c9a824b86', + 'isActive': false, + 'balance': 2446.07, + 'age': 25, + 'name': 'Bell Emerson', + 'gender': 'male', + 'company': 'MULTIFLEX', + 'email': 'bellemerson@multiflex.com', + 'phone': '+1 (806) 496-2473', + 'address': '238 Oxford Walk, Monument, New Mexico, 1345', + 'bd': '2016-10-07T01:07:21 -06:00' + }, + { + '_id': '5a7b73f76bc821dc6ee56ee2', + 'index': 21, + 'guid': 'b6c685c2-a497-4261-9217-622723d5235f', + 'isActive': false, + 'balance': 3694.63, + 'age': 33, + 'name': 'Cecelia Graham', + 'gender': 'female', + 'company': 'ZOXY', + 'email': 'ceceliagraham@zoxy.com', + 'phone': '+1 (933) 429-3129', + 'address': '954 Lawton Street, Terlingua, New Jersey, 6723', + 'bd': '2017-12-01T04:36:13 -06:00' + }, + { + '_id': '5a7b73f794c27c4048290cbf', + 'index': 22, + 'guid': '7e887403-8ff5-41b4-9902-bb63ff714fee', + 'isActive': true, + 'balance': 2804.02, + 'age': 29, + 'name': 'Anthony Pennington', + 'gender': 'male', + 'company': 'NAMEGEN', + 'email': 'anthonypennington@namegen.com', + 'phone': '+1 (860) 458-3988', + 'address': '287 Auburn Place, Gardiner, Northern Mariana Islands, 7131', + 'bd': '2018-02-04T11:06:51 -06:00' + }, + { + '_id': '5a7b73f720a5781f7d19597a', + 'index': 23, + 'guid': '9e108687-e1ca-4385-bdd5-62ab006f8aa3', + 'isActive': true, + 'balance': 1984.1, + 'age': 36, + 'name': 'Mayo Justice', + 'gender': 'male', + 'company': 'SLOFAST', + 'email': 'mayojustice@slofast.com', + 'phone': '+1 (854) 428-2270', + 'address': '648 Melba Court, Dodge, Pennsylvania, 7596', + 'bd': '2016-12-29T07:28:10 -06:00' + }, + { + '_id': '5a7b73f7f0a4c5e6c9807fb2', + 'index': 24, + 'guid': '93b0b383-dd69-4453-be26-f13ae361ce67', + 'isActive': true, + 'balance': 1845.13, + 'age': 22, + 'name': 'Vaughn Salazar', + 'gender': 'male', + 'company': 'ZAGGLE', + 'email': 'vaughnsalazar@zaggle.com', + 'phone': '+1 (986) 415-3294', + 'address': '382 Dewitt Avenue, Goodville, Palau, 711', + 'bd': '2014-10-31T12:32:59 -06:00' + }, + { + '_id': '5a7b73f7e6c45298c709371c', + 'index': 25, + 'guid': '5a059bbb-3f6d-47bc-ba2b-c13eeaaa93b4', + 'isActive': false, + 'balance': 3684.79, + 'age': 31, + 'name': 'Calhoun Bradshaw', + 'gender': 'male', + 'company': 'OVERPLEX', + 'email': 'calhounbradshaw@overplex.com', + 'phone': '+1 (964) 594-2363', + 'address': '527 Seton Place, Wedgewood, Wisconsin, 8306', + 'bd': '2016-05-27T10:46:17 -06:00' + }, + { + '_id': '5a7b73f79468759d25ecdcf4', + 'index': 26, + 'guid': '68d7f78e-5001-480b-a67d-72b370a5c2de', + 'isActive': false, + 'balance': 1831.14, + 'age': 29, + 'name': 'Dianne Bauer', + 'gender': 'female', + 'company': 'XUMONK', + 'email': 'diannebauer@xumonk.com', + 'phone': '+1 (866) 510-2479', + 'address': '540 Moffat Street, Emison, South Carolina, 7329', + 'bd': '2014-09-02T04:57:23 -06:00' + }, + { + '_id': '5a7b73f7346b1bbab11524fa', + 'index': 27, + 'guid': '0729eef8-36c5-4aa2-8e31-f5e2ca19b94b', + 'isActive': false, + 'balance': 1719.77, + 'age': 22, + 'name': 'Hebert Bryan', + 'gender': 'male', + 'company': 'COMTRAIL', + 'email': 'hebertbryan@comtrail.com', + 'phone': '+1 (838) 579-3709', + 'address': '669 Hausman Street, Gerber, Kentucky, 7779', + 'bd': '2017-11-29T12:22:59 -06:00' + }, + { + '_id': '5a7b73f75116874002de08de', + 'index': 28, + 'guid': '63014b40-3f1e-40ff-b2f7-f55ef6a5a599', + 'isActive': true, + 'balance': 1973.27, + 'age': 20, + 'name': 'Cash Bean', + 'gender': 'male', + 'company': 'SUPREMIA', + 'email': 'cashbean@supremia.com', + 'phone': '+1 (846) 551-2291', + 'address': '152 Garnet Street, Boling, Nevada, 4867', + 'bd': '2014-01-06T10:18:37 -06:00' + }, + { + '_id': '5a7b73f739be4dc1f743993c', + 'index': 29, + 'guid': 'ae498760-b43b-4c9c-8575-820f419984f6', + 'isActive': true, + 'balance': 2118.14, + 'age': 36, + 'name': 'Candy Hopper', + 'gender': 'female', + 'company': 'ACCUFARM', + 'email': 'candyhopper@accufarm.com', + 'phone': '+1 (841) 425-2442', + 'address': '695 Nassau Avenue, Nutrioso, Maryland, 2026', + 'bd': '2016-01-03T02:15:56 -06:00' + }, + { + '_id': '5a7b73f70b86f2969d762be2', + 'index': 30, + 'guid': 'f19cb86e-ab4f-4d07-833a-4adb8a19d0af', + 'isActive': false, + 'balance': 3794.89, + 'age': 37, + 'name': 'Fisher Powell', + 'gender': 'male', + 'company': 'ENOMEN', + 'email': 'fisherpowell@enomen.com', + 'phone': '+1 (876) 562-2932', + 'address': '616 Tapscott Avenue, Crucible, Nebraska, 4900', + 'bd': '2018-01-31T05:15:13 -06:00' + }, + { + '_id': '5a7b73f7394648a68c2a6ae3', + 'index': 31, + 'guid': 'a88e5389-0b07-4d19-ac6c-718ce9e0de55', + 'isActive': false, + 'balance': 3343.45, + 'age': 38, + 'name': 'Rosemary Sloan', + 'gender': 'female', + 'company': 'PHORMULA', + 'email': 'rosemarysloan@phormula.com', + 'phone': '+1 (924) 517-3289', + 'address': '687 Navy Walk, Edmund, Delaware, 1419', + 'bd': '2018-01-23T11:32:25 -06:00' + }, + { + '_id': '5a7b73f77ad97f4e1c2fa65a', + 'index': 32, + 'guid': 'fb915568-2875-49b3-96d7-6b54b2b186a1', + 'isActive': true, + 'balance': 2680.62, + 'age': 30, + 'name': 'Elba Glover', + 'gender': 'female', + 'company': 'APPLICA', + 'email': 'elbaglover@applica.com', + 'phone': '+1 (857) 495-3565', + 'address': '279 Bridgewater Street, Edneyville, Utah, 9246', + 'bd': '2015-10-03T12:24:56 -06:00' + }, + { + '_id': '5a7b73f72598106a97fbf7d5', + 'index': 33, + 'guid': 'fac3cd4b-2d42-4b4f-9d6f-0bac689bd47b', + 'isActive': false, + 'balance': 3286.46, + 'age': 37, + 'name': 'Mildred Short', + 'gender': 'female', + 'company': 'NIXELT', + 'email': 'mildredshort@nixelt.com', + 'phone': '+1 (980) 530-3588', + 'address': '434 Elm Place, Coloma, West Virginia, 1990', + 'bd': '2016-03-22T10:13:26 -06:00' + }, + { + '_id': '5a7b73f7b88290b05f53faa1', + 'index': 34, + 'guid': 'b1c6a3a3-00bd-4bc6-87df-69eecd909ab5', + 'isActive': false, + 'balance': 1484.16, + 'age': 24, + 'name': 'Karin Schultz', + 'gender': 'female', + 'company': 'PLASMOS', + 'email': 'karinschultz@plasmos.com', + 'phone': '+1 (904) 544-2796', + 'address': '380 Rockaway Avenue, Faxon, American Samoa, 5776', + 'bd': '2016-03-27T09:30:36 -06:00' + }, + { + '_id': '5a7b73f7d2f7429d0caec5fe', + 'index': 35, + 'guid': '62c961ac-49b1-4a69-b4bf-13a396ec4fd9', + 'isActive': false, + 'balance': 3450.17, + 'age': 23, + 'name': 'Addie Rose', + 'gender': 'female', + 'company': 'XYQAG', + 'email': 'addierose@xyqag.com', + 'phone': '+1 (838) 549-3147', + 'address': '999 Coleridge Street, Golconda, Vermont, 9575', + 'bd': '2016-10-01T06:50:42 -06:00' + }, + { + '_id': '5a7b73f78a4c54ff8334e053', + 'index': 36, + 'guid': '4f2f7ae5-0bd1-4665-b97f-c556e5162349', + 'isActive': false, + 'balance': 1797.89, + 'age': 23, + 'name': 'Janie Ellison', + 'gender': 'female', + 'company': 'SPLINX', + 'email': 'janieellison@splinx.com', + 'phone': '+1 (947) 460-2254', + 'address': '114 Landis Court, Genoa, Indiana, 5198', + 'bd': '2017-07-28T12:45:44 -06:00' + }, + { + '_id': '5a7b73f7c87f7e86fcb00055', + 'index': 37, + 'guid': 'b7236378-8129-44b5-bcc6-0369290ffad6', + 'isActive': false, + 'balance': 3776.51, + 'age': 38, + 'name': 'Elisabeth Campbell', + 'gender': 'female', + 'company': 'GOKO', + 'email': 'elisabethcampbell@goko.com', + 'phone': '+1 (849) 430-3377', + 'address': '832 Kermit Place, Lutsen, Georgia, 9145', + 'bd': '2015-04-26T06:40:08 -06:00' + }, + { + '_id': '5a7b73f712f9208f145fa6ea', + 'index': 38, + 'guid': '5c955e3a-5f3a-4ead-96ee-80a5de6dc479', + 'isActive': true, + 'balance': 3794.93, + 'age': 27, + 'name': 'Noble Holland', + 'gender': 'male', + 'company': 'NUTRALAB', + 'email': 'nobleholland@nutralab.com', + 'phone': '+1 (888) 573-3730', + 'address': '408 Roosevelt Court, Hiwasse, North Dakota, 281', + 'bd': '2014-03-25T12:24:34 -06:00' + }, + { + '_id': '5a7b73f7aa1f371de59df90b', + 'index': 39, + 'guid': '94698a81-61a6-4e23-a952-76a50fba71ef', + 'isActive': true, + 'balance': 2205.55, + 'age': 35, + 'name': 'Laverne Brock', + 'gender': 'female', + 'company': 'ICOLOGY', + 'email': 'lavernebrock@icology.com', + 'phone': '+1 (821) 600-3174', + 'address': '391 Conover Street, Cassel, Tennessee, 6566', + 'bd': '2016-01-27T09:40:41 -06:00' + }, + { + '_id': '5a7b73f7c45c697931199945', + 'index': 40, + 'guid': 'a05a215f-be1c-49d1-89ca-c821b118f923', + 'isActive': true, + 'balance': 2397.12, + 'age': 29, + 'name': 'Irene Frost', + 'gender': 'female', + 'company': 'RODEMCO', + 'email': 'irenefrost@rodemco.com', + 'phone': '+1 (918) 539-2612', + 'address': '401 Moore Place, Groton, Arizona, 3415', + 'bd': '2017-09-14T09:46:55 -06:00' + }, + { + '_id': '5a7b73f7ef55416e92ebc818', + 'index': 41, + 'guid': '1ae8ceac-e8d0-4417-9f6f-04cd4e4738ad', + 'isActive': false, + 'balance': 3335.51, + 'age': 35, + 'name': 'Beard Hendricks', + 'gender': 'male', + 'company': 'QUONK', + 'email': 'beardhendricks@quonk.com', + 'phone': '+1 (847) 521-3952', + 'address': '576 Bayard Street, Chloride, Federated States Of Micronesia, 8070', + 'bd': '2016-11-01T12:47:26 -06:00' + }, + { + '_id': '5a7b73f7cbeecfe6febd672d', + 'index': 42, + 'guid': 'afdf3298-77bd-46b3-ae8d-232f815c5f01', + 'isActive': false, + 'balance': 2205.01, + 'age': 37, + 'name': 'Nelson Shields', + 'gender': 'male', + 'company': 'ARTWORLDS', + 'email': 'nelsonshields@artworlds.com', + 'phone': '+1 (956) 534-3050', + 'address': '581 Maple Street, Needmore, Colorado, 2062', + 'bd': '2014-07-21T08:22:01 -06:00' + }, + { + '_id': '5a7b73f71803de25c5f754ad', + 'index': 43, + 'guid': '5b872cad-4388-496b-8ede-5f86990dec00', + 'isActive': true, + 'balance': 1001.05, + 'age': 21, + 'name': 'Luella Duffy', + 'gender': 'female', + 'company': 'KROG', + 'email': 'luelladuffy@krog.com', + 'phone': '+1 (973) 451-2222', + 'address': '349 Bryant Street, Tioga, South Dakota, 6493', + 'bd': '2016-04-27T02:46:46 -06:00' + }, + { + '_id': '5a7b73f77f2a05eacb331c74', + 'index': 44, + 'guid': '7d6b7650-10d7-435d-87ca-33a1fe12cd57', + 'isActive': false, + 'balance': 1926.79, + 'age': 27, + 'name': 'Rosa Guthrie', + 'gender': 'female', + 'company': 'COMTOURS', + 'email': 'rosaguthrie@comtours.com', + 'phone': '+1 (814) 528-2701', + 'address': '719 Kathleen Court, Morriston, Guam, 4011', + 'bd': '2015-07-02T08:22:18 -06:00' + }, + { + '_id': '5a7b73f7727afbb0fc15653b', + 'index': 45, + 'guid': 'ebbc985b-227e-4954-a8a6-588b2a2bff22', + 'isActive': false, + 'balance': 2464.9, + 'age': 29, + 'name': 'Dillard Carlson', + 'gender': 'male', + 'company': 'COMCUR', + 'email': 'dillardcarlson@comcur.com', + 'phone': '+1 (847) 469-3741', + 'address': '918 Oceanic Avenue, Cochranville, Missouri, 1018', + 'bd': '2016-06-11T11:31:54 -06:00' + }, + { + '_id': '5a7b73f71dd7612e967e01ae', + 'index': 46, + 'guid': '63a2ee7f-2141-4ec5-b1e2-fcdcd62f28ed', + 'isActive': false, + 'balance': 3917.74, + 'age': 25, + 'name': 'Faye Walls', + 'gender': 'female', + 'company': 'EMERGENT', + 'email': 'fayewalls@emergent.com', + 'phone': '+1 (964) 527-3791', + 'address': '947 Judge Street, Nescatunga, Maine, 4928', + 'bd': '2014-06-23T12:46:21 -06:00' + }, + { + '_id': '5a7b73f7b33c73c425db7ee0', + 'index': 47, + 'guid': '61d40a89-af0c-40ca-8970-c54978134e6b', + 'isActive': true, + 'balance': 2213.18, + 'age': 32, + 'name': 'Norma Hooper', + 'gender': 'female', + 'company': 'PARCOE', + 'email': 'normahooper@parcoe.com', + 'phone': '+1 (827) 503-2742', + 'address': '470 Fenimore Street, Hatteras, Texas, 1582', + 'bd': '2015-01-15T12:22:00 -06:00' + }, + { + '_id': '5a7b73f7c30aa4064670cf21', + 'index': 48, + 'guid': '969d77af-b251-4924-82cf-7c787752161d', + 'isActive': false, + 'balance': 3673.94, + 'age': 23, + 'name': 'Lee Wiggins', + 'gender': 'female', + 'company': 'NITRACYR', + 'email': 'leewiggins@nitracyr.com', + 'phone': '+1 (941) 478-3536', + 'address': '958 Flatbush Avenue, Clara, North Carolina, 970', + 'bd': '2018-01-09T11:09:34 -06:00' + }, + { + '_id': '5a7b73f7ecd5a4859f2d94dc', + 'index': 49, + 'guid': 'cdf9b8de-a309-4cb7-80bb-f1b830b8b640', + 'isActive': true, + 'balance': 2166.21, + 'age': 27, + 'name': 'Alvarez Lynch', + 'gender': 'male', + 'company': 'KIGGLE', + 'email': 'alvarezlynch@kiggle.com', + 'phone': '+1 (929) 528-3805', + 'address': '901 Stratford Road, Derwood, Iowa, 1402', + 'bd': '2015-01-08T04:28:57 -06:00' + }, + { + '_id': '5a7b73f7216c8cabc849eea7', + 'index': 50, + 'guid': 'c4175d6a-1560-468e-b682-701c1549b6b1', + 'isActive': false, + 'balance': 3479.39, + 'age': 39, + 'name': 'Oneal Rosario', + 'gender': 'male', + 'company': 'UBERLUX', + 'email': 'onealrosario@uberlux.com', + 'phone': '+1 (951) 572-3027', + 'address': '267 Rockaway Parkway, Chapin, Montana, 7813', + 'bd': '2014-02-10T05:08:13 -06:00' + }, + { + '_id': '5a7b73f78841719bf955b2d9', + 'index': 51, + 'guid': '966c9ce6-9151-47cb-8c71-98c4cd0d2f40', + 'isActive': false, + 'balance': 1625.49, + 'age': 36, + 'name': 'Olsen Stevens', + 'gender': 'male', + 'company': 'EMPIRICA', + 'email': 'olsenstevens@empirica.com', + 'phone': '+1 (871) 403-3377', + 'address': '704 Lamont Court, Saranap, Massachusetts, 3171', + 'bd': '2014-09-17T05:13:13 -06:00' + }, + { + '_id': '5a7b73f7b7b8e578dff0f85c', + 'index': 52, + 'guid': '8269a34f-3a02-47d6-bcb1-8f076bb478f0', + 'isActive': true, + 'balance': 1143.73, + 'age': 27, + 'name': 'Marian Henson', + 'gender': 'female', + 'company': 'ENDIPINE', + 'email': 'marianhenson@endipine.com', + 'phone': '+1 (995) 406-2592', + 'address': '803 Ellery Street, Boykin, Alaska, 8624', + 'bd': '2016-08-28T01:22:51 -06:00' + }, + { + '_id': '5a7b73f737459ec79c91ca75', + 'index': 53, + 'guid': 'badb9342-10fd-4520-ae66-c246e47add8f', + 'isActive': false, + 'balance': 1458.01, + 'age': 23, + 'name': 'Dudley Dickson', + 'gender': 'male', + 'company': 'POLARIA', + 'email': 'dudleydickson@polaria.com', + 'phone': '+1 (860) 428-3250', + 'address': '833 Revere Place, Rockbridge, Illinois, 4628', + 'bd': '2017-01-19T12:36:59 -06:00' + }, + { + '_id': '5a7b73f70ddc6fc11ebf043a', + 'index': 54, + 'guid': '52b1be89-8186-4685-81b7-203c17ed9f89', + 'isActive': true, + 'balance': 2815.76, + 'age': 25, + 'name': 'Earnestine Oneil', + 'gender': 'female', + 'company': 'CYTREK', + 'email': 'earnestineoneil@cytrek.com', + 'phone': '+1 (879) 541-3490', + 'address': '442 Emerald Street, Graniteville, Hawaii, 1302', + 'bd': '2017-07-07T10:34:33 -06:00' + }, + { + '_id': '5a7b73f78b816185ccd2b4b3', + 'index': 55, + 'guid': 'e66850ea-546b-4eb5-ae76-d66b0e727f44', + 'isActive': true, + 'balance': 3645.09, + 'age': 21, + 'name': 'Nicholson Mason', + 'gender': 'male', + 'company': 'TELEQUIET', + 'email': 'nicholsonmason@telequiet.com', + 'phone': '+1 (861) 528-3215', + 'address': '261 Aitken Place, Cecilia, Ohio, 1381', + 'bd': '2016-03-20T08:31:34 -06:00' + }, + { + '_id': '5a7b73f780f8bf8fbe24d75c', + 'index': 56, + 'guid': '40b999cd-00bf-46e0-9107-b44906d832e0', + 'isActive': false, + 'balance': 2477.66, + 'age': 36, + 'name': 'Linda Shaffer', + 'gender': 'female', + 'company': 'ZORK', + 'email': 'lindashaffer@zork.com', + 'phone': '+1 (828) 524-3011', + 'address': '350 Plymouth Street, Waterford, Washington, 6715', + 'bd': '2017-07-09T05:51:11 -06:00' + }, + { + '_id': '5a7b73f741e22fc19ffa6952', + 'index': 57, + 'guid': 'cc2ac19d-7d67-4f60-973a-369160a9c377', + 'isActive': false, + 'balance': 2651.39, + 'age': 20, + 'name': 'Montoya Riggs', + 'gender': 'male', + 'company': 'MARKETOID', + 'email': 'montoyariggs@marketoid.com', + 'phone': '+1 (809) 562-3786', + 'address': '633 Monitor Street, Chicopee, District Of Columbia, 550', + 'bd': '2016-02-05T12:36:05 -06:00' + }, + { + '_id': '5a7b73f7de56ead40c26e69a', + 'index': 58, + 'guid': '6e0b06b8-1199-498c-8002-41f4972aa2d2', + 'isActive': false, + 'balance': 3463.92, + 'age': 28, + 'name': 'Walker Duran', + 'gender': 'male', + 'company': 'GEOFORM', + 'email': 'walkerduran@geoform.com', + 'phone': '+1 (868) 502-2553', + 'address': '550 Kensington Walk, Wyano, Virginia, 7703', + 'bd': '2017-08-18T12:39:37 -06:00' + }, + { + '_id': '5a7b73f70a04fe142269ea8d', + 'index': 59, + 'guid': 'c6733cd5-1e73-4317-b4bc-1a9e597581a4', + 'isActive': true, + 'balance': 3846.35, + 'age': 26, + 'name': 'Suzanne House', + 'gender': 'female', + 'company': 'SYBIXTEX', + 'email': 'suzannehouse@sybixtex.com', + 'phone': '+1 (892) 533-2739', + 'address': '367 Harwood Place, Twilight, Oregon, 9799', + 'bd': '2016-11-26T11:57:18 -06:00' + }, + { + '_id': '5a7b73f7339943d94af3b39d', + 'index': 60, + 'guid': '4ff2c2aa-0573-4be1-a1c8-f684af8a5fbf', + 'isActive': false, + 'balance': 2717.94, + 'age': 26, + 'name': 'Lewis Oconnor', + 'gender': 'male', + 'company': 'EXOZENT', + 'email': 'lewisoconnor@exozent.com', + 'phone': '+1 (954) 582-2660', + 'address': '717 Sutter Avenue, Bartley, Michigan, 1142', + 'bd': '2017-08-21T08:25:00 -06:00' + }, + { + '_id': '5a7b73f7d8e266ad1bc5daa8', + 'index': 61, + 'guid': '94667aad-86fc-4a2c-94fb-11b572307c75', + 'isActive': false, + 'balance': 2725.58, + 'age': 39, + 'name': 'Shelley Bonner', + 'gender': 'female', + 'company': 'INDEXIA', + 'email': 'shelleybonner@indexia.com', + 'phone': '+1 (965) 490-3768', + 'address': '896 Clinton Avenue, Canoochee, Idaho, 1154', + 'bd': '2016-04-11T06:08:29 -06:00' + }, + { + '_id': '5a7b73f7e74a5af674e4cbdd', + 'index': 62, + 'guid': 'ec68c47e-7cbd-485e-8d54-fab1bb6ea008', + 'isActive': true, + 'balance': 1343.87, + 'age': 29, + 'name': 'Mccall Morales', + 'gender': 'male', + 'company': 'QUILITY', + 'email': 'mccallmorales@quility.com', + 'phone': '+1 (939) 455-2610', + 'address': '325 Crystal Street, Harleigh, Wyoming, 5658', + 'bd': '2014-11-20T07:30:04 -06:00' + }, + { + '_id': '5a7b73f7efb231e53a0c94cd', + 'index': 63, + 'guid': '6a8b3f55-406c-4ae8-be59-94a0f8fbd180', + 'isActive': false, + 'balance': 1092.69, + 'age': 37, + 'name': 'Vera Mcpherson', + 'gender': 'female', + 'company': 'CIPROMOX', + 'email': 'veramcpherson@cipromox.com', + 'phone': '+1 (890) 500-3729', + 'address': '771 Beard Street, Rivera, Minnesota, 4726', + 'bd': '2017-07-13T02:47:50 -06:00' + }, + { + '_id': '5a7b73f7e345c5dfc5d636e4', + 'index': 64, + 'guid': '46879caf-76e6-46e0-9b8b-bc17667a81ea', + 'isActive': true, + 'balance': 2077.12, + 'age': 36, + 'name': 'Gregory Roth', + 'gender': 'male', + 'company': 'EARWAX', + 'email': 'gregoryroth@earwax.com', + 'phone': '+1 (806) 595-2477', + 'address': '349 Dunham Place, Sardis, Alabama, 3320', + 'bd': '2017-11-08T02:26:23 -06:00' + }, + { + '_id': '5a7b73f77f5f9d730fab11e0', + 'index': 65, + 'guid': '9cfb8f58-7acf-4a39-bf2b-c90269c33db0', + 'isActive': true, + 'balance': 3503.58, + 'age': 31, + 'name': 'Russell Carver', + 'gender': 'male', + 'company': 'PREMIANT', + 'email': 'russellcarver@premiant.com', + 'phone': '+1 (849) 521-2335', + 'address': '851 Noble Street, Holcombe, Oklahoma, 311', + 'bd': '2016-07-10T10:08:35 -06:00' + }, + { + '_id': '5a7b73f7cab10f461153989c', + 'index': 66, + 'guid': '2562a818-4451-4193-94cd-650d131ff097', + 'isActive': false, + 'balance': 1652.9, + 'age': 21, + 'name': 'Darlene Hurley', + 'gender': 'female', + 'company': 'STELAECOR', + 'email': 'darlenehurley@stelaecor.com', + 'phone': '+1 (868) 492-2270', + 'address': '627 Wilson Street, Loveland, Louisiana, 765', + 'bd': '2017-05-20T12:39:31 -06:00' + }, + { + '_id': '5a7b73f7ecccc997e4160a59', + 'index': 67, + 'guid': '0050170f-0283-481d-9633-dc9d134be121', + 'isActive': true, + 'balance': 3692.88, + 'age': 21, + 'name': 'Lela Bailey', + 'gender': 'female', + 'company': 'AQUOAVO', + 'email': 'lelabailey@aquoavo.com', + 'phone': '+1 (917) 449-2329', + 'address': '121 Adams Street, Malo, Arkansas, 7435', + 'bd': '2016-11-06T04:55:46 -06:00' + } + ] +} \ No newline at end of file diff --git a/src/app/shared/interceptors/token.interceptor.ts b/src/app/shared/interceptors/token.interceptor.ts new file mode 100644 index 0000000..26564d3 --- /dev/null +++ b/src/app/shared/interceptors/token.interceptor.ts @@ -0,0 +1,39 @@ +import { Injectable } from "@angular/core"; +import { + HttpEvent, + HttpInterceptor, + HttpHandler, + HttpRequest +} from "@angular/common/http"; +import { Observable } from "rxjs"; +import { JwtAuthService } from "../services/auth/jwt-auth.service"; + +@Injectable() +export class TokenInterceptor implements HttpInterceptor { + + constructor(private jwtAuth: JwtAuthService) {} + + intercept( + req: HttpRequest, + next: HttpHandler + ): Observable> { + var token = this.jwtAuth.token || this.jwtAuth.getJwtToken(); + + var changedReq; + + if (token) { + + changedReq = req.clone({ + setHeaders: { + Authorization: `Bearer ${token}` + }, + }); + + } else { + + changedReq = req; + + } + return next.handle(changedReq); + } +} \ No newline at end of file diff --git a/src/app/shared/models/event.model.ts b/src/app/shared/models/event.model.ts new file mode 100644 index 0000000..30cfaa2 --- /dev/null +++ b/src/app/shared/models/event.model.ts @@ -0,0 +1,58 @@ +import { CalendarEventAction, CalendarEvent } from 'angular-calendar'; +import { + startOfDay, + endOfDay, + subDays, + addDays, + endOfMonth, + isSameDay, + isSameMonth, + addHours +} from 'date-fns'; + +export class MatXCalendarEvent implements CalendarEvent { + _id?: string; + start: Date; + end?: Date; + title: string; + color?: { + primary: string; + secondary: string; + }; + actions?: CalendarEventAction[]; + allDay?: boolean; + cssClass?: string; + resizable?: { + beforeStart?: boolean; + afterEnd?: boolean; + }; + draggable?: boolean; + meta?: { + location: string, + notes: string + }; + + constructor(data?) { + data = data || {}; + this.start = new Date(data.start) || startOfDay(new Date()); + this.end = data.end ? new Date(data.end) : null; + this._id = data._id || ''; + this.title = data.title || ''; + this.color = { + primary: data.color && data.color.primary || '#247ba0', + secondary: data.color && data.color.secondary || '#D1E8FF' + }; + this.draggable = data.draggable || true; + this.resizable = { + beforeStart: data.resizable && data.resizable.beforeStart || true, + afterEnd: data.resizable && data.resizable.afterEnd || true + }; + this.actions = data.actions || []; + this.allDay = data.allDay || false; + this.cssClass = data.cssClass || ''; + this.meta = { + location: data.meta && data.meta.location || '', + notes: data.meta && data.meta.notes || '' + }; + } +} diff --git a/src/app/shared/models/invoice.model.ts b/src/app/shared/models/invoice.model.ts new file mode 100644 index 0000000..fca0e1a --- /dev/null +++ b/src/app/shared/models/invoice.model.ts @@ -0,0 +1,24 @@ +export interface Invoice { + id?: string; + orderNo?: string; + status?: string; + date?: string; + currency?: string; + vat?: number; + buyer?: { + name: string; + address: string; + }; + seller?: { + name: string; + address: string; + }; + item?: InvoiceItem[]; +} + +export interface InvoiceItem { + name: string; + unit: number; + price: number; + id? ; +} diff --git a/src/app/shared/models/product.model.ts b/src/app/shared/models/product.model.ts new file mode 100644 index 0000000..277e7ad --- /dev/null +++ b/src/app/shared/models/product.model.ts @@ -0,0 +1,19 @@ +export class Product { + public _id: string; + public name: string; + public description?: string; + public category?: string; + public tags?: string[]; + public price: { + sale: number, + previous?: number + }; + public ratings?: { + rating: number, + ratingCount: number + }; + public features?: string[]; + public photo?: string; + public gallery?: string[]; + public badge?: { text: string, color?: string }; +} diff --git a/src/app/shared/models/todo.model.ts b/src/app/shared/models/todo.model.ts new file mode 100644 index 0000000..290add0 --- /dev/null +++ b/src/app/shared/models/todo.model.ts @@ -0,0 +1,19 @@ +export interface TodoItem { + id?: number; + title?: string; + note?: string; + important?: boolean; + starred?: boolean; + done?: boolean; + read?: boolean; + selected?: boolean; + startDate?: string; + dueDate?: string; + + tag?: number[]; +} + +export interface TagItem { + id?: number; + name?: string; +} \ No newline at end of file diff --git a/src/app/shared/models/user.model.ts b/src/app/shared/models/user.model.ts new file mode 100644 index 0000000..6ca9082 --- /dev/null +++ b/src/app/shared/models/user.model.ts @@ -0,0 +1,5 @@ +export interface User { + id?: string; + displayName?: string; + role?: string +} \ No newline at end of file diff --git a/src/app/shared/pipes/excerpt.pipe.ts b/src/app/shared/pipes/excerpt.pipe.ts new file mode 100644 index 0000000..4c35159 --- /dev/null +++ b/src/app/shared/pipes/excerpt.pipe.ts @@ -0,0 +1,10 @@ +import { Pipe, PipeTransform } from "@angular/core"; + +@Pipe({ name: 'excerpt' }) +export class ExcerptPipe implements PipeTransform { + transform(text: string, limit: number = 5) { + if(text.length <= limit) + return text; + return text.substring(0, limit) + '...'; + } +} \ No newline at end of file diff --git a/src/app/shared/pipes/get-value-by-key.pipe.ts b/src/app/shared/pipes/get-value-by-key.pipe.ts new file mode 100644 index 0000000..8d40de8 --- /dev/null +++ b/src/app/shared/pipes/get-value-by-key.pipe.ts @@ -0,0 +1,21 @@ +import { Pipe, PipeTransform } from "@angular/core"; + +@Pipe({ + name: "getValueByKey", + pure: false +}) +export class GetValueByKeyPipe implements PipeTransform { + transform(value: any[], id: number, property: string): any { + const filteredObj = value.find(item => { + if (item.id !== undefined) { + return item.id === id; + } + + return false; + }); + + if (filteredObj) { + return filteredObj[property]; + } + } +} diff --git a/src/app/shared/pipes/relative-time.pipe.ts b/src/app/shared/pipes/relative-time.pipe.ts new file mode 100644 index 0000000..5a21e4d --- /dev/null +++ b/src/app/shared/pipes/relative-time.pipe.ts @@ -0,0 +1,33 @@ +import { Pipe, PipeTransform } from "@angular/core"; + +@Pipe({ name: 'relativeTime' }) +export class RelativeTimePipe implements PipeTransform { + transform(value: Date) { + if(!(value instanceof Date)) + value = new Date(value); + + let seconds: number = Math.floor(((new Date()).getTime() - value.getTime()) / 1000); + let interval: number = Math.floor(seconds / 31536000); + + if (interval > 1) { + return interval + " years ago"; + } + interval = Math.floor(seconds / 2592000); + if (interval > 1) { + return interval + " months ago"; + } + interval = Math.floor(seconds / 86400); + if (interval > 1) { + return interval + " days ago"; + } + interval = Math.floor(seconds / 3600); + if (interval > 1) { + return interval + " hours ago"; + } + interval = Math.floor(seconds / 60); + if (interval > 1) { + return interval + " minutes ago"; + } + return Math.floor(seconds) + " seconds ago"; + } +} \ No newline at end of file diff --git a/src/app/shared/pipes/shared-pipes.module.ts b/src/app/shared/pipes/shared-pipes.module.ts new file mode 100644 index 0000000..b39a79f --- /dev/null +++ b/src/app/shared/pipes/shared-pipes.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { RelativeTimePipe } from './relative-time.pipe'; +import { ExcerptPipe } from "./excerpt.pipe"; +import { GetValueByKeyPipe } from './get-value-by-key.pipe'; + +const pipes = [ + RelativeTimePipe, + ExcerptPipe, + GetValueByKeyPipe +] + +@NgModule({ + imports: [ + CommonModule + ], + declarations: pipes, + exports: pipes +}) +export class SharedPipesModule {} \ No newline at end of file diff --git a/src/app/shared/search/search-input-over/search-input-over.component.html b/src/app/shared/search/search-input-over/search-input-over.component.html new file mode 100644 index 0000000..dcb581a --- /dev/null +++ b/src/app/shared/search/search-input-over/search-input-over.component.html @@ -0,0 +1,9 @@ +
+ +
+ +
+ close +
diff --git a/src/app/shared/search/search-input-over/search-input-over.component.scss b/src/app/shared/search/search-input-over/search-input-over.component.scss new file mode 100644 index 0000000..6e95fe8 --- /dev/null +++ b/src/app/shared/search/search-input-over/search-input-over.component.scss @@ -0,0 +1,40 @@ +.search-bar-wide { + &.open { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 64px; + z-index: 999; + .search-icon-btn { + display: none; + } + div { + display: flex; + } + .search-close { + display: block; + } + } + div { + display: none; + height: 100%; + width: 100%; + input { + height: 100%; + width: 100%; + border: 0; + outline: 0; + padding: 0; + font-weight: 700; + padding-left: 15px; + } + } + .search-close { + display: none; + position: absolute; + top: 20px; + right: 15px; + cursor: pointer; + } +} \ No newline at end of file diff --git a/src/app/shared/search/search-input-over/search-input-over.component.spec.ts b/src/app/shared/search/search-input-over/search-input-over.component.spec.ts new file mode 100644 index 0000000..9043200 --- /dev/null +++ b/src/app/shared/search/search-input-over/search-input-over.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SearchInputOverComponent } from './search-input-over.component'; + +describe('SearchInputOverComponent', () => { + let component: SearchInputOverComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SearchInputOverComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SearchInputOverComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/search/search-input-over/search-input-over.component.ts b/src/app/shared/search/search-input-over/search-input-over.component.ts new file mode 100644 index 0000000..a3eacb9 --- /dev/null +++ b/src/app/shared/search/search-input-over/search-input-over.component.ts @@ -0,0 +1,61 @@ +import { + Component, + OnInit, + Output, + EventEmitter, + OnDestroy, + Input +} from "@angular/core"; +import { FormControl } from "@angular/forms"; +import { Subscription } from "rxjs"; +import { debounceTime } from "rxjs/operators"; +import { SearchService } from "../search.service"; +import { Router, ActivatedRoute } from "@angular/router"; + +@Component({ + selector: "matx-search-input-over", + templateUrl: "./search-input-over.component.html", + styleUrls: ["./search-input-over.component.scss"] +}) +export class SearchInputOverComponent implements OnInit, OnDestroy { + isOpen: boolean; + @Input('resultPage') resultPage: string; + @Input('placeholder') placeholder: string = "Search here"; + @Output("search") search = new EventEmitter(); + searchCtrl = new FormControl(); + searchCtrlSub: Subscription; + constructor( + private searchService: SearchService, + private router: Router, + private route: ActivatedRoute + ) {} + + ngOnInit() { + this.searchCtrl.valueChanges.pipe(debounceTime(200)) + .subscribe(value => { + this.search.emit(value); + this.searchService.searchTerm.next(value); + }); + } + + ngOnDestroy() { + if (this.searchCtrlSub) { + this.searchCtrlSub.unsubscribe(); + } + } + navigateToResult() { + if(this.resultPage) { + this.router.navigateByUrl(this.resultPage); + } + } + open() { + this.isOpen = true; + this.navigateToResult(); + } + close() { + this.isOpen = false; + } + toggle() { + this.isOpen = !this.isOpen; + } +} diff --git a/src/app/shared/search/search.module.ts b/src/app/shared/search/search.module.ts new file mode 100644 index 0000000..711c551 --- /dev/null +++ b/src/app/shared/search/search.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { SearchInputOverComponent } from "./search-input-over/search-input-over.component"; +import { ReactiveFormsModule } from "@angular/forms"; +import { MatButtonModule } from "@angular/material/button"; +import { MatIconModule } from "@angular/material/icon"; + +@NgModule({ + declarations: [SearchInputOverComponent], + exports: [SearchInputOverComponent], + imports: [ReactiveFormsModule, MatIconModule, MatButtonModule, CommonModule] +}) +export class SearchModule {} diff --git a/src/app/shared/search/search.service.ts b/src/app/shared/search/search.service.ts new file mode 100644 index 0000000..95f1e93 --- /dev/null +++ b/src/app/shared/search/search.service.ts @@ -0,0 +1,12 @@ +import { Injectable } from '@angular/core'; +import { Observable, BehaviorSubject } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class SearchService { + public searchTerm: BehaviorSubject = new BehaviorSubject(''); + public searchTerm$: Observable = this.searchTerm.asObservable(); + + constructor() {} +} diff --git a/src/app/shared/services/app-confirm/app-confirm.component.ts b/src/app/shared/services/app-confirm/app-confirm.component.ts new file mode 100644 index 0000000..a21e5c4 --- /dev/null +++ b/src/app/shared/services/app-confirm/app-confirm.component.ts @@ -0,0 +1,28 @@ +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { Component, Inject } from '@angular/core'; + +@Component({ + selector: 'app-confirm', + template: `

{{ data.title }}

+
{{ data.message }}
+
+ +   + + +
`, +}) +export class AppComfirmComponent { + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data:any + ) {} +} \ No newline at end of file diff --git a/src/app/shared/services/app-confirm/app-confirm.service.ts b/src/app/shared/services/app-confirm/app-confirm.service.ts new file mode 100644 index 0000000..5f3ed10 --- /dev/null +++ b/src/app/shared/services/app-confirm/app-confirm.service.ts @@ -0,0 +1,28 @@ +import { Observable } from 'rxjs'; +import { MatDialogRef, MatDialog, MatDialogConfig } from '@angular/material/dialog'; +import { Injectable } from '@angular/core'; + +import { AppComfirmComponent } from './app-confirm.component'; + +interface confirmData { + title?: string, + message?: string +} + +@Injectable() +export class AppConfirmService { + + constructor(private dialog: MatDialog) { } + + public confirm(data:confirmData = {}): Observable { + data.title = data.title || 'Confirm'; + data.message = data.message || 'Are you sure?'; + let dialogRef: MatDialogRef; + dialogRef = this.dialog.open(AppComfirmComponent, { + width: '380px', + disableClose: true, + data: {title: data.title, message: data.message} + }); + return dialogRef.afterClosed(); + } +} \ No newline at end of file diff --git a/src/app/shared/services/app-loader/app-loader.component.css b/src/app/shared/services/app-loader/app-loader.component.css new file mode 100644 index 0000000..c785377 --- /dev/null +++ b/src/app/shared/services/app-loader/app-loader.component.css @@ -0,0 +1,3 @@ +.mat-dialog-content { + min-height: 122px; +} \ No newline at end of file diff --git a/src/app/shared/services/app-loader/app-loader.component.html b/src/app/shared/services/app-loader/app-loader.component.html new file mode 100644 index 0000000..e44a95d --- /dev/null +++ b/src/app/shared/services/app-loader/app-loader.component.html @@ -0,0 +1,6 @@ +
+
{{ title }}
+
+ +
+
diff --git a/src/app/shared/services/app-loader/app-loader.component.ts b/src/app/shared/services/app-loader/app-loader.component.ts new file mode 100644 index 0000000..1c65f8a --- /dev/null +++ b/src/app/shared/services/app-loader/app-loader.component.ts @@ -0,0 +1,17 @@ +import { Component, OnInit } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'app-app-loader', + templateUrl: './app-loader.component.html', + styleUrls: ['./app-loader.component.css'] +}) +export class AppLoaderComponent implements OnInit { + title; + message; + constructor(public dialogRef: MatDialogRef) {} + + ngOnInit() { + } + +} diff --git a/src/app/shared/services/app-loader/app-loader.service.ts b/src/app/shared/services/app-loader/app-loader.service.ts new file mode 100644 index 0000000..d4e77ea --- /dev/null +++ b/src/app/shared/services/app-loader/app-loader.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@angular/core'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { Observable } from 'rxjs'; +import { AppLoaderComponent } from './app-loader.component'; + +interface Config { + width?: string +} + +@Injectable() +export class AppLoaderService { + dialogRef: MatDialogRef; + constructor(private dialog: MatDialog) { } + + public open(title: string = 'Please wait', config: Config = {width: '200px'}): Observable { + this.dialogRef = this.dialog.open(AppLoaderComponent, { disableClose: true, backdropClass: 'light-backdrop'}); + this.dialogRef.updateSize(config.width); + this.dialogRef.componentInstance.title = title; + return this.dialogRef.afterClosed(); + } + + public close() { + if(this.dialogRef) + this.dialogRef.close(); + } +} \ No newline at end of file diff --git a/src/app/shared/services/auth/jwt-auth.service.ts b/src/app/shared/services/auth/jwt-auth.service.ts new file mode 100644 index 0000000..2c5fc3a --- /dev/null +++ b/src/app/shared/services/auth/jwt-auth.service.ts @@ -0,0 +1,128 @@ +import { Injectable } from '@angular/core'; +import { LocalStoreService } from '../local-store.service'; +import { HttpClient } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { map, catchError, delay } from 'rxjs/operators'; +import { User } from '../../models/user.model'; +import { of, BehaviorSubject, throwError } from 'rxjs'; +import { environment } from 'environments/environment'; + +// ================= only for demo purpose =========== +const DEMO_TOKEN = + 'eyJfaWQiOiI1YjhkNDc4MDc4NmM3MjE3MjBkYzU1NzMiLCJlbWFpbCI6InJhZmkuYm9ncmFAZ21haWwuY29tIiwicm9sZSI6IlNBIiwiYWN0aXZlIjp0cnVlLCJpYXQiOjE1ODc3MTc2NTgsImV4cCI6MTU4ODMyMjQ1OH0.dXw0ySun5ex98dOzTEk0lkmXJvxg3Qgz4ed'; + +const DEMO_USER: User = { + id: '4sa00c45639d2c0c54b354ba', + displayName: 'John Doe', + role: 'Admin', +}; +// ================= you will get those data from server ======= + +@Injectable({ + providedIn: 'root', +}) +export class JwtAuthService { + token; + isAuthenticated: Boolean; + user: User; + user$ = (new BehaviorSubject(this.user)); + signingIn: Boolean; + JWT_TOKEN = 'JWT_TOKEN'; + APP_USER = 'MATX_USER'; + + constructor( + private ls: LocalStoreService, + private http: HttpClient, + private router: Router + ) {} + + public signin(username, password) { + return of({token: DEMO_TOKEN, user: DEMO_USER}) + .pipe( + delay(1000), + map((res: any) => { + this.setUserAndToken(res.token, res.user, !!res); + this.signingIn = false; + return res; + }), + catchError((error) => { + return throwError(error); + }) + ); + + // FOLLOWING CODE SENDS SIGNIN REQUEST TO SERVER + + // this.signingIn = true; + // return this.http.post(`${environment.apiURL}/auth/local`, { username, password }) + // .pipe( + // map((res: any) => { + // this.setUserAndToken(res.token, res.user, !!res); + // this.signingIn = false; + // return res; + // }), + // catchError((error) => { + // return throwError(error); + // }) + // ); + } + + /* + checkTokenIsValid is called inside constructor of + shared/components/layouts/admin-layout/admin-layout.component.ts + */ + public checkTokenIsValid() { + return of(DEMO_USER) + .pipe( + map((profile: User) => { + this.setUserAndToken(this.getJwtToken(), profile, true); + this.signingIn = false; + return profile; + }), + catchError((error) => { + return of(error); + }) + ); + + /* + The following code get user data and jwt token is assigned to + Request header using token.interceptor + This checks if the existing token is valid when app is reloaded + */ + + // return this.http.get(`${environment.apiURL}/api/users/profile`) + // .pipe( + // map((profile: User) => { + // this.setUserAndToken(this.getJwtToken(), profile, true); + // return profile; + // }), + // catchError((error) => { + // return of(error); + // }) + // ); + } + + public signout() { + this.setUserAndToken(null, null, false); + this.router.navigateByUrl('sessions/signin'); + } + + isLoggedIn(): Boolean { + return !!this.getJwtToken(); + } + + getJwtToken() { + return this.ls.getItem(this.JWT_TOKEN); + } + getUser() { + return this.ls.getItem(this.APP_USER); + } + + setUserAndToken(token: String, user: User, isAuthenticated: Boolean) { + this.isAuthenticated = isAuthenticated; + this.token = token; + this.user = user; + this.user$.next(user); + this.ls.setItem(this.JWT_TOKEN, token); + this.ls.setItem(this.APP_USER, user); + } +} \ No newline at end of file diff --git a/src/app/shared/services/copier.service.ts b/src/app/shared/services/copier.service.ts new file mode 100644 index 0000000..f2f37e0 --- /dev/null +++ b/src/app/shared/services/copier.service.ts @@ -0,0 +1,60 @@ +/** + * This class is based on the code in the following projects: + * + * - https://github.com/zenorocha/select + * - https://github.com/zenorocha/clipboard.js/ + * + * Both released under MIT license - © Zeno Rocha + */ +import {Injectable} from '@angular/core'; + +@Injectable() +export class CopierService { + + private textarea: HTMLTextAreaElement; + + /** Copy the text value to the clipboard. */ + copyText(text: string): boolean { + this.createTextareaAndSelect(text); + + const copySuccessful = document.execCommand('copy'); + this.removeFake(); + + return copySuccessful; + } + + /** + * Creates a hidden textarea element, sets its value from `text` property, + * and makes a selection on it. + */ + private createTextareaAndSelect(text: string) { + // Create a fake element to hold the contents to copy + this.textarea = document.createElement('textarea'); + + // Prevent zooming on iOS + this.textarea.style.fontSize = '12pt'; + + // Hide the element + this.textarea.classList.add('cdk-visually-hidden'); + + // Move element to the same position vertically + const yPosition = window.pageYOffset || document.documentElement.scrollTop; + this.textarea.style.top = yPosition + 'px'; + + this.textarea.setAttribute('readonly', ''); + this.textarea.value = text; + + document.body.appendChild(this.textarea); + + this.textarea.select(); + this.textarea.setSelectionRange(0, this.textarea.value.length); + } + + /** Remove the text area from the DOM. */ + private removeFake() { + if (this.textarea) { + document.body.removeChild(this.textarea); + this.textarea = null; + } + } +} \ No newline at end of file diff --git a/src/app/shared/services/customizer.service.ts b/src/app/shared/services/customizer.service.ts new file mode 100644 index 0000000..fd5a1fd --- /dev/null +++ b/src/app/shared/services/customizer.service.ts @@ -0,0 +1,242 @@ +import { Injectable } from "@angular/core"; +import { Router, NavigationStart } from "@angular/router"; +import { filter } from "rxjs/operators"; +import { LayoutService } from "./layout.service"; + +@Injectable({ + providedIn: "root", +}) +export class CustomizerService { + colors = [ + { + class: "black", + active: false, + }, + { + class: "white", + active: false, + }, + { + class: "dark-blue", + active: false, + }, + { + class: "grey", + active: false, + }, + { + class: "brown", + active: false, + }, + { + class: "gray", + active: false, + }, + { + class: "purple", + active: false, + }, + { + class: "blue", + active: false, + }, + + { + class: "indigo", + active: false, + }, + { + class: "yellow", + active: false, + }, + { + class: "green", + active: false, + }, + { + class: "pink", + active: false, + }, + { + class: "red", + active: false, + }, + { + class: "slate", + active: false, + }, + ]; + + layoutOptions = [ + { + name: "Vertical Nav", + thumbnail: "assets/images/screenshots/layout1-customizer.png", + options: { + navigationPos: "side", + sidebarColor: "white", + sidebarCompactToggle: false, + topbarColor: "blue", + footerColor: "blue", + matTheme: "matx-blue", + }, + }, + { + name: "Dark Sidebar", + thumbnail: "assets/images/screenshots/layout1-blue-customizer.png", + options: { + navigationPos: "side", + sidebarColor: "slate", + sidebarCompactToggle: false, + topbarColor: "blue", + footerColor: "slate", + matTheme: "matx-blue", + }, + }, + { + name: "Night Mode", + thumbnail: "assets/images/screenshots/layout3-customizer.png", + options: { + sidebarColor: "slate", + sidebarCompactToggle: false, + topbarColor: "purple", + footerColor: "slate", + matTheme: "matx-dark-purple", + }, + } + ]; + + selectedSidebarColor; + topbarColors: any[]; + sidebarColors: any[]; + footerColors: any[]; + + constructor(private router: Router, private layout: LayoutService) { + this.topbarColors = this.getTopbarColors(); + this.sidebarColors = this.getSidebarColors(); + this.footerColors = this.getFooterColors(); + } + + getSidebarColors() { + let sidebarColors = [ + "black", + "slate", + "white", + "purple", + "blue", + "dark-blue", + ]; + return this.colors + .filter((color) => { + return sidebarColors.includes(color.class); + }) + .map((c) => { + c.active = c.class === this.layout.layoutConf.sidebarColor; + return { ...c }; + }); + } + + getTopbarColors() { + let topbarColors = [ + "black", + "slate", + "white", + "dark-gray", + "purple", + "dark-blue", + "blue", + "pink", + ]; + return this.colors + .filter((color) => { + return topbarColors.includes(color.class); + }) + .map((c) => { + c.active = c.class === this.layout.layoutConf.topbarColor; + return { ...c }; + }); + } + + getFooterColors() { + let footerColors = [ + "black", + "slate", + "white", + "dark-gray", + "purple", + "dark-blue", + "indigo", + "pink", + "red", + "yellow", + "green", + ]; + return this.colors + .filter((color) => { + return footerColors.includes(color.class); + }) + .map((c) => { + c.active = c.class === this.layout.layoutConf.footerColor; + return { ...c }; + }); + } + + changeSidebarColor(color) { + this.layout.publishLayoutChange({ sidebarColor: color.class }); + this.sidebarColors = this.getSidebarColors(); + } + + changeTopbarColor(color) { + this.layout.publishLayoutChange({ topbarColor: color.class }); + this.topbarColors = this.getTopbarColors(); + } + + changeFooterColor(color) { + this.layout.publishLayoutChange({ footerColor: color.class }); + this.footerColors = this.getFooterColors(); + } + + removeClass(el, className) { + if (!el || el.length === 0) return; + if (!el.length) { + el.classList.remove(className); + } else { + for (var i = 0; i < el.length; i++) { + el[i].classList.remove(className); + } + } + } + addClass(el, className) { + if (!el) return; + if (!el.length) { + el.classList.add(className); + } else { + for (var i = 0; i < el.length; i++) { + el[i].classList.add(className); + } + } + } + findClosest(el, className) { + if (!el) return; + while (el) { + var parent = el.parentElement; + if (parent && this.hasClass(parent, className)) { + return parent; + } + el = parent; + } + } + hasClass(el, className) { + if (!el) return; + return ( + ` ${el.className} `.replace(/[\n\t]/g, " ").indexOf(` ${className} `) > -1 + ); + } + toggleClass(el, className) { + if (!el) return; + if (this.hasClass(el, className)) { + this.removeClass(el, className); + } else { + this.addClass(el, className); + } + } +} diff --git a/src/app/shared/services/error-handler.service.ts b/src/app/shared/services/error-handler.service.ts new file mode 100644 index 0000000..2596721 --- /dev/null +++ b/src/app/shared/services/error-handler.service.ts @@ -0,0 +1,41 @@ +import { ErrorHandler, Injectable, Injector, ApplicationRef, ChangeDetectorRef } from '@angular/core'; + +@Injectable() +export class ErrorHandlerService extends ErrorHandler { + + errorCount = 0; + + constructor(protected injector: Injector) { + super(); + } + // https://github.com/angular/angular/issues/17010 + handleError(error: any) { + let increment = 5; + let max = 50; + + // Prevents change detection + let debugCtx = error['ngDebugContext']; + let changeDetectorRef = debugCtx && debugCtx.injector.get(ChangeDetectorRef); + if (changeDetectorRef) changeDetectorRef.detach(); + + this.errorCount = this.errorCount + 1; + if (this.errorCount % increment === 0) { + console.log(' '); + console.log(`errorHandler() was called ${this.errorCount} times.`); + console.log(' '); + super.handleError(error); + + if (this.errorCount === max) { + console.log(' '); + console.log(`Preventing recursive error after ${this.errorCount} recursive errors.`); + console.log(' '); + + let appRef = this.injector.get(ApplicationRef); + appRef.tick(); + } + } + else if (this.errorCount === 1) { + super.handleError(error); + } + } +} diff --git a/src/app/shared/services/layout.service.ts b/src/app/shared/services/layout.service.ts new file mode 100644 index 0000000..ca0b739 --- /dev/null +++ b/src/app/shared/services/layout.service.ts @@ -0,0 +1,113 @@ +import { Injectable, Renderer2 } from '@angular/core'; +import { BehaviorSubject } from 'rxjs'; +import { getQueryParam } from '../helpers/url.helper'; +import { ThemeService } from './theme.service'; + +export interface ILayoutConf { + navigationPos?: string; // side + sidebarStyle?: string; // full, compact, closed + sidebarCompactToggle?: boolean; // sidebar expandable on hover + sidebarColor?: string; // Sidebar background color http://demos.ui-lib.com/matx-doc/#matx-colors + isMobile?: boolean; // updated automatically + useBreadcrumb?: boolean; // Breadcrumb enabled/disabled + breadcrumb?: string; // simple, title + topbarFixed?: boolean; // Fixed header + footerFixed?: boolean; // Fixed Footer + topbarColor?: string; // Header background color http://demos.ui-lib.com/matx-doc/#matx-colors + footerColor?: string; // Header background color http://demos.ui-lib.com/matx-doc/#matx-colors + matTheme?: string; // material theme. matx-blue, matx-navy, matx-dark-purple, matx-dark-pink + perfectScrollbar?: boolean; +} +export interface ILayoutChangeOptions { + duration?: number; + transitionClass?: boolean; +} +interface IAdjustScreenOptions { + browserEvent?: any; + route?: string; +} + +@Injectable({ + providedIn: 'root' +}) +export class LayoutService { + public layoutConf: ILayoutConf; + layoutConfSubject = new BehaviorSubject(this.layoutConf); + layoutConf$ = this.layoutConfSubject.asObservable(); + public isMobile: boolean; + public currentRoute: string; + public fullWidthRoutes = []; + + constructor(private themeService: ThemeService) { + this.setAppLayout( + // ******** SET YOUR LAYOUT OPTIONS HERE ********* + { + navigationPos: 'side', + sidebarStyle: 'full', // full, compact, closed + sidebarColor: 'slate', // http://demos.ui-lib.com/matx-doc/#matx-colors + sidebarCompactToggle: false, // applied when "sidebarStyle" is "compact" + useBreadcrumb: true, + footerFixed: true, + topbarColor: 'purple', // http://demos.ui-lib.com/matx-doc/#matx-colors + footerColor: 'slate', // http://demos.ui-lib.com/matx-doc/#matx-colors + matTheme: 'matx-light-purple', // matx-blue, matx-navy, matx-light-purple, matx-dark-purple, matx-dark-pink + breadcrumb: 'simple', // simple, title + perfectScrollbar: true + } + ); + } + + setAppLayout(layoutConf: ILayoutConf) { + this.layoutConf = { ...this.layoutConf, ...layoutConf }; + this.applyMatTheme(this.layoutConf.matTheme); + + // ******* Only for demo purpose *** + this.setLayoutFromQuery(); + // ********************** + } + + publishLayoutChange(lc: ILayoutConf, opt: ILayoutChangeOptions = {}) { + if (this.layoutConf.matTheme !== lc.matTheme && lc.matTheme) { + this.themeService.changeTheme(this.layoutConf.matTheme, lc.matTheme); + } + + this.layoutConf = Object.assign(this.layoutConf, lc); + this.layoutConfSubject.next(this.layoutConf); + } + + applyMatTheme(theme) { + this.themeService.applyMatTheme(this.layoutConf.matTheme); + } + + setLayoutFromQuery() { + const layoutConfString = getQueryParam('layout'); + const prevTheme = this.layoutConf.matTheme; + try { + this.layoutConf = JSON.parse(layoutConfString); + this.themeService.changeTheme(prevTheme, this.layoutConf.matTheme); + } catch (e) {} + } + + adjustLayout(options: IAdjustScreenOptions = {}) { + let sidebarStyle: string; + this.isMobile = this.isSm(); + this.currentRoute = options.route || this.currentRoute; + sidebarStyle = this.isMobile ? 'closed' : 'full'; + + if (this.currentRoute) { + this.fullWidthRoutes.forEach(route => { + if (this.currentRoute.indexOf(route) !== -1) { + sidebarStyle = 'closed'; + } + }); + } + + this.publishLayoutChange({ + isMobile: this.isMobile, + sidebarStyle: sidebarStyle + }); + } + isSm() { + return window.matchMedia(`(max-width: 959px)`).matches; + } +} diff --git a/src/app/shared/services/local-store.service.ts b/src/app/shared/services/local-store.service.ts new file mode 100644 index 0000000..c7b55b3 --- /dev/null +++ b/src/app/shared/services/local-store.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class LocalStoreService { + + private ls = window.localStorage; + + constructor() { } + + public setItem(key, value) { + value = JSON.stringify(value) + this.ls.setItem(key, value) + return true + } + + public getItem(key) { + let value = this.ls.getItem(key) + try { + return JSON.parse(value) + } catch (e) { + return null + } + } + + public clear() { + this.ls.clear(); + } +} \ No newline at end of file diff --git a/src/app/shared/services/match-media.service.ts b/src/app/shared/services/match-media.service.ts new file mode 100644 index 0000000..87f5815 --- /dev/null +++ b/src/app/shared/services/match-media.service.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@angular/core'; +import { MediaObserver, MediaChange } from '@angular/flex-layout'; +import { BehaviorSubject } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class MatchMediaService { + activeMediaQuery: string; + onMediaChange: BehaviorSubject = new BehaviorSubject(''); + + constructor( + private mediaObserver: MediaObserver + ) { + this.activeMediaQuery = ''; + this.init(); + } + + + private init(): void + { + this.mediaObserver.media$ + .subscribe((change: MediaChange) => { + if ( this.activeMediaQuery !== change.mqAlias ) + { + this.activeMediaQuery = change.mqAlias; + this.onMediaChange.next(change.mqAlias); + } + }); + } +} diff --git a/src/app/shared/services/navigation.service.ts b/src/app/shared/services/navigation.service.ts new file mode 100644 index 0000000..aca444d --- /dev/null +++ b/src/app/shared/services/navigation.service.ts @@ -0,0 +1,156 @@ +import { Injectable } from "@angular/core"; +import { BehaviorSubject } from "rxjs"; + +interface IMenuItem { + type: string; // Possible values: link/dropDown/separator/extLink + name?: string; // Used as display text for item and title for separator type + state?: string; // Router state + icon?: string; // Material icon name + tooltip?: string; // Tooltip text + disabled?: boolean; // If true, item will not be appeared in sidenav. + sub?: IChildItem[]; // Dropdown items + badges?: IBadge[]; +} +interface IChildItem { + type?: string; + name: string; // Display text + state?: string; // Router state + icon?: string; + sub?: IChildItem[]; +} + +interface IBadge { + color: string; // primary/accent/warn/hex color codes(#fff000) + value: string; // Display text +} + +@Injectable() +export class NavigationService { + constructor() {} + iconMenu: IMenuItem[] = [ + + { + name: "Dashboard", + type: "link", + tooltip: "Dashboard", + icon: "dashboard", + state: "dashboard/analytics" + }, + { + name: "PAGES", + type: "separator" + }, + { + name: "Sessions", + type: "dropDown", + tooltip: "Pages", + icon: "how_to_reg", + state: "sessions", + badges: [{color: 'primary', value: '6'}], + sub: [ + { name: "Sign up", state: "signup" }, + { name: "Sign in", state: "signin" }, + { name: "Forgot", state: "forgot-password" }, + { name: "Lock screen", state: "lockscreen" }, + { name: "Not Found", state: "404" }, + { name: "Error", state: "error" } + ] + }, + { + name: "Blank Page", + type: "link", + icon: "check_box_outline_blank", + state: "pages/blank" + }, + { + name: "COMPONENTS", + type: "separator" + }, + { + name: "Forms", + type: "dropDown", + tooltip: "Forms", + icon: "description", + state: "forms", + sub: [ + { name: "Basic", state: "basic" }, + { name: "Editor", state: "editor" }, + { name: "Upload", state: "upload" }, + { name: "Wizard", state: "wizard" } + ] + }, + { + name: "Data Table", + type: "link", + tooltip: "Tables", + icon: "format_line_spacing", + state: "tables/mat-table" + }, + { + name: "Material Kit", + type: "link", + icon: "move_to_inbox", + state: "mat-kits" + }, + { + name: "OTHERS", + type: "separator" + }, + { + name: "Icons", + type: "link", + tooltip: "Material Icons", + icon: "store", + state: "icons" + }, + { + name: "Multi Level", + type: "dropDown", + tooltip: "Multi Level", + icon: "format_align_center", + state: "", + sub: [ + { + name: "Level Two", + type: "dropDown", + state: "fake-1", + sub: [ + { name: "Level Three", state: "fake-2" }, + { name: "Level Three", state: "fake-3" } + ] + }, + { name: "Level Two", state: "fake-4" }, + { name: "Level Two", state: "fake-5" } + ] + }, + { + name: "Documentation", + type: "extLink", + icon: "library_books", + state: "http://demos.ui-lib.com/matx-angular-doc/" + }, + { + name: "Upgrade to PRO", + type: "extLink", + icon: "present_to_all", + state: "http://matx-angular.ui-lib.com" + } + ]; + + + // Icon menu TITLE at the very top of navigation. + // This title will appear if any icon type item is present in menu. + iconTypeMenuTitle: string = "Frequently Accessed"; + // sets iconMenu as default; + menuItems = new BehaviorSubject(this.iconMenu); + // navigation component has subscribed to this Observable + menuItems$ = this.menuItems.asObservable(); + + // Customizer component uses this method to change menu. + // You can remove this method and customizer component. + // Or you can customize this method to supply different menu for + // different user type. + publishNavigationChange(menuType: string) { + this.menuItems.next(this.iconMenu); + } +} diff --git a/src/app/shared/services/route-parts.service.ts b/src/app/shared/services/route-parts.service.ts new file mode 100644 index 0000000..2d07b40 --- /dev/null +++ b/src/app/shared/services/route-parts.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { Router, ActivatedRoute, NavigationEnd, ActivatedRouteSnapshot, Params, PRIMARY_OUTLET } from "@angular/router"; + +interface IRoutePart { + title: string, + breadcrumb: string, + params?: Params, + url: string, + urlSegments: any[] +} + +@Injectable() +export class RoutePartsService { + public routeParts: IRoutePart[]; + constructor(private router: Router) {} + + ngOnInit() { + } + generateRouteParts(snapshot: ActivatedRouteSnapshot): IRoutePart[] { + var routeParts = []; + if (snapshot) { + if (snapshot.firstChild) { + routeParts = routeParts.concat(this.generateRouteParts(snapshot.firstChild)); + } + if (snapshot.data['title'] && snapshot.url.length) { + // console.log(snapshot.data['title'], snapshot.url) + + } + } + return routeParts; + } +} \ No newline at end of file diff --git a/src/app/shared/services/theme.service.ts b/src/app/shared/services/theme.service.ts new file mode 100644 index 0000000..df119e9 --- /dev/null +++ b/src/app/shared/services/theme.service.ts @@ -0,0 +1,87 @@ +import { Injectable, Inject, Renderer2, RendererFactory2, EventEmitter } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { getQueryParam } from '../helpers/url.helper'; + +export interface ITheme { + name: string, + baseColor?: string, + isActive?: boolean +} + +@Injectable() +export class ThemeService { + public onThemeChange :EventEmitter = new EventEmitter(); + + public matxThemes :ITheme[] = [{ + "name": "matx-dark-purple", + "baseColor": "#7367f0", + "isActive": false + }, { + "name": "matx-dark-pink", + "baseColor": "#e91e63", + "isActive": false + }, { + "name": "matx-blue", + "baseColor": "#1976d2", + "isActive": true + }, { + "name": "matx-light-purple", + "baseColor": "#7367f0", + "isActive": false + }, { + "name": "matx-navy", + "baseColor": "#10174c", + "isActive": false + }]; + public activatedTheme: ITheme; + private renderer: Renderer2; + constructor( + @Inject(DOCUMENT) private document: Document, + rendererFactory: RendererFactory2 + ) { + this.renderer = rendererFactory.createRenderer(null, null); + } + + // Invoked in AppComponent and apply 'activatedTheme' on startup + applyMatTheme( themeName: string) { + + this.activatedTheme = this.matxThemes.find(t => t.name === themeName); + this.flipActiveFlag(themeName); + + // *********** ONLY FOR DEMO ********** + this.setThemeFromQuery(); + // ************************************ + + // this.changeTheme(themeName); + this.renderer.addClass(this.document.body, themeName); + + } + + changeTheme(prevTheme, themeName: string) { + this.renderer.removeClass(this.document.body, prevTheme); + this.renderer.addClass(this.document.body, themeName); + this.flipActiveFlag(themeName); + this.onThemeChange.emit(this.activatedTheme); + } + + flipActiveFlag(themeName:string) { + this.matxThemes.forEach((t) => { + t.isActive = false; + if(t.name === themeName) { + t.isActive = true; + this.activatedTheme = t; + } + }); + } + + // *********** ONLY FOR DEMO ********** + setThemeFromQuery() { + let themeStr = getQueryParam('theme'); + try { + this.activatedTheme = JSON.parse(themeStr); + console.log(this.activatedTheme); + + this.flipActiveFlag(this.activatedTheme.name); + } catch(e) {} + } +} diff --git a/src/app/shared/shared-material.module.ts b/src/app/shared/shared-material.module.ts new file mode 100644 index 0000000..672c517 --- /dev/null +++ b/src/app/shared/shared-material.module.ts @@ -0,0 +1,81 @@ +import { NgModule } from "@angular/core"; + +import { MatAutocompleteModule } from "@angular/material/autocomplete"; +import { MatBadgeModule } from "@angular/material/badge"; +import { MatBottomSheetModule } from "@angular/material/bottom-sheet"; +import { MatButtonModule } from "@angular/material/button"; +import { MatButtonToggleModule } from "@angular/material/button-toggle"; +import { MatCardModule } from "@angular/material/card"; +import { MatCheckboxModule } from "@angular/material/checkbox"; +import { MatChipsModule } from "@angular/material/chips"; +import { MatRippleModule, MatNativeDateModule } from "@angular/material/core"; +import { MatDatepickerModule } from "@angular/material/datepicker"; +import { MatDialogModule } from "@angular/material/dialog"; +import { MatDividerModule } from "@angular/material/divider"; +import { MatExpansionModule } from "@angular/material/expansion"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { MatGridListModule } from "@angular/material/grid-list"; +import { MatIconModule } from "@angular/material/icon"; +import { MatInputModule } from "@angular/material/input"; +import { MatListModule } from "@angular/material/list"; +import { MatMenuModule } from "@angular/material/menu"; +import { MatPaginatorModule } from "@angular/material/paginator"; +import { MatProgressBarModule } from "@angular/material/progress-bar"; +import { MatProgressSpinnerModule } from "@angular/material/progress-spinner"; +import { MatRadioModule } from "@angular/material/radio"; +import { MatSelectModule } from "@angular/material/select"; +import { MatSidenavModule } from "@angular/material/sidenav"; +import { MatSlideToggleModule } from "@angular/material/slide-toggle"; +import { MatSliderModule } from "@angular/material/slider"; +import { MatSnackBarModule } from "@angular/material/snack-bar"; +import { MatSortModule } from "@angular/material/sort"; +import { MatStepperModule } from "@angular/material/stepper"; +import { MatTableModule } from "@angular/material/table"; +import { MatTabsModule } from "@angular/material/tabs"; +import { MatToolbarModule } from "@angular/material/toolbar"; +import { MatTooltipModule } from "@angular/material/tooltip"; +import { MatTreeModule } from "@angular/material/tree"; +import { MatMomentDateModule } from "@angular/material-moment-adapter"; + +@NgModule({ + exports: [ + MatCheckboxModule, + MatButtonModule, + MatInputModule, + MatAutocompleteModule, + MatDatepickerModule, + MatFormFieldModule, + MatRadioModule, + MatSelectModule, + MatSliderModule, + MatSlideToggleModule, + MatMenuModule, + MatSidenavModule, + MatToolbarModule, + MatListModule, + MatGridListModule, + MatCardModule, + MatStepperModule, + MatTabsModule, + MatExpansionModule, + MatButtonToggleModule, + MatChipsModule, + MatIconModule, + MatProgressSpinnerModule, + MatProgressBarModule, + MatDialogModule, + MatTooltipModule, + MatSnackBarModule, + MatTableModule, + MatSortModule, + MatPaginatorModule, + MatNativeDateModule, + MatMomentDateModule, + MatTreeModule, + MatRippleModule, + MatBadgeModule, + MatBottomSheetModule, + MatDividerModule + ] +}) +export class SharedMaterialModule {} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts new file mode 100644 index 0000000..ef8db73 --- /dev/null +++ b/src/app/shared/shared.module.ts @@ -0,0 +1,37 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +// SERVICES +import { ThemeService } from './services/theme.service'; +import { NavigationService } from "./services/navigation.service"; +import { RoutePartsService } from './services/route-parts.service'; +import { AuthGuard } from './guards/auth.guard'; +import { UserRoleGuard } from './guards/user-role.guard'; +import { AppConfirmService } from './services/app-confirm/app-confirm.service'; +import { AppLoaderService } from './services/app-loader/app-loader.service'; + +import { SharedComponentsModule } from './components/shared-components.module'; +import { SharedPipesModule } from './pipes/shared-pipes.module'; +import { SharedDirectivesModule } from './directives/shared-directives.module'; + +@NgModule({ + imports: [ + CommonModule, + SharedComponentsModule, + SharedPipesModule, + SharedDirectivesModule + ], + providers: [ + ThemeService, + NavigationService, + RoutePartsService, + AuthGuard, + UserRoleGuard, + AppConfirmService, + AppLoaderService + ], + exports: [ + + ] +}) +export class SharedModule { } diff --git a/src/app/vendor/Chart.min.js b/src/app/vendor/Chart.min.js new file mode 100644 index 0000000..0bdd5e5 --- /dev/null +++ b/src/app/vendor/Chart.min.js @@ -0,0 +1,14 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 2.1.6 + * + * Copyright 2016 Nick Downie + * Released under the MIT license + * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Chart=t()}}(function(){return function t(e,a,i){function n(r,l){if(!a[r]){if(!e[r]){var s="function"==typeof require&&require;if(!l&&s)return s(r,!0);if(o)return o(r,!0);var d=new Error("Cannot find module '"+r+"'");throw d.code="MODULE_NOT_FOUND",d}var u=a[r]={exports:{}};e[r][0].call(u.exports,function(t){var a=e[r][1][t];return n(a?a:t)},u,u.exports,t,e,a,i)}return a[r].exports}for(var o="function"==typeof require&&require,r=0;re||t[3]&&t[3]<1?c(t,e):"rgb("+t[0]+", "+t[1]+", "+t[2]+")"}function c(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function h(t,e){if(1>e||t[3]&&t[3]<1)return f(t,e);var a=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),n=Math.round(t[2]/255*100);return"rgb("+a+"%, "+i+"%, "+n+"%)"}function f(t,e){var a=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),n=Math.round(t[2]/255*100);return"rgba("+a+"%, "+i+"%, "+n+"%, "+(e||t[3]||1)+")"}function g(t,e){return 1>e||t[3]&&t[3]<1?p(t,e):"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"}function p(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function m(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"}function b(t){return k[t.slice(0,3)]}function v(t,e,a){return Math.min(Math.max(e,t),a)}function x(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var y=t(6);e.exports={getRgba:i,getHsla:n,getRgb:r,getHsl:l,getHwb:o,getAlpha:s,hexString:d,rgbString:u,rgbaString:c,percentString:h,percentaString:f,hslString:g,hslaString:p,hwbString:m,keyword:b};var k={};for(var S in y)k[y[S]]=S},{6:6}],3:[function(t,e,a){var i=t(5),n=t(2),o=function(t){if(t instanceof o)return t;if(!(this instanceof o))return new o(t);this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1};var e;if("string"==typeof t)if(e=n.getRgba(t))this.setValues("rgb",e);else if(e=n.getHsla(t))this.setValues("hsl",e);else{if(!(e=n.getHwb(t)))throw new Error('Unable to parse color from string "'+t+'"');this.setValues("hwb",e)}else if("object"==typeof t)if(e=t,void 0!==e.r||void 0!==e.red)this.setValues("rgb",e);else if(void 0!==e.l||void 0!==e.lightness)this.setValues("hsl",e);else if(void 0!==e.v||void 0!==e.value)this.setValues("hsv",e);else if(void 0!==e.w||void 0!==e.whiteness)this.setValues("hwb",e);else{if(void 0===e.c&&void 0===e.cyan)throw new Error("Unable to parse color from object "+JSON.stringify(t));this.setValues("cmyk",e)}};o.prototype={rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t%=360,t=0>t?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return n.hexString(this.values.rgb)},rgbString:function(){return n.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return n.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return n.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return n.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return n.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return n.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return n.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],a=0;a=i?i/12.92:Math.pow((i+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),a=t.luminosity();return e>a?(e+.05)/(a+.05):(a+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb,e=(299*t[0]+587*t[1]+114*t[2])/1e3;return 128>e},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;3>e;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,a=(e[0]+t)%360;return e[0]=0>a?360+a:a,this.setValues("hsl",e),this},mix:function(t,e){var a=this,i=t,n=void 0===e?.5:e,o=2*n-1,r=a.alpha()-i.alpha(),l=((o*r===-1?o:(o+r)/(1+o*r))+1)/2,s=1-l;return this.rgb(l*a.red()+s*i.red(),l*a.green()+s*i.green(),l*a.blue()+s*i.blue()).alpha(a.alpha()*n+i.alpha()*(1-n))},toJSON:function(){return this.rgb()},clone:function(){var t,e,a=new o,i=this.values,n=a.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],e={}.toString.call(t),"[object Array]"===e?n[r]=t.slice(0):"[object Number]"===e?n[r]=t:console.error("unexpected color value:",t));return a}},o.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},o.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},o.prototype.getValues=function(t){for(var e=this.values,a={},i=0;ie&&(e+=360),i=(l+s)/2,a=s==l?0:.5>=i?d/(s+l):d/(2-s-l),[e,100*a,100*i]}function n(t){var e,a,i,n=t[0],o=t[1],r=t[2],l=Math.min(n,o,r),s=Math.max(n,o,r),d=s-l;return a=0==s?0:d/s*1e3/10,s==l?e=0:n==s?e=(o-r)/d:o==s?e=2+(r-n)/d:r==s&&(e=4+(n-o)/d),e=Math.min(60*e,360),0>e&&(e+=360),i=s/255*1e3/10,[e,a,i]}function o(t){var e=t[0],a=t[1],n=t[2],o=i(t)[0],r=1/255*Math.min(e,Math.min(a,n)),n=1-1/255*Math.max(e,Math.max(a,n));return[o,100*r,100*n]}function l(t){var e,a,i,n,o=t[0]/255,r=t[1]/255,l=t[2]/255;return n=Math.min(1-o,1-r,1-l),e=(1-o-n)/(1-n)||0,a=(1-r-n)/(1-n)||0,i=(1-l-n)/(1-n)||0,[100*e,100*a,100*i,100*n]}function s(t){return Q[JSON.stringify(t)]}function d(t){var e=t[0]/255,a=t[1]/255,i=t[2]/255;e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92,a=a>.04045?Math.pow((a+.055)/1.055,2.4):a/12.92,i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92;var n=.4124*e+.3576*a+.1805*i,o=.2126*e+.7152*a+.0722*i,r=.0193*e+.1192*a+.9505*i;return[100*n,100*o,100*r]}function u(t){var e,a,i,n=d(t),o=n[0],r=n[1],l=n[2];return o/=95.047,r/=100,l/=108.883,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,l=l>.008856?Math.pow(l,1/3):7.787*l+16/116,e=116*r-16,a=500*(o-r),i=200*(r-l),[e,a,i]}function c(t){return W(u(t))}function h(t){var e,a,i,n,o,r=t[0]/360,l=t[1]/100,s=t[2]/100;if(0==l)return o=255*s,[o,o,o];a=.5>s?s*(1+l):s+l-s*l,e=2*s-a,n=[0,0,0];for(var d=0;3>d;d++)i=r+1/3*-(d-1),0>i&&i++,i>1&&i--,o=1>6*i?e+6*(a-e)*i:1>2*i?a:2>3*i?e+(a-e)*(2/3-i)*6:e,n[d]=255*o;return n}function f(t){var e,a,i=t[0],n=t[1]/100,o=t[2]/100;return 0===o?[0,0,0]:(o*=2,n*=1>=o?o:2-o,a=(o+n)/2,e=2*n/(o+n),[i,100*e,100*a])}function p(t){return o(h(t))}function m(t){return l(h(t))}function v(t){return s(h(t))}function x(t){var e=t[0]/60,a=t[1]/100,i=t[2]/100,n=Math.floor(e)%6,o=e-Math.floor(e),r=255*i*(1-a),l=255*i*(1-a*o),s=255*i*(1-a*(1-o)),i=255*i;switch(n){case 0:return[i,s,r];case 1:return[l,i,r];case 2:return[r,i,s];case 3:return[r,l,i];case 4:return[s,r,i];case 5:return[i,r,l]}}function y(t){var e,a,i=t[0],n=t[1]/100,o=t[2]/100;return a=(2-n)*o,e=n*o,e/=1>=a?a:2-a,e=e||0,a/=2,[i,100*e,100*a]}function k(t){return o(x(t))}function S(t){return l(x(t))}function w(t){return s(x(t))}function C(t){var e,a,i,n,o=t[0]/360,l=t[1]/100,s=t[2]/100,d=l+s;switch(d>1&&(l/=d,s/=d),e=Math.floor(6*o),a=1-s,i=6*o-e,0!=(1&e)&&(i=1-i),n=l+i*(a-l),e){default:case 6:case 0:r=a,g=n,b=l;break;case 1:r=n,g=a,b=l;break;case 2:r=l,g=a,b=n;break;case 3:r=l,g=n,b=a;break;case 4:r=n,g=l,b=a;break;case 5:r=a,g=l,b=n}return[255*r,255*g,255*b]}function M(t){return i(C(t))}function D(t){return n(C(t))}function A(t){return l(C(t))}function I(t){return s(C(t))}function F(t){var e,a,i,n=t[0]/100,o=t[1]/100,r=t[2]/100,l=t[3]/100;return e=1-Math.min(1,n*(1-l)+l),a=1-Math.min(1,o*(1-l)+l),i=1-Math.min(1,r*(1-l)+l),[255*e,255*a,255*i]}function T(t){return i(F(t))}function P(t){return n(F(t))}function _(t){return o(F(t))}function R(t){return s(F(t))}function V(t){var e,a,i,n=t[0]/100,o=t[1]/100,r=t[2]/100;return e=3.2406*n+-1.5372*o+r*-.4986,a=n*-.9689+1.8758*o+.0415*r,i=.0557*n+o*-.204+1.057*r,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e=12.92*e,a=a>.0031308?1.055*Math.pow(a,1/2.4)-.055:a=12.92*a,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i=12.92*i,e=Math.min(Math.max(0,e),1),a=Math.min(Math.max(0,a),1),i=Math.min(Math.max(0,i),1),[255*e,255*a,255*i]}function O(t){var e,a,i,n=t[0],o=t[1],r=t[2];return n/=95.047,o/=100,r/=108.883,n=n>.008856?Math.pow(n,1/3):7.787*n+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,e=116*o-16,a=500*(n-o),i=200*(o-r),[e,a,i]}function L(t){return W(O(t))}function B(t){var e,a,i,n,o=t[0],r=t[1],l=t[2];return 8>=o?(a=100*o/903.3,n=7.787*(a/100)+16/116):(a=100*Math.pow((o+16)/116,3),n=Math.pow(a/100,1/3)),e=.008856>=e/95.047?e=95.047*(r/500+n-16/116)/7.787:95.047*Math.pow(r/500+n,3),i=.008859>=i/108.883?i=108.883*(n-l/200-16/116)/7.787:108.883*Math.pow(n-l/200,3),[e,a,i]}function W(t){var e,a,i,n=t[0],o=t[1],r=t[2];return e=Math.atan2(r,o),a=360*e/2/Math.PI,0>a&&(a+=360),i=Math.sqrt(o*o+r*r),[n,i,a]}function z(t){return V(B(t))}function H(t){var e,a,i,n=t[0],o=t[1],r=t[2];return i=r/360*2*Math.PI,e=o*Math.cos(i),a=o*Math.sin(i),[n,e,a]}function N(t){return B(H(t))}function E(t){return z(H(t))}function U(t){return G[t]}function q(t){return i(U(t))}function j(t){return n(U(t))}function Y(t){return o(U(t))}function J(t){return l(U(t))}function X(t){return u(U(t))}function Z(t){return d(U(t))}e.exports={rgb2hsl:i,rgb2hsv:n,rgb2hwb:o,rgb2cmyk:l,rgb2keyword:s,rgb2xyz:d,rgb2lab:u,rgb2lch:c,hsl2rgb:h,hsl2hsv:f,hsl2hwb:p,hsl2cmyk:m,hsl2keyword:v,hsv2rgb:x,hsv2hsl:y,hsv2hwb:k,hsv2cmyk:S,hsv2keyword:w,hwb2rgb:C,hwb2hsl:M,hwb2hsv:D,hwb2cmyk:A,hwb2keyword:I,cmyk2rgb:F,cmyk2hsl:T,cmyk2hsv:P,cmyk2hwb:_,cmyk2keyword:R,keyword2rgb:U,keyword2hsl:q,keyword2hsv:j,keyword2hwb:Y,keyword2cmyk:J,keyword2lab:X,keyword2xyz:Z,xyz2rgb:V,xyz2lab:O,xyz2lch:L,lab2xyz:B,lab2rgb:z,lab2lch:W,lch2lab:H,lch2xyz:N,lch2rgb:E};var G={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Q={};for(var $ in G)Q[JSON.stringify(G[$])]=$},{}],5:[function(t,e,a){var i=t(4),n=function(){return new d};for(var o in i){n[o+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(o);var r=/(\w+)2(\w+)/.exec(o),l=r[1],s=r[2];n[l]=n[l]||{},n[l][s]=n[o]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var a=i[t](e);if("string"==typeof a||void 0===a)return a;for(var n=0;ns)for(var d=0;t>d;d++){var u=l[d],c=r.getDatasetMeta(d);c.bar&&c.yAxisID===n.id&&r.isDatasetVisible(d)&&(o+=u.data[e]<0?u.data[e]:0)}else for(var h=0;t>h;h++){var f=l[h],g=r.getDatasetMeta(h);g.bar&&g.yAxisID===n.id&&r.isDatasetVisible(h)&&(o+=f.data[e]>0?f.data[e]:0)}return n.getPixelForValue(o)}return n.getBasePixel()},getRuler:function(t){var e,a=this,i=a.getMeta(),n=a.getScaleForId(i.xAxisID),o=a.getBarCount();e="category"===n.options.type?n.getPixelForTick(t+1)-n.getPixelForTick(t):n.width/n.ticks.length;var r=e*n.options.categoryPercentage,l=(e-e*n.options.categoryPercentage)/2,s=r/o;if(n.ticks.length!==a.chart.data.labels.length){var d=n.ticks.length/a.chart.data.labels.length;s*=d}var u=s*n.options.barPercentage,c=s-s*n.options.barPercentage;return{datasetCount:o,tickWidth:e,categoryWidth:r,categorySpacing:l,fullBarWidth:s,barWidth:u,barSpacing:c}},calculateBarWidth:function(t){var e=this.getScaleForId(this.getMeta().xAxisID),a=this.getRuler(t);return e.options.stacked?a.categoryWidth:a.barWidth},getBarIndex:function(t){var e,a,i=0;for(a=0;t>a;++a)e=this.chart.getDatasetMeta(a),e.bar&&this.chart.isDatasetVisible(a)&&++i;return i},calculateBarX:function(t,e){var a=this,i=a.getMeta(),n=a.getScaleForId(i.xAxisID),o=a.getBarIndex(e),r=a.getRuler(t),l=n.getPixelForValue(null,t,e,a.chart.isCombo);return l-=a.chart.isCombo?r.tickWidth/2:0,n.options.stacked?l+r.categoryWidth/2+r.categorySpacing:l+r.barWidth/2+r.categorySpacing+r.barWidth*o+r.barSpacing/2+r.barSpacing*o},calculateBarY:function(t,e){var a=this,i=a.getMeta(),n=a.getScaleForId(i.yAxisID),o=a.getDataset().data[t];if(n.options.stacked){for(var r=0,l=0,s=0;e>s;s++){var d=a.chart.data.datasets[s],u=a.chart.getDatasetMeta(s);u.bar&&u.yAxisID===n.id&&a.chart.isDatasetVisible(s)&&(d.data[t]<0?l+=d.data[t]||0:r+=d.data[t]||0)}return 0>o?n.getPixelForValue(l+o):n.getPixelForValue(r+o)}return n.getPixelForValue(o)},draw:function(t){var a=this,i=t||1;e.each(a.getMeta().data,function(t,e){var n=a.getDataset().data[e];null===n||void 0===n||isNaN(n)||t.transition(i).draw()},a)},setHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},o=t._model;o.backgroundColor=n.hoverBackgroundColor?n.hoverBackgroundColor:e.getValueAtIndexOrDefault(a.hoverBackgroundColor,i,e.getHoverColor(o.backgroundColor)),o.borderColor=n.hoverBorderColor?n.hoverBorderColor:e.getValueAtIndexOrDefault(a.hoverBorderColor,i,e.getHoverColor(o.borderColor)),o.borderWidth=n.hoverBorderWidth?n.hoverBorderWidth:e.getValueAtIndexOrDefault(a.hoverBorderWidth,i,o.borderWidth)},removeHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},o=t._model,r=this.chart.options.elements.rectangle;o.backgroundColor=n.backgroundColor?n.backgroundColor:e.getValueAtIndexOrDefault(a.backgroundColor,i,r.backgroundColor),o.borderColor=n.borderColor?n.borderColor:e.getValueAtIndexOrDefault(a.borderColor,i,r.borderColor),o.borderWidth=n.borderWidth?n.borderWidth:e.getValueAtIndexOrDefault(a.borderWidth,i,r.borderWidth)}}),t.defaults.horizontalBar={hover:{mode:"label"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{position:"left",type:"category",categoryPercentage:.8,barPercentage:.9,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{callbacks:{title:function(t,e){var a="";return t.length>0&&(t[0].yLabel?a=t[0].yLabel:e.labels.length>0&&t[0].indexc;c++)e.lineTo.apply(e,t(c));e.fill(),a.borderWidth&&e.stroke()},inRange:function(t,e){var a=this._view,i=!1;return a&&(i=a.x=a.y-a.height/2&&e<=a.y+a.height/2&&t>=a.x&&t<=a.base:e>=a.y-a.height/2&&e<=a.y+a.height/2&&t>=a.base&&t<=a.x),i}}),t.pivot()},calculateBarBase:function(t,e){ +var a=this,i=a.getMeta(),n=a.getScaleForId(i.xAxisID),o=0;if(n.options.stacked){var r=a.chart.data.datasets[t].data[e];if(0>r)for(var l=0;t>l;l++){var s=a.chart.data.datasets[l],d=a.chart.getDatasetMeta(l);d.bar&&d.xAxisID===n.id&&a.chart.isDatasetVisible(l)&&(o+=s.data[e]<0?s.data[e]:0)}else for(var u=0;t>u;u++){var c=a.chart.data.datasets[u],h=a.chart.getDatasetMeta(u);h.bar&&h.xAxisID===n.id&&a.chart.isDatasetVisible(u)&&(o+=c.data[e]>0?c.data[e]:0)}return n.getPixelForValue(o)}return n.getBasePixel()},getRuler:function(t){var e,a=this,i=a.getMeta(),n=a.getScaleForId(i.yAxisID),o=a.getBarCount();e="category"===n.options.type?n.getPixelForTick(t+1)-n.getPixelForTick(t):n.width/n.ticks.length;var r=e*n.options.categoryPercentage,l=(e-e*n.options.categoryPercentage)/2,s=r/o;if(n.ticks.length!==a.chart.data.labels.length){var d=n.ticks.length/a.chart.data.labels.length;s*=d}var u=s*n.options.barPercentage,c=s-s*n.options.barPercentage;return{datasetCount:o,tickHeight:e,categoryHeight:r,categorySpacing:l,fullBarHeight:s,barHeight:u,barSpacing:c}},calculateBarHeight:function(t){var e=this,a=e.getScaleForId(e.getMeta().yAxisID),i=e.getRuler(t);return a.options.stacked?i.categoryHeight:i.barHeight},calculateBarX:function(t,e){var a=this,i=a.getMeta(),n=a.getScaleForId(i.xAxisID),o=a.getDataset().data[t];if(n.options.stacked){for(var r=0,l=0,s=0;e>s;s++){var d=a.chart.data.datasets[s],u=a.chart.getDatasetMeta(s);u.bar&&u.xAxisID===n.id&&a.chart.isDatasetVisible(s)&&(d.data[t]<0?l+=d.data[t]||0:r+=d.data[t]||0)}return 0>o?n.getPixelForValue(l+o):n.getPixelForValue(r+o)}return n.getPixelForValue(o)},calculateBarY:function(t,e){var a=this,i=a.getMeta(),n=a.getScaleForId(i.yAxisID),o=a.getBarIndex(e),r=a.getRuler(t),l=n.getPixelForValue(null,t,e,a.chart.isCombo);return l-=a.chart.isCombo?r.tickHeight/2:0,n.options.stacked?l+r.categoryHeight/2+r.categorySpacing:l+r.barHeight/2+r.categorySpacing+r.barHeight*o+r.barSpacing/2+r.barSpacing*o}})}},{}],16:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.bubble={hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(t,e){return""},label:function(t,e){var a=e.datasets[t.datasetIndex].label||"",i=e.datasets[t.datasetIndex].data[t.index];return a+": ("+i.x+", "+i.y+", "+i.r+")"}}}},t.controllers.bubble=t.DatasetController.extend({dataElementType:t.elements.Point,update:function(t){var a=this,i=a.getMeta(),n=i.data;e.each(n,function(e,i){a.updateElement(e,i,t)})},updateElement:function(a,i,n){var o=this,r=o.getMeta(),l=o.getScaleForId(r.xAxisID),s=o.getScaleForId(r.yAxisID),d=a.custom||{},u=o.getDataset(),c=u.data[i],h=o.chart.options.elements.point,f=o.index;e.extend(a,{_xScale:l,_yScale:s,_datasetIndex:f,_index:i,_model:{x:n?l.getPixelForDecimal(.5):l.getPixelForValue(c,i,f,o.chart.isCombo),y:n?s.getBasePixel():s.getPixelForValue(c,i,f),radius:n?0:d.radius?d.radius:o.getRadius(c),hitRadius:d.hitRadius?d.hitRadius:e.getValueAtIndexOrDefault(u.hitRadius,i,h.hitRadius)}}),t.DatasetController.prototype.removeHoverStyle.call(o,a,h);var g=a._model;g.skip=d.skip?d.skip:isNaN(g.x)||isNaN(g.y),a.pivot()},getRadius:function(t){return t.r||this.chart.options.elements.point.radius},setHoverStyle:function(a){var i=this;t.DatasetController.prototype.setHoverStyle.call(i,a);var n=i.chart.data.datasets[a._datasetIndex],o=a._index,r=a.custom||{},l=a._model;l.radius=r.hoverRadius?r.hoverRadius:e.getValueAtIndexOrDefault(n.hoverRadius,o,i.chart.options.elements.point.hoverRadius)+i.getRadius(n.data[o])},removeHoverStyle:function(e){var a=this;t.DatasetController.prototype.removeHoverStyle.call(a,e,a.chart.options.elements.point);var i=a.chart.data.datasets[e._datasetIndex].data[e._index],n=e.custom||{},o=e._model;o.radius=n.radius?n.radius:a.getRadius(i)}})}},{}],17:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=t.defaults;a.doughnut={animation:{animateRotate:!0,animateScale:!1},aspectRatio:1,hover:{mode:"single"},legendCallback:function(t){var e=[];e.push('
    ');var a=t.data,i=a.datasets,n=a.labels;if(i.length)for(var o=0;o'),n[o]&&e.push(n[o]),e.push("");return e.push("
"),e.join("")},legend:{labels:{generateLabels:function(t){var a=t.data;return a.labels.length&&a.datasets.length?a.labels.map(function(i,n){var o=t.getDatasetMeta(0),r=a.datasets[0],l=o.data[n],s=l.custom||{},d=e.getValueAtIndexOrDefault,u=t.options.elements.arc,c=s.backgroundColor?s.backgroundColor:d(r.backgroundColor,n,u.backgroundColor),h=s.borderColor?s.borderColor:d(r.borderColor,n,u.borderColor),f=s.borderWidth?s.borderWidth:d(r.borderWidth,n,u.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(r.data[n])||o.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var a,i,n,o=e.index,r=this.chart;for(a=0,i=(r.data.datasets||[]).length;i>a;++a)n=r.getDatasetMeta(a),n.data[o].hidden=!n.data[o].hidden;r.update()}},cutoutPercentage:50,rotation:Math.PI*-.5,circumference:2*Math.PI,tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+e.datasets[t.datasetIndex].data[t.index]}}}},a.pie=e.clone(a.doughnut),e.extend(a.pie,{cutoutPercentage:0}),t.controllers.doughnut=t.controllers.pie=t.DatasetController.extend({dataElementType:t.elements.Arc,linkScales:e.noop,getRingIndex:function(t){for(var e=0,a=0;t>a;++a)this.chart.isDatasetVisible(a)&&++e;return e},update:function(t){var a=this,i=a.chart,n=i.chartArea,o=i.options,r=o.elements.arc,l=n.right-n.left-r.borderWidth,s=n.bottom-n.top-r.borderWidth,d=Math.min(l,s),u={x:0,y:0},c=a.getMeta(),h=o.cutoutPercentage,f=o.circumference;if(f<2*Math.PI){var g=o.rotation%(2*Math.PI);g+=2*Math.PI*(g>=Math.PI?-1:g<-Math.PI?1:0);var p=g+f,m={x:Math.cos(g),y:Math.sin(g)},b={x:Math.cos(p),y:Math.sin(p)},v=0>=g&&p>=0||g<=2*Math.PI&&2*Math.PI<=p,x=g<=.5*Math.PI&&.5*Math.PI<=p||g<=2.5*Math.PI&&2.5*Math.PI<=p,y=g<=-Math.PI&&-Math.PI<=p||g<=Math.PI&&Math.PI<=p,k=g<=.5*-Math.PI&&.5*-Math.PI<=p||g<=1.5*Math.PI&&1.5*Math.PI<=p,S=h/100,w={x:y?-1:Math.min(m.x*(m.x<0?1:S),b.x*(b.x<0?1:S)),y:k?-1:Math.min(m.y*(m.y<0?1:S),b.y*(b.y<0?1:S))},C={x:v?1:Math.max(m.x*(m.x>0?1:S),b.x*(b.x>0?1:S)),y:x?1:Math.max(m.y*(m.y>0?1:S),b.y*(b.y>0?1:S))},M={width:.5*(C.x-w.x),height:.5*(C.y-w.y)};d=Math.min(l/M.width,s/M.height),u={x:(C.x+w.x)*-.5,y:(C.y+w.y)*-.5}}i.outerRadius=Math.max(d/2,0),i.innerRadius=Math.max(h?i.outerRadius/100*h:1,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),i.offsetX=u.x*i.outerRadius,i.offsetY=u.y*i.outerRadius,c.total=a.calculateTotal(),a.outerRadius=i.outerRadius-i.radiusLength*a.getRingIndex(a.index),a.innerRadius=a.outerRadius-i.radiusLength,e.each(c.data,function(e,i){a.updateElement(e,i,t)})},updateElement:function(t,a,i){var n=this,o=n.chart,r=o.chartArea,l=o.options,s=l.animation,d=(l.elements.arc,(r.left+r.right)/2),u=(r.top+r.bottom)/2,c=l.rotation,h=l.rotation,f=n.getDataset(),g=i&&s.animateRotate?0:t.hidden?0:n.calculateCircumference(f.data[a])*(l.circumference/(2*Math.PI)),p=i&&s.animateScale?0:n.innerRadius,m=i&&s.animateScale?0:n.outerRadius,b=(t.custom||{},e.getValueAtIndexOrDefault);e.extend(t,{_datasetIndex:n.index,_index:a,_model:{x:d+o.offsetX,y:u+o.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:m,innerRadius:p,label:b(f.label,a,o.data.labels[a])}});var v=t._model;this.removeHoverStyle(t),i&&s.animateRotate||(0===a?v.startAngle=l.rotation:v.startAngle=n.getMeta().data[a-1]._model.endAngle,v.endAngle=v.startAngle+v.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,a=this.getDataset(),i=this.getMeta(),n=0;return e.each(i.data,function(e,i){t=a.data[i],isNaN(t)||e.hidden||(n+=Math.abs(t))}),n},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0}})}},{}],18:[function(t,e,a){"use strict";e.exports=function(t){function e(t,e){return a.getValueOrDefault(t.showLine,e.showLines)}var a=t.helpers;t.defaults.line={showLines:!0,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}},t.controllers.line=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,addElementAndReset:function(a){var i=this,n=i.chart.options,o=i.getMeta();t.DatasetController.prototype.addElementAndReset.call(i,a),e(i.getDataset(),n)&&0!==o.dataset._model.tension&&i.updateBezierControlPoints()},update:function(t){var i,n,o,r=this,l=r.getMeta(),s=l.dataset,d=l.data||[],u=r.chart.options,c=u.elements.line,h=r.getScaleForId(l.yAxisID),f=r.getDataset(),g=e(f,u);for(g&&(o=s.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),s._scale=h,s._datasetIndex=r.index,s._children=d,s._model={spanGaps:f.spanGaps?f.spanGaps:!1,tension:o.tension?o.tension:a.getValueOrDefault(f.lineTension,c.tension),backgroundColor:o.backgroundColor?o.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:o.borderWidth?o.borderWidth:f.borderWidth||c.borderWidth,borderColor:o.borderColor?o.borderColor:f.borderColor||c.borderColor,borderCapStyle:o.borderCapStyle?o.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:o.borderDash?o.borderDash:f.borderDash||c.borderDash,borderDashOffset:o.borderDashOffset?o.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:o.borderJoinStyle?o.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:o.fill?o.fill:void 0!==f.fill?f.fill:c.fill,scaleTop:h.top,scaleBottom:h.bottom,scaleZero:h.getBasePixel()},s.pivot()),i=0,n=d.length;n>i;++i)r.updateElement(d[i],i,t);for(g&&0!==s._model.tension&&r.updateBezierControlPoints(),i=0,n=d.length;n>i;++i)d[i].pivot()},getPointBackgroundColor:function(t,e){var i=this.chart.options.elements.point.backgroundColor,n=this.getDataset(),o=t.custom||{};return o.backgroundColor?i=o.backgroundColor:n.pointBackgroundColor?i=a.getValueAtIndexOrDefault(n.pointBackgroundColor,e,i):n.backgroundColor&&(i=n.backgroundColor),i},getPointBorderColor:function(t,e){var i=this.chart.options.elements.point.borderColor,n=this.getDataset(),o=t.custom||{};return o.borderColor?i=o.borderColor:n.pointBorderColor?i=a.getValueAtIndexOrDefault(n.pointBorderColor,e,i):n.borderColor&&(i=n.borderColor),i},getPointBorderWidth:function(t,e){var i=this.chart.options.elements.point.borderWidth,n=this.getDataset(),o=t.custom||{};return o.borderWidth?i=o.borderWidth:n.pointBorderWidth?i=a.getValueAtIndexOrDefault(n.pointBorderWidth,e,i):n.borderWidth&&(i=n.borderWidth),i},updateElement:function(t,e,i){var n,o,r=this,l=r.getMeta(),s=t.custom||{},d=r.getDataset(),u=r.index,c=d.data[e],h=r.getScaleForId(l.yAxisID),f=r.getScaleForId(l.xAxisID),g=r.chart.options.elements.point;void 0!==d.radius&&void 0===d.pointRadius&&(d.pointRadius=d.radius),void 0!==d.hitRadius&&void 0===d.pointHitRadius&&(d.pointHitRadius=d.hitRadius),n=f.getPixelForValue(c,e,u,r.chart.isCombo),o=i?h.getBasePixel():r.calculatePointY(c,e,u,r.chart.isCombo),t._xScale=f,t._yScale=h,t._datasetIndex=u,t._index=e,t._model={x:n,y:o,skip:s.skip||isNaN(n)||isNaN(o),radius:s.radius||a.getValueAtIndexOrDefault(d.pointRadius,e,g.radius),pointStyle:s.pointStyle||a.getValueAtIndexOrDefault(d.pointStyle,e,g.pointStyle),backgroundColor:r.getPointBackgroundColor(t,e),borderColor:r.getPointBorderColor(t,e),borderWidth:r.getPointBorderWidth(t,e),tension:l.dataset._model?l.dataset._model.tension:0,hitRadius:s.hitRadius||a.getValueAtIndexOrDefault(d.pointHitRadius,e,g.hitRadius)}},calculatePointY:function(t,e,a,i){var n,o,r,l=this,s=l.chart,d=l.getMeta(),u=l.getScaleForId(d.yAxisID),c=0,h=0;if(u.options.stacked){for(n=0;a>n;n++)o=s.data.datasets[n],r=s.getDatasetMeta(n),"line"===r.type&&s.isDatasetVisible(n)&&(o.data[e]<0?h+=o.data[e]||0:c+=o.data[e]||0);return 0>t?u.getPixelForValue(h+t):u.getPixelForValue(c+t)}return u.getPixelForValue(t)},updateBezierControlPoints:function(){var t,e,i,n,o,r=this.getMeta(),l=(this.chart.chartArea,r.data||[]);for(t=0,e=l.length;e>t;++t)i=l[t],n=i._model,o=a.splineCurve(a.previousItem(l,t)._model,n,a.nextItem(l,t)._model,r.dataset._model.tension),n.controlPointPreviousX=o.previous.x,n.controlPointPreviousY=o.previous.y,n.controlPointNextX=o.next.x,n.controlPointNextY=o.next.y},draw:function(t){var a,i,n=this,o=n.getMeta(),r=o.data||[],l=t||1;for(a=0,i=r.length;i>a;++a)r[a].transition(l);for(e(n.getDataset(),n.chart.options)&&o.dataset.transition(l).draw(),a=0,i=r.length;i>a;++a)r[a].draw()},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},o=t._model;o.radius=n.hoverRadius||a.getValueAtIndexOrDefault(e.pointHoverRadius,i,this.chart.options.elements.point.hoverRadius),o.backgroundColor=n.hoverBackgroundColor||a.getValueAtIndexOrDefault(e.pointHoverBackgroundColor,i,a.getHoverColor(o.backgroundColor)),o.borderColor=n.hoverBorderColor||a.getValueAtIndexOrDefault(e.pointHoverBorderColor,i,a.getHoverColor(o.borderColor)),o.borderWidth=n.hoverBorderWidth||a.getValueAtIndexOrDefault(e.pointHoverBorderWidth,i,o.borderWidth)},removeHoverStyle:function(t){var e=this,i=e.chart.data.datasets[t._datasetIndex],n=t._index,o=t.custom||{},r=t._model;void 0!==i.radius&&void 0===i.pointRadius&&(i.pointRadius=i.radius),r.radius=o.radius||a.getValueAtIndexOrDefault(i.pointRadius,n,e.chart.options.elements.point.radius),r.backgroundColor=e.getPointBackgroundColor(t,n),r.borderColor=e.getPointBorderColor(t,n),r.borderWidth=e.getPointBorderWidth(t,n)}})}},{}],19:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.polarArea={scale:{type:"radialLinear",lineArc:!0},animation:{animateRotate:!0,animateScale:!0},aspectRatio:1,legendCallback:function(t){var e=[];e.push('
    ');var a=t.data,i=a.datasets,n=a.labels;if(i.length)for(var o=0;o'),n[o]&&e.push(n[o]),e.push("");return e.push("
"),e.join("")},legend:{labels:{generateLabels:function(t){var a=t.data;return a.labels.length&&a.datasets.length?a.labels.map(function(i,n){var o=t.getDatasetMeta(0),r=a.datasets[0],l=o.data[n],s=l.custom||{},d=e.getValueAtIndexOrDefault,u=t.options.elements.arc,c=s.backgroundColor?s.backgroundColor:d(r.backgroundColor,n,u.backgroundColor),h=s.borderColor?s.borderColor:d(r.borderColor,n,u.borderColor),f=s.borderWidth?s.borderWidth:d(r.borderWidth,n,u.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(r.data[n])||o.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var a,i,n,o=e.index,r=this.chart;for(a=0,i=(r.data.datasets||[]).length;i>a;++a)n=r.getDatasetMeta(a),n.data[o].hidden=!n.data[o].hidden;r.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}},t.controllers.polarArea=t.DatasetController.extend({dataElementType:t.elements.Arc,linkScales:e.noop,update:function(t){var a=this,i=a.chart,n=i.chartArea,o=a.getMeta(),r=i.options,l=r.elements.arc,s=Math.min(n.right-n.left,n.bottom-n.top);i.outerRadius=Math.max((s-l.borderWidth/2)/2,0),i.innerRadius=Math.max(r.cutoutPercentage?i.outerRadius/100*r.cutoutPercentage:1,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),a.outerRadius=i.outerRadius-i.radiusLength*a.index,a.innerRadius=a.outerRadius-i.radiusLength,o.count=a.countVisibleElements(),e.each(o.data,function(e,i){a.updateElement(e,i,t)})},updateElement:function(t,a,i){for(var n=this,o=n.chart,r=o.chartArea,l=n.getDataset(),s=o.options,d=s.animation,u=(s.elements.arc,t.custom||{},o.scale),c=e.getValueAtIndexOrDefault,h=o.data.labels,f=n.calculateCircumference(l.data[a]),g=(r.left+r.right)/2,p=(r.top+r.bottom)/2,m=0,b=n.getMeta(),v=0;a>v;++v)isNaN(l.data[v])||b.data[v].hidden||++m;var x=-.5*Math.PI,y=t.hidden?0:u.getDistanceFromCenterForValue(l.data[a]),k=x+f*m,S=k+(t.hidden?0:f),w=d.animateScale?0:u.getDistanceFromCenterForValue(l.data[a]);e.extend(t,{_datasetIndex:n.index,_index:a,_scale:u,_model:{x:g,y:p,innerRadius:0,outerRadius:i?w:y,startAngle:i&&d.animateRotate?x:k,endAngle:i&&d.animateRotate?x:S,label:c(h,a,h[a])}}),n.removeHoverStyle(t),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},countVisibleElements:function(){var t=this.getDataset(),a=this.getMeta(),i=0;return e.each(a.data,function(e,a){isNaN(t.data[a])||e.hidden||i++}),i},calculateCircumference:function(t){var e=this.getMeta().count;return e>0&&!isNaN(t)?2*Math.PI/e:0}})}},{}],20:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.radar={scale:{type:"radialLinear"},elements:{line:{tension:0}}},t.controllers.radar=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,linkScales:e.noop,addElementAndReset:function(e){t.DatasetController.prototype.addElementAndReset.call(this,e),this.updateBezierControlPoints()},update:function(t){var a=this,i=a.getMeta(),n=i.dataset,o=i.data,r=n.custom||{},l=a.getDataset(),s=a.chart.options.elements.line,d=a.chart.scale;void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),e.extend(i.dataset,{_datasetIndex:a.index,_children:o,_loop:!0,_model:{tension:r.tension?r.tension:e.getValueOrDefault(l.lineTension,s.tension),backgroundColor:r.backgroundColor?r.backgroundColor:l.backgroundColor||s.backgroundColor,borderWidth:r.borderWidth?r.borderWidth:l.borderWidth||s.borderWidth,borderColor:r.borderColor?r.borderColor:l.borderColor||s.borderColor,fill:r.fill?r.fill:void 0!==l.fill?l.fill:s.fill,borderCapStyle:r.borderCapStyle?r.borderCapStyle:l.borderCapStyle||s.borderCapStyle,borderDash:r.borderDash?r.borderDash:l.borderDash||s.borderDash,borderDashOffset:r.borderDashOffset?r.borderDashOffset:l.borderDashOffset||s.borderDashOffset,borderJoinStyle:r.borderJoinStyle?r.borderJoinStyle:l.borderJoinStyle||s.borderJoinStyle,scaleTop:d.top,scaleBottom:d.bottom,scaleZero:d.getBasePosition()}}),i.dataset.pivot(),e.each(o,function(e,i){a.updateElement(e,i,t)},a),a.updateBezierControlPoints()},updateElement:function(t,a,i){var n=this,o=t.custom||{},r=n.getDataset(),l=n.chart.scale,s=n.chart.options.elements.point,d=l.getPointPositionForValue(a,r.data[a]);e.extend(t,{_datasetIndex:n.index,_index:a,_scale:l,_model:{x:i?l.xCenter:d.x,y:i?l.yCenter:d.y,tension:o.tension?o.tension:e.getValueOrDefault(r.tension,n.chart.options.elements.line.tension),radius:o.radius?o.radius:e.getValueAtIndexOrDefault(r.pointRadius,a,s.radius),backgroundColor:o.backgroundColor?o.backgroundColor:e.getValueAtIndexOrDefault(r.pointBackgroundColor,a,s.backgroundColor),borderColor:o.borderColor?o.borderColor:e.getValueAtIndexOrDefault(r.pointBorderColor,a,s.borderColor),borderWidth:o.borderWidth?o.borderWidth:e.getValueAtIndexOrDefault(r.pointBorderWidth,a,s.borderWidth),pointStyle:o.pointStyle?o.pointStyle:e.getValueAtIndexOrDefault(r.pointStyle,a,s.pointStyle),hitRadius:o.hitRadius?o.hitRadius:e.getValueAtIndexOrDefault(r.hitRadius,a,s.hitRadius)}}),t._model.skip=o.skip?o.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,a=this.getMeta();e.each(a.data,function(i,n){var o=i._model,r=e.splineCurve(e.previousItem(a.data,n,!0)._model,o,e.nextItem(a.data,n,!0)._model,o.tension);o.controlPointPreviousX=Math.max(Math.min(r.previous.x,t.right),t.left),o.controlPointPreviousY=Math.max(Math.min(r.previous.y,t.bottom),t.top),o.controlPointNextX=Math.max(Math.min(r.next.x,t.right),t.left),o.controlPointNextY=Math.max(Math.min(r.next.y,t.bottom),t.top),i.pivot()})},draw:function(t){var a=this.getMeta(),i=t||1;e.each(a.data,function(t,e){t.transition(i)}),a.dataset.transition(i).draw(),e.each(a.data,function(t){t.draw()})},setHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},n=t._index,o=t._model;o.radius=i.hoverRadius?i.hoverRadius:e.getValueAtIndexOrDefault(a.pointHoverRadius,n,this.chart.options.elements.point.hoverRadius),o.backgroundColor=i.hoverBackgroundColor?i.hoverBackgroundColor:e.getValueAtIndexOrDefault(a.pointHoverBackgroundColor,n,e.getHoverColor(o.backgroundColor)),o.borderColor=i.hoverBorderColor?i.hoverBorderColor:e.getValueAtIndexOrDefault(a.pointHoverBorderColor,n,e.getHoverColor(o.borderColor)),o.borderWidth=i.hoverBorderWidth?i.hoverBorderWidth:e.getValueAtIndexOrDefault(a.pointHoverBorderWidth,n,o.borderWidth)},removeHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},n=t._index,o=t._model,r=this.chart.options.elements.point;o.radius=i.radius?i.radius:e.getValueAtIndexOrDefault(a.radius,n,r.radius),o.backgroundColor=i.backgroundColor?i.backgroundColor:e.getValueAtIndexOrDefault(a.pointBackgroundColor,n,r.backgroundColor),o.borderColor=i.borderColor?i.borderColor:e.getValueAtIndexOrDefault(a.pointBorderColor,n,r.borderColor),o.borderWidth=i.borderWidth?i.borderWidth:e.getValueAtIndexOrDefault(a.pointBorderWidth,n,r.borderWidth)}})}},{}],21:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.animation={duration:1e3,easing:"easeOutQuart",onProgress:e.noop,onComplete:e.noop},t.Animation=t.Element.extend({currentStep:null,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,a,i){var n=this;i||(t.animating=!0);for(var o=0;o1&&(a=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1);for(var i=0;it.animations[i].animationObject.numSteps&&(t.animations[i].animationObject.currentStep=t.animations[i].animationObject.numSteps),t.animations[i].animationObject.render(t.animations[i].chartInstance,t.animations[i].animationObject),t.animations[i].animationObject.onAnimationProgress&&t.animations[i].animationObject.onAnimationProgress.call&&t.animations[i].animationObject.onAnimationProgress.call(t.animations[i].chartInstance,t.animations[i]),t.animations[i].animationObject.currentStep===t.animations[i].animationObject.numSteps?(t.animations[i].animationObject.onAnimationComplete&&t.animations[i].animationObject.onAnimationComplete.call&&t.animations[i].animationObject.onAnimationComplete.call(t.animations[i].chartInstance,t.animations[i]),t.animations[i].chartInstance.animating=!1,t.animations.splice(i,1)):++i;var n=Date.now(),o=(n-e)/t.frameDuration;t.dropFrames+=o,t.animations.length>0&&t.requestAnimationFrame()}}}},{}],22:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.types={},t.instances={},t.controllers={},t.Controller=function(a){return this.chart=a,this.config=a.config,this.options=this.config.options=e.configMerge(t.defaults.global,t.defaults[this.config.type],this.config.options||{}),this.id=e.uid(),Object.defineProperty(this,"data",{get:function(){return this.config.data}}),t.instances[this.id]=this,this.options.responsive&&this.resize(!0),this.initialize(),this},e.extend(t.Controller.prototype,{initialize:function(){var e=this;return t.plugins.notify("beforeInit",[e]),e.bindEvents(),e.ensureScalesHaveIDs(),e.buildOrUpdateControllers(),e.buildScales(),e.updateLayout(),e.resetElements(),e.initToolTip(),e.update(),t.plugins.notify("afterInit",[e]),e},clear:function(){return e.clear(this.chart),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(a){var i=this,n=i.chart,o=n.canvas,r=e.getMaximumWidth(o),l=n.aspectRatio,s=i.options.maintainAspectRatio&&isNaN(l)===!1&&isFinite(l)&&0!==l?r/l:e.getMaximumHeight(o),d=n.width!==r||n.height!==s;if(!d)return i;o.width=n.width=r,o.height=n.height=s,e.retinaScale(n);var u={width:r,height:s};return t.plugins.notify("resize",[i,u]),i.options.onResize&&i.options.onResize(i,u),a||(i.stop(),i.update(i.options.responsiveAnimationDuration)),i},ensureScalesHaveIDs:function(){var t=this.options,a=t.scales||{},i=t.scale;e.each(a.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),e.each(a.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),i&&(i.id=i.id||"scale")},buildScales:function(){var a=this,i=a.options,n=a.scales={},o=[];i.scales&&(o=o.concat((i.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category"}}),(i.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear"}}))),i.scale&&o.push({options:i.scale,dtype:"radialLinear",isDefault:!0}),e.each(o,function(i,o){var r=i.options,l=e.getValueOrDefault(r.type,i.dtype),s=t.scaleService.getScaleConstructor(l);if(s){var d=new s({id:r.id,options:r,ctx:a.chart.ctx,chart:a});n[d.id]=d,i.isDefault&&(a.scale=d)}}),t.scaleService.addScalesToLayout(this)},updateLayout:function(){t.layoutService.update(this,this.chart.width,this.chart.height)},buildOrUpdateControllers:function(){var a=this,i=[],n=[];if(e.each(a.data.datasets,function(e,o){var r=a.getDatasetMeta(o);r.type||(r.type=e.type||a.config.type),i.push(r.type),r.controller?r.controller.updateIndex(o):(r.controller=new t.controllers[r.type](a,o),n.push(r.controller))},a),i.length>1)for(var o=1;oe;++e)i.getDatasetMeta(e).controller.update();t.plugins.notify("afterDatasetsUpdate",[i])}},render:function(a,i){var n=this;t.plugins.notify("beforeRender",[n]);var o=n.options.animation;if(o&&("undefined"!=typeof a&&0!==a||"undefined"==typeof a&&0!==o.duration)){var r=new t.Animation;r.numSteps=(a||o.duration)/16.66,r.easing=o.easing,r.render=function(t,a){var i=e.easingEffects[a.easing],n=a.currentStep/a.numSteps,o=i(n);t.draw(o,n,a.currentStep)},r.onAnimationProgress=o.onProgress,r.onAnimationComplete=o.onComplete,t.animationService.addAnimation(n,r,a,i)}else n.draw(),o&&o.onComplete&&o.onComplete.call&&o.onComplete.call(n);return n},draw:function(a){var i=this,n=a||1;i.clear(),t.plugins.notify("beforeDraw",[i,n]),e.each(i.boxes,function(t){t.draw(i.chartArea)},i),i.scale&&i.scale.draw(),t.plugins.notify("beforeDatasetsDraw",[i,n]),e.each(i.data.datasets,function(t,e){i.isDatasetVisible(e)&&i.getDatasetMeta(e).controller.draw(a)},i,!0),t.plugins.notify("afterDatasetsDraw",[i,n]),i.tooltip.transition(n).draw(),t.plugins.notify("afterDraw",[i,n])},getElementAtEvent:function(t){var a=this,i=e.getRelativePosition(t,a.chart),n=[];return e.each(a.data.datasets,function(t,o){if(a.isDatasetVisible(o)){var r=a.getDatasetMeta(o);e.each(r.data,function(t,e){return t.inRange(i.x,i.y)?(n.push(t),n):void 0})}}),n},getElementsAtEvent:function(t){var a=this,i=e.getRelativePosition(t,a.chart),n=[],o=function(){if(a.data.datasets)for(var t=0;t0&&(e=this.getDatasetMeta(e[0]._datasetIndex).data),e},getDatasetMeta:function(t){var e=this,a=e.data.datasets[t];a._meta||(a._meta={});var i=a._meta[e.id];return i||(i=a._meta[e.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,a=this.data.datasets.length;a>e;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroy:function(){var a=this;a.stop(),a.clear(),e.unbindEvents(a,a.events),e.removeResizeListener(a.chart.canvas.parentNode);var i=a.chart.canvas;i.width=a.chart.width,i.height=a.chart.height,void 0!==a.chart.originalDevicePixelRatio&&a.chart.ctx.scale(1/a.chart.originalDevicePixelRatio,1/a.chart.originalDevicePixelRatio),i.style.width=a.chart.originalCanvasStyleWidth,i.style.height=a.chart.originalCanvasStyleHeight,t.plugins.notify("destroy",[a]),delete t.instances[a.id]},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)},initToolTip:function(){var e=this;e.tooltip=new t.Tooltip({_chart:e.chart,_chartInstance:e,_data:e.data,_options:e.options.tooltips},e)},bindEvents:function(){var t=this;e.bindEvents(t,t.options.events,function(e){t.eventHandler(e)})},updateHoverStyle:function(t,e,a){var i,n,o,r=a?"setHoverStyle":"removeHoverStyle";switch(e){case"single":t=[t[0]];break;case"label":case"dataset":break;default:return}for(n=0,o=t.length;o>n;++n)i=t[n],i&&this.getDatasetMeta(i._datasetIndex).controller[r](i)},eventHandler:function(t){var a=this,i=a.tooltip,n=a.options||{},o=n.hover,r=n.tooltips;return a.lastActive=a.lastActive||[],a.lastTooltipActive=a.lastTooltipActive||[],"mouseout"===t.type?(a.active=[],a.tooltipActive=[]):(a.active=a.getElementsAtEventForMode(t,o.mode),a.tooltipActive=a.getElementsAtEventForMode(t,r.mode)),o.onHover&&o.onHover.call(a,a.active),("mouseup"===t.type||"click"===t.type)&&(n.onClick&&n.onClick.call(a,t,a.active),a.legend&&a.legend.handleEvent&&a.legend.handleEvent(t)),a.lastActive.length&&a.updateHoverStyle(a.lastActive,o.mode,!1),a.active.length&&o.mode&&a.updateHoverStyle(a.active,o.mode,!0),(r.enabled||r.custom)&&(i.initialize(),i._active=a.tooltipActive,i.update(!0)),i.pivot(),a.animating||e.arrayEquals(a.active,a.lastActive)&&e.arrayEquals(a.tooltipActive,a.lastTooltipActive)||(a.stop(),(r.enabled||r.custom)&&i.update(!0),a.render(o.animationDuration,!0)),a.lastActive=a.active,a.lastTooltipActive=a.tooltipActive,a}})}},{}],23:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=e.noop;t.DatasetController=function(t,e){this.initialize.call(this,t,e)},e.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var a=this;a.chart=t,a.index=e,a.linkScales(),a.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),a=t.getDataset();null===e.xAxisID&&(e.xAxisID=a.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=a.yAxisID||t.chart.options.scales.yAxes[0].id); +},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,a=e.dataElementType;return a&&new a({_chart:e.chart.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,a=this,i=a.getMeta(),n=a.getDataset().data||[],o=i.data;for(t=0,e=n.length;e>t;++t)o[t]=o[t]||a.createMetaData(i,t);i.dataset=i.dataset||a.createMetaDataset()},addElementAndReset:function(t){var e=this,a=e.createMetaData(t);e.getMeta().data.splice(t,0,a),e.updateElement(a,t,!0)},buildOrUpdateElements:function(){var t=this.getMeta(),e=t.data,a=this.getDataset().data.length,i=e.length;if(i>a)e.splice(a,i-a);else if(a>i)for(var n=i;a>n;++n)this.addElementAndReset(n)},update:a,draw:function(t){var a=t||1;e.each(this.getMeta().data,function(t,e){t.transition(a).draw()})},removeHoverStyle:function(t,a){var i=this.chart.data.datasets[t._datasetIndex],n=t._index,o=t.custom||{},r=e.getValueAtIndexOrDefault,l=(e.color,t._model);l.backgroundColor=o.backgroundColor?o.backgroundColor:r(i.backgroundColor,n,a.backgroundColor),l.borderColor=o.borderColor?o.borderColor:r(i.borderColor,n,a.borderColor),l.borderWidth=o.borderWidth?o.borderWidth:r(i.borderWidth,n,a.borderWidth)},setHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},o=e.getValueAtIndexOrDefault,r=(e.color,e.getHoverColor),l=t._model;l.backgroundColor=n.hoverBackgroundColor?n.hoverBackgroundColor:o(a.hoverBackgroundColor,i,r(l.backgroundColor)),l.borderColor=n.hoverBorderColor?n.hoverBorderColor:o(a.hoverBorderColor,i,r(l.borderColor)),l.borderWidth=n.hoverBorderWidth?n.hoverBorderWidth:o(a.hoverBorderWidth,i,l.borderWidth)}}),t.DatasetController.extend=e.inherits}},{}],24:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.elements={},t.Element=function(t){e.extend(this,t),this.initialize.apply(this,arguments)},e.extend(t.Element.prototype,{initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=e.clone(t._model)),t._start=e.clone(t._view),t},transition:function(t){var a=this;return a._view||(a._view=e.clone(a._model)),1===t?(a._view=a._model,a._start=null,a):(a._start||a.pivot(),e.each(a._model,function(i,n){if("_"===n[0]);else if(a._view.hasOwnProperty(n))if(i===a._view[n]);else if("string"==typeof i)try{var o=e.color(a._model[n]).mix(e.color(a._start[n]),t);a._view[n]=o.rgbString()}catch(r){a._view[n]=i}else if("number"==typeof i){var l=void 0!==a._start[n]&&isNaN(a._start[n])===!1?a._start[n]:0;a._view[n]=(a._model[n]-l)*t+l}else a._view[n]=i;else"number"!=typeof i||isNaN(a._view[n])?a._view[n]=i:a._view[n]=i*t},a),a)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return e.isNumber(this._model.x)&&e.isNumber(this._model.y)}}),t.Element.extend=e.inherits}},{}],25:[function(t,e,a){"use strict";var i=t(3);e.exports=function(t){function e(t,e,a){var i;return"string"==typeof t?(i=parseInt(t,10),-1!=t.indexOf("%")&&(i=i/100*e.parentNode[a])):i=t,i}function a(t){return void 0!==t&&null!==t&&"none"!==t}function n(t,i,n){var o=document.defaultView,r=t.parentNode,l=o.getComputedStyle(t)[i],s=o.getComputedStyle(r)[i],d=a(l),u=a(s),c=Number.POSITIVE_INFINITY;return d||u?Math.min(d?e(l,t,n):c,u?e(s,r,n):c):"none"}var o=t.helpers={};o.each=function(t,e,a,i){var n,r;if(o.isArray(t))if(r=t.length,i)for(n=r-1;n>=0;n--)e.call(a,t[n],n);else for(n=0;r>n;n++)e.call(a,t[n],n);else if("object"==typeof t){var l=Object.keys(t);for(r=l.length,n=0;r>n;n++)e.call(a,t[l[n]],l[n])}},o.clone=function(t){var e={};return o.each(t,function(t,a){o.isArray(t)?e[a]=t.slice(0):"object"==typeof t&&null!==t?e[a]=o.clone(t):e[a]=t}),e},o.extend=function(t){for(var e=function(e,a){t[a]=e},a=1,i=arguments.length;i>a;a++)o.each(arguments[a],e);return t},o.configMerge=function(e){var a=o.clone(e);return o.each(Array.prototype.slice.call(arguments,1),function(e){o.each(e,function(e,i){if("scales"===i)a[i]=o.scaleMerge(a.hasOwnProperty(i)?a[i]:{},e);else if("scale"===i)a[i]=o.configMerge(a.hasOwnProperty(i)?a[i]:{},t.scaleService.getScaleDefaults(e.type),e);else if(a.hasOwnProperty(i)&&o.isArray(a[i])&&o.isArray(e)){var n=a[i];o.each(e,function(t,e){e=i[a].length||!i[a][n].type?i[a].push(o.configMerge(l,e)):e.type&&e.type!==i[a][n].type?i[a][n]=o.configMerge(i[a][n],l,e):i[a][n]=o.configMerge(i[a][n],e)}):(i[a]=[],o.each(e,function(e){var n=o.getValueOrDefault(e.type,"xAxes"===a?"category":"linear");i[a].push(o.configMerge(t.scaleService.getScaleDefaults(n),e))})):i.hasOwnProperty(a)&&"object"==typeof i[a]&&null!==i[a]&&"object"==typeof e?i[a]=o.configMerge(i[a],e):i[a]=e}),i},o.getValueAtIndexOrDefault=function(t,e,a){return void 0===t||null===t?a:o.isArray(t)?ea;++a)if(t[a]===e)return a;return-1},o.where=function(t,e){if(o.isArray(t)&&Array.prototype.filter)return t.filter(e);var a=[];return o.each(t,function(t){e(t)&&a.push(t)}),a},o.findIndex=Array.prototype.findIndex?function(t,e,a){return t.findIndex(e,a)}:function(t,e,a){a=void 0===a?t:a;for(var i=0,n=t.length;n>i;++i)if(e.call(a,t[i],i,t))return i;return-1},o.findNextWhere=function(t,e,a){(void 0===a||null===a)&&(a=-1);for(var i=a+1;i=0;i--){var n=t[i];if(e(n))return n}},o.inherits=function(t){var e=this,a=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},i=function(){this.constructor=a};return i.prototype=e.prototype,a.prototype=new i,a.extend=o.inherits,t&&o.extend(a.prototype,t),a.__super__=e.prototype,a},o.noop=function(){},o.uid=function(){var t=0;return function(){return t++}}(),o.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.almostEquals=function(t,e,a){return Math.abs(t-e)0?1:-1},o.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},o.toRadians=function(t){return t*(Math.PI/180)},o.toDegrees=function(t){return t*(180/Math.PI)},o.getAngleFromPoint=function(t,e){var a=e.x-t.x,i=e.y-t.y,n=Math.sqrt(a*a+i*i),o=Math.atan2(i,a);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:n}},o.aliasPixel=function(t){return t%2===0?0:.5},o.splineCurve=function(t,e,a,i){var n=t.skip?e:t,o=e,r=a.skip?e:a,l=Math.sqrt(Math.pow(o.x-n.x,2)+Math.pow(o.y-n.y,2)),s=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),d=l/(l+s),u=s/(l+s);d=isNaN(d)?0:d,u=isNaN(u)?0:u;var c=i*d,h=i*u;return{previous:{x:o.x-c*(r.x-n.x),y:o.y-c*(r.y-n.y)},next:{x:o.x+h*(r.x-n.x),y:o.y+h*(r.y-n.y)}}},o.nextItem=function(t,e,a){return a?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},o.previousItem=function(t,e,a){return a?0>=e?t[t.length-1]:t[e-1]:0>=e?t[0]:t[e-1]},o.niceNum=function(t,e){var a,i=Math.floor(o.log10(t)),n=t/Math.pow(10,i);return a=e?1.5>n?1:3>n?2:7>n?5:10:1>=n?1:2>=n?2:5>=n?5:10,a*Math.pow(10,i)};var r=o.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,a=0,i=1;return 0===t?0:1===(t/=1)?1:(a||(a=.3),it?-.5*(i*Math.pow(2,10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/a)):i*Math.pow(2,-10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/a)*.5+1)},easeInBack:function(t){var e=1.70158;return 1*(t/=1)*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return 1*((t=t/1-1)*t*((e+1)*t+e)+1)},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?.5*(t*t*(((e*=1.525)+1)*t-e)):.5*((t-=2)*t*(((e*=1.525)+1)*t+e)+2)},easeInBounce:function(t){return 1-r.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?1*(7.5625*t*t):2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*r.easeInBounce(2*t):.5*r.easeOutBounce(2*t-1)+.5}};o.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),o.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),o.getRelativePosition=function(t,e){var a,i,n=t.originalEvent||t,r=t.currentTarget||t.srcElement,l=r.getBoundingClientRect(),s=n.touches;s&&s.length>0?(a=s[0].clientX,i=s[0].clientY):(a=n.clientX,i=n.clientY);var d=parseFloat(o.getStyle(r,"padding-left")),u=parseFloat(o.getStyle(r,"padding-top")),c=parseFloat(o.getStyle(r,"padding-right")),h=parseFloat(o.getStyle(r,"padding-bottom")),f=l.right-l.left-d-c,g=l.bottom-l.top-u-h;return a=Math.round((a-l.left-d)/f*r.width/e.currentDevicePixelRatio),i=Math.round((i-l.top-u)/g*r.height/e.currentDevicePixelRatio),{x:a,y:i}},o.addEvent=function(t,e,a){t.addEventListener?t.addEventListener(e,a):t.attachEvent?t.attachEvent("on"+e,a):t["on"+e]=a},o.removeEvent=function(t,e,a){t.removeEventListener?t.removeEventListener(e,a,!1):t.detachEvent?t.detachEvent("on"+e,a):t["on"+e]=o.noop},o.bindEvents=function(t,e,a){var i=t.events=t.events||{};o.each(e,function(e){i[e]=function(){a.apply(t,arguments)},o.addEvent(t.chart.canvas,e,i[e])})},o.unbindEvents=function(t,e){var a=t.chart.canvas;o.each(e,function(t,e){o.removeEvent(a,e,t)})},o.getConstraintWidth=function(t){return n(t,"max-width","clientWidth")},o.getConstraintHeight=function(t){return n(t,"max-height","clientHeight")},o.getMaximumWidth=function(t){var e=t.parentNode,a=parseInt(o.getStyle(e,"padding-left"))+parseInt(o.getStyle(e,"padding-right")),i=e.clientWidth-a,n=o.getConstraintWidth(t);return isNaN(n)?i:Math.min(i,n)},o.getMaximumHeight=function(t){var e=t.parentNode,a=parseInt(o.getStyle(e,"padding-top"))+parseInt(o.getStyle(e,"padding-bottom")),i=e.clientHeight-a,n=o.getConstraintHeight(t);return isNaN(n)?i:Math.min(i,n)},o.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},o.retinaScale=function(t){var e=t.ctx,a=t.canvas,i=a.width,n=a.height,o=t.currentDevicePixelRatio=window.devicePixelRatio||1;1!==o&&(a.height=n*o,a.width=i*o,e.scale(o,o),t.originalDevicePixelRatio=t.originalDevicePixelRatio||o),a.style.width=i+"px",a.style.height=n+"px"},o.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},o.fontString=function(t,e,a){return e+" "+t+"px "+a},o.longestText=function(t,e,a,i){i=i||{};var n=i.data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(n=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var l=0;o.each(a,function(e){void 0!==e&&null!==e&&o.isArray(e)!==!0?l=o.measureText(t,n,r,l,e):o.isArray(e)&&o.each(e,function(e){void 0===e||null===e||o.isArray(e)||(l=o.measureText(t,n,r,l,e))})});var s=r.length/2;if(s>a.length){for(var d=0;s>d;d++)delete n[r[d]];r.splice(0,s)}return l},o.measureText=function(t,e,a,i,n){var o=e[n];return o||(o=e[n]=t.measureText(n).width,a.push(n)),o>i&&(i=o),i},o.numberOfLabelLines=function(t){var e=1;return o.each(t,function(t){o.isArray(t)&&t.length>e&&(e=t.length)}),e},o.drawRoundedRectangle=function(t,e,a,i,n,o){t.beginPath(),t.moveTo(e+o,a),t.lineTo(e+i-o,a),t.quadraticCurveTo(e+i,a,e+i,a+o),t.lineTo(e+i,a+n-o),t.quadraticCurveTo(e+i,a+n,e+i-o,a+n),t.lineTo(e+o,a+n),t.quadraticCurveTo(e,a+n,e,a+n-o),t.lineTo(e,a+o),t.quadraticCurveTo(e,a,e+o,a),t.closePath()},o.color=function(e){return i?i(e instanceof CanvasGradient?t.defaults.global.defaultColor:e):(console.log("Color.js not found!"),e)},o.addResizeListener=function(t,e){var a=document.createElement("iframe"),i="chartjs-hidden-iframe";a.classlist?a.classlist.add(i):a.setAttribute("class",i);var n=a.style;n.width="100%",n.display="block",n.border=0,n.height=0,n.margin=0,n.position="absolute",n.left=0,n.right=0,n.top=0,n.bottom=0,t.insertBefore(a,t.firstChild),(a.contentWindow||a).onresize=function(){e&&e()}},o.removeResizeListener=function(t){var e=t.querySelector(".chartjs-hidden-iframe");e&&e.parentNode.removeChild(e)},o.isArray=Array.isArray?function(t){return Array.isArray(t)}:function(t){return"[object Array]"===Object.prototype.toString.call(t)},o.arrayEquals=function(t,e){var a,i,n,r;if(!t||!e||t.length!=e.length)return!1;for(a=0,i=t.length;i>a;++a)if(n=t[a],r=e[a],n instanceof Array&&r instanceof Array){if(!o.arrayEquals(n,r))return!1}else if(n!=r)return!1;return!0},o.callCallback=function(t,e,a){t&&"function"==typeof t.call&&t.apply(a,e)},o.getHoverColor=function(t){return t instanceof CanvasPattern?t:o.color(t).saturate(.5).darken(.1).rgbString()}}},{3:3}],26:[function(t,e,a){"use strict";e.exports=function(){var t=function(e,a){var i=this,n=t.helpers;return i.config=a,e.length&&e[0].getContext&&(e=e[0]),e.getContext&&(e=e.getContext("2d")),i.ctx=e,i.canvas=e.canvas,e.canvas.style.display=e.canvas.style.display||"block",i.width=e.canvas.width||parseInt(n.getStyle(e.canvas,"width"),10)||n.getMaximumWidth(e.canvas),i.height=e.canvas.height||parseInt(n.getStyle(e.canvas,"height"),10)||n.getMaximumHeight(e.canvas),i.aspectRatio=i.width/i.height,(isNaN(i.aspectRatio)||isFinite(i.aspectRatio)===!1)&&(i.aspectRatio=void 0!==a.aspectRatio?a.aspectRatio:2),i.originalCanvasStyleWidth=e.canvas.style.width,i.originalCanvasStyleHeight=e.canvas.style.height,n.retinaScale(i),a&&(i.controller=new t.Controller(i)),n.addResizeListener(e.canvas.parentNode,function(){i.controller&&i.controller.config.options.responsive&&i.controller.resize()}),i.controller?i.controller:i};return t.defaults={global:{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"single",animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},legendCallback:function(t){var e=[];e.push('
    ');for(var a=0;a'),t.data.datasets[a].label&&e.push(t.data.datasets[a].label),e.push("");return e.push("
"),e.join("")}}},t.Chart=t,t}},{}],27:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),t.boxes.push(e)},removeBox:function(t,e){t.boxes&&t.boxes.splice(t.boxes.indexOf(e),1)},update:function(t,a,i){function n(t){var e,a=t.isHorizontal();a?(e=t.update(t.options.fullWidth?p:k,y),S-=e.height):(e=t.update(x,v),k-=e.width),w.push({horizontal:a,minSize:e,box:t})}function o(t){var a=e.findNextWhere(w,function(e){return e.box===t});if(a)if(t.isHorizontal()){var i={left:C,right:M,top:0,bottom:0};t.update(t.options.fullWidth?p:k,m/2,i)}else t.update(a.minSize.width,S)}function r(t){var a=e.findNextWhere(w,function(e){return e.box===t}),i={left:0,right:0,top:D,bottom:A};a&&t.update(a.minSize.width,S,i)}function l(t){t.isHorizontal()?(t.left=t.options.fullWidth?s:C,t.right=t.options.fullWidth?a-s:C+k,t.top=P,t.bottom=P+t.height,P=t.bottom):(t.left=T,t.right=T+t.width,t.top=D,t.bottom=D+S,T=t.right)}if(t){var s=0,d=0,u=e.where(t.boxes,function(t){return"left"===t.options.position}),c=e.where(t.boxes,function(t){return"right"===t.options.position}),h=e.where(t.boxes,function(t){return"top"===t.options.position}),f=e.where(t.boxes,function(t){return"bottom"===t.options.position}),g=e.where(t.boxes,function(t){return"chartArea"===t.options.position});h.sort(function(t,e){return(e.options.fullWidth?1:0)-(t.options.fullWidth?1:0)}),f.sort(function(t,e){return(t.options.fullWidth?1:0)-(e.options.fullWidth?1:0)});var p=a-2*s,m=i-2*d,b=p/2,v=m/2,x=(a-b)/(u.length+c.length),y=(i-v)/(h.length+f.length),k=p,S=m,w=[];e.each(u.concat(c,h,f),n);var C=s,M=s,D=d,A=d;e.each(u.concat(c),o),e.each(u,function(t){C+=t.width}),e.each(c,function(t){M+=t.width}),e.each(h.concat(f),o),e.each(h,function(t){D+=t.height}),e.each(f,function(t){A+=t.height}),e.each(u.concat(c),r),C=s,M=s,D=d,A=d,e.each(u,function(t){C+=t.width}),e.each(c,function(t){M+=t.width}),e.each(h,function(t){D+=t.height}),e.each(f,function(t){A+=t.height});var I=i-D-A,F=a-C-M;(F!==k||I!==S)&&(e.each(u,function(t){t.height=I}),e.each(c,function(t){t.height=I}),e.each(h,function(t){t.options.fullWidth||(t.width=F)}),e.each(f,function(t){t.options.fullWidth||(t.width=F)}),S=I,k=F);var T=s,P=d;e.each(u.concat(h),l),T+=k,P+=S,e.each(c,l),e.each(f,l),t.chartArea={left:C,top:D,right:C+k,bottom:D+S},e.each(g,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(k,S)})}}}}},{}],28:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=e.noop;t.defaults.global.legend={display:!0,position:"top",fullWidth:!0,reverse:!1,onClick:function(t,e){var a=e.datasetIndex,i=this.chart,n=i.getDatasetMeta(a);n.hidden=null===n.hidden?!i.data.datasets[a].hidden:null,i.update()},labels:{boxWidth:40,padding:10,generateLabels:function(t){var a=t.data;return e.isArray(a.datasets)?a.datasets.map(function(a,i){return{text:a.label,fillStyle:e.isArray(a.backgroundColor)?a.backgroundColor[0]:a.backgroundColor,hidden:!t.isDatasetVisible(i),lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:a.borderWidth,strokeStyle:a.borderColor,datasetIndex:i}},this):[]}}},t.Legend=t.Element.extend({initialize:function(t){e.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:a,update:function(t,e,a){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=a,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:a,beforeSetDimensions:a,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:a,beforeBuildLabels:a,buildLabels:function(){var t=this;t.legendItems=t.options.labels.generateLabels.call(t,t.chart),t.options.reverse&&t.legendItems.reverse()},afterBuildLabels:a,beforeFit:a,fit:function(){var a=this,i=a.options,n=i.labels,o=i.display,r=a.ctx,l=t.defaults.global,s=e.getValueOrDefault,d=s(n.fontSize,l.defaultFontSize),u=s(n.fontStyle,l.defaultFontStyle),c=s(n.fontFamily,l.defaultFontFamily),h=e.fontString(d,u,c),f=a.legendHitBoxes=[],g=a.minSize,p=a.isHorizontal();if(p?(g.width=a.maxWidth,g.height=o?10:0):(g.width=o?10:0,g.height=a.maxHeight),o)if(r.font=h,p){var m=a.lineWidths=[0],b=a.legendItems.length?d+n.padding:0;r.textAlign="left",r.textBaseline="top",e.each(a.legendItems,function(t,e){var i=n.boxWidth+d/2+r.measureText(t.text).width;m[m.length-1]+i+n.padding>=a.width&&(b+=d+n.padding,m[m.length]=a.left),f[e]={left:0,top:0,width:i,height:d},m[m.length-1]+=i+n.padding}),g.height+=b}else{var v=n.padding,x=a.columnWidths=[],y=n.padding,k=0,S=0,w=d+v;e.each(a.legendItems,function(t,e){var a=n.boxWidth+d/2+r.measureText(t.text).width;S+w>g.height&&(y+=k+n.padding,x.push(k),k=0,S=0),k=Math.max(k,a),S+=w,f[e]={left:0,top:0,width:a,height:d}}),y+=k,x.push(k),g.width+=y}a.width=g.width,a.height=g.height},afterFit:a,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var a=this,i=a.options,n=i.labels,o=t.defaults.global,r=o.elements.line,l=a.width,s=(a.height,a.lineWidths);if(i.display){var d,u=a.ctx,c=e.getValueOrDefault,h=c(n.fontColor,o.defaultFontColor),f=c(n.fontSize,o.defaultFontSize),g=c(n.fontStyle,o.defaultFontStyle),p=c(n.fontFamily,o.defaultFontFamily),m=e.fontString(f,g,p);u.textAlign="left",u.textBaseline="top",u.lineWidth=.5,u.strokeStyle=h,u.fillStyle=h,u.font=m;var b=n.boxWidth,v=a.legendHitBoxes,x=function(t,e,a){u.save(),u.fillStyle=c(a.fillStyle,o.defaultColor),u.lineCap=c(a.lineCap,r.borderCapStyle),u.lineDashOffset=c(a.lineDashOffset,r.borderDashOffset),u.lineJoin=c(a.lineJoin,r.borderJoinStyle),u.lineWidth=c(a.lineWidth,r.borderWidth),u.strokeStyle=c(a.strokeStyle,o.defaultColor),u.setLineDash&&u.setLineDash(c(a.lineDash,r.borderDash)),u.strokeRect(t,e,b,f),u.fillRect(t,e,b,f),u.restore()},y=function(t,e,a,i){u.fillText(a.text,b+f/2+t,e),a.hidden&&(u.beginPath(),u.lineWidth=2,u.moveTo(b+f/2+t,e+f/2),u.lineTo(b+f/2+t+i,e+f/2),u.stroke())},k=a.isHorizontal();d=k?{x:a.left+(l-s[0])/2,y:a.top+n.padding,line:0}:{x:a.left+n.padding,y:a.top,line:0};var S=f+n.padding;e.each(a.legendItems,function(t,e){var i=u.measureText(t.text).width,o=b+f/2+i,r=d.x,c=d.y;k?r+o>=l&&(c=d.y+=f+n.padding,d.line++,r=d.x=a.left+(l-s[d.line])/2):c+S>a.bottom&&(r=d.x=r+a.columnWidths[d.line]+n.padding,c=d.y=a.top,d.line++),x(r,c,t),v[e].left=r,v[e].top=c,y(r,c,t,i),k?d.x+=o+n.padding:d.y+=S})}},handleEvent:function(t){var a=this,i=e.getRelativePosition(t,a.chart.chart),n=i.x,o=i.y,r=a.options;if(n>=a.left&&n<=a.right&&o>=a.top&&o<=a.bottom)for(var l=a.legendHitBoxes,s=0;s=d.left&&n<=d.left+d.width&&o>=d.top&&o<=d.top+d.height){r.onClick&&r.onClick.call(a,t,a.legendItems[s]);break}}}}),t.plugins.register({beforeInit:function(e){var a=e.options,i=a.legend;i&&(e.legend=new t.Legend({ctx:e.chart.ctx,options:i,chart:e}),t.layoutService.addBox(e,e.legend))}})}},{}],29:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers.noop;t.plugins={_plugins:[],register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){-1===e.indexOf(t)&&e.push(t)})},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var a=e.indexOf(t);-1!==a&&e.splice(a,1)})},clear:function(){this._plugins=[]},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e){var a,i,n=this._plugins,o=n.length;for(a=0;o>a;++a)if(i=n[a],"function"==typeof i[t]&&i[t].apply(i,e||[])===!1)return!1;return!0}},t.PluginBase=t.Element.extend({beforeInit:e,afterInit:e,beforeUpdate:e,afterUpdate:e,beforeDraw:e,afterDraw:e,destroy:e}),t.pluginService=t.plugins}},{}],30:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.scale={display:!0,position:"left",gridLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",offsetGridLines:!1},scaleLabel:{labelString:"",display:!1},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:10,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:function(t){return e.isArray(t)?t:""+t}}},t.Scale=t.Element.extend({beforeUpdate:function(){e.callCallback(this.options.beforeUpdate,[this])},update:function(t,a,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=a,n.margins=e.extend({left:0,right:0,top:0,bottom:0},i),n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeDataLimits(),n.determineDataLimits(),n.afterDataLimits(),n.beforeBuildTicks(),n.buildTicks(),n.afterBuildTicks(),n.beforeTickToLabelConversion(),n.convertTicksToLabels(),n.afterTickToLabelConversion(),n.beforeCalculateTickRotation(),n.calculateTickRotation(),n.afterCalculateTickRotation(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:function(){e.callCallback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){e.callCallback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){e.callCallback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){e.callCallback(this.options.beforeDataLimits,[this])},determineDataLimits:e.noop,afterDataLimits:function(){e.callCallback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){e.callCallback(this.options.beforeBuildTicks,[this])},buildTicks:e.noop,afterBuildTicks:function(){e.callCallback(this.options.afterBuildTicks,[this])},beforeTickToLabelConversion:function(){e.callCallback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this;t.ticks=t.ticks.map(function(e,a,i){return t.options.ticks.userCallback?t.options.ticks.userCallback(e,a,i):t.options.ticks.callback(e,a,i)},t)},afterTickToLabelConversion:function(){e.callCallback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){e.callCallback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var a=this,i=a.ctx,n=t.defaults.global,o=a.options.ticks,r=e.getValueOrDefault(o.fontSize,n.defaultFontSize),l=e.getValueOrDefault(o.fontStyle,n.defaultFontStyle),s=e.getValueOrDefault(o.fontFamily,n.defaultFontFamily),d=e.fontString(r,l,s);i.font=d;var u,c=i.measureText(a.ticks[0]).width,h=i.measureText(a.ticks[a.ticks.length-1]).width;if(a.labelRotation=o.minRotation||0,a.paddingRight=0,a.paddingLeft=0,a.options.display&&a.isHorizontal()){a.paddingRight=h/2+3,a.paddingLeft=c/2+3,a.longestTextCache||(a.longestTextCache={});for(var f,g,p=e.longestText(i,d,a.ticks,a.longestTextCache),m=p,b=a.getPixelForTick(1)-a.getPixelForTick(0)-6;m>b&&a.labelRotationa.yLabelWidth&&(a.paddingLeft=u+r/2),a.paddingRight=r/2,g*p>a.maxHeight){a.labelRotation--;break}a.labelRotation++,m=f*p}}a.margins&&(a.paddingLeft=Math.max(a.paddingLeft-a.margins.left,0),a.paddingRight=Math.max(a.paddingRight-a.margins.right,0))},afterCalculateTickRotation:function(){e.callCallback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){e.callCallback(this.options.beforeFit,[this])},fit:function(){var a=this,i=a.minSize={width:0,height:0},n=a.options,o=t.defaults.global,r=n.ticks,l=n.scaleLabel,s=n.display,d=a.isHorizontal(),u=e.getValueOrDefault(r.fontSize,o.defaultFontSize),c=e.getValueOrDefault(r.fontStyle,o.defaultFontStyle),h=e.getValueOrDefault(r.fontFamily,o.defaultFontFamily),f=e.fontString(u,c,h),g=e.getValueOrDefault(l.fontSize,o.defaultFontSize),p=e.getValueOrDefault(l.fontStyle,o.defaultFontStyle),m=e.getValueOrDefault(l.fontFamily,o.defaultFontFamily),b=(e.fontString(g,p,m),n.gridLines.tickMarkLength);if(d?i.width=a.isFullWidth()?a.maxWidth-a.margins.left-a.margins.right:a.maxWidth:i.width=s?b:0,d?i.height=s?b:0:i.height=a.maxHeight,l.display&&s&&(d?i.height+=1.5*g:i.width+=1.5*g),r.display&&s){a.longestTextCache||(a.longestTextCache={});var v=e.longestText(a.ctx,f,a.ticks,a.longestTextCache),x=e.numberOfLabelLines(a.ticks),y=.5*u;if(d){a.longestLabelWidth=v;var k=Math.sin(e.toRadians(a.labelRotation))*a.longestLabelWidth+u*x+y*x;i.height=Math.min(a.maxHeight,i.height+k),a.ctx.font=f;var S=a.ctx.measureText(a.ticks[0]).width,w=a.ctx.measureText(a.ticks[a.ticks.length-1]).width,C=Math.cos(e.toRadians(a.labelRotation)),M=Math.sin(e.toRadians(a.labelRotation));a.paddingLeft=0!==a.labelRotation?C*S+3:S/2+3,a.paddingRight=0!==a.labelRotation?M*(u/2)+3:w/2+3}else{var D=a.maxWidth-i.width,A=r.mirror;A?v=0:v+=a.options.ticks.padding,D>v?i.width+=v:i.width=a.maxWidth,a.paddingTop=u/2,a.paddingBottom=u/2}}a.margins&&(a.paddingLeft=Math.max(a.paddingLeft-a.margins.left,0),a.paddingTop=Math.max(a.paddingTop-a.margins.top,0),a.paddingRight=Math.max(a.paddingRight-a.margins.right,0),a.paddingBottom=Math.max(a.paddingBottom-a.margins.bottom,0)),a.width=i.width,a.height=i.height},afterFit:function(){e.callCallback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function a(t){return null===t||"undefined"==typeof t?NaN:"number"==typeof t&&isNaN(t)?NaN:"object"==typeof t?t instanceof Date||t.isValid?t:a(this.isHorizontal()?t.x:t.y):t},getLabelForIndex:e.noop,getPixelForValue:e.noop,getValueForPixel:e.noop,getPixelForTick:function(t,e){var a=this;if(a.isHorizontal()){var i=a.width-(a.paddingLeft+a.paddingRight),n=i/Math.max(a.ticks.length-(a.options.gridLines.offsetGridLines?0:1),1),o=n*t+a.paddingLeft;e&&(o+=n/2);var r=a.left+Math.round(o);return r+=a.isFullWidth()?a.margins.left:0}var l=a.height-(a.paddingTop+a.paddingBottom);return a.top+t*(l/(a.ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var a=e.width-(e.paddingLeft+e.paddingRight),i=a*t+e.paddingLeft,n=e.left+Math.round(i);return n+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){var t=this,e=t.min,a=t.max;return t.getPixelForValue(t.beginAtZero?0:0>e&&0>a?a:e>0&&a>0?e:0)},draw:function(a){var i=this,n=i.options;if(n.display){ +var o,r,l=i.ctx,s=t.defaults.global,d=n.ticks,u=n.gridLines,c=n.scaleLabel,h=0!==i.labelRotation,f=d.autoSkip,g=i.isHorizontal();d.maxTicksLimit&&(r=d.maxTicksLimit);var p=e.getValueOrDefault(d.fontColor,s.defaultFontColor),m=e.getValueOrDefault(d.fontSize,s.defaultFontSize),b=e.getValueOrDefault(d.fontStyle,s.defaultFontStyle),v=e.getValueOrDefault(d.fontFamily,s.defaultFontFamily),x=e.fontString(m,b,v),y=u.tickMarkLength,k=e.getValueOrDefault(c.fontColor,s.defaultFontColor),S=e.getValueOrDefault(c.fontSize,s.defaultFontSize),w=e.getValueOrDefault(c.fontStyle,s.defaultFontStyle),C=e.getValueOrDefault(c.fontFamily,s.defaultFontFamily),M=e.fontString(S,w,C),D=e.toRadians(i.labelRotation),A=Math.cos(D),I=(Math.sin(D),i.longestLabelWidth*A);l.fillStyle=p;var F=[];if(g){if(o=!1,h&&(I/=2),(I+d.autoSkipPadding)*i.ticks.length>i.width-(i.paddingLeft+i.paddingRight)&&(o=1+Math.floor((I+d.autoSkipPadding)*i.ticks.length/(i.width-(i.paddingLeft+i.paddingRight)))),r&&i.ticks.length>r)for(;!o||i.ticks.length/(o||1)>r;)o||(o=1),o+=1;f||(o=!1)}var T="right"===n.position?i.left:i.right-y,P="right"===n.position?i.left+y:i.right,_="bottom"===n.position?i.top:i.bottom-y,R="bottom"===n.position?i.top+y:i.bottom;if(e.each(i.ticks,function(t,r){if(void 0!==t&&null!==t){var l=i.ticks.length===r+1,s=o>1&&r%o>0||r%o===0&&r+o>=i.ticks.length;if((!s||l)&&void 0!==t&&null!==t){var c,f;r===("undefined"!=typeof i.zeroLineIndex?i.zeroLineIndex:0)?(c=u.zeroLineWidth,f=u.zeroLineColor):(c=e.getValueAtIndexOrDefault(u.lineWidth,r),f=e.getValueAtIndexOrDefault(u.color,r));var p,m,b,v,x,k,S,w,C,M,A,I="middle";if(g){h||(I="top"===n.position?"bottom":"top"),A=h?"right":"center";var V=i.getPixelForTick(r)+e.aliasPixel(c);C=i.getPixelForTick(r,u.offsetGridLines)+d.labelOffset,M=h?i.top+12:"top"===n.position?i.bottom-y:i.top+y,p=b=x=S=V,m=_,v=R,k=a.top,w=a.bottom}else{"left"===n.position?d.mirror?(C=i.right+d.padding,A="left"):(C=i.right-d.padding,A="right"):d.mirror?(C=i.left-d.padding,A="right"):(C=i.left+d.padding,A="left");var O=i.getPixelForTick(r);O+=e.aliasPixel(c),M=i.getPixelForTick(r,u.offsetGridLines),p=T,b=P,x=a.left,S=a.right,m=v=k=w=O}F.push({tx1:p,ty1:m,tx2:b,ty2:v,x1:x,y1:k,x2:S,y2:w,labelX:C,labelY:M,glWidth:c,glColor:f,rotation:-1*D,label:t,textBaseline:I,textAlign:A})}}}),e.each(F,function(t){if(u.display&&(l.lineWidth=t.glWidth,l.strokeStyle=t.glColor,l.beginPath(),u.drawTicks&&(l.moveTo(t.tx1,t.ty1),l.lineTo(t.tx2,t.ty2)),u.drawOnChartArea&&(l.moveTo(t.x1,t.y1),l.lineTo(t.x2,t.y2)),l.stroke()),d.display){l.save(),l.translate(t.labelX,t.labelY),l.rotate(t.rotation),l.font=x,l.textBaseline=t.textBaseline,l.textAlign=t.textAlign;var a=t.label;if(e.isArray(a))for(var i=0,n=0;ie;++e){var o=t[e];if(o&&o.hasValue()){var r=o.tooltipPosition();i.push(r.x),n.push(r.y)}}var l=0,s=0;for(e=0,a-i.length;a>e;++e)l+=i[e],s+=n[e];return{x:Math.round(l/i.length),y:Math.round(s/i.length)}}function i(t){var e=t._xScale,a=t._yScale||t._scale,i=t._index,n=t._datasetIndex;return{xLabel:e?e.getLabelForIndex(i,n):"",yLabel:a?a.getLabelForIndex(i,n):"",index:i,datasetIndex:n}}var n=t.helpers;t.defaults.global.tooltips={enabled:!0,custom:null,mode:"single",backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,yAlign:"center",xAlign:"center",caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",callbacks:{beforeTitle:n.noop,title:function(t,e){var a="",i=e.labels,n=i?i.length:0;if(t.length>0){var o=t[0];o.xLabel?a=o.xLabel:n>0&&o.indexe;++e)g.push(i(d[e]));l.itemSort&&(g=g.sort(l.itemSort)),d.length>1&&n.each(g,function(t){h.push(l.callbacks.labelColor.call(r,t,c))}),n.extend(s,{title:r.getTitle(g,u),beforeBody:r.getBeforeBody(g,u),body:r.getBody(g,u),afterBody:r.getAfterBody(g,u),footer:r.getFooter(g,u),x:Math.round(f.x),y:Math.round(f.y),caretPadding:n.getValueOrDefault(f.padding,2),labelColors:h});var p=r.getTooltipSize(s);r.determineAlignment(p),n.extend(s,r.getBackgroundPoint(s,p))}else r._model.opacity=0;return t&&l.custom&&l.custom.call(r,s),r},getTooltipSize:function(t){var e=this._chart.ctx,a={height:2*t.yPadding,width:0},i=t.body,o=i.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);o+=t.beforeBody.length+t.afterBody.length;var r=t.title.length,l=t.footer.length,s=t.titleFontSize,d=t.bodyFontSize,u=t.footerFontSize;a.height+=r*s,a.height+=(r-1)*t.titleSpacing,a.height+=r?t.titleMarginBottom:0,a.height+=o*d,a.height+=o?(o-1)*t.bodySpacing:0,a.height+=l?t.footerMarginTop:0,a.height+=l*u,a.height+=l?(l-1)*t.footerSpacing:0;var c=0,h=function(t){a.width=Math.max(a.width,e.measureText(t).width+c)};return e.font=n.fontString(s,t._titleFontStyle,t._titleFontFamily),n.each(t.title,h),e.font=n.fontString(d,t._bodyFontStyle,t._bodyFontFamily),n.each(t.beforeBody.concat(t.afterBody),h),c=i.length>1?d+2:0,n.each(i,function(t){n.each(t.before,h),n.each(t.lines,h),n.each(t.after,h)}),c=0,e.font=n.fontString(u,t._footerFontStyle,t._footerFontFamily),n.each(t.footer,h),a.width+=2*t.xPadding,a},determineAlignment:function(t){var e=this,a=e._model,i=e._chart,n=e._chartInstance.chartArea;a.yi.height-t.height&&(a.yAlign="bottom");var o,r,l,s,d,u=(n.left+n.right)/2,c=(n.top+n.bottom)/2;"center"===a.yAlign?(o=function(t){return u>=t},r=function(t){return t>u}):(o=function(e){return e<=t.width/2},r=function(e){return e>=i.width-t.width/2}),l=function(e){return e+t.width>i.width},s=function(e){return e-t.width<0},d=function(t){return c>=t?"top":"bottom"},o(a.x)?(a.xAlign="left",l(a.x)&&(a.xAlign="center",a.yAlign=d(a.y))):r(a.x)&&(a.xAlign="right",s(a.x)&&(a.xAlign="center",a.yAlign=d(a.y)))},getBackgroundPoint:function(t,e){var a={x:t.x,y:t.y},i=t.caretSize,n=t.caretPadding,o=t.cornerRadius,r=t.xAlign,l=t.yAlign,s=i+n,d=o+n;return"right"===r?a.x-=e.width:"center"===r&&(a.x-=e.width/2),"top"===l?a.y+=s:"bottom"===l?a.y-=e.height+s:a.y-=e.height/2,"center"===l?"left"===r?a.x+=s:"right"===r&&(a.x-=s):"left"===r?a.x-=d:"right"===r&&(a.x+=d),a},drawCaret:function(t,e,a,i){var o,r,l,s,d,u,c=this._view,h=this._chart.ctx,f=c.caretSize,g=c.cornerRadius,p=c.xAlign,m=c.yAlign,b=t.x,v=t.y,x=e.width,y=e.height;"center"===m?("left"===p?(o=b,r=o-f,l=o):(o=b+x,r=o+f,l=o),d=v+y/2,s=d-f,u=d+f):("left"===p?(o=b+g,r=o+f,l=r+f):"right"===p?(o=b+x-g,r=o-f,l=r-f):(r=b+x/2,o=r-f,l=r+f),"top"===m?(s=v,d=s-f,u=s):(s=v+y,d=s+f,u=s));var k=n.color(c.backgroundColor);h.fillStyle=k.alpha(a*k.alpha()).rgbString(),h.beginPath(),h.moveTo(o,s),h.lineTo(r,d),h.lineTo(l,u),h.closePath(),h.fill()},drawTitle:function(t,e,a,i){var o=e.title;if(o.length){a.textAlign=e._titleAlign,a.textBaseline="top";var r=e.titleFontSize,l=e.titleSpacing,s=n.color(e.titleFontColor);a.fillStyle=s.alpha(i*s.alpha()).rgbString(),a.font=n.fontString(r,e._titleFontStyle,e._titleFontFamily);var d,u;for(d=0,u=o.length;u>d;++d)a.fillText(o[d],t.x,t.y),t.y+=r+l,d+1===o.length&&(t.y+=e.titleMarginBottom-l)}},drawBody:function(t,e,a,i){var o=e.bodyFontSize,r=e.bodySpacing,l=e.body;a.textAlign=e._bodyAlign,a.textBaseline="top";var s=n.color(e.bodyFontColor),d=s.alpha(i*s.alpha()).rgbString();a.fillStyle=d,a.font=n.fontString(o,e._bodyFontStyle,e._bodyFontFamily);var u=0,c=function(e){a.fillText(e,t.x+u,t.y),t.y+=o+r};n.each(e.beforeBody,c);var h=l.length>1;u=h?o+2:0,n.each(l,function(r,l){n.each(r.before,c),n.each(r.lines,function(r){h&&(a.fillStyle=n.color(e.legendColorBackground).alpha(i).rgbaString(),a.fillRect(t.x,t.y,o,o),a.strokeStyle=n.color(e.labelColors[l].borderColor).alpha(i).rgbaString(),a.strokeRect(t.x,t.y,o,o),a.fillStyle=n.color(e.labelColors[l].backgroundColor).alpha(i).rgbaString(),a.fillRect(t.x+1,t.y+1,o-2,o-2),a.fillStyle=d),c(r)}),n.each(r.after,c)}),u=0,n.each(e.afterBody,c),t.y-=r},drawFooter:function(t,e,a,i){var o=e.footer;if(o.length){t.y+=e.footerMarginTop,a.textAlign=e._footerAlign,a.textBaseline="top";var r=n.color(e.footerFontColor);a.fillStyle=r.alpha(i*r.alpha()).rgbString(),a.font=n.fontString(e.footerFontSize,e._footerFontStyle,e._footerFontFamily),n.each(o,function(i){a.fillText(i,t.x,t.y),t.y+=e.footerFontSize+e.footerSpacing})}},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var a=this.getTooltipSize(e),i={x:e.x,y:e.y},o=Math.abs(e.opacity<.001)?0:e.opacity;if(this._options.enabled){var r=n.color(e.backgroundColor);t.fillStyle=r.alpha(o*r.alpha()).rgbString(),n.drawRoundedRectangle(t,i.x,i.y,a.width,a.height,e.cornerRadius),t.fill(),this.drawCaret(i,a,o,e.caretPadding),i.x+=e.xPadding,i.y+=e.yPadding,this.drawTitle(i,e,t,o),this.drawBody(i,e,t,o),this.drawFooter(i,e,t,o)}}}})}},{}],34:[function(t,e,a){"use strict";e.exports=function(t,e){var a=t.helpers,i=t.defaults.global;i.elements.arc={backgroundColor:i.defaultColor,borderColor:"#fff",borderWidth:2},t.elements.Arc=t.Element.extend({inLabelRange:function(t){var e=this._view;return e?Math.pow(t-e.x,2)s;)s+=2*Math.PI;for(;o>s;)o-=2*Math.PI;for(;l>o;)o+=2*Math.PI;var d=o>=l&&s>=o,u=r>=i.innerRadius&&r<=i.outerRadius;return d&&u}return!1},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,a=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*a,y:t.y+Math.sin(e)*a}},draw:function(){var t=this._chart.ctx,e=this._view,a=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,a,i),t.arc(e.x,e.y,e.innerRadius,i,a,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})}},{}],35:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=t.defaults.global;t.defaults.global.elements.line={tension:.4,backgroundColor:a.defaultColor,borderWidth:3,borderColor:a.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",fill:!0},t.elements.Line=t.Element.extend({lineToNextPoint:function(t,e,a,i,n){var o=this,r=o._chart.ctx,l=o._view?o._view.spanGaps:!1;e._view.skip&&!l?i.call(o,t,e,a):t._view.skip&&!l?n.call(o,t,e,a):0===e._view.tension?r.lineTo(e._view.x,e._view.y):r.bezierCurveTo(t._view.controlPointNextX,t._view.controlPointNextY,e._view.controlPointPreviousX,e._view.controlPointPreviousY,e._view.x,e._view.y)},draw:function(){function t(t){r._view.skip||l._view.skip?t&&o.lineTo(i._view.scaleZero.x,i._view.scaleZero.y):o.bezierCurveTo(l._view.controlPointNextX,l._view.controlPointNextY,r._view.controlPointPreviousX,r._view.controlPointPreviousY,r._view.x,r._view.y)}var i=this,n=i._view,o=i._chart.ctx,r=i._children[0],l=i._children[i._children.length-1];o.save(),i._children.length>0&&n.fill&&(o.beginPath(),e.each(i._children,function(t,a){var r=e.previousItem(i._children,a),l=e.nextItem(i._children,a);0===a?(i._loop?o.moveTo(n.scaleZero.x,n.scaleZero.y):o.moveTo(t._view.x,n.scaleZero),t._view.skip?i._loop||o.moveTo(l._view.x,i._view.scaleZero):o.lineTo(t._view.x,t._view.y)):i.lineToNextPoint(r,t,l,function(t,e,a){i._loop?o.lineTo(i._view.scaleZero.x,i._view.scaleZero.y):(o.lineTo(t._view.x,i._view.scaleZero),o.moveTo(a._view.x,i._view.scaleZero))},function(t,e){o.lineTo(e._view.x,e._view.y)})},i),i._loop?t(!0):(o.lineTo(i._children[i._children.length-1]._view.x,n.scaleZero),o.lineTo(i._children[0]._view.x,n.scaleZero)),o.fillStyle=n.backgroundColor||a.defaultColor,o.closePath(),o.fill());var s=a.elements.line;o.lineCap=n.borderCapStyle||s.borderCapStyle,o.setLineDash&&o.setLineDash(n.borderDash||s.borderDash),o.lineDashOffset=n.borderDashOffset||s.borderDashOffset,o.lineJoin=n.borderJoinStyle||s.borderJoinStyle,o.lineWidth=n.borderWidth||s.borderWidth,o.strokeStyle=n.borderColor||a.defaultColor,o.beginPath(),e.each(i._children,function(t,a){var n=e.previousItem(i._children,a),r=e.nextItem(i._children,a);0===a?o.moveTo(t._view.x,t._view.y):i.lineToNextPoint(n,t,r,function(t,e,a){o.moveTo(a._view.x,a._view.y)},function(t,e){o.moveTo(e._view.x,e._view.y)})},i),i._loop&&i._children.length>0&&t(),o.stroke(),o.restore()}})}},{}],36:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=t.defaults.global,i=a.defaultColor;a.elements.point={radius:3,pointStyle:"circle",backgroundColor:i,borderWidth:1,borderColor:i,hitRadius:1,hoverRadius:4,hoverBorderWidth:1},t.elements.Point=t.Element.extend({inRange:function(t,e){var a=this._view;return a?Math.pow(t-a.x,2)+Math.pow(e-a.y,2)=h)){switch(u.strokeStyle=d.borderColor||i,u.lineWidth=e.getValueOrDefault(d.borderWidth,a.elements.point.borderWidth),u.fillStyle=d.backgroundColor||i,c){default:u.beginPath(),u.arc(f,g,h,0,2*Math.PI),u.closePath(),u.fill();break;case"triangle":u.beginPath(),n=3*h/Math.sqrt(3),l=n*Math.sqrt(3)/2,u.moveTo(f-n/2,g+l/3),u.lineTo(f+n/2,g+l/3),u.lineTo(f,g-2*l/3),u.closePath(),u.fill();break;case"rect":s=1/Math.SQRT2*h,u.fillRect(f-s,g-s,2*s,2*s),u.strokeRect(f-s,g-s,2*s,2*s);break;case"rectRot":s=1/Math.SQRT2*h,u.beginPath(),u.moveTo(f-s,g),u.lineTo(f,g+s),u.lineTo(f+s,g),u.lineTo(f,g-s),u.closePath(),u.fill();break;case"cross":u.beginPath(),u.moveTo(f,g+h),u.lineTo(f,g-h),u.moveTo(f-h,g),u.lineTo(f+h,g),u.closePath();break;case"crossRot":u.beginPath(),o=Math.cos(Math.PI/4)*h,r=Math.sin(Math.PI/4)*h,u.moveTo(f-o,g-r),u.lineTo(f+o,g+r),u.moveTo(f-o,g+r),u.lineTo(f+o,g-r),u.closePath();break;case"star":u.beginPath(),u.moveTo(f,g+h),u.lineTo(f,g-h),u.moveTo(f-h,g),u.lineTo(f+h,g),o=Math.cos(Math.PI/4)*h,r=Math.sin(Math.PI/4)*h,u.moveTo(f-o,g-r),u.lineTo(f+o,g+r),u.moveTo(f-o,g+r),u.lineTo(f+o,g-r),u.closePath();break;case"line":u.beginPath(),u.moveTo(f-h,g),u.lineTo(f+h,g),u.closePath();break;case"dash":u.beginPath(),u.moveTo(f,g),u.lineTo(f+h,g),u.closePath()}u.stroke()}}}})}},{}],37:[function(t,e,a){"use strict";e.exports=function(t){var e=(t.helpers,t.defaults.global);e.elements.rectangle={backgroundColor:e.defaultColor,borderWidth:0,borderColor:e.defaultColor,borderSkipped:"bottom"},t.elements.Rectangle=t.Element.extend({draw:function(){function t(t){return s[(u+t)%4]}var e=this._chart.ctx,a=this._view,i=a.width/2,n=a.x-i,o=a.x+i,r=a.base-(a.base-a.y),l=a.borderWidth/2;a.borderWidth&&(n+=l,o-=l,r+=l),e.beginPath(),e.fillStyle=a.backgroundColor,e.strokeStyle=a.borderColor,e.lineWidth=a.borderWidth;var s=[[n,a.base],[n,r],[o,r],[o,a.base]],d=["bottom","left","top","right"],u=d.indexOf(a.borderSkipped,0);-1===u&&(u=0),e.moveTo.apply(e,t(0));for(var c=1;4>c;c++)e.lineTo.apply(e,t(c));e.fill(),a.borderWidth&&e.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var a=this._view;return a?a.y=a.x-a.width/2&&t<=a.x+a.width/2&&e>=a.y&&e<=a.base:t>=a.x-a.width/2&&t<=a.x+a.width/2&&e>=a.base&&e<=a.y:!1},inLabelRange:function(t){var e=this._view;return e?t>=e.x-e.width/2&&t<=e.x+e.width/2:!1},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})}},{}],38:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a={position:"bottom"},i=t.Scale.extend({determineDataLimits:function(){var t=this;t.minIndex=0,t.maxIndex=t.chart.data.labels.length-1;var a;void 0!==t.options.ticks.min&&(a=e.indexOf(t.chart.data.labels,t.options.ticks.min),t.minIndex=-1!==a?a:t.minIndex),void 0!==t.options.ticks.max&&(a=e.indexOf(t.chart.data.labels,t.options.ticks.max),t.maxIndex=-1!==a?a:t.maxIndex),t.min=t.chart.data.labels[t.minIndex],t.max=t.chart.data.labels[t.maxIndex]},buildTicks:function(t){var e=this;e.ticks=0===e.minIndex&&e.maxIndex===e.chart.data.labels.length-1?e.chart.data.labels:e.chart.data.labels.slice(e.minIndex,e.maxIndex+1)},getLabelForIndex:function(t,e){return this.ticks[t]},getPixelForValue:function(t,e,a,i){var n=this,o=Math.max(n.maxIndex+1-n.minIndex-(n.options.gridLines.offsetGridLines?0:1),1);if(n.isHorizontal()){var r=n.width-(n.paddingLeft+n.paddingRight),l=r/o,s=l*(e-n.minIndex)+n.paddingLeft;return n.options.gridLines.offsetGridLines&&i&&(s+=l/2),n.left+Math.round(s)}var d=n.height-(n.paddingTop+n.paddingBottom),u=d/o,c=u*(e-n.minIndex)+n.paddingTop;return n.options.gridLines.offsetGridLines&&i&&(c+=u/2),n.top+Math.round(c)},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null,e)},getValueForPixel:function(t){var e,a=this,i=Math.max(a.ticks.length-(a.options.gridLines.offsetGridLines?0:1),1),n=a.isHorizontal(),o=n?a.width-(a.paddingLeft+a.paddingRight):a.height-(a.paddingTop+a.paddingBottom),r=o/i;return a.options.gridLines.offsetGridLines&&(t-=r/2),t-=n?a.paddingLeft:a.paddingTop,e=0>=t?0:Math.round(t/r)}});t.scaleService.registerScaleType("category",i,a)}},{}],39:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a={position:"left",ticks:{callback:function(t,a,i){var n=i.length>3?i[2]-i[1]:i[1]-i[0];Math.abs(n)>1&&t!==Math.floor(t)&&(n=t-Math.floor(t));var o=e.log10(Math.abs(n)),r="";if(0!==t){var l=-1*Math.floor(o);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r}}},i=t.LinearScaleBase.extend({determineDataLimits:function(){function t(t){return l?t.xAxisID===a.id:t.yAxisID===a.id}var a=this,i=a.options,n=(i.ticks,a.chart),o=n.data,r=o.datasets,l=a.isHorizontal();if(a.min=null,a.max=null,i.stacked){var s={},d=!1,u=!1;e.each(r,function(o,r){var l=n.getDatasetMeta(r);void 0===s[l.type]&&(s[l.type]={positiveValues:[],negativeValues:[]});var c=s[l.type].positiveValues,h=s[l.type].negativeValues;n.isDatasetVisible(r)&&t(l)&&e.each(o.data,function(t,e){var n=+a.getRightValue(t);isNaN(n)||l.data[e].hidden||(c[e]=c[e]||0,h[e]=h[e]||0,i.relativePoints?c[e]=100:0>n?(u=!0,h[e]+=n):(d=!0,c[e]+=n))})}),e.each(s,function(t){var i=t.positiveValues.concat(t.negativeValues),n=e.min(i),o=e.max(i);a.min=null===a.min?n:Math.min(a.min,n),a.max=null===a.max?o:Math.max(a.max,o)})}else e.each(r,function(i,o){var r=n.getDatasetMeta(o);n.isDatasetVisible(o)&&t(r)&&e.each(i.data,function(t,e){var i=+a.getRightValue(t);isNaN(i)||r.data[e].hidden||(null===a.min?a.min=i:ia.max&&(a.max=i))})});this.handleTickRangeOptions()},getTickLimit:function(){var a,i=this,n=i.options.ticks;if(i.isHorizontal())a=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(i.width/50));else{var o=e.getValueOrDefault(n.fontSize,t.defaults.global.defaultFontSize);a=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(i.height/(2*o)))}return a},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t,e,a,i){var n,o,r=this,l=r.paddingLeft,s=r.paddingBottom,d=r.start,u=+r.getRightValue(t),c=r.end-d;return r.isHorizontal()?(o=r.width-(l+r.paddingRight),n=r.left+o/c*(u-d),Math.round(n+l)):(o=r.height-(r.paddingTop+s),n=r.bottom-s-o/c*(u-d),Math.round(n))},getValueForPixel:function(t){var e=this,a=e.isHorizontal(),i=e.paddingLeft,n=e.paddingBottom,o=a?e.width-(i+e.paddingRight):e.height-(e.paddingTop+n),r=(a?t-e.left-i:e.bottom-n-t)/o;return e.start+(e.end-e.start)*r},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticksAsNumbers[t],null,null,e)}});t.scaleService.registerScaleType("linear",i,a)}},{}],40:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=e.noop;t.LinearScaleBase=t.Scale.extend({handleTickRangeOptions:function(){var t=this,a=t.options,i=a.ticks;if(i.beginAtZero){var n=e.sign(t.min),o=e.sign(t.max);0>n&&0>o?t.max=0:n>0&&o>0&&(t.min=0)}void 0!==i.min?t.min=i.min:void 0!==i.suggestedMin&&(t.min=Math.min(t.min,i.suggestedMin)),void 0!==i.max?t.max=i.max:void 0!==i.suggestedMax&&(t.max=Math.max(t.max,i.suggestedMax)),t.min===t.max&&(t.max++,i.beginAtZero||t.min--)},getTickLimit:a,handleDirectionalChanges:a,buildTicks:function(){var t=this,a=t.options,i=a.ticks,n=e.getValueOrDefault,o=(t.isHorizontal(),t.ticks=[]),r=t.getTickLimit();r=Math.max(2,r);var l,s=i.fixedStepSize&&i.fixedStepSize>0||i.stepSize&&i.stepSize>0;if(s)l=n(i.fixedStepSize,i.stepSize);else{var d=e.niceNum(t.max-t.min,!1);l=e.niceNum(d/(r-1),!0)}var u=Math.floor(t.min/l)*l,c=Math.ceil(t.max/l)*l,h=(c-u)/l;h=e.almostEquals(h,Math.round(h),l/1e3)?Math.round(h):Math.ceil(h),o.push(void 0!==i.min?i.min:u);for(var f=1;h>f;++f)o.push(u+f*l);o.push(void 0!==i.max?i.max:c),t.handleDirectionalChanges(),t.max=e.max(o),t.min=e.min(o),i.reverse?(o.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{}],41:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a={position:"left",ticks:{callback:function(t,a,i){var n=t/Math.pow(10,Math.floor(e.log10(t)));return 1===n||2===n||5===n||0===a||a===i.length-1?t.toExponential():""}}},i=t.Scale.extend({determineDataLimits:function(){function t(t){return d?t.xAxisID===a.id:t.yAxisID===a.id}var a=this,i=a.options,n=i.ticks,o=a.chart,r=o.data,l=r.datasets,s=e.getValueOrDefault,d=a.isHorizontal();if(a.min=null,a.max=null,i.stacked){var u={};e.each(l,function(n,r){var l=o.getDatasetMeta(r);o.isDatasetVisible(r)&&t(l)&&(void 0===u[l.type]&&(u[l.type]=[]),e.each(n.data,function(t,e){var n=u[l.type],o=+a.getRightValue(t);isNaN(o)||l.data[e].hidden||(n[e]=n[e]||0,i.relativePoints?n[e]=100:n[e]+=o)}))}),e.each(u,function(t){var i=e.min(t),n=e.max(t);a.min=null===a.min?i:Math.min(a.min,i),a.max=null===a.max?n:Math.max(a.max,n)})}else e.each(l,function(i,n){var r=o.getDatasetMeta(n);o.isDatasetVisible(n)&&t(r)&&e.each(i.data,function(t,e){var i=+a.getRightValue(t);isNaN(i)||r.data[e].hidden||(null===a.min?a.min=i:ia.max&&(a.max=i))})});a.min=s(n.min,a.min),a.max=s(n.max,a.max),a.min===a.max&&(0!==a.min&&null!==a.min?(a.min=Math.pow(10,Math.floor(e.log10(a.min))-1),a.max=Math.pow(10,Math.floor(e.log10(a.max))+1)):(a.min=1,a.max=10))},buildTicks:function(){for(var t=this,a=t.options,i=a.ticks,n=e.getValueOrDefault,o=t.ticks=[],r=n(i.min,Math.pow(10,Math.floor(e.log10(t.min))));rt.max&&(t.max=i))})}}),t.handleTickRangeOptions()},getTickLimit:function(){var t=this.options.ticks,i=e.getValueOrDefault(t.fontSize,a.defaultFontSize);return Math.min(t.maxTicksLimit?t.maxTicksLimit:11,Math.ceil(this.drawingArea/(1.5*i)))},convertTicksToLabels:function(){ +var e=this;t.LinearScaleBase.prototype.convertTicksToLabels.call(e),e.pointLabels=e.chart.data.labels.map(e.options.pointLabels.callback,e)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t,i,n,o,r,l,s,d,u,c,h,f,g=this.options.pointLabels,p=e.getValueOrDefault(g.fontSize,a.defaultFontSize),m=e.getValueOrDefault(g.fontStyle,a.defaultFontStyle),b=e.getValueOrDefault(g.fontFamily,a.defaultFontFamily),v=e.fontString(p,m,b),x=e.min([this.height/2-p-5,this.width/2]),y=this.width,k=0;for(this.ctx.font=v,i=0;iy&&(y=t.x+o,r=i),t.x-oy&&(y=t.x+n,r=i):i>this.getValueCount()/2&&t.x-ne&&0>a?a:e>0&&a>0?e:0)},draw:function(){var t=this,i=t.options,n=i.gridLines,o=i.ticks,r=i.angleLines,l=i.pointLabels,s=e.getValueOrDefault;if(i.display){var d=t.ctx,u=s(o.fontSize,a.defaultFontSize),c=s(o.fontStyle,a.defaultFontStyle),h=s(o.fontFamily,a.defaultFontFamily),f=e.fontString(u,c,h);if(e.each(t.ticks,function(r,l){if(l>0||i.reverse){var c=t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]),h=t.yCenter-c;if(n.display&&0!==l)if(d.strokeStyle=e.getValueAtIndexOrDefault(n.color,l-1),d.lineWidth=e.getValueAtIndexOrDefault(n.lineWidth,l-1),i.lineArc)d.beginPath(),d.arc(t.xCenter,t.yCenter,c,0,2*Math.PI),d.closePath(),d.stroke();else{d.beginPath();for(var g=0;g=0;x--){if(r.display){var y=t.getPointPosition(x,g);d.beginPath(),d.moveTo(t.xCenter,t.yCenter),d.lineTo(y.x,y.y),d.stroke(),d.closePath()}var k=t.getPointPosition(x,g+5),S=s(l.fontColor,a.defaultFontColor);d.font=v,d.fillStyle=S;var w=t.pointLabels,C=w.length,M=w.length/2,D=M/2,A=D>x||x>C-D,I=x===D||x===C-D;0===x?d.textAlign="center":x===M?d.textAlign="center":M>x?d.textAlign="left":d.textAlign="right",I?d.textBaseline="middle":A?d.textBaseline="bottom":d.textBaseline="top",d.fillText(w[x]?w[x]:"",k.x,k.y)}}}}});t.scaleService.registerScaleType("radialLinear",n,i)}},{}],43:[function(t,e,a){"use strict";var i=t(1);i="function"==typeof i?i:window.moment,e.exports=function(t){var e=t.helpers,a={units:[{name:"millisecond",steps:[1,2,5,10,20,50,100,250,500]},{name:"second",steps:[1,2,5,10,30]},{name:"minute",steps:[1,2,5,10,30]},{name:"hour",steps:[1,2,3,6,12]},{name:"day",steps:[1,2,5]},{name:"week",maxStep:4},{name:"month",maxStep:3},{name:"quarter",maxStep:4},{name:"year",maxStep:!1}]},n={position:"bottom",time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,displayFormats:{millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm:ss a",hour:"MMM D, hA",day:"ll",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"}},ticks:{autoSkip:!1}},o=t.Scale.extend({initialize:function(){if(!i)throw new Error("Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com");t.Scale.prototype.initialize.call(this)},getLabelMoment:function(t,e){return this.labelMoments[t][e]},getMomentStartOf:function(t){var e=this;return"week"===e.options.time.unit&&e.options.time.isoWeekday!==!1?t.clone().startOf("isoWeek").isoWeekday(e.options.time.isoWeekday):t.clone().startOf(e.tickUnit)},determineDataLimits:function(){var t=this;t.labelMoments=[];var a=[];t.chart.data.labels&&t.chart.data.labels.length>0?(e.each(t.chart.data.labels,function(e,i){var n=t.parseTime(e);n.isValid()&&(t.options.time.round&&n.startOf(t.options.time.round),a.push(n))},t),t.firstTick=i.min.call(t,a),t.lastTick=i.max.call(t,a)):(t.firstTick=null,t.lastTick=null),e.each(t.chart.data.datasets,function(n,o){var r=[],l=t.chart.isDatasetVisible(o);"object"==typeof n.data[0]&&null!==n.data[0]?e.each(n.data,function(e,a){var n=t.parseTime(t.getRightValue(e));n.isValid()&&(t.options.time.round&&n.startOf(t.options.time.round),r.push(n),l&&(t.firstTick=null!==t.firstTick?i.min(t.firstTick,n):n,t.lastTick=null!==t.lastTick?i.max(t.lastTick,n):n))},t):r=a,t.labelMoments.push(r)},t),t.options.time.min&&(t.firstTick=t.parseTime(t.options.time.min)),t.options.time.max&&(t.lastTick=t.parseTime(t.options.time.max)),t.firstTick=(t.firstTick||i()).clone(),t.lastTick=(t.lastTick||i()).clone()},buildTicks:function(i){var n=this;n.ctx.save();var o=e.getValueOrDefault(n.options.ticks.fontSize,t.defaults.global.defaultFontSize),r=e.getValueOrDefault(n.options.ticks.fontStyle,t.defaults.global.defaultFontStyle),l=e.getValueOrDefault(n.options.ticks.fontFamily,t.defaults.global.defaultFontFamily),s=e.fontString(o,r,l);if(n.ctx.font=s,n.ticks=[],n.unitScale=1,n.scaleSizeInUnits=0,n.options.time.unit)n.tickUnit=n.options.time.unit||"day",n.displayFormat=n.options.time.displayFormats[n.tickUnit],n.scaleSizeInUnits=n.lastTick.diff(n.firstTick,n.tickUnit,!0),n.unitScale=e.getValueOrDefault(n.options.time.unitStepSize,1);else{var d=n.isHorizontal()?n.width-(n.paddingLeft+n.paddingRight):n.height-(n.paddingTop+n.paddingBottom),u=n.tickFormatFunction(n.firstTick,0,[]),c=n.ctx.measureText(u).width,h=Math.cos(e.toRadians(n.options.ticks.maxRotation)),f=Math.sin(e.toRadians(n.options.ticks.maxRotation));c=c*h+o*f;var g=d/c;n.tickUnit="millisecond",n.scaleSizeInUnits=n.lastTick.diff(n.firstTick,n.tickUnit,!0),n.displayFormat=n.options.time.displayFormats[n.tickUnit];for(var p=0,m=a.units[p];p=Math.ceil(n.scaleSizeInUnits/g)){n.unitScale=e.getValueOrDefault(n.options.time.unitStepSize,m.steps[b]);break}break}if(m.maxStep===!1||Math.ceil(n.scaleSizeInUnits/g)=0)break;S%n.unitScale===0&&n.ticks.push(w)}var C=n.ticks[n.ticks.length-1].diff(n.lastTick,n.tickUnit);(0!==C||0===n.scaleSizeInUnits)&&(n.options.time.max?(n.ticks.push(n.lastTick.clone()),n.scaleSizeInUnits=n.lastTick.diff(n.ticks[0],n.tickUnit,!0)):(n.ticks.push(n.lastTick.clone()),n.scaleSizeInUnits=n.lastTick.diff(n.firstTick,n.tickUnit,!0))),n.ctx.restore()},getLabelForIndex:function(t,e){var a=this,i=a.chart.data.labels&&tb;b++)if(b in this&&this[b]===a)return b;return-1};for(t={catchupTime:500,initialRate:.03,minTime:500,ghostTime:500,maxProgressPerFrame:10,easeFactor:1.25,startOnPageLoad:!0,restartOnPushState:!0,restartOnRequestAfter:500,target:"body",elements:{checkInterval:100,selectors:["body"]},eventLag:{minSamples:10,sampleCount:3,lagThreshold:3},ajax:{trackMethods:["GET"],trackWebSockets:!0,ignoreURLs:[]}},B=function(){var a;return null!=(a="undefined"!=typeof performance&&null!==performance&&"function"==typeof performance.now?performance.now():void 0)?a:+new Date},D=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,s=window.cancelAnimationFrame||window.mozCancelAnimationFrame,null==D&&(D=function(a){return setTimeout(a,50)},s=function(a){return clearTimeout(a)}),F=function(a){var b,c;return b=B(),(c=function(){var d;return d=B()-b,d>=33?(b=B(),a(d,function(){return D(c)})):setTimeout(c,33-d)})()},E=function(){var a,b,c;return c=arguments[0],b=arguments[1],a=3<=arguments.length?W.call(arguments,2):[],"function"==typeof c[b]?c[b].apply(c,a):c[b]},u=function(){var a,b,c,d,e,f,g;for(b=arguments[0],d=2<=arguments.length?W.call(arguments,1):[],f=0,g=d.length;g>f;f++)if(c=d[f])for(a in c)X.call(c,a)&&(e=c[a],null!=b[a]&&"object"==typeof b[a]&&null!=e&&"object"==typeof e?u(b[a],e):b[a]=e);return b},p=function(a){var b,c,d,e,f;for(c=b=0,e=0,f=a.length;f>e;e++)d=a[e],c+=Math.abs(d),b++;return c/b},w=function(a,b){var c,d,e;if(null==a&&(a="options"),null==b&&(b=!0),e=document.querySelector("[data-pace-"+a+"]")){if(c=e.getAttribute("data-pace-"+a),!b)return c;try{return JSON.parse(c)}catch(f){return d=f,"undefined"!=typeof console&&null!==console?console.error("Error parsing inline pace options",d):void 0}}},g=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];cP;P++)J=T[P],C[J]===!0&&(C[J]=t[J]);i=function(a){function b(){return U=b.__super__.constructor.apply(this,arguments)}return Y(b,a),b}(Error),b=function(){function a(){this.progress=0}return a.prototype.getElement=function(){var a;if(null==this.el){if(a=document.querySelector(C.target),!a)throw new i;this.el=document.createElement("div"),this.el.className="pace pace-active",document.body.className=document.body.className.replace(/pace-done/g,""),document.body.className+=" pace-running",this.el.innerHTML='
\n
\n
\n
',null!=a.firstChild?a.insertBefore(this.el,a.firstChild):a.appendChild(this.el)}return this.el},a.prototype.finish=function(){var a;return a=this.getElement(),a.className=a.className.replace("pace-active",""),a.className+=" pace-inactive",document.body.className=document.body.className.replace("pace-running",""),document.body.className+=" pace-done"},a.prototype.update=function(a){return this.progress=a,this.render()},a.prototype.destroy=function(){try{this.getElement().parentNode.removeChild(this.getElement())}catch(a){i=a}return this.el=void 0},a.prototype.render=function(){var a,b;return null==document.querySelector(C.target)?!1:(a=this.getElement(),a.children[0].style.width=""+this.progress+"%",(!this.lastRenderedProgress||this.lastRenderedProgress|0!==this.progress|0)&&(a.children[0].setAttribute("data-progress-text",""+(0|this.progress)+"%"),this.progress>=100?b="99":(b=this.progress<10?"0":"",b+=0|this.progress),a.children[0].setAttribute("data-progress",""+b)),this.lastRenderedProgress=this.progress)},a.prototype.done=function(){return this.progress>=100},a}(),h=function(){function a(){this.bindings={}}return a.prototype.trigger=function(a,b){var c,d,e,f,g;if(null!=this.bindings[a]){for(f=this.bindings[a],g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(c.call(this,b));return g}},a.prototype.on=function(a,b){var c;return null==(c=this.bindings)[a]&&(c[a]=[]),this.bindings[a].push(b)},a}(),O=window.XMLHttpRequest,N=window.XDomainRequest,M=window.WebSocket,v=function(a,b){var c,d,e,f;f=[];for(d in b.prototype)try{e=b.prototype[d],f.push(null==a[d]&&"function"!=typeof e?a[d]=e:void 0)}catch(g){c=g}return f},z=[],Pace.ignore=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?W.call(arguments,1):[],z.unshift("ignore"),c=b.apply(null,a),z.shift(),c},Pace.track=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?W.call(arguments,1):[],z.unshift("track"),c=b.apply(null,a),z.shift(),c},I=function(a){var b;if(null==a&&(a="GET"),"track"===z[0])return"force";if(!z.length&&C.ajax){if("socket"===a&&C.ajax.trackWebSockets)return!0;if(b=a.toUpperCase(),Z.call(C.ajax.trackMethods,b)>=0)return!0}return!1},j=function(a){function b(){var a,c=this;b.__super__.constructor.apply(this,arguments),a=function(a){var b;return b=a.open,a.open=function(d,e){return I(d)&&c.trigger("request",{type:d,url:e,request:a}),b.apply(a,arguments)}},window.XMLHttpRequest=function(b){var c;return c=new O(b),a(c),c},v(window.XMLHttpRequest,O),null!=N&&(window.XDomainRequest=function(){var b;return b=new N,a(b),b},v(window.XDomainRequest,N)),null!=M&&C.ajax.trackWebSockets&&(window.WebSocket=function(a,b){var d;return d=null!=b?new M(a,b):new M(a),I("socket")&&c.trigger("request",{type:"socket",url:a,protocols:b,request:d}),d},v(window.WebSocket,M))}return Y(b,a),b}(h),Q=null,x=function(){return null==Q&&(Q=new j),Q},H=function(a){var b,c,d,e;for(e=C.ajax.ignoreURLs,c=0,d=e.length;d>c;c++)if(b=e[c],"string"==typeof b){if(-1!==a.indexOf(b))return!0}else if(b.test(a))return!0;return!1},x().on("request",function(b){var c,d,e,f,g;return f=b.type,e=b.request,g=b.url,H(g)?void 0:Pace.running||C.restartOnRequestAfter===!1&&"force"!==I(f)?void 0:(d=arguments,c=C.restartOnRequestAfter||0,"boolean"==typeof c&&(c=0),setTimeout(function(){var b,c,g,h,i,j;if(b="socket"===f?e.readyState<2:0<(h=e.readyState)&&4>h){for(Pace.restart(),i=Pace.sources,j=[],c=0,g=i.length;g>c;c++){if(J=i[c],J instanceof a){J.watch.apply(J,d);break}j.push(void 0)}return j}},c))}),a=function(){function a(){var a=this;this.elements=[],x().on("request",function(){return a.watch.apply(a,arguments)})}return a.prototype.watch=function(a){var b,c,d,e;return d=a.type,b=a.request,e=a.url,H(e)?void 0:(c="socket"===d?new m(b):new n(b),this.elements.push(c))},a}(),n=function(){function a(a){var b,c,d,e,f,g,h=this;if(this.progress=0,null!=window.ProgressEvent)for(c=null,a.addEventListener("progress",function(a){return h.progress=a.lengthComputable?100*a.loaded/a.total:h.progress+(100-h.progress)/2}),g=["load","abort","timeout","error"],d=0,e=g.length;e>d;d++)b=g[d],a.addEventListener(b,function(){return h.progress=100});else f=a.onreadystatechange,a.onreadystatechange=function(){var b;return 0===(b=a.readyState)||4===b?h.progress=100:3===a.readyState&&(h.progress=50),"function"==typeof f?f.apply(null,arguments):void 0}}return a}(),m=function(){function a(a){var b,c,d,e,f=this;for(this.progress=0,e=["error","open"],c=0,d=e.length;d>c;c++)b=e[c],a.addEventListener(b,function(){return f.progress=100})}return a}(),d=function(){function a(a){var b,c,d,f;for(null==a&&(a={}),this.elements=[],null==a.selectors&&(a.selectors=[]),f=a.selectors,c=0,d=f.length;d>c;c++)b=f[c],this.elements.push(new e(b))}return a}(),e=function(){function a(a){this.selector=a,this.progress=0,this.check()}return a.prototype.check=function(){var a=this;return document.querySelector(this.selector)?this.done():setTimeout(function(){return a.check()},C.elements.checkInterval)},a.prototype.done=function(){return this.progress=100},a}(),c=function(){function a(){var a,b,c=this;this.progress=null!=(b=this.states[document.readyState])?b:100,a=document.onreadystatechange,document.onreadystatechange=function(){return null!=c.states[document.readyState]&&(c.progress=c.states[document.readyState]),"function"==typeof a?a.apply(null,arguments):void 0}}return a.prototype.states={loading:0,interactive:50,complete:100},a}(),f=function(){function a(){var a,b,c,d,e,f=this;this.progress=0,a=0,e=[],d=0,c=B(),b=setInterval(function(){var g;return g=B()-c-50,c=B(),e.push(g),e.length>C.eventLag.sampleCount&&e.shift(),a=p(e),++d>=C.eventLag.minSamples&&a=100&&(this.done=!0),b===this.last?this.sinceLastUpdate+=a:(this.sinceLastUpdate&&(this.rate=(b-this.last)/this.sinceLastUpdate),this.catchup=(b-this.progress)/C.catchupTime,this.sinceLastUpdate=0,this.last=b),b>this.progress&&(this.progress+=this.catchup*a),c=1-Math.pow(this.progress/100,C.easeFactor),this.progress+=c*this.rate*a,this.progress=Math.min(this.lastProgress+C.maxProgressPerFrame,this.progress),this.progress=Math.max(0,this.progress),this.progress=Math.min(100,this.progress),this.lastProgress=this.progress,this.progress},a}(),K=null,G=null,q=null,L=null,o=null,r=null,Pace.running=!1,y=function(){return C.restartOnPushState?Pace.restart():void 0},null!=window.history.pushState&&(S=window.history.pushState,window.history.pushState=function(){return y(),S.apply(window.history,arguments)}),null!=window.history.replaceState&&(V=window.history.replaceState,window.history.replaceState=function(){return y(),V.apply(window.history,arguments)}),k={ajax:a,elements:d,document:c,eventLag:f},(A=function(){var a,c,d,e,f,g,h,i;for(Pace.sources=K=[],g=["ajax","elements","document","eventLag"],c=0,e=g.length;e>c;c++)a=g[c],C[a]!==!1&&K.push(new k[a](C[a]));for(i=null!=(h=C.extraSources)?h:[],d=0,f=i.length;f>d;d++)J=i[d],K.push(new J(C));return Pace.bar=q=new b,G=[],L=new l})(),Pace.stop=function(){return Pace.trigger("stop"),Pace.running=!1,q.destroy(),r=!0,null!=o&&("function"==typeof s&&s(o),o=null),A()},Pace.restart=function(){return Pace.trigger("restart"),Pace.stop(),Pace.start()},Pace.go=function(){var a;return Pace.running=!0,q.render(),a=B(),r=!1,o=F(function(b,c){var d,e,f,g,h,i,j,k,m,n,o,p,s,t,u,v;for(k=100-q.progress,e=o=0,f=!0,i=p=0,t=K.length;t>p;i=++p)for(J=K[i],n=null!=G[i]?G[i]:G[i]=[],h=null!=(v=J.elements)?v:[J],j=s=0,u=h.length;u>s;j=++s)g=h[j],m=null!=n[j]?n[j]:n[j]=new l(g),f&=m.done,m.done||(e++,o+=m.tick(b));return d=o/e,q.update(L.tick(b,d)),q.done()||f||r?(q.update(100),Pace.trigger("done"),setTimeout(function(){return q.finish(),Pace.running=!1,Pace.trigger("hide")},Math.max(C.ghostTime,Math.max(C.minTime-(B()-a),0)))):c()})},Pace.start=function(a){u(C,a),Pace.running=!0;try{q.render()}catch(b){i=b}return document.querySelector(".pace")?(Pace.trigger("start"),Pace.go()):setTimeout(Pace.start,50)},"function"==typeof define&&define.amd?define(function(){return Pace}):"object"==typeof exports?module.exports=Pace:C.startOnPageLoad&&Pace.start()}).call(this); \ No newline at end of file diff --git a/src/app/views/dashboard/analytics/analytics.component.html b/src/app/views/dashboard/analytics/analytics.component.html new file mode 100644 index 0000000..f3d4242 --- /dev/null +++ b/src/app/views/dashboard/analytics/analytics.component.html @@ -0,0 +1,332 @@ +
+
Last 12 Months Sales
+
+
+
+
+
+
+
+ +
+ {{ + item.icon + }} +
+

{{ item.title }}

+
{{ item.amount }}
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name +
+ {{ element.name }} +

+ {{ element.name }} +

+
+
Revenue${{ element.price }}Stock Status + + {{ getProductStatus(element.available).status }} + + Action + +
+
+ +
+ +
+ +
+ Active Users +
+
+
+

+ 10.8k +

+
+
+ + expand_less + +
+ + (+21%) + +
+
+
+ +
+ +
+ Transactions +
+
+
+

+ $2.8M +

+
+
+ + expand_less + +
+ + (+21%) + +
+
+
+
+ +
+ Ongoing Projects + +
+ +
+ + +

+ {{ item.title }} +

+
+ +
+

+ 03/02/2020 07:13PM +

+ +
+ + + +

+ +3 +

+
+
+ + +
+
+
+
+ +
+
+ + Traffic Sources + Last 30 days +
+
+ + + upgrade +

+ Upgrade to MatX PRO for
+ more resources +

+ +
+
+
+
+ + Campaigns + +

Today

+
+ + Google (102k) +
+
+ + Facebook (120k) +
+
+ + Tensor (80k) +
+ +

Yesterday

+
+ + Google (102k) +
+
+ + Facebook (120k) +
+
+ + Tensor (80k) +
+ +

Last Month

+
+ + Google (102k) +
+
+ + Facebook (120k) +
+
+ + Tensor (80k) +
+
+
+
+
+
diff --git a/src/app/views/dashboard/analytics/analytics.component.scss b/src/app/views/dashboard/analytics/analytics.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/dashboard/analytics/analytics.component.spec.ts b/src/app/views/dashboard/analytics/analytics.component.spec.ts new file mode 100644 index 0000000..6c00899 --- /dev/null +++ b/src/app/views/dashboard/analytics/analytics.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AnalyticsComponent } from './analytics.component'; + +describe('AnalyticsComponent', () => { + let component: AnalyticsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AnalyticsComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AnalyticsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/dashboard/analytics/analytics.component.ts b/src/app/views/dashboard/analytics/analytics.component.ts new file mode 100644 index 0000000..44684b4 --- /dev/null +++ b/src/app/views/dashboard/analytics/analytics.component.ts @@ -0,0 +1,366 @@ +import { + Component, + OnInit, + AfterViewInit, + ChangeDetectionStrategy +} from '@angular/core'; +import { matxAnimations } from 'app/shared/animations/matx-animations'; +import { ThemeService } from 'app/shared/services/theme.service'; +import tinyColor from 'tinycolor2'; +import PerfectScrollbar from 'perfect-scrollbar'; + +@Component({ + selector: 'app-analytics', + templateUrl: './analytics.component.html', + styleUrls: ['./analytics.component.scss'], + animations: matxAnimations +}) +export class AnalyticsComponent implements OnInit, AfterViewInit { + trafficVsSaleOptions: any; + trafficVsSale: any; + trafficData: any; + saleData: any; + + sessionOptions: any; + sessions: any; + sessionsData: any; + + trafficGrowthChart: any; + bounceRateGrowthChart: any; + + dailyTrafficChartBar: any; + trafficSourcesChart: any; + countryTrafficStats: any[]; + doughNutPieOptions: any; + + statCardList = [ + { + icon: 'people', + title: 'New Leads', + amount: '3,050', + color: 'primary' + }, + { + icon: 'attach_money', + title: 'This week Sales', + amount: '$80,500', + color: 'primary' + }, + { + icon: 'store', + title: 'Inventory Status', + amount: '8.5% Stock Surplus', + color: 'accent' + }, + { + icon: 'shopping_cart', + title: 'Orders to deliver', + amount: '305 Orders', + color: 'accent' + } + ]; + + productList = [ + { + imgUrl: 'assets/images/products/headphone-2.jpg', + name: 'earphone', + price: 100, + available: 15 + }, + { + imgUrl: 'assets/images/products/headphone-3.jpg', + name: 'earphone', + price: 1500, + available: 30 + }, + { + imgUrl: 'assets/images/products/iphone-2.jpg', + name: 'iPhone x', + price: 1900, + available: 35 + }, + { + imgUrl: 'assets/images/products/iphone-1.jpg', + name: 'iPhone x', + price: 100, + available: 0 + }, + { + imgUrl: 'assets/images/products/headphone-3.jpg', + name: 'Head phone', + price: 1190, + available: 5 + } + ]; + + onGoingProjectList = [ + { + icon: 'start_border', + color: 'warn', + title: 'project 1' + }, + { + icon: 'date_range', + color: 'primary', + title: 'project 2' + }, + { + icon: 'start_border', + color: 'warn', + title: 'project 3' + }, + { + icon: 'date_range', + color: 'accent', + title: 'project 4' + } + ]; + + displayedColumns: string[] = ['name', 'price', 'available', 'action']; + + constructor(private themeService: ThemeService) {} + + ngAfterViewInit() {} + ngOnInit() { + this.themeService.onThemeChange.subscribe(activeTheme => { + this.initDoughNutPieOptions(activeTheme); + this.initDailyTrafficChartBar(activeTheme); + }); + this.initDailyTrafficChartBar(this.themeService.activatedTheme); + this.initDoughNutPieOptions(this.themeService.activatedTheme); + } + + initDoughNutPieOptions(theme) { + this.doughNutPieOptions = { + backgroundColor: 'transparent', + color: [ + '#f44336', + '#ff9e43', + 'rgba(116, 103, 239, 1)' + ], + legend: { + show: true, + itemGap: 20, + icon: 'circle', + bottom: 0, + textStyle: { + fontSize: 13, + fontFamily: 'roboto' + } + }, + tooltip: { + show: false, + trigger: 'item', + formatter: '{a}
{b}: {c} ({d}%)' + }, + xAxis: [ + { + axisLine: { + show: false + }, + splitLine: { + show: false + } + } + ], + yAxis: [ + { + axisLine: { + show: false + }, + splitLine: { + show: false + } + } + ], + + series: [ + { + name: 'Traffic Rate', + type: 'pie', + radius: ['45%', '72.55%'], + center: ['50%', '50%'], + avoidLabelOverlap: false, + hoverOffset: 5, + stillShowZeroSum: false, + + label: { + normal: { + show: false, + position: 'center', + textStyle: { + fontSize: '13', + fontWeight: 'normal' + }, + formatter: '{a}' + }, + emphasis: { + show: true, + textStyle: { + fontSize: '15', + fontWeight: 'normal', + color: 'rgba(116, 103, 239, 1)' + }, + formatter: '{b} \n{c} ({d}%)' + } + }, + labelLine: { + normal: { + show: false + } + }, + data: [ + { + value: 65, + name: 'Google' + }, + { + value: 20, + name: 'Facebook' + }, + { value: 15, name: 'Others' } + ], + + itemStyle: { + emphasis: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' + } + } + } + ] + }; + } + + initDailyTrafficChartBar(theme) { + this.dailyTrafficChartBar = { + grid: { + top: 16, + left: 36, + right: 16, + bottom: 32 + }, + legend: {}, + tooltip: { + show: true, + trigger: 'axis', + + axisPointer: { + type: 'cross', + lineStyle: { + opacity: 0 + } + }, + crossStyle: { + color: '#000' + } + }, + series: [ + { + data: [34, 45, 31, 45, 31, 43, 26, 43, 31, 45, 33, 40], + type: 'line', + areaStyle: {}, + smooth: true, + lineStyle: { + width: 2, + color: '#fff' + } + } + ], + xAxis: { + show: true, + type: 'category', + showGrid: false, + boundaryGap: false, + data: [ + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec' + ], + axisLabel: { + color: '#ccc', + margin: 20 + }, + axisLine: { + show: false + }, + axisTick: { + show: false + } + }, + yAxis: { + type: 'value', + min: 10, + max: 60, + axisLabel: { + color: '#ccc', + margin: 20, + fontSize: 13, + fontFamily: 'roboto' + }, + splitLine: { + show: true, + lineStyle: { + color: 'rgba(255, 255, 255, .1)' + } + }, + + axisLine: { + show: false + }, + axisTick: { + show: false + } + }, + color: [ + { + type: 'linear', + x: 0, + y: 0, + x2: 0, + y2: 1, + colorStops: [ + { + offset: 0, + color: 'rgba(255,255,255,0.3)' // color at 0% position + }, + { + offset: 1, + color: 'rgba(255,255,255,0)' // color at 100% position + } + ], + global: false // false by default + } + ] + }; + } + + getProductStatus(value) { + if (value) { + if (value < 20) { + return { + color: 'accent', + status: `${value} available` + }; + } else + return { + color: 'primary', + status: `in stock` + }; + } else + return { + color: 'warn', + status: `out of stcok` + }; + } +} diff --git a/src/app/views/dashboard/dashboard.module.ts b/src/app/views/dashboard/dashboard.module.ts new file mode 100644 index 0000000..1dc5c68 --- /dev/null +++ b/src/app/views/dashboard/dashboard.module.ts @@ -0,0 +1,25 @@ +import { SharedMaterialModule } from 'app/shared/shared-material.module'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { NgxDatatableModule } from '@swimlane/ngx-datatable'; +import { SharedPipesModule } from 'app/shared/pipes/shared-pipes.module'; +import { DashboardRoutes } from './dashboard.routing'; +import { AnalyticsComponent } from './analytics/analytics.component'; +import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar'; + +@NgModule({ + imports: [ + CommonModule, + SharedMaterialModule, + FlexLayoutModule, + NgxDatatableModule, + SharedPipesModule, + PerfectScrollbarModule, + RouterModule.forChild(DashboardRoutes) + ], + declarations: [AnalyticsComponent], + exports: [] +}) +export class DashboardModule {} diff --git a/src/app/views/dashboard/dashboard.routing.ts b/src/app/views/dashboard/dashboard.routing.ts new file mode 100644 index 0000000..cb6f523 --- /dev/null +++ b/src/app/views/dashboard/dashboard.routing.ts @@ -0,0 +1,10 @@ +import { Routes } from "@angular/router"; + +import { AnalyticsComponent } from "./analytics/analytics.component"; + +export const DashboardRoutes: Routes = [ + { + path: "analytics", + component: AnalyticsComponent + } +]; diff --git a/src/app/views/forms/basic-form/basic-form.component.css b/src/app/views/forms/basic-form/basic-form.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/forms/basic-form/basic-form.component.html b/src/app/views/forms/basic-form/basic-form.component.html new file mode 100644 index 0000000..7872f95 --- /dev/null +++ b/src/app/views/forms/basic-form/basic-form.component.html @@ -0,0 +1,175 @@ + + +
Form validation
+ +
+ +
+
+
+
+ + + + Username require at least {{basicForm.controls['username'].errors.minlength.requiredLength}} characters + Username can not contain more than {{basicForm.controls['username'].errors.maxlength.requiredLength}} characters +
+ +
+ + + + First name is required +
+ +
+ + + + Email is required + Invaild email address +
+ +
+ + + + Invaild web address +
+ +
+ + + + + + +
+
+ +
+
+ + + + Invaild card number +
+ +
+ + + + Invaild phone number +
+ +
+ + + + Password is required +
+ +
+ + + + Password mismatch +
+ +
+ + + Male + Female + +
+ +
+ I have read and agree to the terms of service. + + You must agree to the terms and conditions +
+
+
+ +
+
+
+ diff --git a/src/app/views/forms/basic-form/basic-form.component.ts b/src/app/views/forms/basic-form/basic-form.component.ts new file mode 100644 index 0000000..d02d24f --- /dev/null +++ b/src/app/views/forms/basic-form/basic-form.component.ts @@ -0,0 +1,47 @@ +import { Component, OnInit } from '@angular/core'; +import { FormGroup, FormControl, Validators } from '@angular/forms'; +import { CustomValidators } from 'ngx-custom-validators'; + +@Component({ + selector: 'app-basic-form', + templateUrl: './basic-form.component.html', + styleUrls: ['./basic-form.component.css'] +}) +export class BasicFormComponent implements OnInit { + formData = {}; + console = console; + basicForm: FormGroup; + + constructor() {} + + ngOnInit() { + const password = new FormControl('', Validators.required); + const confirmPassword = new FormControl( + '', + //CustomValidators.equalTo(password) + ); + + this.basicForm = new FormGroup({ + username: new FormControl('', [ + Validators.minLength(4), + Validators.maxLength(9) + ]), + firstname: new FormControl('', [Validators.required]), + email: new FormControl('', [Validators.required, Validators.email]), + website: new FormControl(''), + date: new FormControl(), + cardno: new FormControl(''), + phone: new FormControl('', [Validators.required]), + password: password, + confirmPassword: confirmPassword, + gender: new FormControl('', [Validators.required]), + agreed: new FormControl('', (control: FormControl) => { + const agreed = control.value; + if (!agreed) { + return { agreed: true }; + } + return null; + }) + }); + } +} diff --git a/src/app/views/forms/file-upload/file-upload.component.css b/src/app/views/forms/file-upload/file-upload.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/forms/file-upload/file-upload.component.html b/src/app/views/forms/file-upload/file-upload.component.html new file mode 100644 index 0000000..b850216 --- /dev/null +++ b/src/app/views/forms/file-upload/file-upload.component.html @@ -0,0 +1,116 @@ + + +
File upload
+ +
+ +
+

Multiple

+
+ +

Single

+ +
+ +
+
+ Drop file here +
+
+ + + + + + + + + + + + + + + + + + + + + +

Queue is empty

+
+
NameSizeProgressStatusActions
{{ item?.file?.name }}{{ item?.file?.size/1024/1024 | number:'.2' }} MB +
+
+ + +
+
+ check + cancel + error + + + + + +
+ + +
+

Queue progress:

+
+ + +
+ + + + + + +
+
+
diff --git a/src/app/views/forms/file-upload/file-upload.component.ts b/src/app/views/forms/file-upload/file-upload.component.ts new file mode 100644 index 0000000..682cab4 --- /dev/null +++ b/src/app/views/forms/file-upload/file-upload.component.ts @@ -0,0 +1,22 @@ +import { Component, OnInit } from "@angular/core"; +import { FileUploader } from "ng2-file-upload"; + +@Component({ + selector: "app-file-upload", + templateUrl: "./file-upload.component.html", + styleUrls: ["./file-upload.component.css"] +}) +export class FileUploadComponent implements OnInit { + public uploader: FileUploader = new FileUploader({ + url: "https://evening-anchorage-315.herokuapp.com/api/" + }); + public hasBaseDropZoneOver: boolean = false; + console = console; + constructor() {} + + ngOnInit() {} + + public fileOverBase(e: any): void { + this.hasBaseDropZoneOver = e; + } +} diff --git a/src/app/views/forms/forms.module.ts b/src/app/views/forms/forms.module.ts new file mode 100644 index 0000000..c00cec7 --- /dev/null +++ b/src/app/views/forms/forms.module.ts @@ -0,0 +1,55 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatNativeDateModule } from '@angular/material/core'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatStepperModule } from '@angular/material/stepper'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { NgxDatatableModule } from '@swimlane/ngx-datatable'; +import { FileUploadModule } from 'ng2-file-upload'; + +import { BasicFormComponent } from './basic-form/basic-form.component'; +import { RichTextEditorComponent } from './rich-text-editor/rich-text-editor.component'; +import { FileUploadComponent } from './file-upload/file-upload.component'; + +import { FormsRoutes } from './forms.routing'; +import { WizardComponent } from './wizard/wizard.component'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + MatInputModule, + MatListModule, + MatCardModule, + MatDatepickerModule, + MatNativeDateModule, + MatProgressBarModule, + MatRadioModule, + MatCheckboxModule, + MatButtonModule, + MatIconModule, + MatStepperModule, + FlexLayoutModule, + NgxDatatableModule, + FileUploadModule, + RouterModule.forChild(FormsRoutes) + ], + declarations: [ + BasicFormComponent, + RichTextEditorComponent, + FileUploadComponent, + WizardComponent + ] +}) +export class AppFormsModule {} diff --git a/src/app/views/forms/forms.routing.ts b/src/app/views/forms/forms.routing.ts new file mode 100644 index 0000000..7b027a7 --- /dev/null +++ b/src/app/views/forms/forms.routing.ts @@ -0,0 +1,29 @@ +import { Routes } from '@angular/router'; + +import { BasicFormComponent } from './basic-form/basic-form.component'; +import { RichTextEditorComponent } from './rich-text-editor/rich-text-editor.component'; +import { FileUploadComponent } from './file-upload/file-upload.component'; +import { WizardComponent } from './wizard/wizard.component'; + +export const FormsRoutes: Routes = [ + { + path: '', + children: [{ + path: 'basic', + component: BasicFormComponent, + data: { title: 'Basic', breadcrumb: 'Basic' } + }, { + path: 'editor', + component: RichTextEditorComponent, + data: { title: 'Editor', breadcrumb: 'Editor' } + }, { + path: 'upload', + component: FileUploadComponent, + data: { title: 'Upload', breadcrumb: 'Upload' } + }, { + path: 'wizard', + component: WizardComponent, + data: { title: 'Wizard', breadcrumb: 'Wizard' } + }] + } +]; \ No newline at end of file diff --git a/src/app/views/forms/rich-text-editor/rich-text-editor.component.css b/src/app/views/forms/rich-text-editor/rich-text-editor.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/forms/rich-text-editor/rich-text-editor.component.html b/src/app/views/forms/rich-text-editor/rich-text-editor.component.html new file mode 100644 index 0000000..a2f7b1f --- /dev/null +++ b/src/app/views/forms/rich-text-editor/rich-text-editor.component.html @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/app/views/forms/rich-text-editor/rich-text-editor.component.ts b/src/app/views/forms/rich-text-editor/rich-text-editor.component.ts new file mode 100644 index 0000000..fb07ee0 --- /dev/null +++ b/src/app/views/forms/rich-text-editor/rich-text-editor.component.ts @@ -0,0 +1,26 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-rich-text-editor', + templateUrl: './rich-text-editor.component.html', + styleUrls: [ + './rich-text-editor.component.css' + ] +}) +export class RichTextEditorComponent implements OnInit { + + editorData = `

MatX | Angular material admin

+

UI Lib

+


Lorem Ipsum +  is simply dummy text of the printing and typesetting industry. + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a + galley of type and scrambled it to make a type specimen book. It has survived not only five centuries

`; + + constructor() { } + + ngOnInit() { + } + + onContentChanged() { } + onSelectionChanged() { } +} diff --git a/src/app/views/forms/wizard/wizard.component.css b/src/app/views/forms/wizard/wizard.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/forms/wizard/wizard.component.html b/src/app/views/forms/wizard/wizard.component.html new file mode 100644 index 0000000..4bec4b8 --- /dev/null +++ b/src/app/views/forms/wizard/wizard.component.html @@ -0,0 +1,91 @@ + + +
Horizontal
+ +
+ + + +
+ Fill out your name + + + +
+ +
+
+
+ +
+ Fill out your address + + + +
+ + + +
+
+
+ + Done +
+ check +
+
You Are Done.
+
+ + + +
+
+
+
+
+ + + +
Verticle
+ +
+ + + +
+ Fill out your name + + + +
+ +
+
+
+ +
+ Fill out your address + + + +
+ + + +
+
+
+ + Done +
+ check +
+
You Are Done.
+
+ +
+
+
+
+
\ No newline at end of file diff --git a/src/app/views/forms/wizard/wizard.component.ts b/src/app/views/forms/wizard/wizard.component.ts new file mode 100644 index 0000000..a3b56f4 --- /dev/null +++ b/src/app/views/forms/wizard/wizard.component.ts @@ -0,0 +1,28 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; + +@Component({ + selector: 'app-wizard', + templateUrl: './wizard.component.html', + styleUrls: ['./wizard.component.css'] +}) +export class WizardComponent implements OnInit { + firstFormGroup: FormGroup; + secondFormGroup: FormGroup; + + constructor(private fb: FormBuilder) { } + + ngOnInit() { + this.firstFormGroup = this.fb.group({ + firstCtrl: ['', Validators.required] + }); + this.secondFormGroup = this.fb.group({ + secondCtrl: ['', Validators.required] + }); + } + + submit() { + console.log(this.firstFormGroup.value); + console.log(this.secondFormGroup.value); + } +} diff --git a/src/app/views/mat-icons/mat-icons.component.css b/src/app/views/mat-icons/mat-icons.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/mat-icons/mat-icons.component.html b/src/app/views/mat-icons/mat-icons.component.html new file mode 100644 index 0000000..debfa20 --- /dev/null +++ b/src/app/views/mat-icons/mat-icons.component.html @@ -0,0 +1,35 @@ + + +
Easy to use
+
+ +

HTML

+

<mat-icon>3d_rotation</mat-icon>

+

Output

+ 3d_rotation +
+
+ + + +
Material icon list
+
+ +
+
+ {{icon}}
+
{{icon}}
+
+
+
+
diff --git a/src/app/views/mat-icons/mat-icons.component.ts b/src/app/views/mat-icons/mat-icons.component.ts new file mode 100644 index 0000000..318fced --- /dev/null +++ b/src/app/views/mat-icons/mat-icons.component.ts @@ -0,0 +1,14 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-mat-icons', + templateUrl: './mat-icons.component.html', + styleUrls: ['./mat-icons.component.css'] +}) +export class MatIconsComponent implements OnInit { + + constructor() { } + + ngOnInit() { } + icons = ['3d_rotation', 'ac_unit', 'access_alarm', 'access_alarms', 'access_time', 'accessibility', 'accessible', 'account_balance', 'account_balance_wallet', 'account_box', 'account_circle', 'adb', 'add', 'add_a_photo', 'add_alarm', 'add_alert', 'add_box', 'add_circle', 'add_circle_outline', 'add_location', 'add_shopping_cart', 'add_to_photos', 'add_to_queue', 'adjust', 'airline_seat_flat', 'airline_seat_flat_angled', 'airline_seat_individual_suite', 'airline_seat_legroom_extra', 'airline_seat_legroom_normal', 'airline_seat_legroom_reduced', 'airline_seat_recline_extra', 'airline_seat_recline_normal', 'airplanemode_active', 'airplanemode_inactive', 'airplay', 'airport_shuttle', 'alarm', 'alarm_add', 'alarm_off', 'alarm_on', 'album', 'all_inclusive', 'all_out', 'android', 'announcement', 'apps', 'archive', 'arrow_back', 'arrow_downward', 'arrow_drop_down', 'arrow_drop_down_circle', 'arrow_drop_up', 'arrow_forward', 'arrow_upward', 'art_track', 'aspect_ratio', 'assessment', 'assignment', 'assignment_ind', 'assignment_late', 'assignment_return', 'assignment_returned', 'assignment_turned_in', 'assistant', 'assistant_photo', 'attach_file', 'attach_money', 'attachment', 'audiotrack', 'autorenew', 'av_timer', 'backspace', 'backup', 'battery_alert', 'battery_charging_full', 'battery_full', 'battery_std', 'battery_unknown', 'beach_access', 'beenhere', 'block', 'bluetooth', 'bluetooth_audio', 'bluetooth_connected', 'bluetooth_disabled', 'bluetooth_searching', 'blur_circular', 'blur_linear', 'blur_off', 'blur_on', 'book', 'bookmark', 'bookmark_border', 'border_all', 'border_bottom', 'border_clear', 'border_color', 'border_horizontal', 'border_inner', 'border_left', 'border_outer', 'border_right', 'border_style', 'border_top', 'border_vertical', 'branding_watermark', 'brightness_1', 'brightness_2', 'brightness_3', 'brightness_4', 'brightness_5', 'brightness_6', 'brightness_7', 'brightness_auto', 'brightness_high', 'brightness_low', 'brightness_medium', 'broken_image', 'brush', 'bubble_chart', 'bug_report', 'build', 'burst_mode', 'business', 'business_center', 'cached', 'cake', 'call', 'call_end', 'call_made', 'call_merge', 'call_missed', 'call_missed_outgoing', 'call_received', 'call_split', 'call_to_action', 'camera', 'camera_alt', 'camera_enhance', 'camera_front', 'camera_rear', 'camera_roll', 'cancel', 'card_giftcard', 'card_membership', 'card_travel', 'casino', 'cast', 'cast_connected', 'center_focus_strong', 'center_focus_weak', 'change_history', 'chat', 'chat_bubble', 'chat_bubble_outline', 'check', 'check_box', 'check_box_outline_blank', 'check_circle', 'chevron_left', 'chevron_right', 'child_care', 'child_friendly', 'chrome_reader_mode', 'class', 'clear', 'clear_all', 'close', 'closed_caption', 'cloud', 'cloud_circle', 'cloud_done', 'cloud_download', 'cloud_off', 'cloud_queue', 'cloud_upload', 'code', 'collections', 'collections_bookmark', 'color_lens', 'colorize', 'comment', 'compare', 'compare_arrows', 'computer', 'confirmation_number', 'contact_mail', 'contact_phone', 'contacts', 'content_copy', 'content_cut', 'content_paste', 'control_point', 'control_point_duplicate', 'copyright', 'create', 'create_new_folder', 'credit_card', 'crop', 'crop_16_9', 'crop_3_2', 'crop_5_4', 'crop_7_5', 'crop_din', 'crop_free', 'crop_landscape', 'crop_original', 'crop_portrait', 'crop_rotate', 'crop_square', 'dashboard', 'data_usage', 'date_range', 'dehaze', 'delete', 'delete_forever', 'delete_sweep', 'description', 'desktop_mac', 'desktop_windows', 'details', 'developer_board', 'developer_mode', 'device_hub', 'devices', 'devices_other', 'dialer_sip', 'dialpad', 'directions', 'directions_bike', 'directions_boat', 'directions_bus', 'directions_car', 'directions_railway', 'directions_run', 'directions_subway', 'directions_transit', 'directions_walk', 'disc_full', 'dns', 'do_not_disturb', 'do_not_disturb_alt', 'do_not_disturb_off', 'do_not_disturb_on', 'dock', 'domain', 'done', 'done_all', 'donut_large', 'donut_small', 'drafts', 'drag_handle', 'drive_eta', 'dvr', 'edit', 'edit_location', 'eject', 'email', 'enhanced_encryption', 'equalizer', 'error', 'error_outline', 'euro_symbol', 'ev_station', 'event', 'event_available', 'event_busy', 'event_note', 'event_seat', 'exit_to_app', 'expand_less', 'expand_more', 'explicit', 'explore', 'exposure', 'exposure_neg_1', 'exposure_neg_2', 'exposure_plus_1', 'exposure_plus_2', 'exposure_zero', 'extension', 'face', 'fast_forward', 'fast_rewind', 'favorite', 'favorite_border', 'featured_play_list', 'featured_video', 'feedback', 'fiber_dvr', 'fiber_manual_record', 'fiber_new', 'fiber_pin', 'fiber_smart_record', 'file_download', 'file_upload', 'filter', 'filter_1', 'filter_2', 'filter_3', 'filter_4', 'filter_5', 'filter_6', 'filter_7', 'filter_8', 'filter_9', 'filter_9_plus', 'filter_b_and_w', 'filter_center_focus', 'filter_drama', 'filter_frames', 'filter_hdr', 'filter_list', 'filter_none', 'filter_tilt_shift', 'filter_vintage', 'find_in_page', 'find_replace', 'fingerprint', 'first_page', 'fitness_center', 'flag', 'flare', 'flash_auto', 'flash_off', 'flash_on', 'flight', 'flight_land', 'flight_takeoff', 'flip', 'flip_to_back', 'flip_to_front', 'folder', 'folder_open', 'folder_shared', 'folder_special', 'font_download', 'format_align_center', 'format_align_justify', 'format_align_left', 'format_align_right', 'format_bold', 'format_clear', 'format_color_fill', 'format_color_reset', 'format_color_text', 'format_indent_decrease', 'format_indent_increase', 'format_italic', 'format_line_spacing', 'format_list_bulleted', 'format_list_numbered', 'format_paint', 'format_quote', 'format_shapes', 'format_size', 'format_strikethrough', 'format_textdirection_l_to_r', 'format_textdirection_r_to_l', 'format_underlined', 'forum', 'forward', 'forward_10', 'forward_30', 'forward_5', 'free_breakfast', 'fullscreen', 'fullscreen_exit', 'functions', 'g_translate', 'gamepad', 'games', 'gavel', 'gesture', 'get_app', 'gif', 'golf_course', 'gps_fixed', 'gps_not_fixed', 'gps_off', 'grade', 'gradient', 'grain', 'graphic_eq', 'grid_off', 'grid_on', 'group', 'group_add', 'group_work', 'hd', 'hdr_off', 'hdr_on', 'hdr_strong', 'hdr_weak', 'headset', 'headset_mic', 'healing', 'hearing', 'help', 'help_outline', 'high_quality', 'highlight', 'highlight_off', 'history', 'home', 'hot_tub', 'hotel', 'hourglass_empty', 'hourglass_full', 'http', 'https', 'image', 'image_aspect_ratio', 'import_contacts', 'import_export', 'important_devices', 'inbox', 'indeterminate_check_box', 'info', 'info_outline', 'input', 'insert_chart', 'insert_comment', 'insert_drive_file', 'insert_emoticon', 'insert_invitation', 'insert_link', 'insert_photo', 'invert_colors', 'invert_colors_off', 'iso', 'keyboard', 'keyboard_arrow_down', 'keyboard_arrow_left', 'keyboard_arrow_right', 'keyboard_arrow_up', 'keyboard_backspace', 'keyboard_capslock', 'keyboard_hide', 'keyboard_return', 'keyboard_tab', 'keyboard_voice', 'kitchen', 'label', 'label_outline', 'landscape', 'language', 'laptop', 'laptop_chromebook', 'laptop_mac', 'laptop_windows', 'last_page', 'launch', 'layers', 'layers_clear', 'leak_add', 'leak_remove', 'lens', 'library_add', 'library_books', 'library_music', 'lightbulb_outline', 'line_style', 'line_weight', 'linear_scale', 'link', 'linked_camera', 'list', 'live_help', 'live_tv', 'local_activity', 'local_airport', 'local_atm', 'local_bar', 'local_cafe', 'local_car_wash', 'local_convenience_store', 'local_dining', 'local_drink', 'local_florist', 'local_gas_station', 'local_grocery_store', 'local_hospital', 'local_hotel', 'local_laundry_service', 'local_library', 'local_mall', 'local_movies', 'local_offer', 'local_parking', 'local_pharmacy', 'local_phone', 'local_pizza', 'local_play', 'local_post_office', 'local_printshop', 'local_see', 'local_shipping', 'local_taxi', 'location_city', 'location_disabled', 'location_off', 'location_on', 'location_searching', 'lock', 'lock_open', 'lock_outline', 'looks', 'looks_3', 'looks_4', 'looks_5', 'looks_6', 'looks_one', 'looks_two', 'loop', 'loupe', 'low_priority', 'loyalty', 'mail', 'mail_outline', 'map', 'markunread', 'markunread_mailbox', 'memory', 'menu', 'merge_type', 'message', 'mic', 'mic_none', 'mic_off', 'mms', 'mode_comment', 'mode_edit', 'monetization_on', 'money_off', 'monochrome_photos', 'mood', 'mood_bad', 'more', 'more_horiz', 'more_vert', 'motorcycle', 'mouse', 'move_to_inbox', 'movie', 'movie_creation', 'movie_filter', 'multiline_chart', 'music_note', 'music_video', 'my_location', 'nature', 'nature_people', 'navigate_before', 'navigate_next', 'navigation', 'near_me', 'network_cell', 'network_check', 'network_locked', 'network_wifi', 'new_releases', 'next_week', 'nfc', 'no_encryption', 'no_sim', 'not_interested', 'note', 'note_add', 'notifications', 'notifications_active', 'notifications_none', 'notifications_off', 'notifications_paused', 'offline_pin', 'ondemand_video', 'opacity', 'open_in_browser', 'open_in_new', 'open_with', 'pages', 'pageview', 'palette', 'pan_tool', 'panorama', 'panorama_fish_eye', 'panorama_horizontal', 'panorama_vertical', 'panorama_wide_angle', 'party_mode', 'pause', 'pause_circle_filled', 'pause_circle_outline', 'payment', 'people', 'people_outline', 'perm_camera_mic', 'perm_contact_calendar', 'perm_data_setting', 'perm_device_information', 'perm_identity', 'perm_media', 'perm_phone_msg', 'perm_scan_wifi', 'person', 'person_add', 'person_outline', 'person_pin', 'person_pin_circle', 'personal_video', 'pets', 'phone', 'phone_android', 'phone_bluetooth_speaker', 'phone_forwarded', 'phone_in_talk', 'phone_iphone', 'phone_locked', 'phone_missed', 'phone_paused', 'phonelink', 'phonelink_erase', 'phonelink_lock', 'phonelink_off', 'phonelink_ring', 'phonelink_setup', 'photo', 'photo_album', 'photo_camera', 'photo_filter', 'photo_library', 'photo_size_select_actual', 'photo_size_select_large', 'photo_size_select_small', 'picture_as_pdf', 'picture_in_picture', 'picture_in_picture_alt', 'pie_chart', 'pie_chart_outlined', 'pin_drop', 'place', 'play_arrow', 'play_circle_filled', 'play_circle_outline', 'play_for_work', 'playlist_add', 'playlist_add_check', 'playlist_play', 'plus_one', 'poll', 'polymer', 'pool', 'portable_wifi_off', 'portrait', 'power', 'power_input', 'power_settings_new', 'pregnant_woman', 'present_to_all', 'print', 'priority_high', 'public', 'publish', 'query_builder', 'question_answer', 'queue', 'queue_music', 'queue_play_next', 'radio', 'radio_button_checked', 'radio_button_unchecked', 'rate_review', 'receipt', 'recent_actors', 'record_voice_over', 'redeem', 'redo', 'refresh', 'remove', 'remove_circle', 'remove_circle_outline', 'remove_from_queue', 'remove_red_eye', 'remove_shopping_cart', 'reorder', 'repeat', 'repeat_one', 'replay', 'replay_10', 'replay_30', 'replay_5', 'reply', 'reply_all', 'report', 'report_problem', 'restaurant', 'restaurant_menu', 'restore', 'restore_page', 'ring_volume', 'room', 'room_service', 'rotate_90_degrees_ccw', 'rotate_left', 'rotate_right', 'rounded_corner', 'router', 'rowing', 'rss_feed', 'rv_hookup', 'satellite', 'save', 'scanner', 'schedule', 'school', 'screen_lock_landscape', 'screen_lock_portrait', 'screen_lock_rotation', 'screen_rotation', 'screen_share', 'sd_card', 'sd_storage', 'search', 'security', 'select_all', 'send', 'sentiment_dissatisfied', 'sentiment_neutral', 'sentiment_satisfied', 'sentiment_very_dissatisfied', 'sentiment_very_satisfied', 'settings', 'settings_applications', 'settings_backup_restore', 'settings_bluetooth', 'settings_brightness', 'settings_cell', 'settings_ethernet', 'settings_input_antenna', 'settings_input_component', 'settings_input_composite', 'settings_input_hdmi', 'settings_input_svideo', 'settings_overscan', 'settings_phone', 'settings_power', 'settings_remote', 'settings_system_daydream', 'settings_voice', 'share', 'shop', 'shop_two', 'shopping_basket', 'shopping_cart', 'short_text', 'show_chart', 'shuffle', 'signal_cellular_4_bar', 'signal_cellular_connected_no_internet_4_bar', 'signal_cellular_no_sim', 'signal_cellular_null', 'signal_cellular_off', 'signal_wifi_4_bar', 'signal_wifi_4_bar_lock', 'signal_wifi_off', 'sim_card', 'sim_card_alert', 'skip_next', 'skip_previous', 'slideshow', 'slow_motion_video', 'smartphone', 'smoke_free', 'smoking_rooms', 'sms', 'sms_failed', 'snooze', 'sort', 'sort_by_alpha', 'spa', 'space_bar', 'speaker', 'speaker_group', 'speaker_notes', 'speaker_notes_off', 'speaker_phone', 'spellcheck', 'star', 'star_border', 'star_half', 'stars', 'stay_current_landscape', 'stay_current_portrait', 'stay_primary_landscape', 'stay_primary_portrait', 'stop', 'stop_screen_share', 'storage', 'store', 'store_mall_directory', 'straighten', 'streetview', 'strikethrough_s', 'style', 'subdirectory_arrow_left', 'subdirectory_arrow_right', 'subject', 'subscriptions', 'subtitles', 'subway', 'supervisor_account', 'surround_sound', 'swap_calls', 'swap_horiz', 'swap_vert', 'swap_vertical_circle', 'switch_camera', 'switch_video', 'sync', 'sync_disabled', 'sync_problem', 'system_update', 'system_update_alt', 'tab', 'tab_unselected', 'tablet', 'tablet_android', 'tablet_mac', 'tag_faces', 'tap_and_play', 'terrain', 'text_fields', 'text_format', 'textsms', 'texture', 'theaters', 'thumb_down', 'thumb_up', 'thumbs_up_down', 'time_to_leave', 'timelapse', 'timeline', 'timer', 'timer_10', 'timer_3', 'timer_off', 'title', 'toc', 'today', 'toll', 'tonality', 'touch_app', 'toys', 'track_changes', 'traffic', 'train', 'tram', 'transfer_within_a_station', 'transform', 'translate', 'trending_down', 'trending_flat', 'trending_up', 'tune', 'turned_in', 'turned_in_not', 'tv', 'unarchive', 'undo', 'unfold_less', 'unfold_more', 'update', 'usb', 'verified_user', 'vertical_align_bottom', 'vertical_align_center', 'vertical_align_top', 'vibration', 'video_call', 'video_label', 'video_library', 'videocam', 'videocam_off', 'videogame_asset', 'view_agenda', 'view_array', 'view_carousel', 'view_column', 'view_comfy', 'view_compact', 'view_day', 'view_headline', 'view_list', 'view_module', 'view_quilt', 'view_stream', 'view_week', 'vignette', 'visibility', 'visibility_off', 'voice_chat', 'voicemail', 'volume_down', 'volume_mute', 'volume_off', 'volume_up', 'vpn_key', 'vpn_lock', 'wallpaper', 'warning', 'watch', 'watch_later', 'wb_auto', 'wb_cloudy', 'wb_incandescent', 'wb_iridescent', 'wb_sunny', 'wc', 'web', 'web_asset', 'weekend', 'whatshot', 'widgets', 'wifi', 'wifi_lock', 'wifi_tethering', 'work', 'wrap_text', 'youtube_searched_for', 'zoom_in', 'zoom_out', 'zoom_out_map'] +} diff --git a/src/app/views/mat-icons/mat-icons.module.ts b/src/app/views/mat-icons/mat-icons.module.ts new file mode 100644 index 0000000..6b91c6e --- /dev/null +++ b/src/app/views/mat-icons/mat-icons.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { MatCardModule } from '@angular/material/card'; +import { MatIconModule } from '@angular/material/icon'; +import { FlexLayoutModule } from '@angular/flex-layout'; + +import { MatIconsComponent } from './mat-icons.component'; +import { MatIconsRoutes } from "./mat-icons.routing"; + +@NgModule({ + imports: [ + CommonModule, + MatCardModule, + MatIconModule, + FlexLayoutModule, + RouterModule.forChild(MatIconsRoutes) + ], + declarations: [MatIconsComponent] +}) +export class MatIconsModule { } diff --git a/src/app/views/mat-icons/mat-icons.routing.ts b/src/app/views/mat-icons/mat-icons.routing.ts new file mode 100644 index 0000000..5c61623 --- /dev/null +++ b/src/app/views/mat-icons/mat-icons.routing.ts @@ -0,0 +1,8 @@ +import { Routes } from '@angular/router'; + +import { MatIconsComponent } from './mat-icons.component'; + + +export const MatIconsRoutes: Routes = [ + { path: '', component: MatIconsComponent, data: { title: 'Material icons' } } +]; \ No newline at end of file diff --git a/src/app/views/material-components/mat-kits/mat-kits.component.html b/src/app/views/material-components/mat-kits/mat-kits.component.html new file mode 100644 index 0000000..5883909 --- /dev/null +++ b/src/app/views/material-components/mat-kits/mat-kits.component.html @@ -0,0 +1,11 @@ + + +

Matx includes all the components from + Angular material library. + It has SharedMaterialModule which you can use in your + module to get access of Material components. +

+ + Browse available Components +
+
\ No newline at end of file diff --git a/src/app/views/material-components/mat-kits/mat-kits.component.scss b/src/app/views/material-components/mat-kits/mat-kits.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/material-components/mat-kits/mat-kits.component.spec.ts b/src/app/views/material-components/mat-kits/mat-kits.component.spec.ts new file mode 100644 index 0000000..45c0268 --- /dev/null +++ b/src/app/views/material-components/mat-kits/mat-kits.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MatKitsComponent } from './mat-kits.component'; + +describe('MatKitsComponent', () => { + let component: MatKitsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MatKitsComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MatKitsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/material-components/mat-kits/mat-kits.component.ts b/src/app/views/material-components/mat-kits/mat-kits.component.ts new file mode 100644 index 0000000..d6449a0 --- /dev/null +++ b/src/app/views/material-components/mat-kits/mat-kits.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-mat-kits', + templateUrl: './mat-kits.component.html', + styleUrls: ['./mat-kits.component.scss'] +}) +export class MatKitsComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/views/material-components/material-components-routing.module.ts b/src/app/views/material-components/material-components-routing.module.ts new file mode 100644 index 0000000..3813993 --- /dev/null +++ b/src/app/views/material-components/material-components-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { MatKitsComponent } from '../material-components/mat-kits/mat-kits.component'; + + +const routes: Routes = [ + { + path: '', + component: MatKitsComponent + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], +exports: [RouterModule] +}) +export class MaterialComponentsRoutingModule { } diff --git a/src/app/views/material-components/material-components.module.ts b/src/app/views/material-components/material-components.module.ts new file mode 100644 index 0000000..8d41179 --- /dev/null +++ b/src/app/views/material-components/material-components.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { MaterialComponentsRoutingModule } from './material-components-routing.module'; +import { MatKitsComponent } from './mat-kits/mat-kits.component'; +import { SharedMaterialModule } from '../../shared/shared-material.module'; + + +@NgModule({ + declarations: [MatKitsComponent], + imports: [ + CommonModule, + SharedMaterialModule, + MaterialComponentsRoutingModule + ] +}) +export class MaterialComponentsModule { } diff --git a/src/app/views/order/order-cost-list/order-cost-list.component.html b/src/app/views/order/order-cost-list/order-cost-list.component.html new file mode 100644 index 0000000..8c27a76 --- /dev/null +++ b/src/app/views/order/order-cost-list/order-cost-list.component.html @@ -0,0 +1,3 @@ +

+ order-cost-list works! +

diff --git a/src/app/views/order/order-cost-list/order-cost-list.component.scss b/src/app/views/order/order-cost-list/order-cost-list.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/order/order-cost-list/order-cost-list.component.spec.ts b/src/app/views/order/order-cost-list/order-cost-list.component.spec.ts new file mode 100644 index 0000000..8244014 --- /dev/null +++ b/src/app/views/order/order-cost-list/order-cost-list.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OrderCostListComponent } from './order-cost-list.component'; + +describe('OrderCostListComponent', () => { + let component: OrderCostListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OrderCostListComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderCostListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/order/order-cost-list/order-cost-list.component.ts b/src/app/views/order/order-cost-list/order-cost-list.component.ts new file mode 100644 index 0000000..6435803 --- /dev/null +++ b/src/app/views/order/order-cost-list/order-cost-list.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-order-cost-list', + templateUrl: './order-cost-list.component.html', + styleUrls: ['./order-cost-list.component.scss'] +}) +export class OrderCostListComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/views/order/order-detail/order-detail.component.html b/src/app/views/order/order-detail/order-detail.component.html new file mode 100644 index 0000000..a160895 --- /dev/null +++ b/src/app/views/order/order-detail/order-detail.component.html @@ -0,0 +1,4 @@ +

+ order-detail works! +

+ \ No newline at end of file diff --git a/src/app/views/order/order-detail/order-detail.component.scss b/src/app/views/order/order-detail/order-detail.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/order/order-detail/order-detail.component.spec.ts b/src/app/views/order/order-detail/order-detail.component.spec.ts new file mode 100644 index 0000000..a5478ce --- /dev/null +++ b/src/app/views/order/order-detail/order-detail.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OrderDetailComponent } from './order-detail.component'; + +describe('OrderDetailComponent', () => { + let component: OrderDetailComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OrderDetailComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/order/order-detail/order-detail.component.ts b/src/app/views/order/order-detail/order-detail.component.ts new file mode 100644 index 0000000..73f5850 --- /dev/null +++ b/src/app/views/order/order-detail/order-detail.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-order-detail', + templateUrl: './order-detail.component.html', + styleUrls: ['./order-detail.component.scss'] +}) +export class OrderDetailComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/views/order/order-list/order-list.component.html b/src/app/views/order/order-list/order-list.component.html new file mode 100644 index 0000000..7fbfc24 --- /dev/null +++ b/src/app/views/order/order-list/order-list.component.html @@ -0,0 +1,5 @@ +

+ order-list works! +

+ + diff --git a/src/app/views/order/order-list/order-list.component.scss b/src/app/views/order/order-list/order-list.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/order/order-list/order-list.component.spec.ts b/src/app/views/order/order-list/order-list.component.spec.ts new file mode 100644 index 0000000..2688bcf --- /dev/null +++ b/src/app/views/order/order-list/order-list.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OrderListComponent } from './order-list.component'; + +describe('OrderListComponent', () => { + let component: OrderListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OrderListComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/order/order-list/order-list.component.ts b/src/app/views/order/order-list/order-list.component.ts new file mode 100644 index 0000000..1b406f6 --- /dev/null +++ b/src/app/views/order/order-list/order-list.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-order-list', + templateUrl: './order-list.component.html', + styleUrls: ['./order-list.component.scss'] +}) +export class OrderListComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/views/order/order-routing.module.ts b/src/app/views/order/order-routing.module.ts new file mode 100644 index 0000000..f1b3044 --- /dev/null +++ b/src/app/views/order/order-routing.module.ts @@ -0,0 +1,33 @@ +import { NgModule } from "@angular/core"; +import { Routes, RouterModule } from "@angular/router"; +import { OrderCostListComponent } from "./order-cost-list/order-cost-list.component"; +import { OrderDetailComponent } from "./order-detail/order-detail.component"; +import { OrderListComponent } from "./order-list/order-list.component"; + +const routes: Routes = [ + { + path: "", + component: OrderListComponent + }, + { + path: ":id", + data: { title: "Order Details", breadcrumb: "Order id: {{id}}" }, + children: [ + { + path: "", + component: OrderDetailComponent + }, + { + path: "costs", + component: OrderCostListComponent, + data: { title: "Costs", breadcrumb: "Costs" } + } + ] + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class OrderRoutingModule {} diff --git a/src/app/views/order/order.module.ts b/src/app/views/order/order.module.ts new file mode 100644 index 0000000..2a18b0e --- /dev/null +++ b/src/app/views/order/order.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from "@angular/core"; +import { CommonModule } from "@angular/common"; + +import { OrderRoutingModule } from "./order-routing.module"; +import { OrderListComponent } from "./order-list/order-list.component"; +import { OrderDetailComponent } from "./order-detail/order-detail.component"; +import { OrderCostListComponent } from "./order-cost-list/order-cost-list.component"; +import { SharedMaterialModule } from "app/shared/shared-material.module"; + +@NgModule({ + declarations: [ + OrderListComponent, + OrderDetailComponent, + OrderCostListComponent + ], + imports: [CommonModule, SharedMaterialModule, OrderRoutingModule] +}) +export class OrderModule {} diff --git a/src/app/views/order/order.service.ts b/src/app/views/order/order.service.ts new file mode 100644 index 0000000..c20ec33 --- /dev/null +++ b/src/app/views/order/order.service.ts @@ -0,0 +1,9 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class OrderService { + + constructor() { } +} diff --git a/src/app/views/others/app-blank/app-blank.component.css b/src/app/views/others/app-blank/app-blank.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/others/app-blank/app-blank.component.html b/src/app/views/others/app-blank/app-blank.component.html new file mode 100644 index 0000000..ce7090c --- /dev/null +++ b/src/app/views/others/app-blank/app-blank.component.html @@ -0,0 +1,3 @@ +

+ This is a blank component. +

diff --git a/src/app/views/others/app-blank/app-blank.component.ts b/src/app/views/others/app-blank/app-blank.component.ts new file mode 100644 index 0000000..9dfb754 --- /dev/null +++ b/src/app/views/others/app-blank/app-blank.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-blank', + templateUrl: './app-blank.component.html', + styleUrls: ['./app-blank.component.css'] +}) +export class AppBlankComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/views/others/others.module.ts b/src/app/views/others/others.module.ts new file mode 100644 index 0000000..5b60e73 --- /dev/null +++ b/src/app/views/others/others.module.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatChipsModule } from '@angular/material/chips'; +import { MatGridListModule } from '@angular/material/grid-list'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatTabsModule } from '@angular/material/tabs'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { NgxDatatableModule } from '@swimlane/ngx-datatable'; +import { FileUploadModule } from 'ng2-file-upload'; +import { SharedModule } from './../../shared/shared.module'; +import { SharedMaterialModule } from 'app/shared/shared-material.module'; + +import { AppBlankComponent } from './app-blank/app-blank.component'; +import { OthersRoutes } from './others.routing'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + SharedMaterialModule, + FlexLayoutModule, + NgxDatatableModule, + FileUploadModule, + SharedModule, + RouterModule.forChild(OthersRoutes) + ], + declarations: [ + AppBlankComponent + ] +}) +export class OthersModule {} diff --git a/src/app/views/others/others.routing.ts b/src/app/views/others/others.routing.ts new file mode 100644 index 0000000..5fbd070 --- /dev/null +++ b/src/app/views/others/others.routing.ts @@ -0,0 +1,17 @@ +import { Routes } from '@angular/router'; +import { AppBlankComponent } from './app-blank/app-blank.component'; +import { config } from 'config'; +import { UserRoleGuard } from '../../shared/guards/user-role.guard'; + + +export const OthersRoutes: Routes = [ + { + path: '', + children: [{ + path: 'blank', + canActivate: [UserRoleGuard], + component: AppBlankComponent, + data: { title: 'Blank', breadcrumb: 'Blank', roles: config.authRoles.sa } + }] + } +]; \ No newline at end of file diff --git a/src/app/views/search-view/country.service.ts b/src/app/views/search-view/country.service.ts new file mode 100644 index 0000000..8f49b8c --- /dev/null +++ b/src/app/views/search-view/country.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class CountryService { + + constructor( + private http: HttpClient + ) { } + + getCountries(name) { + return this.http.get('https://restcountries.eu/rest/v2/name/'+name); + } +} diff --git a/src/app/views/search-view/result-page/result-page.component.html b/src/app/views/search-view/result-page/result-page.component.html new file mode 100644 index 0000000..087e5e3 --- /dev/null +++ b/src/app/views/search-view/result-page/result-page.component.html @@ -0,0 +1,69 @@ +
+
+ Search result for "{{ searchService.searchTerm$ | async }}" +
+
+ +
+ + + + Flag + + + + + + + + + Name + + + {{ value }} + + + + + + Region + + + {{ value }} + + + + + + Capital + + + {{ value }} + + + + + + Population + + + {{ value }} + + + +
diff --git a/src/app/views/search-view/result-page/result-page.component.scss b/src/app/views/search-view/result-page/result-page.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/search-view/result-page/result-page.component.spec.ts b/src/app/views/search-view/result-page/result-page.component.spec.ts new file mode 100644 index 0000000..4d821d8 --- /dev/null +++ b/src/app/views/search-view/result-page/result-page.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ResultPageComponent } from './result-page.component'; + +describe('ResultPageComponent', () => { + let component: ResultPageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ResultPageComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ResultPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/search-view/result-page/result-page.component.ts b/src/app/views/search-view/result-page/result-page.component.ts new file mode 100644 index 0000000..2800e9d --- /dev/null +++ b/src/app/views/search-view/result-page/result-page.component.ts @@ -0,0 +1,32 @@ +import { Component, OnInit, OnDestroy } from "@angular/core"; +import { SearchService } from "app/shared/search/search.service"; +import { Observable, Subscription } from "rxjs"; +import { CountryService } from "../country.service"; + +@Component({ + selector: "app-result-page", + templateUrl: "./result-page.component.html", + styleUrls: ["./result-page.component.scss"] +}) +export class ResultPageComponent implements OnInit, OnDestroy { + countries$: Observable; + searchTermSub: Subscription; + + constructor( + public searchService: SearchService, + public countryService: CountryService + ) {} + + ngOnInit() { + this.searchTermSub = this.searchService.searchTerm$.subscribe(term => { + this.countries$ = this.countryService.getCountries(term); + }); + } + + ngOnDestroy() { + if (this.searchTermSub) { + this.searchTermSub.unsubscribe(); + } + } + +} diff --git a/src/app/views/search-view/search-view-routing.module.ts b/src/app/views/search-view/search-view-routing.module.ts new file mode 100644 index 0000000..c7aaf87 --- /dev/null +++ b/src/app/views/search-view/search-view-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { ResultPageComponent } from './result-page/result-page.component'; + +const routes: Routes = [ + { + path: '', + component: ResultPageComponent + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class SearchViewRoutingModule { } diff --git a/src/app/views/search-view/search-view.module.ts b/src/app/views/search-view/search-view.module.ts new file mode 100644 index 0000000..89aabc0 --- /dev/null +++ b/src/app/views/search-view/search-view.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from "@angular/core"; +import { CommonModule } from "@angular/common"; + +import { SearchViewRoutingModule } from "./search-view-routing.module"; +import { ResultPageComponent } from "./result-page/result-page.component"; +import { MatCardModule } from "@angular/material/card"; +import { SearchModule } from "app/shared/search/search.module"; +import { NgxDatatableModule } from "@swimlane/ngx-datatable"; + +@NgModule({ + declarations: [ResultPageComponent], + imports: [MatCardModule, CommonModule, NgxDatatableModule, SearchViewRoutingModule] +}) +export class SearchViewModule {} diff --git a/src/app/views/sessions/error/error.component.css b/src/app/views/sessions/error/error.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/sessions/error/error.component.html b/src/app/views/sessions/error/error.component.html new file mode 100644 index 0000000..f86272f --- /dev/null +++ b/src/app/views/sessions/error/error.component.html @@ -0,0 +1,22 @@ +
+
+
+ warning +
+

500

+
Server Error!
+
+
+ +
+ + +
+
+
diff --git a/src/app/views/sessions/error/error.component.ts b/src/app/views/sessions/error/error.component.ts new file mode 100644 index 0000000..725b557 --- /dev/null +++ b/src/app/views/sessions/error/error.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-error', + templateUrl: './error.component.html', + styleUrls: ['./error.component.css'] +}) +export class ErrorComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/views/sessions/forgot-password/forgot-password.component.css b/src/app/views/sessions/forgot-password/forgot-password.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/sessions/forgot-password/forgot-password.component.html b/src/app/views/sessions/forgot-password/forgot-password.component.html new file mode 100644 index 0000000..0f27b0e --- /dev/null +++ b/src/app/views/sessions/forgot-password/forgot-password.component.html @@ -0,0 +1,39 @@ +
+
+ + + +
+ +

New password will be sent to your email address

+
+
+ +
+ + + + Email is required +
+ + + +
+
+
+
+
+ diff --git a/src/app/views/sessions/forgot-password/forgot-password.component.ts b/src/app/views/sessions/forgot-password/forgot-password.component.ts new file mode 100644 index 0000000..f257749 --- /dev/null +++ b/src/app/views/sessions/forgot-password/forgot-password.component.ts @@ -0,0 +1,21 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatButton } from '@angular/material/button'; +import { MatProgressBar } from '@angular/material/progress-bar'; +@Component({ + selector: 'app-forgot-password', + templateUrl: './forgot-password.component.html', + styleUrls: ['./forgot-password.component.css'] +}) +export class ForgotPasswordComponent implements OnInit { + userEmail; + @ViewChild(MatProgressBar) progressBar: MatProgressBar; + @ViewChild(MatButton) submitButton: MatButton; + constructor() { } + + ngOnInit() { + } + submitEmail() { + this.submitButton.disabled = true; + this.progressBar.mode = 'indeterminate'; + } +} diff --git a/src/app/views/sessions/lockscreen/lockscreen.component.css b/src/app/views/sessions/lockscreen/lockscreen.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/sessions/lockscreen/lockscreen.component.html b/src/app/views/sessions/lockscreen/lockscreen.component.html new file mode 100644 index 0000000..5551baa --- /dev/null +++ b/src/app/views/sessions/lockscreen/lockscreen.component.html @@ -0,0 +1,37 @@ +
+
+ + + +
+
+ +
John Doe
+ Last seen 1 hour ago +
+
+
+ + + + Password is required +
+ + + +
+
+
+
+
+
+ diff --git a/src/app/views/sessions/lockscreen/lockscreen.component.ts b/src/app/views/sessions/lockscreen/lockscreen.component.ts new file mode 100644 index 0000000..1fb7805 --- /dev/null +++ b/src/app/views/sessions/lockscreen/lockscreen.component.ts @@ -0,0 +1,29 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatButton } from '@angular/material/button'; +import { MatProgressBar } from '@angular/material/progress-bar'; + +@Component({ + selector: 'app-lockscreen', + templateUrl: './lockscreen.component.html', + styleUrls: ['./lockscreen.component.css'] +}) +export class LockscreenComponent implements OnInit { + @ViewChild(MatProgressBar) progressBar: MatProgressBar; + @ViewChild(MatButton) submitButton: MatButton; + + lockscreenData = { + password: '' + } + + constructor() { } + + ngOnInit() { + } + + unlock() { + console.log(this.lockscreenData); + + this.submitButton.disabled = true; + this.progressBar.mode = 'indeterminate'; + } +} diff --git a/src/app/views/sessions/not-found/not-found.component.css b/src/app/views/sessions/not-found/not-found.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/sessions/not-found/not-found.component.html b/src/app/views/sessions/not-found/not-found.component.html new file mode 100644 index 0000000..f7c90fe --- /dev/null +++ b/src/app/views/sessions/not-found/not-found.component.html @@ -0,0 +1,23 @@ +
+
+
+ error +
+

404

+
Page Not Found!
+
+
+ +
+ + + +
+
+
diff --git a/src/app/views/sessions/not-found/not-found.component.ts b/src/app/views/sessions/not-found/not-found.component.ts new file mode 100644 index 0000000..029bd54 --- /dev/null +++ b/src/app/views/sessions/not-found/not-found.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-not-found', + templateUrl: './not-found.component.html', + styleUrls: ['./not-found.component.css'] +}) +export class NotFoundComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/views/sessions/sessions.module.ts b/src/app/views/sessions/sessions.module.ts new file mode 100644 index 0000000..2afb71e --- /dev/null +++ b/src/app/views/sessions/sessions.module.ts @@ -0,0 +1,41 @@ +import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; +import { SharedMaterialModule } from '../../shared/shared-material.module'; + +import { FlexLayoutModule } from '@angular/flex-layout'; +import { SharedComponentsModule } from '../../shared/components/shared-components.module'; + +// import { CommonDirectivesModule } from './sdirectives/common/common-directives.module'; +import { ForgotPasswordComponent } from './forgot-password/forgot-password.component'; +import { LockscreenComponent } from './lockscreen/lockscreen.component'; +import { SigninComponent } from './signin/signin.component'; +import { SignupComponent } from './signup/signup.component'; +import { SessionsRoutes } from './sessions.routing'; +import { NotFoundComponent } from './not-found/not-found.component'; +import { ErrorComponent } from './error/error.component'; + + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + SharedMaterialModule, + SharedComponentsModule, + FlexLayoutModule, + PerfectScrollbarModule, + RouterModule.forChild(SessionsRoutes), + ], + declarations: [ + ForgotPasswordComponent, + LockscreenComponent, + SigninComponent, + SignupComponent, + NotFoundComponent, + ErrorComponent + ], +}) +export class SessionsModule {} diff --git a/src/app/views/sessions/sessions.routing.ts b/src/app/views/sessions/sessions.routing.ts new file mode 100644 index 0000000..6e57ef3 --- /dev/null +++ b/src/app/views/sessions/sessions.routing.ts @@ -0,0 +1,47 @@ +import { Routes } from "@angular/router"; + +import { ForgotPasswordComponent } from "./forgot-password/forgot-password.component"; +import { LockscreenComponent } from "./lockscreen/lockscreen.component"; +import { SigninComponent } from "./signin/signin.component"; +import { SignupComponent } from "./signup/signup.component"; +import { NotFoundComponent } from "./not-found/not-found.component"; +import { ErrorComponent } from "./error/error.component"; + + +export const SessionsRoutes: Routes = [ + { + path: "", + children: [ + { + path: "signup", + component: SignupComponent, + data: { title: "Signup" }, + }, + { + path: "signin", + component: SigninComponent, + data: { title: "Signin" }, + }, + { + path: "forgot-password", + component: ForgotPasswordComponent, + data: { title: "Forgot password" }, + }, + { + path: "lockscreen", + component: LockscreenComponent, + data: { title: "Lockscreen" }, + }, + { + path: "404", + component: NotFoundComponent, + data: { title: "Not Found" }, + }, + { + path: "error", + component: ErrorComponent, + data: { title: "Error" }, + }, + ], + }, +]; diff --git a/src/app/views/sessions/signin/signin.component.html b/src/app/views/sessions/signin/signin.component.html new file mode 100644 index 0000000..b7299d4 --- /dev/null +++ b/src/app/views/sessions/signin/signin.component.html @@ -0,0 +1,94 @@ +
+
+ +
+
+ +
+
+ + +
+
+ + Email + + + + + Password + + + + Remember this computer + +
+ Sign in + or + Sign Up +
+ + +
+
+
+
diff --git a/src/app/views/sessions/signin/signin.component.scss b/src/app/views/sessions/signin/signin.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/sessions/signin/signin.component.spec.ts b/src/app/views/sessions/signin/signin.component.spec.ts new file mode 100644 index 0000000..4f50c36 --- /dev/null +++ b/src/app/views/sessions/signin/signin.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SigninComponent } from './signin.component'; + +describe('Signin4Component', () => { + let component: SigninComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SigninComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SigninComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/sessions/signin/signin.component.ts b/src/app/views/sessions/signin/signin.component.ts new file mode 100644 index 0000000..badcfec --- /dev/null +++ b/src/app/views/sessions/signin/signin.component.ts @@ -0,0 +1,87 @@ +import { Component, OnInit, AfterViewInit } from '@angular/core'; +import { + FormGroup, + FormBuilder, + Validators, + FormControl +} from '@angular/forms'; +import { CustomValidators } from 'ngx-custom-validators'; +import { matxAnimations } from 'app/shared/animations/matx-animations'; +import { JwtAuthService } from 'app/shared/services/auth/jwt-auth.service'; +import { AppLoaderService } from 'app/shared/services/app-loader/app-loader.service'; +import { Router, ActivatedRoute } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +@Component({ + selector: 'app-signin', + templateUrl: './signin.component.html', + styleUrls: ['./signin.component.scss'], + animations: matxAnimations +}) +export class SigninComponent implements OnInit, AfterViewInit { + signinForm: FormGroup; + errorMsg = ''; + return: string; + loading: Boolean; + + private _unsubscribeAll: Subject; + + constructor( + private jwtAuth: JwtAuthService, + private matxLoader: AppLoaderService, + private router: Router, + private route: ActivatedRoute + ) { + this._unsubscribeAll = new Subject(); + } + + ngOnInit() { + this.signinForm = new FormGroup({ + username: new FormControl('Watson', Validators.required), + password: new FormControl('12345678', Validators.required), + rememberMe: new FormControl(true) + }); + + this.route.queryParams + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(params => this.return = params['return'] || '/'); + } + + ngAfterViewInit() { + // setTimeout(() => { + //this.autoSignIn(); + // }) + } + + // tslint:disable-next-line: use-lifecycle-interface + ngOnDestroy() { + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + signin() { + const signinData = this.signinForm.value; + this.loading = true; + this.jwtAuth.signin(signinData.username, signinData.password) + .subscribe(response => { + this.loading = false; + this.router.navigateByUrl(this.return); + }, err => { + this.loading = false; + this.errorMsg = err.message; + }) + } + + autoSignIn() { + if (this.return === '/') { + return; + } + this.matxLoader.open(`Automatically Signing you in! \n Return url: ${this.return.substring(0, 20)}...`, {width: '320px'}); + setTimeout(() => { + this.signin(); + console.log('autoSignIn'); + this.matxLoader.close(); + }, 2000); + } +} diff --git a/src/app/views/sessions/signup/signup.component.html b/src/app/views/sessions/signup/signup.component.html new file mode 100644 index 0000000..d7f70fe --- /dev/null +++ b/src/app/views/sessions/signup/signup.component.html @@ -0,0 +1,85 @@ +
+
+ + +
+ +
+ +
+ +
+ + +
+
+ + + Username + + + + + Email + + + + + Password + + + + I agree with terms and conditions + +
+ + or + Sign In +
+ + + +
+
+
+
diff --git a/src/app/views/sessions/signup/signup.component.scss b/src/app/views/sessions/signup/signup.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/sessions/signup/signup.component.spec.ts b/src/app/views/sessions/signup/signup.component.spec.ts new file mode 100644 index 0000000..43e46a5 --- /dev/null +++ b/src/app/views/sessions/signup/signup.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SignupComponent } from './signup.component'; + +describe('SignupComponent', () => { + let component: SignupComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SignupComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SignupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/sessions/signup/signup.component.ts b/src/app/views/sessions/signup/signup.component.ts new file mode 100644 index 0000000..7045445 --- /dev/null +++ b/src/app/views/sessions/signup/signup.component.ts @@ -0,0 +1,43 @@ +import { Component, OnInit } from '@angular/core'; +import { + Validators, + FormControl, + FormBuilder, + FormGroup +} from '@angular/forms'; +import { CustomValidators } from 'ngx-custom-validators'; +import { matxAnimations } from 'app/shared/animations/matx-animations'; + +@Component({ + selector: 'app-signup', + templateUrl: './signup.component.html', + styleUrls: ['./signup.component.scss'], + animations: matxAnimations +}) +export class SignupComponent implements OnInit { + signupForm: FormGroup; + + constructor(private fb: FormBuilder) {} + + ngOnInit() { + const password = new FormControl('', Validators.required); + const confirmPassword = new FormControl( + '', + //CustomValidators.equalTo(password) + ); + + this.signupForm = this.fb.group({ + username: ['', Validators.required], + email: ['', [Validators.required, Validators.email]], + password: password, + agreed: [false, Validators.required] + }); + } + + onSubmit() { + if (!this.signupForm.invalid) { + // do what you wnat with your data + console.log(this.signupForm.value); + } + } +} diff --git a/src/app/views/tables/material-table/material-table.component.html b/src/app/views/tables/material-table/material-table.component.html new file mode 100644 index 0000000..a825579 --- /dev/null +++ b/src/app/views/tables/material-table/material-table.component.html @@ -0,0 +1,41 @@ +
+
+ + + + ID + {{row.id}} + + + + Progress + {{row.age}} + + + + Name + {{row.name}} + + + + Gender + {{row.gender}} + + + + Company + {{row.company}} + + + + Company + {{row.email}} + + + + + + + +
+
diff --git a/src/app/views/tables/material-table/material-table.component.scss b/src/app/views/tables/material-table/material-table.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/views/tables/material-table/material-table.component.spec.ts b/src/app/views/tables/material-table/material-table.component.spec.ts new file mode 100644 index 0000000..a3338d2 --- /dev/null +++ b/src/app/views/tables/material-table/material-table.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MaterialTableComponent } from './material-table.component'; + +describe('MaterialTableComponent', () => { + let component: MaterialTableComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MaterialTableComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MaterialTableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/views/tables/material-table/material-table.component.ts b/src/app/views/tables/material-table/material-table.component.ts new file mode 100644 index 0000000..4bfe375 --- /dev/null +++ b/src/app/views/tables/material-table/material-table.component.ts @@ -0,0 +1,30 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { TablesService } from '../tables.service'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatSort } from '@angular/material/sort'; +import { MatTableDataSource } from '@angular/material/table'; + +@Component({ + selector: 'app-material-table', + templateUrl: './material-table.component.html', + styleUrls: ['./material-table.component.scss'] +}) +export class MaterialTableComponent implements OnInit { + @ViewChild(MatPaginator) paginator: MatPaginator; + @ViewChild(MatSort) sort: MatSort; + + displayedColumns: string[] = []; + dataSource: any; + + constructor(private tableService: TablesService) { } + + ngOnInit() { + this.displayedColumns = this.tableService.getDataConf().map((c) => c.prop) + this.dataSource = new MatTableDataSource(this.tableService.getAll()); + } + ngAfterViewInit() { + this.dataSource.paginator = this.paginator; + this.dataSource.sort = this.sort; + } + +} diff --git a/src/app/views/tables/tables.module.ts b/src/app/views/tables/tables.module.ts new file mode 100644 index 0000000..110ca28 --- /dev/null +++ b/src/app/views/tables/tables.module.ts @@ -0,0 +1,25 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { MatInputModule } from '@angular/material/input'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatSortModule } from '@angular/material/sort'; +import { MatTableDataSource, MatTableModule } from '@angular/material/table'; +import { NgxDatatableModule } from '@swimlane/ngx-datatable'; + +import { TablesRoutes } from './tables.routing'; +import { MaterialTableComponent } from './material-table/material-table.component'; + +@NgModule({ + imports: [ + CommonModule, + MatInputModule, + MatPaginatorModule, + MatSortModule, + MatTableModule, + NgxDatatableModule, + RouterModule.forChild(TablesRoutes) + ], + declarations: [MaterialTableComponent] +}) +export class TablesModule { } diff --git a/src/app/views/tables/tables.routing.ts b/src/app/views/tables/tables.routing.ts new file mode 100644 index 0000000..32e2738 --- /dev/null +++ b/src/app/views/tables/tables.routing.ts @@ -0,0 +1,13 @@ +import { Routes } from '@angular/router'; +import { MaterialTableComponent } from './material-table/material-table.component'; + +export const TablesRoutes: Routes = [ + { + path: '', + children: [{ + path: 'mat-table', + component: MaterialTableComponent, + data: { title: 'Material TAble', breadcrumb: 'Material Table' } + }] + } +]; diff --git a/src/app/views/tables/tables.service.ts b/src/app/views/tables/tables.service.ts new file mode 100644 index 0000000..9b21b4c --- /dev/null +++ b/src/app/views/tables/tables.service.ts @@ -0,0 +1,640 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class TablesService { + constructor() { } + getDataConf() { + return [ + { + prop: 'id' + }, + { + prop: 'age', + name: 'Age' + }, + { + prop: 'name', + name: 'Name' + }, + { + prop: 'gender', + name: 'Gender' + }, + { + prop: 'company', + name: 'Company' + }, + { + prop: 'email', + name: 'Email' + } + ]; + } + getAll() { + return [ + { + 'id': 0, + 'age': 40, + 'name': 'Mclean Brady', + 'gender': 'male', + 'company': 'JAMNATION', + 'email': 'mcleanbrady@jamnation.com', + 'phone': '+1 (875) 472-2061', + 'registered': '2014-10-20T04:54:00 -06:00' + }, + { + 'id': 1, + 'age': 39, + 'name': 'Dillon Ruiz', + 'gender': 'male', + 'company': 'ACRODANCE', + 'email': 'dillonruiz@acrodance.com', + 'phone': '+1 (858) 562-2261', + 'registered': '2016-08-07T12:15:31 -06:00' + }, + { + 'id': 2, + 'age': 39, + 'name': 'Robyn Knox', + 'gender': 'female', + 'company': 'GLUID', + 'email': 'robynknox@gluid.com', + 'phone': '+1 (826) 491-3098', + 'registered': '2017-02-12T02:43:39 -06:00' + }, + { + 'id': 3, + 'age': 32, + 'name': 'Santana Wagner', + 'gender': 'male', + 'company': 'INTRADISK', + 'email': 'santanawagner@intradisk.com', + 'phone': '+1 (841) 550-2276', + 'registered': '2016-03-28T11:22:15 -06:00' + }, + { + 'id': 4, + 'age': 34, + 'name': 'Jennie Branch', + 'gender': 'female', + 'company': 'VERAQ', + 'email': 'jenniebranch@veraq.com', + 'phone': '+1 (895) 483-3982', + 'registered': '2015-03-16T01:30:06 -06:00' + }, + { + 'id': 5, + 'age': 39, + 'name': 'Farrell Preston', + 'gender': 'male', + 'company': 'HONOTRON', + 'email': 'farrellpreston@honotron.com', + 'phone': '+1 (993) 534-2843', + 'registered': '2015-08-14T09:07:47 -06:00' + }, + { + 'id': 6, + 'age': 38, + 'name': 'Garner Reyes', + 'gender': 'male', + 'company': 'VIOCULAR', + 'email': 'garnerreyes@viocular.com', + 'phone': '+1 (973) 495-3873', + 'registered': '2016-03-23T03:47:23 -06:00' + }, + { + 'id': 7, + 'age': 32, + 'name': 'Ella Boone', + 'gender': 'female', + 'company': 'ARCHITAX', + 'email': 'ellaboone@architax.com', + 'phone': '+1 (945) 491-2580', + 'registered': '2015-07-01T09:35:10 -06:00' + }, + { + 'id': 8, + 'age': 30, + 'name': 'Kathryn Owens', + 'gender': 'female', + 'company': 'CYCLONICA', + 'email': 'kathrynowens@cyclonica.com', + 'phone': '+1 (978) 598-2767', + 'registered': '2014-03-11T11:38:12 -06:00' + }, + { + 'id': 9, + 'age': 22, + 'name': 'Byers Santana', + 'gender': 'male', + 'company': 'KAGGLE', + 'email': 'byerssantana@kaggle.com', + 'phone': '+1 (984) 546-3400', + 'registered': '2015-08-17T02:48:09 -06:00' + }, + { + 'id': 10, + 'age': 30, + 'name': 'Nina Middleton', + 'gender': 'female', + 'company': 'ZINCA', + 'email': 'ninamiddleton@zinca.com', + 'phone': '+1 (829) 553-2060', + 'registered': '2014-12-20T09:53:27 -06:00' + }, + { + 'id': 11, + 'age': 38, + 'name': 'Nixon Morrow', + 'gender': 'male', + 'company': 'CUBIX', + 'email': 'nixonmorrow@cubix.com', + 'phone': '+1 (825) 501-3712', + 'registered': '2014-09-10T10:23:34 -06:00' + }, + { + 'id': 12, + 'age': 28, + 'name': 'Bonita Pate', + 'gender': 'female', + 'company': 'MAGNEATO', + 'email': 'bonitapate@magneato.com', + 'phone': '+1 (808) 497-3968', + 'registered': '2016-01-20T02:45:43 -06:00' + }, + { + 'id': 13, + 'age': 30, + 'name': 'Amy Hyde', + 'gender': 'female', + 'company': 'UNDERTAP', + 'email': 'amyhyde@undertap.com', + 'phone': '+1 (867) 555-2669', + 'registered': '2015-04-12T08:39:31 -06:00' + }, + { + 'id': 14, + 'age': 20, + 'name': 'Cortez Camacho', + 'gender': 'male', + 'company': 'IDEGO', + 'email': 'cortezcamacho@idego.com', + 'phone': '+1 (986) 546-3364', + 'registered': '2014-08-21T11:00:20 -06:00' + }, + { + 'id': 15, + 'age': 29, + 'name': 'Castaneda Armstrong', + 'gender': 'male', + 'company': 'INTERFIND', + 'email': 'castanedaarmstrong@interfind.com', + 'phone': '+1 (975) 557-2651', + 'registered': '2014-11-15T10:38:24 -06:00' + }, + { + 'id': 16, + 'age': 37, + 'name': 'Liza West', + 'gender': 'female', + 'company': 'COWTOWN', + 'email': 'lizawest@cowtown.com', + 'phone': '+1 (852) 415-2358', + 'registered': '2017-05-06T09:46:03 -06:00' + }, + { + 'id': 17, + 'age': 37, + 'name': 'Roth Baird', + 'gender': 'male', + 'company': 'RODEMCO', + 'email': 'rothbaird@rodemco.com', + 'phone': '+1 (840) 417-3313', + 'registered': '2015-04-18T10:58:50 -06:00' + }, + { + 'id': 18, + 'age': 26, + 'name': 'Alexis Blackburn', + 'gender': 'female', + 'company': 'PREMIANT', + 'email': 'alexisblackburn@premiant.com', + 'phone': '+1 (957) 576-2362', + 'registered': '2014-08-08T12:59:38 -06:00' + }, + { + 'id': 19, + 'age': 35, + 'name': 'Sadie Tillman', + 'gender': 'female', + 'company': 'DUOFLEX', + 'email': 'sadietillman@duoflex.com', + 'phone': '+1 (843) 499-3330', + 'registered': '2016-02-21T09:25:03 -06:00' + }, + { + 'id': 20, + 'age': 27, + 'name': 'Sharron Conley', + 'gender': 'female', + 'company': 'QUARMONY', + 'email': 'sharronconley@quarmony.com', + 'phone': '+1 (951) 459-2465', + 'registered': '2014-10-19T06:04:36 -06:00' + }, + { + 'id': 21, + 'age': 27, + 'name': 'Jordan Mccoy', + 'gender': 'male', + 'company': 'ACCUSAGE', + 'email': 'jordanmccoy@accusage.com', + 'phone': '+1 (825) 568-3296', + 'registered': '2017-01-27T01:53:02 -06:00' + }, + { + 'id': 22, + 'age': 35, + 'name': 'Rene House', + 'gender': 'female', + 'company': 'INSURETY', + 'email': 'renehouse@insurety.com', + 'phone': '+1 (838) 578-3190', + 'registered': '2015-11-07T10:07:58 -06:00' + }, + { + 'id': 23, + 'age': 38, + 'name': 'Bernice Berry', + 'gender': 'female', + 'company': 'ROCKYARD', + 'email': 'berniceberry@rockyard.com', + 'phone': '+1 (885) 466-2145', + 'registered': '2014-04-17T07:43:02 -06:00' + }, + { + 'id': 24, + 'age': 30, + 'name': 'Bowen Beach', + 'gender': 'male', + 'company': 'TETRATREX', + 'email': 'bowenbeach@tetratrex.com', + 'phone': '+1 (843) 493-3197', + 'registered': '2015-07-27T03:38:33 -06:00' + }, + { + 'id': 25, + 'age': 31, + 'name': 'Monica Leblanc', + 'gender': 'female', + 'company': 'TALENDULA', + 'email': 'monicaleblanc@talendula.com', + 'phone': '+1 (911) 524-2349', + 'registered': '2016-04-10T08:33:17 -06:00' + }, + { + 'id': 26, + 'age': 36, + 'name': 'Lina Rivas', + 'gender': 'female', + 'company': 'BOINK', + 'email': 'linarivas@boink.com', + 'phone': '+1 (983) 572-2470', + 'registered': '2014-08-28T09:44:32 -06:00' + }, + { + 'id': 27, + 'age': 25, + 'name': 'Joyce Yang', + 'gender': 'female', + 'company': 'SPORTAN', + 'email': 'joyceyang@sportan.com', + 'phone': '+1 (807) 491-3917', + 'registered': '2015-07-22T12:58:31 -06:00' + }, + { + 'id': 28, + 'age': 20, + 'name': 'Lana Joseph', + 'gender': 'female', + 'company': 'BOLAX', + 'email': 'lanajoseph@bolax.com', + 'phone': '+1 (942) 467-2363', + 'registered': '2016-10-30T06:13:50 -06:00' + }, + { + 'id': 29, + 'age': 20, + 'name': 'Jimenez Guerrero', + 'gender': 'male', + 'company': 'INSURON', + 'email': 'jimenezguerrero@insuron.com', + 'phone': '+1 (991) 585-3706', + 'registered': '2016-09-15T01:35:16 -06:00' + }, + { + 'id': 30, + 'age': 35, + 'name': 'Williams Bentley', + 'gender': 'male', + 'company': 'ZEAM', + 'email': 'williamsbentley@zeam.com', + 'phone': '+1 (837) 490-2610', + 'registered': '2014-01-06T01:04:11 -06:00' + }, + { + 'id': 31, + 'age': 27, + 'name': 'Doreen Garrett', + 'gender': 'female', + 'company': 'ENERSAVE', + 'email': 'doreengarrett@enersave.com', + 'phone': '+1 (920) 522-2847', + 'registered': '2017-01-25T03:24:47 -06:00' + }, + { + 'id': 32, + 'age': 34, + 'name': 'Shaw Cannon', + 'gender': 'male', + 'company': 'EBIDCO', + 'email': 'shawcannon@ebidco.com', + 'phone': '+1 (903) 530-2676', + 'registered': '2014-04-11T04:49:08 -06:00' + }, + { + 'id': 33, + 'age': 25, + 'name': 'Sonya Skinner', + 'gender': 'female', + 'company': 'EXOSWITCH', + 'email': 'sonyaskinner@exoswitch.com', + 'phone': '+1 (923) 428-3014', + 'registered': '2014-02-09T11:59:54 -06:00' + }, + { + 'id': 34, + 'age': 27, + 'name': 'Todd Potter', + 'gender': 'male', + 'company': 'MUSIX', + 'email': 'toddpotter@musix.com', + 'phone': '+1 (817) 491-2268', + 'registered': '2015-04-06T11:10:47 -06:00' + }, + { + 'id': 35, + 'age': 21, + 'name': 'Celina Rose', + 'gender': 'female', + 'company': 'TWIIST', + 'email': 'celinarose@twiist.com', + 'phone': '+1 (863) 599-2063', + 'registered': '2015-09-04T07:59:29 -06:00' + }, + { + 'id': 36, + 'age': 40, + 'name': 'Ingrid Day', + 'gender': 'female', + 'company': 'ZBOO', + 'email': 'ingridday@zboo.com', + 'phone': '+1 (921) 447-2312', + 'registered': '2016-10-01T08:26:07 -06:00' + }, + { + 'id': 37, + 'age': 24, + 'name': 'Lynch Stark', + 'gender': 'male', + 'company': 'PYRAMIA', + 'email': 'lynchstark@pyramia.com', + 'phone': '+1 (995) 431-2354', + 'registered': '2014-01-26T11:38:48 -06:00' + }, + { + 'id': 38, + 'age': 29, + 'name': 'Helga Mendez', + 'gender': 'female', + 'company': 'COMVEYER', + 'email': 'helgamendez@comveyer.com', + 'phone': '+1 (897) 418-3815', + 'registered': '2015-10-03T08:58:45 -06:00' + }, + { + 'id': 39, + 'age': 30, + 'name': 'Corinne Calhoun', + 'gender': 'female', + 'company': 'ADORNICA', + 'email': 'corinnecalhoun@adornica.com', + 'phone': '+1 (841) 564-3617', + 'registered': '2016-05-24T10:42:36 -06:00' + }, + { + 'id': 40, + 'age': 40, + 'name': 'Winifred Conrad', + 'gender': 'female', + 'company': 'SATIANCE', + 'email': 'winifredconrad@satiance.com', + 'phone': '+1 (885) 533-2416', + 'registered': '2017-03-01T06:12:08 -06:00' + }, + { + 'id': 41, + 'age': 27, + 'name': 'Lawanda Stevenson', + 'gender': 'female', + 'company': 'ZILLACTIC', + 'email': 'lawandastevenson@zillactic.com', + 'phone': '+1 (823) 535-3187', + 'registered': '2014-07-07T05:26:22 -06:00' + }, + { + 'id': 42, + 'age': 30, + 'name': 'Kirsten Long', + 'gender': 'female', + 'company': 'IMAGEFLOW', + 'email': 'kirstenlong@imageflow.com', + 'phone': '+1 (809) 592-2264', + 'registered': '2014-05-08T07:41:56 -06:00' + }, + { + 'id': 43, + 'age': 39, + 'name': 'Summer Farley', + 'gender': 'female', + 'company': 'ENTOGROK', + 'email': 'summerfarley@entogrok.com', + 'phone': '+1 (814) 490-3578', + 'registered': '2016-10-28T10:02:34 -06:00' + }, + { + 'id': 44, + 'age': 31, + 'name': 'Mendoza Randall', + 'gender': 'male', + 'company': 'COREPAN', + 'email': 'mendozarandall@corepan.com', + 'phone': '+1 (846) 501-2860', + 'registered': '2015-12-14T12:58:18 -06:00' + }, + { + 'id': 45, + 'age': 27, + 'name': 'Marcy Doyle', + 'gender': 'female', + 'company': 'VORATAK', + 'email': 'marcydoyle@voratak.com', + 'phone': '+1 (848) 411-2728', + 'registered': '2014-02-12T10:46:27 -06:00' + }, + { + 'id': 46, + 'age': 30, + 'name': 'Burch Walker', + 'gender': 'male', + 'company': 'COMVEYOR', + 'email': 'burchwalker@comveyor.com', + 'phone': '+1 (968) 445-2104', + 'registered': '2014-01-07T05:16:30 -06:00' + }, + { + 'id': 47, + 'age': 31, + 'name': 'Solis Lester', + 'gender': 'male', + 'company': 'MACRONAUT', + 'email': 'solislester@macronaut.com', + 'phone': '+1 (857) 422-3242', + 'registered': '2016-10-20T09:40:51 -06:00' + }, + { + 'id': 48, + 'age': 20, + 'name': 'Lorene Mooney', + 'gender': 'female', + 'company': 'ORGANICA', + 'email': 'lorenemooney@organica.com', + 'phone': '+1 (853) 406-2716', + 'registered': '2015-09-17T03:54:41 -06:00' + }, + { + 'id': 49, + 'age': 34, + 'name': 'Rhodes Vega', + 'gender': 'male', + 'company': 'CHILLIUM', + 'email': 'rhodesvega@chillium.com', + 'phone': '+1 (863) 577-3562', + 'registered': '2016-06-15T05:36:10 -06:00' + }, + { + 'id': 50, + 'age': 28, + 'name': 'Pruitt Merrill', + 'gender': 'male', + 'company': 'KYAGURU', + 'email': 'pruittmerrill@kyaguru.com', + 'phone': '+1 (910) 585-3659', + 'registered': '2017-04-02T09:36:00 -06:00' + }, + { + 'id': 51, + 'age': 33, + 'name': 'Bernadine Hart', + 'gender': 'female', + 'company': 'BITTOR', + 'email': 'bernadinehart@bittor.com', + 'phone': '+1 (906) 446-3518', + 'registered': '2015-11-10T07:45:59 -06:00' + }, + { + 'id': 52, + 'age': 22, + 'name': 'Carver Mckenzie', + 'gender': 'male', + 'company': 'LOCAZONE', + 'email': 'carvermckenzie@locazone.com', + 'phone': '+1 (803) 407-3142', + 'registered': '2015-06-24T07:16:02 -06:00' + }, + { + 'id': 53, + 'age': 27, + 'name': 'Dean Cobb', + 'gender': 'male', + 'company': 'ASSISTIA', + 'email': 'deancobb@assistia.com', + 'phone': '+1 (877) 539-3346', + 'registered': '2016-12-02T01:14:47 -06:00' + }, + { + 'id': 54, + 'age': 32, + 'name': 'Camacho Robinson', + 'gender': 'male', + 'company': 'INSURITY', + 'email': 'camachorobinson@insurity.com', + 'phone': '+1 (929) 430-3079', + 'registered': '2016-12-14T08:59:33 -06:00' + }, + { + 'id': 55, + 'age': 36, + 'name': 'Nancy Rodgers', + 'gender': 'female', + 'company': 'COSMOSIS', + 'email': 'nancyrodgers@cosmosis.com', + 'phone': '+1 (873) 489-2643', + 'registered': '2014-08-21T02:19:28 -06:00' + }, + { + 'id': 56, + 'age': 27, + 'name': 'June Henry', + 'gender': 'female', + 'company': 'PETIGEMS', + 'email': 'junehenry@petigems.com', + 'phone': '+1 (808) 536-2445', + 'registered': '2014-03-28T08:36:27 -06:00' + }, + { + 'id': 57, + 'age': 26, + 'name': 'Rochelle Simmons', + 'gender': 'female', + 'company': 'DANJA', + 'email': 'rochellesimmons@danja.com', + 'phone': '+1 (936) 563-3886', + 'registered': '2015-12-07T08:01:18 -06:00' + }, + { + 'id': 58, + 'age': 32, + 'name': 'Alice Thornton', + 'gender': 'female', + 'company': 'ISOSURE', + 'email': 'alicethornton@isosure.com', + 'phone': '+1 (962) 560-2318', + 'registered': '2015-06-07T08:09:50 -06:00' + }, + { + 'id': 59, + 'age': 39, + 'name': 'Clara Downs', + 'gender': 'female', + 'company': 'ZANILLA', + 'email': 'claradowns@zanilla.com', + 'phone': '+1 (977) 595-2657', + 'registered': '2015-06-14T02:33:33 -06:00' + } + ] + } + +} diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/chart/chart-examples.module.ts b/src/assets/examples/chart/chart-examples.module.ts new file mode 100644 index 0000000..0c6dd3f --- /dev/null +++ b/src/assets/examples/chart/chart-examples.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { CHART_EXAMPLE_COMPONENT_LIST } from '.'; +import { SharedMaterialModule } from 'app/shared/shared-material.module'; +import { NgxEchartsModule } from 'ngx-echarts'; + +@NgModule({ + declarations: [...CHART_EXAMPLE_COMPONENT_LIST], + imports: [ + NgxEchartsModule, + CommonModule, + SharedMaterialModule + ], + exports: [...CHART_EXAMPLE_COMPONENT_LIST], + entryComponents: [...CHART_EXAMPLE_COMPONENT_LIST] +}) +export class ChartExamplesModule { } diff --git a/src/assets/examples/chart/echart-bar/echart-bar.component.html b/src/assets/examples/chart/echart-bar/echart-bar.component.html new file mode 100644 index 0000000..b4cea6a --- /dev/null +++ b/src/assets/examples/chart/echart-bar/echart-bar.component.html @@ -0,0 +1,20 @@ +

Bar chart with zoom option

+
+
+ +
+ +

Bar chart with multiple series option

+
+
+ +
+ +

Cluster bar chart with rotation

+
+
+ +
+ +

Middle bar chart

+
\ No newline at end of file diff --git a/src/assets/examples/chart/echart-bar/echart-bar.component.scss b/src/assets/examples/chart/echart-bar/echart-bar.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/chart/echart-bar/echart-bar.component.spec.ts b/src/assets/examples/chart/echart-bar/echart-bar.component.spec.ts new file mode 100644 index 0000000..2c4f920 --- /dev/null +++ b/src/assets/examples/chart/echart-bar/echart-bar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EchartBarComponent } from './echart-bar.component'; + +describe('EchartBarComponent', () => { + let component: EchartBarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EchartBarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EchartBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/chart/echart-bar/echart-bar.component.ts b/src/assets/examples/chart/echart-bar/echart-bar.component.ts new file mode 100644 index 0000000..eb6142b --- /dev/null +++ b/src/assets/examples/chart/echart-bar/echart-bar.component.ts @@ -0,0 +1,345 @@ +import { Component, OnInit } from "@angular/core"; +import * as echarts from "echarts"; +import { Z } from "@angular/cdk/keycodes"; + +@Component({ + selector: "app-echart-bar", + templateUrl: "./echart-bar.component.html", + styleUrls: ["./echart-bar.component.scss"] +}) +export class EchartBarComponent implements OnInit { + dataAxis = [ + "mango", + "banana", + "jack", + "sparrow", + "clara", + "smith", + "john", + "doe", + "naem", + "hridoy", + "ricky", + "fahim", + "sandy", + "savage", + "slow", + "snow", + "kashmir", + "great wall", + "godzilla", + "genious" + ]; + data = [ + 220, + 182, + 191, + 234, + 290, + 330, + 310, + 123, + 442, + 321, + 90, + 149, + 210, + 122, + 133, + 334, + 198, + 123, + 125, + 220 + ]; + yMax = 500; + dataShadow = []; + + constructor() {} + + ngOnInit() { + for (var i = 0; i < this.data.length; i++) { + this.dataShadow.push(this.yMax); + } + } + +zoomBarOptions = { + // title: { + // text: "Bar Chart with Zoom Option", + // subtext: "Feature Sample: Gradient Color, Shadow, Click Zoom" + // }, + color: ['rgba(15, 21, 77, 0.8)','rgba(246,107,191, 0.8)','#03A9F4','#FFC107','rgba(15, 21, 77, 0.6)','#9C27BB','rgba(15, 21, 77, 0.4)','rgba(146, 213, 249, 0.8)','#9C27B0'], + xAxis: { + data: this.dataAxis, + axisLabel: { + inside: true, + position: 'insideBottom', + align: 'left', + rotate: 90, + textStyle: { + color: "#fff" + } + }, + axisTick: { + show: false + }, + axisLine: { + show: false + }, + z: 10 + }, + yAxis: { + axisLine: { + show: false + }, + axisTick: { + show: false + }, + axisLabel: { + textStyle: { + color: "#999" + } + } + }, + dataZoom: [ + { + type: "inside" + } + ], + series: [ + { + // For shadow + type: "bar", + itemStyle: { + normal: { color: "rgba(0,0,0,0.05)" } + }, + barGap: "-100%", + barCategoryGap: "40%", + data: this.dataShadow, + animation: false + }, + { + type: "bar", + itemStyle: { + normal: { + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { offset: 0, color: "#83bff6" }, + { offset: 0.5, color: "#188df0" }, + { offset: 1, color: "#03A9F4" } + ]) + }, + emphasis: { + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { offset: 0, color: "#2378f7" }, + { offset: 0.7, color: "#2378f7" }, + { offset: 1, color: "#83bff6" } + ]) + } + }, + data: this.data + } + ] + }; + + // ================================================ + + labelOption = { + normal: { + show: true, + position: 'insideBottom', + distance: 5, + align: 'left', + verticalAlign: 'middle', + rotate: 90, + formatter: '{c} {name|{a}}', + fontSize: 16, + rich: { + name: { + textBorderColor: '#fff' + } + } + } +}; + + +clusteredVBarOptions = { + color: ['rgba(15, 21, 77, 0.8)','rgba(246,107,191, 0.8)','#03A9F4','#FFC107','rgba(15, 21, 77, 0.6)','#9C27BB','rgba(15, 21, 77, 0.4)','rgba(146, 213, 249, 0.8)','#9C27B0'], + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'shadow' + } + }, + legend: { + data: ['Forest', 'Steppe', 'Desert', 'Wetland'] + }, + toolbox: { + show: true, + orient: 'vertical', + left: 'right', + top: 'center', + feature: { + mark: {show: true}, + dataView: {show: true, readOnly: false}, + magicType: {show: true, type: ['line', 'bar', 'stack', 'tiled']}, + restore: {show: true}, + saveAsImage: {show: true} + } + + }, + calculable: true, + xAxis: [ + { + type: 'category', + axisTick: {show: false}, + data: ['2012', '2013', '2014', '2015', '2016'] + } + ], + yAxis: [ + { + type: 'value' + } + ], + series: [ + { + name: 'Forest', + type: 'bar', + barGap: 0, + label: this.labelOption, + data: [320, 332, 301, 334, 390] + }, + { + name: 'Steppe', + type: 'bar', + label: this.labelOption, + data: [220, 182, 191, 234, 290] + }, + { + name: 'Desert', + type: 'bar', + label: this.labelOption, + data: [150, 232, 201, 154, 190] + }, + { + name: 'Wetland', + type: 'bar', + label: this.labelOption, + data: [98, 77, 101, 99, 40] + } + ] +}; + + +// ==================================================== + + +middleBarOption = { + color: ['rgba(15, 21, 77, 0.8)','rgba(15, 21, 77, 0.5)','#03A9F4','#FFC107','rgba(15, 21, 77, 0.6)','#9C27BB','rgba(15, 21, 77, 0.4)','rgba(146, 213, 249, 0.8)','#9C27B0'], + tooltip : { + trigger: 'axis', + axisPointer : { + type : 'shadow' + } + }, + legend: { + data:['Mango', 'Banana', 'Litchi'] + }, + grid: { + left: '3%', + right: '4%', + bottom: '3%', + containLabel: true + }, + xAxis : [ + { + type : 'value' + } + ], + yAxis : [ + { + type : 'category', + axisTick : {show: false}, + data : ['2001','2002','2003','2004','2005','2006','2007'] + } + ], + series : [ + { + name:'Fruits', + type:'bar', + label: { + normal: { + show: true, + position: 'inside' + } + }, + data:[200, 170, 240, 244, 200, 220, 210] + }, + { + name:'Production', + type:'bar', + stack: 'Loss', + label: { + normal: { + show: true + } + }, + data:[320, 302, 341, 374, 390, 450, 420] + }, + { + name:'Loss', + type:'bar', + stack: 'Loss', + label: { + normal: { + show: true, + position: 'left' + } + }, + data:[-120, -132, -101, -134, -190, -230, -210] + } + ] +}; + +// ================ multiple series basic char ============================= +multipleSeriesBasicOptions = { + + color: ['rgba(15, 21, 77, 0.8)','rgba(15, 21, 77, 0.5)','#03A9F4','#FFC107','rgba(15, 21, 77, 0.8)','rgba(171,42,205,0.7)','rgba(15, 21, 77, 0.4)','rgba(146, 213, 249, 0.8)','rgba(255,212,7,0.7)'], + legend: { + padding: [20,0,0,0] + }, + tooltip: {}, + dataset: { + source: [ + ['product', '2012', '2013', '2014', '2015'], + ['Matcha Latte', 41.1, 30.4, 65.1, 53.3], + ['Milk Tea', 86.5, 92.1, 85.7, 83.1], + ['Cheese Cocoa', 24.1, 67.2, 79.5, 86.4] + ] + }, + xAxis: [ + {type: 'category', gridIndex: 0}, + {type: 'category', gridIndex: 1} + ], + yAxis: [ + {gridIndex: 0}, + {gridIndex: 1} + ], + grid: [ + {bottom: '55%'}, + {top: '55%'} + ], + series: [ + // These series are in the first grid. + {type: 'bar', seriesLayoutBy: 'row'}, + {type: 'bar', seriesLayoutBy: 'row'}, + {type: 'bar', seriesLayoutBy: 'row'}, + // These series are in the second grid. + {type: 'bar', xAxisIndex: 1, yAxisIndex: 1}, + {type: 'bar', xAxisIndex: 1, yAxisIndex: 1}, + {type: 'bar', xAxisIndex: 1, yAxisIndex: 1}, + {type: 'bar', xAxisIndex: 1, yAxisIndex: 1} + ] +}; + + +} diff --git a/src/assets/examples/chart/echart-heatmap/echart-heatmap.component.html b/src/assets/examples/chart/echart-heatmap/echart-heatmap.component.html new file mode 100644 index 0000000..0c872c5 --- /dev/null +++ b/src/assets/examples/chart/echart-heatmap/echart-heatmap.component.html @@ -0,0 +1,8 @@ +

Heatmap on Cartesian

+
+
+ +
+ +

Heatmap - 2w Data

+
\ No newline at end of file diff --git a/src/assets/examples/chart/echart-heatmap/echart-heatmap.component.scss b/src/assets/examples/chart/echart-heatmap/echart-heatmap.component.scss new file mode 100644 index 0000000..0a54fe2 --- /dev/null +++ b/src/assets/examples/chart/echart-heatmap/echart-heatmap.component.scss @@ -0,0 +1,6 @@ +// .fsdfsdfsd { + +// color: #c23531; +// color:#2f4554'; +// #61a0a8;color:#d48265;color:#91c7ae;color:#749f83;color:#ca8622;color:#bda29a;color:#6e7074', '#546570', '#c4ccd3' +// } \ No newline at end of file diff --git a/src/assets/examples/chart/echart-heatmap/echart-heatmap.component.spec.ts b/src/assets/examples/chart/echart-heatmap/echart-heatmap.component.spec.ts new file mode 100644 index 0000000..3b0a7b4 --- /dev/null +++ b/src/assets/examples/chart/echart-heatmap/echart-heatmap.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EchartHeatmapComponent } from './echart-heatmap.component'; + +describe('EchartHeatmapComponent', () => { + let component: EchartHeatmapComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EchartHeatmapComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EchartHeatmapComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/chart/echart-heatmap/echart-heatmap.component.ts b/src/assets/examples/chart/echart-heatmap/echart-heatmap.component.ts new file mode 100644 index 0000000..802608c --- /dev/null +++ b/src/assets/examples/chart/echart-heatmap/echart-heatmap.component.ts @@ -0,0 +1,449 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-echart-heatmap', + templateUrl: './echart-heatmap.component.html', + styleUrls: ['./echart-heatmap.component.scss'] +}) +export class EchartHeatmapComponent { + + hours = ['12a', '1a', '2a', '3a', '4a', '5a', '6a', + '7a', '8a', '9a','10a','11a', + '12p', '1p', '2p', '3p', '4p', '5p', + '6p', '7p', '8p', '9p', '10p', '11p']; +days = ['Saturday', 'Friday', 'Thursday', + 'Wednesday', 'Tuesday', 'Monday', 'Sunday']; + +data: any = [[0,0,5],[0,1,1],[0,2,0],[0,3,0],[0,4,0],[0,5,0],[0,6,0],[0,7,0],[0,8,0],[0,9,0],[0,10,0],[0,11,2],[0,12,4],[0,13,1],[0,14,1],[0,15,3],[0,16,4],[0,17,6],[0,18,4],[0,19,4],[0,20,3],[0,21,3],[0,22,2],[0,23,5],[1,0,7],[1,1,0],[1,2,0],[1,3,0],[1,4,0],[1,5,0],[1,6,0],[1,7,0],[1,8,0],[1,9,0],[1,10,5],[1,11,2],[1,12,2],[1,13,6],[1,14,9],[1,15,11],[1,16,6],[1,17,7],[1,18,8],[1,19,12],[1,20,5],[1,21,5],[1,22,7],[1,23,2],[2,0,1],[2,1,1],[2,2,0],[2,3,0],[2,4,0],[2,5,0],[2,6,0],[2,7,0],[2,8,0],[2,9,0],[2,10,3],[2,11,2],[2,12,1],[2,13,9],[2,14,8],[2,15,10],[2,16,6],[2,17,5],[2,18,5],[2,19,5],[2,20,7],[2,21,4],[2,22,2],[2,23,4],[3,0,7],[3,1,3],[3,2,0],[3,3,0],[3,4,0],[3,5,0],[3,6,0],[3,7,0],[3,8,1],[3,9,0],[3,10,5],[3,11,4],[3,12,7],[3,13,14],[3,14,13],[3,15,12],[3,16,9],[3,17,5],[3,18,5],[3,19,10],[3,20,6],[3,21,4],[3,22,4],[3,23,1],[4,0,1],[4,1,3],[4,2,0],[4,3,0],[4,4,0],[4,5,1],[4,6,0],[4,7,0],[4,8,0],[4,9,2],[4,10,4],[4,11,4],[4,12,2],[4,13,4],[4,14,4],[4,15,14],[4,16,12],[4,17,1],[4,18,8],[4,19,5],[4,20,3],[4,21,7],[4,22,3],[4,23,0],[5,0,2],[5,1,1],[5,2,0],[5,3,3],[5,4,0],[5,5,0],[5,6,0],[5,7,0],[5,8,2],[5,9,0],[5,10,4],[5,11,1],[5,12,5],[5,13,10],[5,14,5],[5,15,7],[5,16,11],[5,17,6],[5,18,0],[5,19,5],[5,20,3],[5,21,4],[5,22,2],[5,23,0],[6,0,1],[6,1,0],[6,2,0],[6,3,0],[6,4,0],[6,5,0],[6,6,0],[6,7,0],[6,8,0],[6,9,0],[6,10,1],[6,11,0],[6,12,2],[6,13,1],[6,14,3],[6,15,4],[6,16,0],[6,17,0],[6,18,0],[6,19,0],[6,20,1],[6,21,2],[6,22,2],[6,23,6]]; + +heatMapOptions; + +heatMap2wOptions; + + constructor() { } + + ngOnInit() { + + this.data = this.data.map(function (item) { + return [item[1], item[0], item[2] || '-']; + }); + + this.heatMapOptions = { + tooltip: { + position: 'top' + }, + animation: false, + grid: { + height: '70%', + // width: '90%', + y: '10%' + }, + xAxis: { + type: 'category', + data: this.hours, + splitArea: { + show: true + } + }, + yAxis: { + type: 'category', + data: this.days, + splitArea: { + show: true + } + }, + visualMap: { + min: 0, + max: 10, + calculable: true, + orient: 'horizontal', + left: 'center', + bottom: '0' + }, + series: [{ + name: 'Punch Card', + type: 'heatmap', + data: this.data, + label: { + normal: { + show: true + } + }, + itemStyle: { + emphasis: { + shadowBlur: 10, + shadowColor: 'rgba(0, 0, 0, 0.5)' + } + } + }] + }; + + this.loadHeatMap2wData(); + } + + // ======================= heatmap 2w data ========================== + + + loadHeatMap2wData() { + +var noise = this.getNoiseHelper(); +var xData = []; +var yData = []; +noise.seed(Math.random()); +function generateData(theta, min, max) { + var data = []; + for (var i = 0; i <= 200; i++) { + for (var j = 0; j <= 100; j++) { + // var x = (max - min) * i / 200 + min; + // var y = (max - min) * j / 100 + min; + data.push([i, j, noise.perlin2(i / 40, j / 20) + 0.5]); + // data.push([i, j, normalDist(theta, x) * normalDist(theta, y)]); + } + xData.push(i); + } + for (var j = 0; j < 100; j++) { + yData.push(j); + } + return data; +} +var data = generateData(2, -5, 5); + +this.heatMap2wOptions = { + tooltip: {}, + grid: { + height: '100%' + }, + xAxis: { + type: 'category', + data: xData + }, + yAxis: { + type: 'category', + data: yData + }, + visualMap: { + min: 0, + max: 1, + calculable: true, + realtime: false, + inRange: { + color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] + } + }, + series: [{ + name: 'Gaussian', + type: 'heatmap', + data: data, + itemStyle: { + emphasis: { + borderColor: '#333', + borderWidth: 1 + } + }, + progressive: 1000, + animation: false + }] +}; +} + +/////////////////////////////////////////////////////////////////////////// +// Simplex and perlin noise helper from https://github.com/josephg/noisejs +/////////////////////////////////////////////////////////////////////////// +getNoiseHelper(global?:any) { + + var module:any = {}; + + function Grad(x, y, z) { + this.x = x; this.y = y; this.z = z; + } + + Grad.prototype.dot2 = function(x, y) { + return this.x*x + this.y*y; + }; + + Grad.prototype.dot3 = function(x, y, z) { + return this.x*x + this.y*y + this.z*z; + }; + + var grad3 = [new Grad(1,1,0),new Grad(-1,1,0),new Grad(1,-1,0),new Grad(-1,-1,0), + new Grad(1,0,1),new Grad(-1,0,1),new Grad(1,0,-1),new Grad(-1,0,-1), + new Grad(0,1,1),new Grad(0,-1,1),new Grad(0,1,-1),new Grad(0,-1,-1)]; + + var p = [151,160,137,91,90,15, + 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, + 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, + 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, + 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, + 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, + 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, + 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, + 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, + 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, + 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, + 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, + 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]; + // To remove the need for index wrapping, double the permutation table length + var perm = new Array(512); + var gradP = new Array(512); + + // This isn't a very good seeding function, but it works ok. It supports 2^16 + // different seed values. Write something better if you need more seeds. + module.seed = function(seed) { + if(seed > 0 && seed < 1) { + // Scale the seed out + seed *= 65536; + } + + seed = Math.floor(seed); + if(seed < 256) { + seed |= seed << 8; + } + + for(var i = 0; i < 256; i++) { + var v; + if (i & 1) { + v = p[i] ^ (seed & 255); + } else { + v = p[i] ^ ((seed>>8) & 255); + } + + perm[i] = perm[i + 256] = v; + gradP[i] = gradP[i + 256] = grad3[v % 12]; + } + }; + + module.seed(0); + + /* + for(var i=0; i<256; i++) { + perm[i] = perm[i + 256] = p[i]; + gradP[i] = gradP[i + 256] = grad3[perm[i] % 12]; + }*/ + + // Skewing and unskewing factors for 2, 3, and 4 dimensions + var F2 = 0.5*(Math.sqrt(3)-1); + var G2 = (3-Math.sqrt(3))/6; + + var F3 = 1/3; + var G3 = 1/6; + + // 2D simplex noise + module.simplex2 = function(xin, yin) { + var n0, n1, n2; // Noise contributions from the three corners + // Skew the input space to determine which simplex cell we're in + var s = (xin+yin)*F2; // Hairy factor for 2D + var i = Math.floor(xin+s); + var j = Math.floor(yin+s); + var t = (i+j)*G2; + var x0 = xin-i+t; // The x,y distances from the cell origin, unskewed. + var y0 = yin-j+t; + // For the 2D case, the simplex shape is an equilateral triangle. + // Determine which simplex we are in. + var i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords + if(x0>y0) { // lower triangle, XY order: (0,0)->(1,0)->(1,1) + i1=1; j1=0; + } else { // upper triangle, YX order: (0,0)->(0,1)->(1,1) + i1=0; j1=1; + } + // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and + // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where + // c = (3-sqrt(3))/6 + var x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords + var y1 = y0 - j1 + G2; + var x2 = x0 - 1 + 2 * G2; // Offsets for last corner in (x,y) unskewed coords + var y2 = y0 - 1 + 2 * G2; + // Work out the hashed gradient indices of the three simplex corners + i &= 255; + j &= 255; + var gi0 = gradP[i+perm[j]]; + var gi1 = gradP[i+i1+perm[j+j1]]; + var gi2 = gradP[i+1+perm[j+1]]; + // Calculate the contribution from the three corners + var t0 = 0.5 - x0*x0-y0*y0; + if(t0<0) { + n0 = 0; + } else { + t0 *= t0; + n0 = t0 * t0 * gi0.dot2(x0, y0); // (x,y) of grad3 used for 2D gradient + } + var t1 = 0.5 - x1*x1-y1*y1; + if(t1<0) { + n1 = 0; + } else { + t1 *= t1; + n1 = t1 * t1 * gi1.dot2(x1, y1); + } + var t2 = 0.5 - x2*x2-y2*y2; + if(t2<0) { + n2 = 0; + } else { + t2 *= t2; + n2 = t2 * t2 * gi2.dot2(x2, y2); + } + // Add contributions from each corner to get the final noise value. + // The result is scaled to return values in the interval [-1,1]. + return 70 * (n0 + n1 + n2); + }; + + // 3D simplex noise + module.simplex3 = function(xin, yin, zin) { + var n0, n1, n2, n3; // Noise contributions from the four corners + + // Skew the input space to determine which simplex cell we're in + var s = (xin+yin+zin)*F3; // Hairy factor for 2D + var i = Math.floor(xin+s); + var j = Math.floor(yin+s); + var k = Math.floor(zin+s); + + var t = (i+j+k)*G3; + var x0 = xin-i+t; // The x,y distances from the cell origin, unskewed. + var y0 = yin-j+t; + var z0 = zin-k+t; + + // For the 3D case, the simplex shape is a slightly irregular tetrahedron. + // Determine which simplex we are in. + var i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords + var i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords + if(x0 >= y0) { + if(y0 >= z0) { i1=1; j1=0; k1=0; i2=1; j2=1; k2=0; } + else if(x0 >= z0) { i1=1; j1=0; k1=0; i2=1; j2=0; k2=1; } + else { i1=0; j1=0; k1=1; i2=1; j2=0; k2=1; } + } else { + if(y0 < z0) { i1=0; j1=0; k1=1; i2=0; j2=1; k2=1; } + else if(x0 < z0) { i1=0; j1=1; k1=0; i2=0; j2=1; k2=1; } + else { i1=0; j1=1; k1=0; i2=1; j2=1; k2=0; } + } + // A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z), + // a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and + // a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where + // c = 1/6. + var x1 = x0 - i1 + G3; // Offsets for second corner + var y1 = y0 - j1 + G3; + var z1 = z0 - k1 + G3; + + var x2 = x0 - i2 + 2 * G3; // Offsets for third corner + var y2 = y0 - j2 + 2 * G3; + var z2 = z0 - k2 + 2 * G3; + + var x3 = x0 - 1 + 3 * G3; // Offsets for fourth corner + var y3 = y0 - 1 + 3 * G3; + var z3 = z0 - 1 + 3 * G3; + + // Work out the hashed gradient indices of the four simplex corners + i &= 255; + j &= 255; + k &= 255; + var gi0 = gradP[i+ perm[j+ perm[k ]]]; + var gi1 = gradP[i+i1+perm[j+j1+perm[k+k1]]]; + var gi2 = gradP[i+i2+perm[j+j2+perm[k+k2]]]; + var gi3 = gradP[i+ 1+perm[j+ 1+perm[k+ 1]]]; + + // Calculate the contribution from the four corners + var t0 = 0.6 - x0*x0 - y0*y0 - z0*z0; + if(t0<0) { + n0 = 0; + } else { + t0 *= t0; + n0 = t0 * t0 * gi0.dot3(x0, y0, z0); // (x,y) of grad3 used for 2D gradient + } + var t1 = 0.6 - x1*x1 - y1*y1 - z1*z1; + if(t1<0) { + n1 = 0; + } else { + t1 *= t1; + n1 = t1 * t1 * gi1.dot3(x1, y1, z1); + } + var t2 = 0.6 - x2*x2 - y2*y2 - z2*z2; + if(t2<0) { + n2 = 0; + } else { + t2 *= t2; + n2 = t2 * t2 * gi2.dot3(x2, y2, z2); + } + var t3 = 0.6 - x3*x3 - y3*y3 - z3*z3; + if(t3<0) { + n3 = 0; + } else { + t3 *= t3; + n3 = t3 * t3 * gi3.dot3(x3, y3, z3); + } + // Add contributions from each corner to get the final noise value. + // The result is scaled to return values in the interval [-1,1]. + return 32 * (n0 + n1 + n2 + n3); + + }; + + // ##### Perlin noise stuff + + function fade(t) { + return t*t*t*(t*(t*6-15)+10); + } + + function lerp(a, b, t) { + return (1-t)*a + t*b; + } + + // 2D Perlin Noise + module.perlin2 = function(x, y) { + // Find unit grid cell containing point + var X = Math.floor(x), Y = Math.floor(y); + // Get relative xy coordinates of point within that cell + x = x - X; y = y - Y; + // Wrap the integer cells at 255 (smaller integer period can be introduced here) + X = X & 255; Y = Y & 255; + + // Calculate noise contributions from each of the four corners + var n00 = gradP[X+perm[Y]].dot2(x, y); + var n01 = gradP[X+perm[Y+1]].dot2(x, y-1); + var n10 = gradP[X+1+perm[Y]].dot2(x-1, y); + var n11 = gradP[X+1+perm[Y+1]].dot2(x-1, y-1); + + // Compute the fade curve value for x + var u = fade(x); + + // Interpolate the four results + return lerp( + lerp(n00, n10, u), + lerp(n01, n11, u), + fade(y)); + }; + + // 3D Perlin Noise + module.perlin3 = function(x, y, z) { + // Find unit grid cell containing point + var X = Math.floor(x), Y = Math.floor(y), Z = Math.floor(z); + // Get relative xyz coordinates of point within that cell + x = x - X; y = y - Y; z = z - Z; + // Wrap the integer cells at 255 (smaller integer period can be introduced here) + X = X & 255; Y = Y & 255; Z = Z & 255; + + // Calculate noise contributions from each of the eight corners + var n000 = gradP[X+ perm[Y+ perm[Z ]]].dot3(x, y, z); + var n001 = gradP[X+ perm[Y+ perm[Z+1]]].dot3(x, y, z-1); + var n010 = gradP[X+ perm[Y+1+perm[Z ]]].dot3(x, y-1, z); + var n011 = gradP[X+ perm[Y+1+perm[Z+1]]].dot3(x, y-1, z-1); + var n100 = gradP[X+1+perm[Y+ perm[Z ]]].dot3(x-1, y, z); + var n101 = gradP[X+1+perm[Y+ perm[Z+1]]].dot3(x-1, y, z-1); + var n110 = gradP[X+1+perm[Y+1+perm[Z ]]].dot3(x-1, y-1, z); + var n111 = gradP[X+1+perm[Y+1+perm[Z+1]]].dot3(x-1, y-1, z-1); + + // Compute the fade curve value for x, y, z + var u = fade(x); + var v = fade(y); + var w = fade(z); + + // Interpolate + return lerp( + lerp( + lerp(n000, n100, u), + lerp(n001, n101, u), w), + lerp( + lerp(n010, n110, u), + lerp(n011, n111, u), w), + v); + }; + + + return module; +} +} diff --git a/src/assets/examples/chart/echart-pie/echart-pie.component.html b/src/assets/examples/chart/echart-pie/echart-pie.component.html new file mode 100644 index 0000000..17ffc97 --- /dev/null +++ b/src/assets/examples/chart/echart-pie/echart-pie.component.html @@ -0,0 +1,14 @@ +

Basic Pie Chart

+
+
+ +

Nightingale's Rose Diagram

+
+
+ +

Doughnut Pie

+
+
+ +

Nested Pie

+
\ No newline at end of file diff --git a/src/assets/examples/chart/echart-pie/echart-pie.component.scss b/src/assets/examples/chart/echart-pie/echart-pie.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/chart/echart-pie/echart-pie.component.spec.ts b/src/assets/examples/chart/echart-pie/echart-pie.component.spec.ts new file mode 100644 index 0000000..8f55383 --- /dev/null +++ b/src/assets/examples/chart/echart-pie/echart-pie.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EchartPieComponent } from './echart-pie.component'; + +describe('EchartPieComponent', () => { + let component: EchartPieComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EchartPieComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EchartPieComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/chart/echart-pie/echart-pie.component.ts b/src/assets/examples/chart/echart-pie/echart-pie.component.ts new file mode 100644 index 0000000..590735b --- /dev/null +++ b/src/assets/examples/chart/echart-pie/echart-pie.component.ts @@ -0,0 +1,444 @@ +import { Component, OnInit } from "@angular/core"; + +@Component({ + selector: "app-echart-pie", + templateUrl: "./echart-pie.component.html", + styleUrls: ["./echart-pie.component.scss"] +}) +export class EchartPieComponent { + pieOptions = { + backgroundColor: "#ffffff", + + // title: { + // text: 'Basic Pie', + // left: 'center', + // top: 10, + // textStyle: { + // color: '#000000', + // } + // }, + + grid: { + left: "3%", + right: "4%", + top: "3%", + containLabel: true + }, + color: [ + "rgba(15, 21, 77, .6)", + // "rgba(244, 67, 54, .7)", + "rgba(15, 21, 77, 0.7)", + "rgba(15, 21, 77, 0.8)" + ], + tooltip: { + show: false, + trigger: "item", + formatter: "{a}
{b}: {c} ({d}%)" + }, + xAxis: [ + { + axisLine: { + show: false + }, + splitLine: { + show: false + } + } + ], + yAxis: [ + { + axisLine: { + show: false + }, + splitLine: { + show: false + } + } + ], + + series: [ + { + name: "Sessions", + type: "pie", + radius: ["0%", "65%"], + center: ["50%", "50%"], + avoidLabelOverlap: false, + hoverOffset: 5, + stillShowZeroSum: false, + label: { + normal: { + show: false, + // position: "center", + textStyle: { + fontSize: "13", + fontWeight: "normal" + }, + formatter: "{a}" + }, + emphasis: { + show: true, + textStyle: { + fontSize: "15", + fontWeight: "normal", + color: "rgba(15, 21, 77, 1)" + }, + formatter: "{b} \n{c} ({d}%)" + } + }, + labelLine: { + normal: { + show: false + } + }, + data: [ + { + value: 335, + name: "Direct" + }, + { + value: 310, + name: "Search Eng." + }, + { value: 148, name: "Social" } + ], + itemStyle: { + emphasis: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: "rgba(0, 0, 0, 0.5)" + } + } + } + ] + }; + + doughNutPieOptions = { + backgroundColor: "#ffffff", + + // title: { + // text: 'Doughnut Pie', + // left: 'center', + // top: 20, + // textStyle: { + // color: '#000000' + // } + // }, + grid: { + left: "3%", + right: "4%", + bottom: "3%", + containLabel: true + }, + color: [ + "rgba(15, 21, 77, .6)", + // "rgba(244, 67, 54, .7)", + "rgba(15, 21, 77, 0.7)", + "rgba(15, 21, 77, 0.8)" + ], + tooltip: { + show: false, + trigger: "item", + formatter: "{a}
{b}: {c} ({d}%)" + }, + xAxis: [ + { + axisLine: { + show: false + }, + splitLine: { + show: false + } + } + ], + yAxis: [ + { + axisLine: { + show: false + }, + splitLine: { + show: false + } + } + ], + + series: [ + { + name: "Sessions", + type: "pie", + radius: ["45%", "65%"], + center: ["50%", "50%"], + avoidLabelOverlap: false, + hoverOffset: 5, + stillShowZeroSum: false, + label: { + normal: { + show: false, + // position: "center", + textStyle: { + fontSize: "13", + fontWeight: "normal" + }, + formatter: "{a}" + }, + emphasis: { + show: true, + textStyle: { + fontSize: "15", + fontWeight: "normal", + color: "rgba(15, 21, 77, 1)" + }, + formatter: "{b} \n{c} ({d}%)" + } + }, + labelLine: { + normal: { + show: false + } + }, + data: [ + { + value: 335, + name: "Direct" + }, + { + value: 310, + name: "Search Eng." + }, + { value: 148, name: "Social" } + ], + itemStyle: { + emphasis: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: "rgba(0, 0, 0, 0.5)" + } + } + } + ] + }; + + customPieOptions = { + backgroundColor: "#ffffff", + color: [ + "#3CB2EF", + "#71F6F9", + "#FFDB5C", + "#FFAE8B", + "#E062AE", + "#2C3162", + "#6F7394", + "#FFFFFF", + "#F44336" + ], + // title: { + // text: 'Customized Pie', + // left: 'center', + // top: 20, + // textStyle: { + // color: '#ccc' + // } + // }, + + tooltip: { + trigger: "item", + formatter: "{a}
{b} : {c} ({d}%)" + }, + + visualMap: { + show: false, + min: 80, + max: 600, + inRange: { + colorLightness: [0, 1] + } + }, + series: [ + { + name: "Production", + type: "pie", + radius: "65%", + center: ["50%", "50%"], + data: [ + { value: 335, name: "Potato" }, + { value: 310, name: "Mango" }, + { value: 274, name: "Banana" }, + { value: 235, name: "Strawberry" }, + { value: 400, name: "Jackfruit" } + ].sort(function(a, b) { + return a.value - b.value; + }), + roseType: "radius", + label: { + normal: { + textStyle: { + color: "rgba(0 , 0, 0, 0.87)" + } + } + }, + labelLine: { + normal: { + lineStyle: { + color: "rgba(0 , 0, 0, 0.87)" + }, + smooth: 0.2, + length: 10, + length2: 20 + } + }, + itemStyle: { + normal: { + color: "#2C3162" + // shadowBlur: 200, + // shadowColor: 'rgba(15, 21, 77, 0.5)' + } + }, + + animationType: "scale", + animationEasing: "elasticOut", + animationDelay: function(idx) { + return Math.random() * 200; + } + } + ] + }; + + nestedPieOptions = { + // title: { + // text: 'Nested Pie', + // left: 'center', + // top: 0, + // textStyle: { + // color: '#000000' + // } + // }, + tooltip: { + trigger: "item", + formatter: "{a}
{b}: {c} ({d}%)" + }, + color: [ + "rgba(15, 21, 77, 0.8)", + "rgba(246,107,191, 0.8)", + "#03A9F4", + "#FFC107", + "rgba(15, 21, 77, 0.6)", + "#9C27BB", + "rgba(15, 21, 77, 0.4)", + "rgba(146, 213, 249, 0.8)", + "#9C27B0" + ], + legend: { + textStyle: { + color: "rgba(0,0,0,0.87)" + }, + orient: "horizontal", + x: "left", + data: [ + "Banana", + "Mango", + "Jackfruit", + "Pineapple", + "Strawberry", + "Respberry", + "Blackberry", + "Litchi", + "Guava", + "Watermelon" + ] + }, + series: [ + { + name: "Inner Pie", + type: "pie", + selectedMode: "single", + radius: [0, "30%"], + + label: { + normal: { + position: "inner" + } + }, + labelLine: { + normal: { + show: true + } + }, + data: [ + { value: 335, name: "Banana", selected: true }, + { value: 679, name: "Mango" }, + { value: 1548, name: "Jackfrui" } + ], + itemStyle: { + normal: { + // shadowBlur: 200, + // shadowColor: 'rgba(15, 21, 77, 0.5)' + } + } + }, + { + name: "Outer Pie", + type: "pie", + radius: ["40%", "55%"], + label: { + normal: { + formatter: "{a|{a}}{abg|}\n{hr|}\n {b|{b}:}{c} {per|{d}%} ", + backgroundColor: "#eee", + borderColor: "rgba(0,0,0,0.67)", + borderWidth: 1, + borderRadius: 4, + // shadowBlur:3, + // shadowOffsetX: 2, + // shadowOffsetY: 2, + // shadowColor: '#999', + // padding: [0, 7], + rich: { + a: { + color: "rgba(0,0,0,0.67)", + lineHeight: 22, + align: "center" + }, + // abg: { + // backgroundColor: '#333', + // width: '100%', + // align: 'right', + // height: 22, + // borderRadius: [4, 4, 0, 0] + // }, + hr: { + borderColor: "rgba(0,0,0,0.67)", + width: "100%", + borderWidth: 0.5, + height: 0 + }, + b: { + fontSize: 16, + lineHeight: 33 + }, + per: { + color: "#ccc", + backgroundColor: "#334455", + padding: [2, 4], + borderRadius: 2 + } + } + } + }, + data: [ + { value: 335, name: "Orange" }, + { value: 310, name: "Banana" }, + { value: 234, name: "Litchi" }, + { value: 135, name: "Dragon fruit" }, + { value: 1048, name: "Pineapple" }, + { value: 251, name: "Mango" }, + { value: 147, name: "Apricot" }, + { value: 102, name: "Avocado" } + ], + itemStyle: { + normal: { + // shadowBlur: 200, + // shadowColor: 'rgba(15, 21, 77, 0.5)' + } + } + } + ] + }; +} diff --git a/src/assets/examples/chart/echart-radar/echart-radar.component.html b/src/assets/examples/chart/echart-radar/echart-radar.component.html new file mode 100644 index 0000000..17e4ec1 --- /dev/null +++ b/src/assets/examples/chart/echart-radar/echart-radar.component.html @@ -0,0 +1,8 @@ +

Proportion of Browsers

+
+
+ +
+ +

AQI Radar Chart

+
\ No newline at end of file diff --git a/src/assets/examples/chart/echart-radar/echart-radar.component.scss b/src/assets/examples/chart/echart-radar/echart-radar.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/chart/echart-radar/echart-radar.component.spec.ts b/src/assets/examples/chart/echart-radar/echart-radar.component.spec.ts new file mode 100644 index 0000000..c52ba6d --- /dev/null +++ b/src/assets/examples/chart/echart-radar/echart-radar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EchartRadarComponent } from './echart-radar.component'; + +describe('EchartRadarComponent', () => { + let component: EchartRadarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EchartRadarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EchartRadarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/chart/echart-radar/echart-radar.component.ts b/src/assets/examples/chart/echart-radar/echart-radar.component.ts new file mode 100644 index 0000000..7a3503b --- /dev/null +++ b/src/assets/examples/chart/echart-radar/echart-radar.component.ts @@ -0,0 +1,329 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-echart-radar', + templateUrl: './echart-radar.component.html', + styleUrls: ['./echart-radar.component.scss'] +}) +export class EchartRadarComponent implements OnInit { + +aquiRadar; +fancyRadar; + + constructor() { } + + ngOnInit() { + this.loadAQIRadarData(); + this.loadFancyRadarData(); + } + + loadFancyRadarData() { + this.fancyRadar = { + // title: { + // text: 'Proportion Radar', + // subtext: 'Proportion of Browsers', + // top: 10, + // left: 10 + // }, + tooltip: { + trigger: 'item', + backgroundColor : 'rgba(0,0,250,0.2)' + }, + legend: { + type: 'scroll', + bottom: 10, + data: (function (){ + var list = []; + for (var i = 1; i <=28; i++) { + list.push(i + 2000 + ''); + } + return list; + })() + }, + visualMap: { + top: 'middle', + right: 10, + color: ['rgba(15, 21, 77, 0.8)', '#03A9F4'], + calculable: true + }, + radar: { + name: { + textStyle: { + color: 'rgba(0,0,0,0.87)' + } + }, + indicator : [ + { text: 'IE8-', max: 400}, + { text: 'IE9+', max: 400}, + { text: 'Safari', max: 400}, + { text: 'Firefox', max: 400}, + { text: 'Chrome', max: 400} + ] + }, + series : (function (){ + var series = []; + for (var i = 1; i <= 28; i++) { + series.push({ + name:'Hridoy', + type: 'radar', + symbol: 'none', + lineStyle: { + width: 1 + }, + emphasis: { + areaStyle: { + color: '#FFC107' + } + }, + data:[ + { + value:[ + (40 - i) * 10, + (38 - i) * 4 + 60, + i * 5 + 10, + i * 9, + i * i /2 + ], + name: i + 2000 + '' + } + ] + }); + } + return series; + })() +}; + } + + +loadAQIRadarData() { +// Schema: +// date,AQIindex,PM2.5,PM10,CO,NO2,SO2 +var dataBJ = [ + [55,9,56,0.46,18,6,1], + [25,11,21,0.65,34,9,2], + [56,7,63,0.3,14,5,3], + [33,7,29,0.33,16,6,4], + [42,24,44,0.76,40,16,5], + [82,58,90,1.77,68,33,6], + [74,49,77,1.46,48,27,7], + [78,55,80,1.29,59,29,8], + [267,216,280,4.8,108,64,9], + [185,127,216,2.52,61,27,10], + [39,19,38,0.57,31,15,11], + [41,11,40,0.43,21,7,12], + [64,38,74,1.04,46,22,13], + [108,79,120,1.7,75,41,14], + [108,63,116,1.48,44,26,15], + [33,6,29,0.34,13,5,16], + [94,66,110,1.54,62,31,17], + [186,142,192,3.88,93,79,18], + [57,31,54,0.96,32,14,19], + [22,8,17,0.48,23,10,20], + [39,15,36,0.61,29,13,21], + [94,69,114,2.08,73,39,22], + [99,73,110,2.43,76,48,23], + [31,12,30,0.5,32,16,24], + [42,27,43,1,53,22,25], + [154,117,157,3.05,92,58,26], + [234,185,230,4.09,123,69,27], + [160,120,186,2.77,91,50,28], + [134,96,165,2.76,83,41,29], + [52,24,60,1.03,50,21,30], + [46,5,49,0.28,10,6,31] +]; + +var dataGZ = [ + [26,37,27,1.163,27,13,1], + [85,62,71,1.195,60,8,2], + [78,38,74,1.363,37,7,3], + [21,21,36,0.634,40,9,4], + [41,42,46,0.915,81,13,5], + [56,52,69,1.067,92,16,6], + [64,30,28,0.924,51,2,7], + [55,48,74,1.236,75,26,8], + [76,85,113,1.237,114,27,9], + [91,81,104,1.041,56,40,10], + [84,39,60,0.964,25,11,11], + [64,51,101,0.862,58,23,12], + [70,69,120,1.198,65,36,13], + [77,105,178,2.549,64,16,14], + [109,68,87,0.996,74,29,15], + [73,68,97,0.905,51,34,16], + [54,27,47,0.592,53,12,17], + [51,61,97,0.811,65,19,18], + [91,71,121,1.374,43,18,19], + [73,102,182,2.787,44,19,20], + [73,50,76,0.717,31,20,21], + [84,94,140,2.238,68,18,22], + [93,77,104,1.165,53,7,23], + [99,130,227,3.97,55,15,24], + [146,84,139,1.094,40,17,25], + [113,108,137,1.481,48,15,26], + [81,48,62,1.619,26,3,27], + [56,48,68,1.336,37,9,28], + [82,92,174,3.29,0,13,29], + [106,116,188,3.628,101,16,30], + [118,50,0,1.383,76,11,31] +]; + +var dataSH = [ + [91,45,125,0.82,34,23,1], + [65,27,78,0.86,45,29,2], + [83,60,84,1.09,73,27,3], + [109,81,121,1.28,68,51,4], + [106,77,114,1.07,55,51,5], + [109,81,121,1.28,68,51,6], + [106,77,114,1.07,55,51,7], + [89,65,78,0.86,51,26,8], + [53,33,47,0.64,50,17,9], + [80,55,80,1.01,75,24,10], + [117,81,124,1.03,45,24,11], + [99,71,142,1.1,62,42,12], + [95,69,130,1.28,74,50,13], + [116,87,131,1.47,84,40,14], + [108,80,121,1.3,85,37,15], + [134,83,167,1.16,57,43,16], + [79,43,107,1.05,59,37,17], + [71,46,89,0.86,64,25,18], + [97,71,113,1.17,88,31,19], + [84,57,91,0.85,55,31,20], + [87,63,101,0.9,56,41,21], + [104,77,119,1.09,73,48,22], + [87,62,100,1,72,28,23], + [168,128,172,1.49,97,56,24], + [65,45,51,0.74,39,17,25], + [39,24,38,0.61,47,17,26], + [39,24,39,0.59,50,19,27], + [93,68,96,1.05,79,29,28], + [188,143,197,1.66,99,51,29], + [174,131,174,1.55,108,50,30], + [187,143,201,1.39,89,53,31] +]; + +var lineStyle = { + normal: { + width: 1, + opacity: 0.5, + color: "rgba(15, 21, 77, 0.8)" + } +}; + +this.aquiRadar = { + backgroundColor: '#ffffff', +// title: { +// text: 'AQI - Radar', +// left: 'center', +// textStyle: { +// color: '#eee' +// } +// }, + legend: { + bottom: 5, + data: ['Mango', 'Banana', 'Litchi'], + itemGap: 20, + textStyle: { + color: "rgba(0,0,0,, 0.87)", + fontSize: 14 + }, + selectedMode: 'single' + }, + // visualMap: { + // show: true, + // min: 0, + // max: 20, + // dimension: 6, + // inRange: { + // colorLightness: [0.5, 0.8] + // } + // }, + radar: { + indicator: [ + {name: 'AQI', max: 300}, + {name: 'PM2.5', max: 250}, + {name: 'PM10', max: 300}, + {name: 'CO', max: 5}, + {name: 'NO2', max: 200}, + {name: 'SO2', max: 100} + ], + shape: 'circle', + splitNumber: 5, + name: { + textStyle: { + color: 'rgba(0, 0, 0, 0.87)' + } + }, + splitLine: { + lineStyle: { + color: [ + 'rgba(238, 197, 102, 0.1)', 'rgba(238, 197, 102, 0.2)', + 'rgba(238, 197, 102, 0.4)', 'rgba(238, 197, 102, 0.6)', + 'rgba(238, 197, 102, 0.8)', 'rgba(238, 197, 102, 1)' + ].reverse() + } + }, + splitArea: { + show: false + }, + axisLine: { + lineStyle: { + color: 'rgba(238, 197, 102, 0.5)' + } + } + }, + series: [ + { + name: 'Mango', + type: 'radar', + lineStyle: lineStyle, + data: dataBJ, + symbol: 'none', + itemStyle: { + normal: { + color: 'rgba(15, 21, 77, 0.8)' + } + }, + areaStyle: { + normal: { + opacity: 0.1 + } + } + }, + { + name: 'Banana', + type: 'radar', + lineStyle: lineStyle, + data: dataSH, + symbol: 'none', + itemStyle: { + normal: { + color: '#FFC107' + } + }, + areaStyle: { + normal: { + opacity: 0.05 + } + } + }, + { + name: 'Litchi', + type: 'radar', + lineStyle: lineStyle, + data: dataGZ, + symbol: 'none', + itemStyle: { + normal: { + color: '#03A9F4' + } + }, + areaStyle: { + normal: { + opacity: 0.05 + } + } + } + ] +}; +} + +} diff --git a/src/assets/examples/chart/index.ts b/src/assets/examples/chart/index.ts new file mode 100644 index 0000000..890e0e5 --- /dev/null +++ b/src/assets/examples/chart/index.ts @@ -0,0 +1,48 @@ +import { EchartPieComponent } from "./echart-pie/echart-pie.component"; +import { EchartBarComponent } from "./echart-bar/echart-bar.component"; +import { EchartHeatmapComponent } from "./echart-heatmap/echart-heatmap.component"; +import { EchartRadarComponent } from "./echart-radar/echart-radar.component"; + +// ng g c ../assets/examples/chart/ --skip-import + +export const CHART_EXAMPLE_COMPONENT_MAP = { + 'pie': [ + 'echart-pie', + ], + 'bar': [ + 'echart-bar' + ], + 'heatmap': [ + 'echart-heatmap' + ], + 'radar': [ + 'echart-radar' + ] +} + +export const CHART_EXAMPLE_COMPONENTS = { + 'echart-pie': { + title: 'Echart Pie', + component: EchartPieComponent + }, + 'echart-bar': { + title: 'Echart Bar', + component: EchartBarComponent + }, + 'echart-heatmap': { + title: 'Echart Heatmap', + component: EchartHeatmapComponent + }, + 'echart-radar': { + title: 'Echart Radar', + component: EchartRadarComponent + }, + +} + +export const CHART_EXAMPLE_COMPONENT_LIST = [ + EchartPieComponent, + EchartBarComponent, + EchartHeatmapComponent, + EchartRadarComponent +] \ No newline at end of file diff --git a/src/assets/examples/material/accordin-expansion-panel/accordin-expansion-panel.component.html b/src/assets/examples/material/accordin-expansion-panel/accordin-expansion-panel.component.html new file mode 100644 index 0000000..c76cdf8 --- /dev/null +++ b/src/assets/examples/material/accordin-expansion-panel/accordin-expansion-panel.component.html @@ -0,0 +1,69 @@ + + + + + Personal data + + + Type your name and age + account_circle + + + + + + + + + + + + + + + + + + + + Destination + + + Type the country name + map + + + + + + + + + + + + + + + + + Day of the trip + + + Inform the date you wish to travel + date_range + + + + + + + + + + + + + + + diff --git a/src/assets/examples/material/accordin-expansion-panel/accordin-expansion-panel.component.scss b/src/assets/examples/material/accordin-expansion-panel/accordin-expansion-panel.component.scss new file mode 100644 index 0000000..dadd684 --- /dev/null +++ b/src/assets/examples/material/accordin-expansion-panel/accordin-expansion-panel.component.scss @@ -0,0 +1,13 @@ +.example-headers-align .mat-expansion-panel-header-title, +.example-headers-align .mat-expansion-panel-header-description { + flex-basis: 0; +} + +.example-headers-align .mat-expansion-panel-header-description { + justify-content: space-between; + align-items: center; +} + +mat-form-field { + margin-right: 12px; +} diff --git a/src/assets/examples/material/accordin-expansion-panel/accordin-expansion-panel.component.spec.ts b/src/assets/examples/material/accordin-expansion-panel/accordin-expansion-panel.component.spec.ts new file mode 100644 index 0000000..22bfa17 --- /dev/null +++ b/src/assets/examples/material/accordin-expansion-panel/accordin-expansion-panel.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AccordinExpansionPanelComponent } from './accordin-expansion-panel.component'; + +describe('AccordinExpansionPanelComponent', () => { + let component: AccordinExpansionPanelComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AccordinExpansionPanelComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AccordinExpansionPanelComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/accordin-expansion-panel/accordin-expansion-panel.component.ts b/src/assets/examples/material/accordin-expansion-panel/accordin-expansion-panel.component.ts new file mode 100644 index 0000000..517c748 --- /dev/null +++ b/src/assets/examples/material/accordin-expansion-panel/accordin-expansion-panel.component.ts @@ -0,0 +1,29 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-accordin-expansion-panel', + templateUrl: './accordin-expansion-panel.component.html', + styleUrls: ['./accordin-expansion-panel.component.scss'] +}) +export class AccordinExpansionPanelComponent implements OnInit { + + step = 0; + + setStep(index: number) { + this.step = index; + } + + nextStep() { + this.step++; + } + + prevStep() { + this.step--; + } + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/align-tab-group/align-tab-group.component.html b/src/assets/examples/material/align-tab-group/align-tab-group.component.html new file mode 100644 index 0000000..a65b5e8 --- /dev/null +++ b/src/assets/examples/material/align-tab-group/align-tab-group.component.html @@ -0,0 +1,18 @@ + + Content 1 + Content 2 + Content 3 + + + + Content 1 + Content 2 + Content 3 + + + + Content 1 + Content 2 + Content 3 + + \ No newline at end of file diff --git a/src/assets/examples/material/align-tab-group/align-tab-group.component.scss b/src/assets/examples/material/align-tab-group/align-tab-group.component.scss new file mode 100644 index 0000000..39901a6 --- /dev/null +++ b/src/assets/examples/material/align-tab-group/align-tab-group.component.scss @@ -0,0 +1,4 @@ +.mat-tab-group { + margin-bottom: 48px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/align-tab-group/align-tab-group.component.spec.ts b/src/assets/examples/material/align-tab-group/align-tab-group.component.spec.ts new file mode 100644 index 0000000..8b4ecb3 --- /dev/null +++ b/src/assets/examples/material/align-tab-group/align-tab-group.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AlignTabGroupComponent } from './align-tab-group.component'; + +describe('AlignTabGroupComponent', () => { + let component: AlignTabGroupComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AlignTabGroupComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AlignTabGroupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/align-tab-group/align-tab-group.component.ts b/src/assets/examples/material/align-tab-group/align-tab-group.component.ts new file mode 100644 index 0000000..3a4360c --- /dev/null +++ b/src/assets/examples/material/align-tab-group/align-tab-group.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-align-tab-group', + templateUrl: './align-tab-group.component.html', + styleUrls: ['./align-tab-group.component.scss'] +}) +export class AlignTabGroupComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/animation-tab-group/animation-tab-group.component.html b/src/assets/examples/material/animation-tab-group/animation-tab-group.component.html new file mode 100644 index 0000000..4feae22 --- /dev/null +++ b/src/assets/examples/material/animation-tab-group/animation-tab-group.component.html @@ -0,0 +1,14 @@ +

No animation

+ + + Content 1 + Content 2 + Content 3 + + +

Very slow animation

+ + Content 1 + Content 2 + Content 3 + diff --git a/src/assets/examples/material/animation-tab-group/animation-tab-group.component.scss b/src/assets/examples/material/animation-tab-group/animation-tab-group.component.scss new file mode 100644 index 0000000..39901a6 --- /dev/null +++ b/src/assets/examples/material/animation-tab-group/animation-tab-group.component.scss @@ -0,0 +1,4 @@ +.mat-tab-group { + margin-bottom: 48px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/animation-tab-group/animation-tab-group.component.spec.ts b/src/assets/examples/material/animation-tab-group/animation-tab-group.component.spec.ts new file mode 100644 index 0000000..54a67e9 --- /dev/null +++ b/src/assets/examples/material/animation-tab-group/animation-tab-group.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AnimationTabGroupComponent } from './animation-tab-group.component'; + +describe('AnimationTabGroupComponent', () => { + let component: AnimationTabGroupComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AnimationTabGroupComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AnimationTabGroupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/animation-tab-group/animation-tab-group.component.ts b/src/assets/examples/material/animation-tab-group/animation-tab-group.component.ts new file mode 100644 index 0000000..5c06f60 --- /dev/null +++ b/src/assets/examples/material/animation-tab-group/animation-tab-group.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-animation-tab-group', + templateUrl: './animation-tab-group.component.html', + styleUrls: ['./animation-tab-group.component.scss'] +}) +export class AnimationTabGroupComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/appearance-form-field/appearance-form-field.component.html b/src/assets/examples/material/appearance-form-field/appearance-form-field.component.html new file mode 100644 index 0000000..4ccce92 --- /dev/null +++ b/src/assets/examples/material/appearance-form-field/appearance-form-field.component.html @@ -0,0 +1,32 @@ +

+ + Legacy form field + + sentiment_very_satisfied + Hint + +

+

+ + Standard form field + + sentiment_very_satisfied + Hint + +

+

+ + Fill form field + + sentiment_very_satisfied + Hint + +

+

+ + Outline form field + + sentiment_very_satisfied + Hint + +

diff --git a/src/assets/examples/material/appearance-form-field/appearance-form-field.component.scss b/src/assets/examples/material/appearance-form-field/appearance-form-field.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/appearance-form-field/appearance-form-field.component.spec.ts b/src/assets/examples/material/appearance-form-field/appearance-form-field.component.spec.ts new file mode 100644 index 0000000..15bdcbd --- /dev/null +++ b/src/assets/examples/material/appearance-form-field/appearance-form-field.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AppearanceFormFieldComponent } from './appearance-form-field.component'; + +describe('AppearanceFormFieldComponent', () => { + let component: AppearanceFormFieldComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AppearanceFormFieldComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AppearanceFormFieldComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/appearance-form-field/appearance-form-field.component.ts b/src/assets/examples/material/appearance-form-field/appearance-form-field.component.ts new file mode 100644 index 0000000..6a0076e --- /dev/null +++ b/src/assets/examples/material/appearance-form-field/appearance-form-field.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-appearance-form-field', + templateUrl: './appearance-form-field.component.html', + styleUrls: ['./appearance-form-field.component.scss'] +}) +export class AppearanceFormFieldComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/auto-hide-tooltip/auto-hide-tooltip.component.html b/src/assets/examples/material/auto-hide-tooltip/auto-hide-tooltip.component.html new file mode 100644 index 0000000..cd09f06 --- /dev/null +++ b/src/assets/examples/material/auto-hide-tooltip/auto-hide-tooltip.component.html @@ -0,0 +1,18 @@ + + + + {{positionOption}} + + + + +
+ +
diff --git a/src/assets/examples/material/auto-hide-tooltip/auto-hide-tooltip.component.scss b/src/assets/examples/material/auto-hide-tooltip/auto-hide-tooltip.component.scss new file mode 100644 index 0000000..f301120 --- /dev/null +++ b/src/assets/examples/material/auto-hide-tooltip/auto-hide-tooltip.component.scss @@ -0,0 +1,11 @@ +.example-button { + display: block; + margin: 80px auto 400px; + } + + .example-container { + height: 200px; + overflow: auto; + border: 1px solid #ccc; + } + \ No newline at end of file diff --git a/src/assets/examples/material/auto-hide-tooltip/auto-hide-tooltip.component.spec.ts b/src/assets/examples/material/auto-hide-tooltip/auto-hide-tooltip.component.spec.ts new file mode 100644 index 0000000..106d9cc --- /dev/null +++ b/src/assets/examples/material/auto-hide-tooltip/auto-hide-tooltip.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AutoHideTooltipComponent } from './auto-hide-tooltip.component'; + +describe('AutoHideTooltipComponent', () => { + let component: AutoHideTooltipComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AutoHideTooltipComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AutoHideTooltipComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/auto-hide-tooltip/auto-hide-tooltip.component.ts b/src/assets/examples/material/auto-hide-tooltip/auto-hide-tooltip.component.ts new file mode 100644 index 0000000..afc1668 --- /dev/null +++ b/src/assets/examples/material/auto-hide-tooltip/auto-hide-tooltip.component.ts @@ -0,0 +1,20 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl} from '@angular/forms'; +import { TooltipPosition } from '@angular/material/tooltip'; + +@Component({ + selector: 'app-auto-hide-tooltip', + templateUrl: './auto-hide-tooltip.component.html', + styleUrls: ['./auto-hide-tooltip.component.scss'] +}) +export class AutoHideTooltipComponent implements OnInit { + + positionOptions: TooltipPosition[] = ['below', 'above', 'left', 'right']; + position = new FormControl(this.positionOptions[0]); + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/auto-resizing-texarea/auto-resizing-texarea.component.html b/src/assets/examples/material/auto-resizing-texarea/auto-resizing-texarea.component.html new file mode 100644 index 0000000..761214c --- /dev/null +++ b/src/assets/examples/material/auto-resizing-texarea/auto-resizing-texarea.component.html @@ -0,0 +1,20 @@ + + Font size + + 10px + 12px + 14px + 16px + 18px + 20px + + + + + Autosize textarea + + diff --git a/src/assets/examples/material/auto-resizing-texarea/auto-resizing-texarea.component.scss b/src/assets/examples/material/auto-resizing-texarea/auto-resizing-texarea.component.scss new file mode 100644 index 0000000..692ed8c --- /dev/null +++ b/src/assets/examples/material/auto-resizing-texarea/auto-resizing-texarea.component.scss @@ -0,0 +1,4 @@ +mat-form-field { + margin-right: 12px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/auto-resizing-texarea/auto-resizing-texarea.component.spec.ts b/src/assets/examples/material/auto-resizing-texarea/auto-resizing-texarea.component.spec.ts new file mode 100644 index 0000000..23bdf50 --- /dev/null +++ b/src/assets/examples/material/auto-resizing-texarea/auto-resizing-texarea.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AutoResizingTexareaComponent } from './auto-resizing-texarea.component'; + +describe('AutoResizingTexareaComponent', () => { + let component: AutoResizingTexareaComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AutoResizingTexareaComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AutoResizingTexareaComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/auto-resizing-texarea/auto-resizing-texarea.component.ts b/src/assets/examples/material/auto-resizing-texarea/auto-resizing-texarea.component.ts new file mode 100644 index 0000000..3b413da --- /dev/null +++ b/src/assets/examples/material/auto-resizing-texarea/auto-resizing-texarea.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from "@angular/core"; +import { CdkTextareaAutosize } from "@angular/cdk/text-field"; +import { NgZone, ViewChild } from "@angular/core"; +import { take } from "rxjs/operators"; + +@Component({ + selector: "app-auto-resizing-texarea", + templateUrl: "./auto-resizing-texarea.component.html", + styleUrls: ["./auto-resizing-texarea.component.scss"] +}) +export class AutoResizingTexareaComponent implements OnInit { + constructor(private ngZone: NgZone) {} + + @ViewChild("autosize") autosize: CdkTextareaAutosize; + + triggerResize() { + // Wait for changes to be applied, then trigger textarea resize. + this.ngZone.onStable + .pipe(take(1)) + .subscribe(() => this.autosize.resizeToFitContent(true)); + } + + ngOnInit() {} +} diff --git a/src/assets/examples/material/autocomplete-chip/autocomplete-chip.component.html b/src/assets/examples/material/autocomplete-chip/autocomplete-chip.component.html new file mode 100644 index 0000000..0a5901d --- /dev/null +++ b/src/assets/examples/material/autocomplete-chip/autocomplete-chip.component.html @@ -0,0 +1,27 @@ + + + + {{fruit}} + cancel + + + + + + {{fruit}} + + + + \ No newline at end of file diff --git a/src/assets/examples/material/autocomplete-chip/autocomplete-chip.component.scss b/src/assets/examples/material/autocomplete-chip/autocomplete-chip.component.scss new file mode 100644 index 0000000..df15c4b --- /dev/null +++ b/src/assets/examples/material/autocomplete-chip/autocomplete-chip.component.scss @@ -0,0 +1,6 @@ +.example-chip-list { + width: 100%; + } + .mat-chip:not(.mat-basic-chip) { + display: flex; + } \ No newline at end of file diff --git a/src/assets/examples/material/autocomplete-chip/autocomplete-chip.component.spec.ts b/src/assets/examples/material/autocomplete-chip/autocomplete-chip.component.spec.ts new file mode 100644 index 0000000..dff5342 --- /dev/null +++ b/src/assets/examples/material/autocomplete-chip/autocomplete-chip.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AutocompleteChipComponent } from './autocomplete-chip.component'; + +describe('AutocompleteChipComponent', () => { + let component: AutocompleteChipComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AutocompleteChipComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AutocompleteChipComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/autocomplete-chip/autocomplete-chip.component.ts b/src/assets/examples/material/autocomplete-chip/autocomplete-chip.component.ts new file mode 100644 index 0000000..d708407 --- /dev/null +++ b/src/assets/examples/material/autocomplete-chip/autocomplete-chip.component.ts @@ -0,0 +1,74 @@ +import {COMMA, ENTER} from '@angular/cdk/keycodes'; +import {Component, ElementRef, ViewChild} from '@angular/core'; +import {FormControl} from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocomplete } from '@angular/material/autocomplete'; +import { MatChipInputEvent } from '@angular/material/chips'; +import {Observable} from 'rxjs'; +import {map, startWith} from 'rxjs/operators'; + +@Component({ + selector: 'app-autocomplete-chip', + templateUrl: './autocomplete-chip.component.html', + styleUrls: ['./autocomplete-chip.component.scss'] +}) +export class AutocompleteChipComponent{ + visible = true; + selectable = true; + removable = true; + addOnBlur = true; + separatorKeysCodes: number[] = [ENTER, COMMA]; + fruitCtrl = new FormControl(); + filteredFruits: Observable; + fruits: string[] = ['Lemon']; + allFruits: string[] = ['Apple', 'Lemon', 'Lime', 'Orange', 'Strawberry']; + + @ViewChild('fruitInput') fruitInput: ElementRef; + @ViewChild('auto') matAutocomplete: MatAutocomplete; + + constructor() { + this.filteredFruits = this.fruitCtrl.valueChanges.pipe( + startWith(null), + map((fruit: string | null) => fruit ? this._filter(fruit) : this.allFruits.slice())); + } + + add(event: MatChipInputEvent): void { + // Add fruit only when MatAutocomplete is not open + // To make sure this does not conflict with OptionSelected Event + if (!this.matAutocomplete.isOpen) { + const input = event.input; + const value = event.value; + + // Add our fruit + if ((value || '').trim()) { + this.fruits.push(value.trim()); + } + + // Reset the input value + if (input) { + input.value = ''; + } + + this.fruitCtrl.setValue(null); + } + } + + remove(fruit: string): void { + const index = this.fruits.indexOf(fruit); + + if (index >= 0) { + this.fruits.splice(index, 1); + } + } + + selected(event: MatAutocompleteSelectedEvent): void { + this.fruits.push(event.option.viewValue); + this.fruitInput.nativeElement.value = ''; + this.fruitCtrl.setValue(null); + } + + private _filter(value: string): string[] { + const filterValue = value.toLowerCase(); + + return this.allFruits.filter(fruit => fruit.toLowerCase().indexOf(filterValue) === 0); + } +} diff --git a/src/assets/examples/material/autocomplete-overview/autocomplete-overview.component.html b/src/assets/examples/material/autocomplete-overview/autocomplete-overview.component.html new file mode 100644 index 0000000..09ab07f --- /dev/null +++ b/src/assets/examples/material/autocomplete-overview/autocomplete-overview.component.html @@ -0,0 +1,20 @@ +
+ + + + + + {{state.name}} | + Population: {{state.population}} + + + + +
+ + + Disable Input? + +
diff --git a/src/assets/examples/material/autocomplete-overview/autocomplete-overview.component.scss b/src/assets/examples/material/autocomplete-overview/autocomplete-overview.component.scss new file mode 100644 index 0000000..3957a6e --- /dev/null +++ b/src/assets/examples/material/autocomplete-overview/autocomplete-overview.component.scss @@ -0,0 +1,20 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; + } + + .example-full-width { + width: 100%; + } + + .example-option-img { + vertical-align: middle; + margin-right: 8px; + } + + [dir='rtl'] .example-option-img { + margin-right: 0; + margin-left: 8px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/autocomplete-overview/autocomplete-overview.component.spec.ts b/src/assets/examples/material/autocomplete-overview/autocomplete-overview.component.spec.ts new file mode 100644 index 0000000..020b3f4 --- /dev/null +++ b/src/assets/examples/material/autocomplete-overview/autocomplete-overview.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AutocompleteOverviewComponent } from './autocomplete-overview.component'; + +describe('AutocompleteOverviewComponent', () => { + let component: AutocompleteOverviewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AutocompleteOverviewComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AutocompleteOverviewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/autocomplete-overview/autocomplete-overview.component.ts b/src/assets/examples/material/autocomplete-overview/autocomplete-overview.component.ts new file mode 100644 index 0000000..9dbf0af --- /dev/null +++ b/src/assets/examples/material/autocomplete-overview/autocomplete-overview.component.ts @@ -0,0 +1,63 @@ +import {Component} from '@angular/core'; +import {FormControl} from '@angular/forms'; +import {Observable} from 'rxjs'; +import {map, startWith} from 'rxjs/operators'; + +export interface State { + flag: string; + name: string; + population: string; +} + +@Component({ + selector: 'app-autocomplete-overview', + templateUrl: './autocomplete-overview.component.html', + styleUrls: ['./autocomplete-overview.component.scss'] +}) +export class AutocompleteOverviewComponent { + + stateCtrl = new FormControl(); + filteredStates: Observable; + + states: State[] = [ + { + name: 'Arkansas', + population: '2.978M', + // https://commons.wikimedia.org/wiki/File:Flag_of_Arkansas.svg + flag: 'https://upload.wikimedia.org/wikipedia/commons/9/9d/Flag_of_Arkansas.svg' + }, + { + name: 'California', + population: '39.14M', + // https://commons.wikimedia.org/wiki/File:Flag_of_California.svg + flag: 'https://upload.wikimedia.org/wikipedia/commons/0/01/Flag_of_California.svg' + }, + { + name: 'Florida', + population: '20.27M', + // https://commons.wikimedia.org/wiki/File:Flag_of_Florida.svg + flag: 'https://upload.wikimedia.org/wikipedia/commons/f/f7/Flag_of_Florida.svg' + }, + { + name: 'Texas', + population: '27.47M', + // https://commons.wikimedia.org/wiki/File:Flag_of_Texas.svg + flag: 'https://upload.wikimedia.org/wikipedia/commons/f/f7/Flag_of_Texas.svg' + } + ]; + + constructor() { + this.filteredStates = this.stateCtrl.valueChanges + .pipe( + startWith(''), + map(state => state ? this._filterStates(state) : this.states.slice()) + ); + } + + private _filterStates(value: string): State[] { + const filterValue = value.toLowerCase(); + + return this.states.filter(state => state.name.toLowerCase().indexOf(filterValue) === 0); + } + +} diff --git a/src/assets/examples/material/autoresize-sidenav/autoresize-sidenav.component.html b/src/assets/examples/material/autoresize-sidenav/autoresize-sidenav.component.html new file mode 100644 index 0000000..f9326a3 --- /dev/null +++ b/src/assets/examples/material/autoresize-sidenav/autoresize-sidenav.component.html @@ -0,0 +1,16 @@ + + +

Auto-resizing sidenav

+

Lorem, ipsum dolor sit amet consectetur.

+ +
+ +
+ +
+ +
diff --git a/src/assets/examples/material/autoresize-sidenav/autoresize-sidenav.component.scss b/src/assets/examples/material/autoresize-sidenav/autoresize-sidenav.component.scss new file mode 100644 index 0000000..1629d12 --- /dev/null +++ b/src/assets/examples/material/autoresize-sidenav/autoresize-sidenav.component.scss @@ -0,0 +1,17 @@ +.example-container { + width: 500px; + height: 300px; + border: 1px solid rgba(0, 0, 0, 0.5); + } + + .example-sidenav-content { + display: flex; + height: 100%; + align-items: center; + justify-content: center; + } + + .example-sidenav { + padding: 20px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/autoresize-sidenav/autoresize-sidenav.component.spec.ts b/src/assets/examples/material/autoresize-sidenav/autoresize-sidenav.component.spec.ts new file mode 100644 index 0000000..7c25993 --- /dev/null +++ b/src/assets/examples/material/autoresize-sidenav/autoresize-sidenav.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AutoresizeSidenavComponent } from './autoresize-sidenav.component'; + +describe('AutoresizeSidenavComponent', () => { + let component: AutoresizeSidenavComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AutoresizeSidenavComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AutoresizeSidenavComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/autoresize-sidenav/autoresize-sidenav.component.ts b/src/assets/examples/material/autoresize-sidenav/autoresize-sidenav.component.ts new file mode 100644 index 0000000..45736f2 --- /dev/null +++ b/src/assets/examples/material/autoresize-sidenav/autoresize-sidenav.component.ts @@ -0,0 +1,17 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-autoresize-sidenav', + templateUrl: './autoresize-sidenav.component.html', + styleUrls: ['./autoresize-sidenav.component.scss'] +}) +export class AutoresizeSidenavComponent implements OnInit { + + showFiller = false; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-badge/basic-badge.component.html b/src/assets/examples/material/basic-badge/basic-badge.component.html new file mode 100644 index 0000000..3412708 --- /dev/null +++ b/src/assets/examples/material/basic-badge/basic-badge.component.html @@ -0,0 +1,22 @@ +

+ Text with a badge +

+ +

+ Button with a badge on the left + +

+ +

+ Icon with a badge + home + + + Example with a home icon with overlaid badge showing the number 15 + +

+ + \ No newline at end of file diff --git a/src/assets/examples/material/basic-badge/basic-badge.component.scss b/src/assets/examples/material/basic-badge/basic-badge.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-badge/basic-badge.component.spec.ts b/src/assets/examples/material/basic-badge/basic-badge.component.spec.ts new file mode 100644 index 0000000..bd171cf --- /dev/null +++ b/src/assets/examples/material/basic-badge/basic-badge.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicBadgeComponent } from './basic-badge.component'; + +describe('BasicBadgeComponent', () => { + let component: BasicBadgeComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicBadgeComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicBadgeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-badge/basic-badge.component.ts b/src/assets/examples/material/basic-badge/basic-badge.component.ts new file mode 100644 index 0000000..ad9223b --- /dev/null +++ b/src/assets/examples/material/basic-badge/basic-badge.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-badge', + templateUrl: './basic-badge.component.html', + styleUrls: ['./basic-badge.component.scss'] +}) +export class BasicBadgeComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-bar/basic-bar.component.html b/src/assets/examples/material/basic-bar/basic-bar.component.html new file mode 100644 index 0000000..905e852 --- /dev/null +++ b/src/assets/examples/material/basic-bar/basic-bar.component.html @@ -0,0 +1 @@ + diff --git a/src/assets/examples/material/basic-bar/basic-bar.component.scss b/src/assets/examples/material/basic-bar/basic-bar.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-bar/basic-bar.component.spec.ts b/src/assets/examples/material/basic-bar/basic-bar.component.spec.ts new file mode 100644 index 0000000..a2fe1ec --- /dev/null +++ b/src/assets/examples/material/basic-bar/basic-bar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicBarComponent } from './basic-bar.component'; + +describe('BasicBarComponent', () => { + let component: BasicBarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicBarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-bar/basic-bar.component.ts b/src/assets/examples/material/basic-bar/basic-bar.component.ts new file mode 100644 index 0000000..be59eee --- /dev/null +++ b/src/assets/examples/material/basic-bar/basic-bar.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-bar', + templateUrl: './basic-bar.component.html', + styleUrls: ['./basic-bar.component.scss'] +}) +export class BasicBarComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-button-toggle/basic-button-toggle.component.html b/src/assets/examples/material/basic-button-toggle/basic-button-toggle.component.html new file mode 100644 index 0000000..3a765e2 --- /dev/null +++ b/src/assets/examples/material/basic-button-toggle/basic-button-toggle.component.html @@ -0,0 +1,6 @@ + + Bold + Italic + Underline + + \ No newline at end of file diff --git a/src/assets/examples/material/basic-button-toggle/basic-button-toggle.component.scss b/src/assets/examples/material/basic-button-toggle/basic-button-toggle.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-button-toggle/basic-button-toggle.component.spec.ts b/src/assets/examples/material/basic-button-toggle/basic-button-toggle.component.spec.ts new file mode 100644 index 0000000..e06f7b2 --- /dev/null +++ b/src/assets/examples/material/basic-button-toggle/basic-button-toggle.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicButtonToggleComponent } from './basic-button-toggle.component'; + +describe('BasicButtonToggleComponent', () => { + let component: BasicButtonToggleComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicButtonToggleComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicButtonToggleComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-button-toggle/basic-button-toggle.component.ts b/src/assets/examples/material/basic-button-toggle/basic-button-toggle.component.ts new file mode 100644 index 0000000..cb23f85 --- /dev/null +++ b/src/assets/examples/material/basic-button-toggle/basic-button-toggle.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-button-toggle', + templateUrl: './basic-button-toggle.component.html', + styleUrls: ['./basic-button-toggle.component.scss'] +}) +export class BasicButtonToggleComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-card/basic-card.component.html b/src/assets/examples/material/basic-card/basic-card.component.html new file mode 100644 index 0000000..7745315 --- /dev/null +++ b/src/assets/examples/material/basic-card/basic-card.component.html @@ -0,0 +1 @@ +Simple card diff --git a/src/assets/examples/material/basic-card/basic-card.component.scss b/src/assets/examples/material/basic-card/basic-card.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-card/basic-card.component.spec.ts b/src/assets/examples/material/basic-card/basic-card.component.spec.ts new file mode 100644 index 0000000..8281a20 --- /dev/null +++ b/src/assets/examples/material/basic-card/basic-card.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicCardComponent } from './basic-card.component'; + +describe('BasicCardComponent', () => { + let component: BasicCardComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicCardComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicCardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-card/basic-card.component.ts b/src/assets/examples/material/basic-card/basic-card.component.ts new file mode 100644 index 0000000..4a35c08 --- /dev/null +++ b/src/assets/examples/material/basic-card/basic-card.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-card', + templateUrl: './basic-card.component.html', + styleUrls: ['./basic-card.component.scss'] +}) +export class BasicCardComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-checkbox/basic-checkbox.component.html b/src/assets/examples/material/basic-checkbox/basic-checkbox.component.html new file mode 100644 index 0000000..b5b049f --- /dev/null +++ b/src/assets/examples/material/basic-checkbox/basic-checkbox.component.html @@ -0,0 +1 @@ +Check me! diff --git a/src/assets/examples/material/basic-checkbox/basic-checkbox.component.scss b/src/assets/examples/material/basic-checkbox/basic-checkbox.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-checkbox/basic-checkbox.component.spec.ts b/src/assets/examples/material/basic-checkbox/basic-checkbox.component.spec.ts new file mode 100644 index 0000000..7164f70 --- /dev/null +++ b/src/assets/examples/material/basic-checkbox/basic-checkbox.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicCheckboxComponent } from './basic-checkbox.component'; + +describe('BasicCheckboxComponent', () => { + let component: BasicCheckboxComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicCheckboxComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicCheckboxComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-checkbox/basic-checkbox.component.ts b/src/assets/examples/material/basic-checkbox/basic-checkbox.component.ts new file mode 100644 index 0000000..7cf788a --- /dev/null +++ b/src/assets/examples/material/basic-checkbox/basic-checkbox.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-checkbox', + templateUrl: './basic-checkbox.component.html', + styleUrls: ['./basic-checkbox.component.scss'] +}) +export class BasicCheckboxComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-chip/basic-chip.component.html b/src/assets/examples/material/basic-chip/basic-chip.component.html new file mode 100644 index 0000000..6307166 --- /dev/null +++ b/src/assets/examples/material/basic-chip/basic-chip.component.html @@ -0,0 +1,7 @@ + + One fish + Two fish + Primary fish + Accent fish + + \ No newline at end of file diff --git a/src/assets/examples/material/basic-chip/basic-chip.component.scss b/src/assets/examples/material/basic-chip/basic-chip.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-chip/basic-chip.component.spec.ts b/src/assets/examples/material/basic-chip/basic-chip.component.spec.ts new file mode 100644 index 0000000..5b2e46d --- /dev/null +++ b/src/assets/examples/material/basic-chip/basic-chip.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicChipComponent } from './basic-chip.component'; + +describe('BasicChipComponent', () => { + let component: BasicChipComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicChipComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicChipComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-chip/basic-chip.component.ts b/src/assets/examples/material/basic-chip/basic-chip.component.ts new file mode 100644 index 0000000..e87a3c5 --- /dev/null +++ b/src/assets/examples/material/basic-chip/basic-chip.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-chip', + templateUrl: './basic-chip.component.html', + styleUrls: ['./basic-chip.component.scss'] +}) +export class BasicChipComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-datepicker/basic-datepicker.component.html b/src/assets/examples/material/basic-datepicker/basic-datepicker.component.html new file mode 100644 index 0000000..f828805 --- /dev/null +++ b/src/assets/examples/material/basic-datepicker/basic-datepicker.component.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/examples/material/basic-datepicker/basic-datepicker.component.scss b/src/assets/examples/material/basic-datepicker/basic-datepicker.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-datepicker/basic-datepicker.component.spec.ts b/src/assets/examples/material/basic-datepicker/basic-datepicker.component.spec.ts new file mode 100644 index 0000000..15c395d --- /dev/null +++ b/src/assets/examples/material/basic-datepicker/basic-datepicker.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicDatepickerComponent } from './basic-datepicker.component'; + +describe('BasicDatepickerComponent', () => { + let component: BasicDatepickerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicDatepickerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicDatepickerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-datepicker/basic-datepicker.component.ts b/src/assets/examples/material/basic-datepicker/basic-datepicker.component.ts new file mode 100644 index 0000000..4e87673 --- /dev/null +++ b/src/assets/examples/material/basic-datepicker/basic-datepicker.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-datepicker', + templateUrl: './basic-datepicker.component.html', + styleUrls: ['./basic-datepicker.component.scss'] +}) +export class BasicDatepickerComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-dialog/basic-dialog-overview/basic-dialog-overview.component.html b/src/assets/examples/material/basic-dialog/basic-dialog-overview/basic-dialog-overview.component.html new file mode 100644 index 0000000..daa6744 --- /dev/null +++ b/src/assets/examples/material/basic-dialog/basic-dialog-overview/basic-dialog-overview.component.html @@ -0,0 +1,11 @@ +

Hi {{data.name}}

+
+

What's your favorite animal?

+ + + +
+
+ + +
diff --git a/src/assets/examples/material/basic-dialog/basic-dialog-overview/basic-dialog-overview.component.scss b/src/assets/examples/material/basic-dialog/basic-dialog-overview/basic-dialog-overview.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-dialog/basic-dialog-overview/basic-dialog-overview.component.spec.ts b/src/assets/examples/material/basic-dialog/basic-dialog-overview/basic-dialog-overview.component.spec.ts new file mode 100644 index 0000000..47a8029 --- /dev/null +++ b/src/assets/examples/material/basic-dialog/basic-dialog-overview/basic-dialog-overview.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicDialogOverviewComponent } from './basic-dialog-overview.component'; + +describe('BasicDialogOverviewComponent', () => { + let component: BasicDialogOverviewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicDialogOverviewComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicDialogOverviewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-dialog/basic-dialog-overview/basic-dialog-overview.component.ts b/src/assets/examples/material/basic-dialog/basic-dialog-overview/basic-dialog-overview.component.ts new file mode 100644 index 0000000..afe8a56 --- /dev/null +++ b/src/assets/examples/material/basic-dialog/basic-dialog-overview/basic-dialog-overview.component.ts @@ -0,0 +1,20 @@ +import { Component, OnInit, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +// import { any } from '../basic-dialog.component'; + +@Component({ + selector: 'app-basic-dialog-overview', + templateUrl: './basic-dialog-overview.component.html', + styleUrls: ['./basic-dialog-overview.component.scss'] +}) +export class BasicDialogOverviewComponent{ + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any) {} + + onNoClick(): void { + this.dialogRef.close(); + } + +} diff --git a/src/assets/examples/material/basic-dialog/basic-dialog.component.html b/src/assets/examples/material/basic-dialog/basic-dialog.component.html new file mode 100644 index 0000000..00e1485 --- /dev/null +++ b/src/assets/examples/material/basic-dialog/basic-dialog.component.html @@ -0,0 +1,13 @@ +
    +
  1. + + + +
  2. +
  3. + +
  4. +
  5. + You chose: {{animal}} +
  6. +
diff --git a/src/assets/examples/material/basic-dialog/basic-dialog.component.scss b/src/assets/examples/material/basic-dialog/basic-dialog.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-dialog/basic-dialog.component.spec.ts b/src/assets/examples/material/basic-dialog/basic-dialog.component.spec.ts new file mode 100644 index 0000000..dc8ca75 --- /dev/null +++ b/src/assets/examples/material/basic-dialog/basic-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicDialogComponent } from './basic-dialog.component'; + +describe('BasicDialogComponent', () => { + let component: BasicDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicDialogComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-dialog/basic-dialog.component.ts b/src/assets/examples/material/basic-dialog/basic-dialog.component.ts new file mode 100644 index 0000000..4f6ee54 --- /dev/null +++ b/src/assets/examples/material/basic-dialog/basic-dialog.component.ts @@ -0,0 +1,34 @@ +import {Component} from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { BasicDialogOverviewComponent } from './basic-dialog-overview/basic-dialog-overview.component'; + +export interface DialogData { + animal: string; + name: string; +} + +@Component({ + selector: 'app-basic-dialog', + templateUrl: './basic-dialog.component.html', + styleUrls: ['./basic-dialog.component.scss'] +}) +export class BasicDialogComponent { + + animal: string; + name: string; + + constructor(public dialog: MatDialog) {} + + openDialog(): void { + const dialogRef = this.dialog.open(BasicDialogOverviewComponent, { + width: '250px', + data: {name: this.name, animal: this.animal} + }); + + dialogRef.afterClosed().subscribe(result => { + // console.log('The dialog was closed'); + this.animal = result; + }); + } + +} diff --git a/src/assets/examples/material/basic-divider/basic-divider.component.html b/src/assets/examples/material/basic-divider/basic-divider.component.html new file mode 100644 index 0000000..c0e121f --- /dev/null +++ b/src/assets/examples/material/basic-divider/basic-divider.component.html @@ -0,0 +1,7 @@ + + Item 1 + + Item 2 + + Item 3 + diff --git a/src/assets/examples/material/basic-divider/basic-divider.component.scss b/src/assets/examples/material/basic-divider/basic-divider.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-divider/basic-divider.component.spec.ts b/src/assets/examples/material/basic-divider/basic-divider.component.spec.ts new file mode 100644 index 0000000..510d4a0 --- /dev/null +++ b/src/assets/examples/material/basic-divider/basic-divider.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicDividerComponent } from './basic-divider.component'; + +describe('BasicDividerComponent', () => { + let component: BasicDividerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicDividerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicDividerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-divider/basic-divider.component.ts b/src/assets/examples/material/basic-divider/basic-divider.component.ts new file mode 100644 index 0000000..0831ec3 --- /dev/null +++ b/src/assets/examples/material/basic-divider/basic-divider.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-divider', + templateUrl: './basic-divider.component.html', + styleUrls: ['./basic-divider.component.scss'] +}) +export class BasicDividerComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-expansion-panel/basic-expansion-panel.component.html b/src/assets/examples/material/basic-expansion-panel/basic-expansion-panel.component.html new file mode 100644 index 0000000..8ba383c --- /dev/null +++ b/src/assets/examples/material/basic-expansion-panel/basic-expansion-panel.component.html @@ -0,0 +1,32 @@ + + + + + Personal data + + + Type your name and age + + + + + + + + + + + + + + + Self aware panel + + + Currently I am {{panelOpenState ? 'open' : 'closed'}} + + +

I'm visible because I am open

+
+
diff --git a/src/assets/examples/material/basic-expansion-panel/basic-expansion-panel.component.scss b/src/assets/examples/material/basic-expansion-panel/basic-expansion-panel.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-expansion-panel/basic-expansion-panel.component.spec.ts b/src/assets/examples/material/basic-expansion-panel/basic-expansion-panel.component.spec.ts new file mode 100644 index 0000000..02cafaf --- /dev/null +++ b/src/assets/examples/material/basic-expansion-panel/basic-expansion-panel.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicExpansionPanelComponent } from './basic-expansion-panel.component'; + +describe('BasicExpansionPanelComponent', () => { + let component: BasicExpansionPanelComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicExpansionPanelComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicExpansionPanelComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-expansion-panel/basic-expansion-panel.component.ts b/src/assets/examples/material/basic-expansion-panel/basic-expansion-panel.component.ts new file mode 100644 index 0000000..417e8a9 --- /dev/null +++ b/src/assets/examples/material/basic-expansion-panel/basic-expansion-panel.component.ts @@ -0,0 +1,17 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-expansion-panel', + templateUrl: './basic-expansion-panel.component.html', + styleUrls: ['./basic-expansion-panel.component.scss'] +}) +export class BasicExpansionPanelComponent implements OnInit { + + panelOpenState = false; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-grid/basic-grid.component.html b/src/assets/examples/material/basic-grid/basic-grid.component.html new file mode 100644 index 0000000..ae33854 --- /dev/null +++ b/src/assets/examples/material/basic-grid/basic-grid.component.html @@ -0,0 +1,6 @@ + + 1 + 2 + 3 + 4 + diff --git a/src/assets/examples/material/basic-grid/basic-grid.component.scss b/src/assets/examples/material/basic-grid/basic-grid.component.scss new file mode 100644 index 0000000..1425732 --- /dev/null +++ b/src/assets/examples/material/basic-grid/basic-grid.component.scss @@ -0,0 +1,4 @@ +mat-grid-tile { + background: lightblue; + } + \ No newline at end of file diff --git a/src/assets/examples/material/basic-grid/basic-grid.component.spec.ts b/src/assets/examples/material/basic-grid/basic-grid.component.spec.ts new file mode 100644 index 0000000..cd2a165 --- /dev/null +++ b/src/assets/examples/material/basic-grid/basic-grid.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicGridComponent } from './basic-grid.component'; + +describe('BasicGridComponent', () => { + let component: BasicGridComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicGridComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicGridComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-grid/basic-grid.component.ts b/src/assets/examples/material/basic-grid/basic-grid.component.ts new file mode 100644 index 0000000..6ef9fc3 --- /dev/null +++ b/src/assets/examples/material/basic-grid/basic-grid.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-grid', + templateUrl: './basic-grid.component.html', + styleUrls: ['./basic-grid.component.scss'] +}) +export class BasicGridComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-icon/basic-icon.component.html b/src/assets/examples/material/basic-icon/basic-icon.component.html new file mode 100644 index 0000000..ac069be --- /dev/null +++ b/src/assets/examples/material/basic-icon/basic-icon.component.html @@ -0,0 +1 @@ +home diff --git a/src/assets/examples/material/basic-icon/basic-icon.component.scss b/src/assets/examples/material/basic-icon/basic-icon.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-icon/basic-icon.component.spec.ts b/src/assets/examples/material/basic-icon/basic-icon.component.spec.ts new file mode 100644 index 0000000..1f0fdc4 --- /dev/null +++ b/src/assets/examples/material/basic-icon/basic-icon.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicIconComponent } from './basic-icon.component'; + +describe('BasicIconComponent', () => { + let component: BasicIconComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicIconComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicIconComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-icon/basic-icon.component.ts b/src/assets/examples/material/basic-icon/basic-icon.component.ts new file mode 100644 index 0000000..32fbb3f --- /dev/null +++ b/src/assets/examples/material/basic-icon/basic-icon.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-icon', + templateUrl: './basic-icon.component.html', + styleUrls: ['./basic-icon.component.scss'] +}) +export class BasicIconComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-input/basic-input.component.html b/src/assets/examples/material/basic-input/basic-input.component.html new file mode 100644 index 0000000..5f3a09c --- /dev/null +++ b/src/assets/examples/material/basic-input/basic-input.component.html @@ -0,0 +1,9 @@ +
+ + + + + + + +
diff --git a/src/assets/examples/material/basic-input/basic-input.component.scss b/src/assets/examples/material/basic-input/basic-input.component.scss new file mode 100644 index 0000000..9a473b4 --- /dev/null +++ b/src/assets/examples/material/basic-input/basic-input.component.scss @@ -0,0 +1,10 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; + } + + .example-full-width { + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/basic-input/basic-input.component.spec.ts b/src/assets/examples/material/basic-input/basic-input.component.spec.ts new file mode 100644 index 0000000..aeceda2 --- /dev/null +++ b/src/assets/examples/material/basic-input/basic-input.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicInputComponent } from './basic-input.component'; + +describe('BasicInputComponent', () => { + let component: BasicInputComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicInputComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicInputComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-input/basic-input.component.ts b/src/assets/examples/material/basic-input/basic-input.component.ts new file mode 100644 index 0000000..e3e33ef --- /dev/null +++ b/src/assets/examples/material/basic-input/basic-input.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-input', + templateUrl: './basic-input.component.html', + styleUrls: ['./basic-input.component.scss'] +}) +export class BasicInputComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-list/basic-list.component.html b/src/assets/examples/material/basic-list/basic-list.component.html new file mode 100644 index 0000000..c177f87 --- /dev/null +++ b/src/assets/examples/material/basic-list/basic-list.component.html @@ -0,0 +1,5 @@ + + Item 1 + Item 2 + Item 3 + diff --git a/src/assets/examples/material/basic-list/basic-list.component.scss b/src/assets/examples/material/basic-list/basic-list.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-list/basic-list.component.spec.ts b/src/assets/examples/material/basic-list/basic-list.component.spec.ts new file mode 100644 index 0000000..ae2de9a --- /dev/null +++ b/src/assets/examples/material/basic-list/basic-list.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicListComponent } from './basic-list.component'; + +describe('BasicListComponent', () => { + let component: BasicListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicListComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-list/basic-list.component.ts b/src/assets/examples/material/basic-list/basic-list.component.ts new file mode 100644 index 0000000..2cda02d --- /dev/null +++ b/src/assets/examples/material/basic-list/basic-list.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-list', + templateUrl: './basic-list.component.html', + styleUrls: ['./basic-list.component.scss'] +}) +export class BasicListComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-menu/basic-menu.component.html b/src/assets/examples/material/basic-menu/basic-menu.component.html new file mode 100644 index 0000000..64f76da --- /dev/null +++ b/src/assets/examples/material/basic-menu/basic-menu.component.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/examples/material/basic-menu/basic-menu.component.scss b/src/assets/examples/material/basic-menu/basic-menu.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-menu/basic-menu.component.spec.ts b/src/assets/examples/material/basic-menu/basic-menu.component.spec.ts new file mode 100644 index 0000000..a9defae --- /dev/null +++ b/src/assets/examples/material/basic-menu/basic-menu.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicMenuComponent } from './basic-menu.component'; + +describe('BasicMenuComponent', () => { + let component: BasicMenuComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicMenuComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicMenuComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-menu/basic-menu.component.ts b/src/assets/examples/material/basic-menu/basic-menu.component.ts new file mode 100644 index 0000000..8fb4797 --- /dev/null +++ b/src/assets/examples/material/basic-menu/basic-menu.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-menu', + templateUrl: './basic-menu.component.html', + styleUrls: ['./basic-menu.component.scss'] +}) +export class BasicMenuComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-paginator/basic-paginator.component.html b/src/assets/examples/material/basic-paginator/basic-paginator.component.html new file mode 100644 index 0000000..9269f3b --- /dev/null +++ b/src/assets/examples/material/basic-paginator/basic-paginator.component.html @@ -0,0 +1,4 @@ + + diff --git a/src/assets/examples/material/basic-paginator/basic-paginator.component.scss b/src/assets/examples/material/basic-paginator/basic-paginator.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-paginator/basic-paginator.component.spec.ts b/src/assets/examples/material/basic-paginator/basic-paginator.component.spec.ts new file mode 100644 index 0000000..73534bc --- /dev/null +++ b/src/assets/examples/material/basic-paginator/basic-paginator.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicPaginatorComponent } from './basic-paginator.component'; + +describe('BasicPaginatorComponent', () => { + let component: BasicPaginatorComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicPaginatorComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicPaginatorComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-paginator/basic-paginator.component.ts b/src/assets/examples/material/basic-paginator/basic-paginator.component.ts new file mode 100644 index 0000000..dcff703 --- /dev/null +++ b/src/assets/examples/material/basic-paginator/basic-paginator.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-paginator', + templateUrl: './basic-paginator.component.html', + styleUrls: ['./basic-paginator.component.scss'] +}) +export class BasicPaginatorComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-radio/basic-radio.component.html b/src/assets/examples/material/basic-radio/basic-radio.component.html new file mode 100644 index 0000000..6e3bfae --- /dev/null +++ b/src/assets/examples/material/basic-radio/basic-radio.component.html @@ -0,0 +1,4 @@ + + Option 1 + Option 2 + diff --git a/src/assets/examples/material/basic-radio/basic-radio.component.scss b/src/assets/examples/material/basic-radio/basic-radio.component.scss new file mode 100644 index 0000000..26c8b53 --- /dev/null +++ b/src/assets/examples/material/basic-radio/basic-radio.component.scss @@ -0,0 +1,4 @@ +.mat-radio-button ~ .mat-radio-button { + margin-left: 16px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/basic-radio/basic-radio.component.spec.ts b/src/assets/examples/material/basic-radio/basic-radio.component.spec.ts new file mode 100644 index 0000000..1287e0c --- /dev/null +++ b/src/assets/examples/material/basic-radio/basic-radio.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicRadioComponent } from './basic-radio.component'; + +describe('BasicRadioComponent', () => { + let component: BasicRadioComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicRadioComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicRadioComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-radio/basic-radio.component.ts b/src/assets/examples/material/basic-radio/basic-radio.component.ts new file mode 100644 index 0000000..bdb0c00 --- /dev/null +++ b/src/assets/examples/material/basic-radio/basic-radio.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-radio', + templateUrl: './basic-radio.component.html', + styleUrls: ['./basic-radio.component.scss'] +}) +export class BasicRadioComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-select/basic-select.component.html b/src/assets/examples/material/basic-select/basic-select.component.html new file mode 100644 index 0000000..d7df828 --- /dev/null +++ b/src/assets/examples/material/basic-select/basic-select.component.html @@ -0,0 +1,20 @@ +

Basic mat-select

+ + Favorite food + + + {{food.viewValue}} + + + + +

Basic native select

+ + Cars + + diff --git a/src/assets/examples/material/basic-select/basic-select.component.scss b/src/assets/examples/material/basic-select/basic-select.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-select/basic-select.component.spec.ts b/src/assets/examples/material/basic-select/basic-select.component.spec.ts new file mode 100644 index 0000000..8933cae --- /dev/null +++ b/src/assets/examples/material/basic-select/basic-select.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicSelectComponent } from './basic-select.component'; + +describe('BasicSelectComponent', () => { + let component: BasicSelectComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicSelectComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicSelectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-select/basic-select.component.ts b/src/assets/examples/material/basic-select/basic-select.component.ts new file mode 100644 index 0000000..311c485 --- /dev/null +++ b/src/assets/examples/material/basic-select/basic-select.component.ts @@ -0,0 +1,26 @@ +import { Component, OnInit } from '@angular/core'; + +export interface Food { + value: string; + viewValue: string; +} + +@Component({ + selector: 'app-basic-select', + templateUrl: './basic-select.component.html', + styleUrls: ['./basic-select.component.scss'] +}) +export class BasicSelectComponent implements OnInit { + + foods: Food[] = [ + {value: 'steak-0', viewValue: 'Steak'}, + {value: 'pizza-1', viewValue: 'Pizza'}, + {value: 'tacos-2', viewValue: 'Tacos'} + ]; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-sidenav/basic-sidenav.component.html b/src/assets/examples/material/basic-sidenav/basic-sidenav.component.html new file mode 100644 index 0000000..3037dae --- /dev/null +++ b/src/assets/examples/material/basic-sidenav/basic-sidenav.component.html @@ -0,0 +1,12 @@ + + Sidenav content + + Main content
+ Main content
+ Main content
+ Main content
+ Main content
+ Main content
+ Main content
+
+
\ No newline at end of file diff --git a/src/assets/examples/material/basic-sidenav/basic-sidenav.component.scss b/src/assets/examples/material/basic-sidenav/basic-sidenav.component.scss new file mode 100644 index 0000000..effc6d9 --- /dev/null +++ b/src/assets/examples/material/basic-sidenav/basic-sidenav.component.scss @@ -0,0 +1,10 @@ +.example-container { + // position: absolute; + // top: 0; + // bottom: 0; + // left: 0; + // right: 0; + background: #eee; + min-height: 200px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/basic-sidenav/basic-sidenav.component.spec.ts b/src/assets/examples/material/basic-sidenav/basic-sidenav.component.spec.ts new file mode 100644 index 0000000..a3ddc39 --- /dev/null +++ b/src/assets/examples/material/basic-sidenav/basic-sidenav.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicSidenavComponent } from './basic-sidenav.component'; + +describe('BasicSidenavComponent', () => { + let component: BasicSidenavComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicSidenavComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicSidenavComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-sidenav/basic-sidenav.component.ts b/src/assets/examples/material/basic-sidenav/basic-sidenav.component.ts new file mode 100644 index 0000000..3d5787a --- /dev/null +++ b/src/assets/examples/material/basic-sidenav/basic-sidenav.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-sidenav', + templateUrl: './basic-sidenav.component.html', + styleUrls: ['./basic-sidenav.component.scss'] +}) +export class BasicSidenavComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-slider/basic-slider.component.html b/src/assets/examples/material/basic-slider/basic-slider.component.html new file mode 100644 index 0000000..49162f5 --- /dev/null +++ b/src/assets/examples/material/basic-slider/basic-slider.component.html @@ -0,0 +1 @@ + diff --git a/src/assets/examples/material/basic-slider/basic-slider.component.scss b/src/assets/examples/material/basic-slider/basic-slider.component.scss new file mode 100644 index 0000000..d7863cb --- /dev/null +++ b/src/assets/examples/material/basic-slider/basic-slider.component.scss @@ -0,0 +1,5 @@ +/** No CSS for this example */ +mat-slider { + width: 300px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/basic-slider/basic-slider.component.spec.ts b/src/assets/examples/material/basic-slider/basic-slider.component.spec.ts new file mode 100644 index 0000000..c14d6a3 --- /dev/null +++ b/src/assets/examples/material/basic-slider/basic-slider.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicSliderComponent } from './basic-slider.component'; + +describe('BasicSliderComponent', () => { + let component: BasicSliderComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicSliderComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicSliderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-slider/basic-slider.component.ts b/src/assets/examples/material/basic-slider/basic-slider.component.ts new file mode 100644 index 0000000..4b7917d --- /dev/null +++ b/src/assets/examples/material/basic-slider/basic-slider.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-slider', + templateUrl: './basic-slider.component.html', + styleUrls: ['./basic-slider.component.scss'] +}) +export class BasicSliderComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-snackbar/basic-snackbar.component.html b/src/assets/examples/material/basic-snackbar/basic-snackbar.component.html new file mode 100644 index 0000000..6706529 --- /dev/null +++ b/src/assets/examples/material/basic-snackbar/basic-snackbar.component.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/examples/material/basic-snackbar/basic-snackbar.component.scss b/src/assets/examples/material/basic-snackbar/basic-snackbar.component.scss new file mode 100644 index 0000000..692ed8c --- /dev/null +++ b/src/assets/examples/material/basic-snackbar/basic-snackbar.component.scss @@ -0,0 +1,4 @@ +mat-form-field { + margin-right: 12px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/basic-snackbar/basic-snackbar.component.spec.ts b/src/assets/examples/material/basic-snackbar/basic-snackbar.component.spec.ts new file mode 100644 index 0000000..b46517e --- /dev/null +++ b/src/assets/examples/material/basic-snackbar/basic-snackbar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicSnackbarComponent } from './basic-snackbar.component'; + +describe('BasicSnackbarComponent', () => { + let component: BasicSnackbarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicSnackbarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicSnackbarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-snackbar/basic-snackbar.component.ts b/src/assets/examples/material/basic-snackbar/basic-snackbar.component.ts new file mode 100644 index 0000000..c096320 --- /dev/null +++ b/src/assets/examples/material/basic-snackbar/basic-snackbar.component.ts @@ -0,0 +1,22 @@ +import { Component, OnInit } from '@angular/core'; +import { MatSnackBar } from '@angular/material/snack-bar'; + +@Component({ + selector: 'app-basic-snackbar', + templateUrl: './basic-snackbar.component.html', + styleUrls: ['./basic-snackbar.component.scss'] +}) +export class BasicSnackbarComponent implements OnInit { + + constructor(private snackBar: MatSnackBar) {} + + openSnackBar(message: string, action: string) { + this.snackBar.open(message, action, { + duration: 2000, + }); + } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-sort-header/basic-sort-header.component.html b/src/assets/examples/material/basic-sort-header/basic-sort-header.component.html new file mode 100644 index 0000000..2b970af --- /dev/null +++ b/src/assets/examples/material/basic-sort-header/basic-sort-header.component.html @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + +
Dessert (100g)CaloriesFat (g)Carbs (g)Protein (g)
{{dessert.name}}{{dessert.calories}}{{dessert.fat}}{{dessert.carbs}}{{dessert.protein}}
diff --git a/src/assets/examples/material/basic-sort-header/basic-sort-header.component.scss b/src/assets/examples/material/basic-sort-header/basic-sort-header.component.scss new file mode 100644 index 0000000..39c8953 --- /dev/null +++ b/src/assets/examples/material/basic-sort-header/basic-sort-header.component.scss @@ -0,0 +1,4 @@ +.mat-sort-header-container { + align-items: center; + } + \ No newline at end of file diff --git a/src/assets/examples/material/basic-sort-header/basic-sort-header.component.spec.ts b/src/assets/examples/material/basic-sort-header/basic-sort-header.component.spec.ts new file mode 100644 index 0000000..495b680 --- /dev/null +++ b/src/assets/examples/material/basic-sort-header/basic-sort-header.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicSortHeaderComponent } from './basic-sort-header.component'; + +describe('BasicSortHeaderComponent', () => { + let component: BasicSortHeaderComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicSortHeaderComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicSortHeaderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-sort-header/basic-sort-header.component.ts b/src/assets/examples/material/basic-sort-header/basic-sort-header.component.ts new file mode 100644 index 0000000..13ce7f7 --- /dev/null +++ b/src/assets/examples/material/basic-sort-header/basic-sort-header.component.ts @@ -0,0 +1,57 @@ +import { Component, OnInit } from '@angular/core'; +import { Sort } from '@angular/material/sort'; + +export interface Dessert { + calories: number; + carbs: number; + fat: number; + name: string; + protein: number; +} + +@Component({ + selector: 'app-basic-sort-header', + templateUrl: './basic-sort-header.component.html', + styleUrls: ['./basic-sort-header.component.scss'] +}) +export class BasicSortHeaderComponent{ + + desserts: Dessert[] = [ + {name: 'Frozen yogurt', calories: 159, fat: 6, carbs: 24, protein: 4}, + {name: 'Ice cream sandwich', calories: 237, fat: 9, carbs: 37, protein: 4}, + {name: 'Eclair', calories: 262, fat: 16, carbs: 24, protein: 6}, + {name: 'Cupcake', calories: 305, fat: 4, carbs: 67, protein: 4}, + {name: 'Gingerbread', calories: 356, fat: 16, carbs: 49, protein: 4}, + ]; + + sortedData: Dessert[]; + + constructor() { + this.sortedData = this.desserts.slice(); + } + + sortData(sort: Sort) { + const data = this.desserts.slice(); + if (!sort.active || sort.direction === '') { + this.sortedData = data; + return; + } + + this.sortedData = data.sort((a, b) => { + const isAsc = sort.direction === 'asc'; + switch (sort.active) { + case 'name': return compare(a.name, b.name, isAsc); + case 'calories': return compare(a.calories, b.calories, isAsc); + case 'fat': return compare(a.fat, b.fat, isAsc); + case 'carbs': return compare(a.carbs, b.carbs, isAsc); + case 'protein': return compare(a.protein, b.protein, isAsc); + default: return 0; + } + }); + } +} + +function compare(a: number | string, b: number | string, isAsc: boolean) { + return (a < b ? -1 : 1) * (isAsc ? 1 : -1); + +} diff --git a/src/assets/examples/material/basic-spinner/basic-spinner.component.html b/src/assets/examples/material/basic-spinner/basic-spinner.component.html new file mode 100644 index 0000000..34e51f7 --- /dev/null +++ b/src/assets/examples/material/basic-spinner/basic-spinner.component.html @@ -0,0 +1 @@ + diff --git a/src/assets/examples/material/basic-spinner/basic-spinner.component.scss b/src/assets/examples/material/basic-spinner/basic-spinner.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-spinner/basic-spinner.component.spec.ts b/src/assets/examples/material/basic-spinner/basic-spinner.component.spec.ts new file mode 100644 index 0000000..0c23c50 --- /dev/null +++ b/src/assets/examples/material/basic-spinner/basic-spinner.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicSpinnerComponent } from './basic-spinner.component'; + +describe('BasicSpinnerComponent', () => { + let component: BasicSpinnerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicSpinnerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicSpinnerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-spinner/basic-spinner.component.ts b/src/assets/examples/material/basic-spinner/basic-spinner.component.ts new file mode 100644 index 0000000..1ce002b --- /dev/null +++ b/src/assets/examples/material/basic-spinner/basic-spinner.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-spinner', + templateUrl: './basic-spinner.component.html', + styleUrls: ['./basic-spinner.component.scss'] +}) +export class BasicSpinnerComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-stepper/basic-stepper.component.html b/src/assets/examples/material/basic-stepper/basic-stepper.component.html new file mode 100644 index 0000000..bf1d758 --- /dev/null +++ b/src/assets/examples/material/basic-stepper/basic-stepper.component.html @@ -0,0 +1,36 @@ + + + +
+ Fill out your name + + + +
+ +
+
+
+ +
+ Fill out your address + + + +
+ + +
+
+
+ + Done + You are now done. +
+ + +
+
+
diff --git a/src/assets/examples/material/basic-stepper/basic-stepper.component.scss b/src/assets/examples/material/basic-stepper/basic-stepper.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-stepper/basic-stepper.component.spec.ts b/src/assets/examples/material/basic-stepper/basic-stepper.component.spec.ts new file mode 100644 index 0000000..4abdefc --- /dev/null +++ b/src/assets/examples/material/basic-stepper/basic-stepper.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicStepperComponent } from './basic-stepper.component'; + +describe('BasicStepperComponent', () => { + let component: BasicStepperComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicStepperComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicStepperComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-stepper/basic-stepper.component.ts b/src/assets/examples/material/basic-stepper/basic-stepper.component.ts new file mode 100644 index 0000000..1a68163 --- /dev/null +++ b/src/assets/examples/material/basic-stepper/basic-stepper.component.ts @@ -0,0 +1,26 @@ +import {Component, OnInit} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; + +@Component({ + selector: 'app-basic-stepper', + templateUrl: './basic-stepper.component.html', + styleUrls: ['./basic-stepper.component.scss'] +}) +export class BasicStepperComponent implements OnInit { + + isLinear = false; + firstFormGroup: FormGroup; + secondFormGroup: FormGroup; + + constructor(private _formBuilder: FormBuilder) {} + + ngOnInit() { + this.firstFormGroup = this._formBuilder.group({ + firstCtrl: ['', Validators.required] + }); + this.secondFormGroup = this._formBuilder.group({ + secondCtrl: ['', Validators.required] + }); + } + +} diff --git a/src/assets/examples/material/basic-tab-group/basic-tab-group.component.html b/src/assets/examples/material/basic-tab-group/basic-tab-group.component.html new file mode 100644 index 0000000..f8e1465 --- /dev/null +++ b/src/assets/examples/material/basic-tab-group/basic-tab-group.component.html @@ -0,0 +1,6 @@ + + Content 1 + Content 2 + Content 3 + + \ No newline at end of file diff --git a/src/assets/examples/material/basic-tab-group/basic-tab-group.component.scss b/src/assets/examples/material/basic-tab-group/basic-tab-group.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-tab-group/basic-tab-group.component.spec.ts b/src/assets/examples/material/basic-tab-group/basic-tab-group.component.spec.ts new file mode 100644 index 0000000..568d9cf --- /dev/null +++ b/src/assets/examples/material/basic-tab-group/basic-tab-group.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicTabGroupComponent } from './basic-tab-group.component'; + +describe('BasicTabGroupComponent', () => { + let component: BasicTabGroupComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicTabGroupComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicTabGroupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-tab-group/basic-tab-group.component.ts b/src/assets/examples/material/basic-tab-group/basic-tab-group.component.ts new file mode 100644 index 0000000..80cc669 --- /dev/null +++ b/src/assets/examples/material/basic-tab-group/basic-tab-group.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-tab-group', + templateUrl: './basic-tab-group.component.html', + styleUrls: ['./basic-tab-group.component.scss'] +}) +export class BasicTabGroupComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-table/basic-table.component.html b/src/assets/examples/material/basic-table/basic-table.component.html new file mode 100644 index 0000000..3713dbd --- /dev/null +++ b/src/assets/examples/material/basic-table/basic-table.component.html @@ -0,0 +1,38 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
No.{{ element.position }}Name{{ element.name }}Weight{{ element.weight }}Symbol{{ element.symbol }}
+
diff --git a/src/assets/examples/material/basic-table/basic-table.component.scss b/src/assets/examples/material/basic-table/basic-table.component.scss new file mode 100644 index 0000000..cfb1698 --- /dev/null +++ b/src/assets/examples/material/basic-table/basic-table.component.scss @@ -0,0 +1,9 @@ +.table-container { + width: 550px; + overflow: auto; +} + +table { + width: 800px; +} + \ No newline at end of file diff --git a/src/assets/examples/material/basic-table/basic-table.component.spec.ts b/src/assets/examples/material/basic-table/basic-table.component.spec.ts new file mode 100644 index 0000000..211db97 --- /dev/null +++ b/src/assets/examples/material/basic-table/basic-table.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicTableComponent } from './basic-table.component'; + +describe('BasicTableComponent', () => { + let component: BasicTableComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicTableComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicTableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-table/basic-table.component.ts b/src/assets/examples/material/basic-table/basic-table.component.ts new file mode 100644 index 0000000..a9fcbfc --- /dev/null +++ b/src/assets/examples/material/basic-table/basic-table.component.ts @@ -0,0 +1,49 @@ +import { AfterViewInit } from '@angular/core'; +import { Component, OnInit, ChangeDetectorRef, } from '@angular/core'; + +export interface PeriodicElement { + name: string; + position: number; + weight: number; + symbol: string; +} + +const ELEMENT_DATA: PeriodicElement[] = [ + {position: 1, name: 'Hydrogen', weight: 1.0078, symbol: 'H'}, + {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'}, + {position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li'}, + {position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be'}, + {position: 5, name: 'Boron', weight: 10.811, symbol: 'B'}, + {position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C'}, + {position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N'}, + {position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O'}, + {position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F'}, + {position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne'}, +]; + +@Component({ + selector: 'app-basic-table', + templateUrl: './basic-table.component.html', + styleUrls: ['./basic-table.component.scss'] +}) +export class BasicTableComponent implements OnInit, AfterViewInit { + + displayedColumns: string[] = ['position', 'name', 'weight', 'symbol']; + dataSource; + + constructor( + private cdr: ChangeDetectorRef + ) { } + + ngOnInit() { + setTimeout(() => { + this.dataSource = ELEMENT_DATA; + this.cdr.detectChanges() + + }) + } + ngAfterViewInit() { + + } + +} diff --git a/src/assets/examples/material/basic-toggle/basic-toggle.component.html b/src/assets/examples/material/basic-toggle/basic-toggle.component.html new file mode 100644 index 0000000..d9d6ab1 --- /dev/null +++ b/src/assets/examples/material/basic-toggle/basic-toggle.component.html @@ -0,0 +1 @@ +Slide me! diff --git a/src/assets/examples/material/basic-toggle/basic-toggle.component.scss b/src/assets/examples/material/basic-toggle/basic-toggle.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-toggle/basic-toggle.component.spec.ts b/src/assets/examples/material/basic-toggle/basic-toggle.component.spec.ts new file mode 100644 index 0000000..9cf14e7 --- /dev/null +++ b/src/assets/examples/material/basic-toggle/basic-toggle.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicToggleComponent } from './basic-toggle.component'; + +describe('BasicToggleComponent', () => { + let component: BasicToggleComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicToggleComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicToggleComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-toggle/basic-toggle.component.ts b/src/assets/examples/material/basic-toggle/basic-toggle.component.ts new file mode 100644 index 0000000..250bc17 --- /dev/null +++ b/src/assets/examples/material/basic-toggle/basic-toggle.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-toggle', + templateUrl: './basic-toggle.component.html', + styleUrls: ['./basic-toggle.component.scss'] +}) +export class BasicToggleComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-toolbar/basic-toolbar.component.html b/src/assets/examples/material/basic-toolbar/basic-toolbar.component.html new file mode 100644 index 0000000..05520fd --- /dev/null +++ b/src/assets/examples/material/basic-toolbar/basic-toolbar.component.html @@ -0,0 +1 @@ +My App diff --git a/src/assets/examples/material/basic-toolbar/basic-toolbar.component.scss b/src/assets/examples/material/basic-toolbar/basic-toolbar.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-toolbar/basic-toolbar.component.spec.ts b/src/assets/examples/material/basic-toolbar/basic-toolbar.component.spec.ts new file mode 100644 index 0000000..f6b03fa --- /dev/null +++ b/src/assets/examples/material/basic-toolbar/basic-toolbar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicToolbarComponent } from './basic-toolbar.component'; + +describe('BasicToolbarComponent', () => { + let component: BasicToolbarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicToolbarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicToolbarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-toolbar/basic-toolbar.component.ts b/src/assets/examples/material/basic-toolbar/basic-toolbar.component.ts new file mode 100644 index 0000000..c6bbacd --- /dev/null +++ b/src/assets/examples/material/basic-toolbar/basic-toolbar.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-toolbar', + templateUrl: './basic-toolbar.component.html', + styleUrls: ['./basic-toolbar.component.scss'] +}) +export class BasicToolbarComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/basic-tooltip/basic-tooltip.component.html b/src/assets/examples/material/basic-tooltip/basic-tooltip.component.html new file mode 100644 index 0000000..29978af --- /dev/null +++ b/src/assets/examples/material/basic-tooltip/basic-tooltip.component.html @@ -0,0 +1,5 @@ + diff --git a/src/assets/examples/material/basic-tooltip/basic-tooltip.component.scss b/src/assets/examples/material/basic-tooltip/basic-tooltip.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/basic-tooltip/basic-tooltip.component.spec.ts b/src/assets/examples/material/basic-tooltip/basic-tooltip.component.spec.ts new file mode 100644 index 0000000..4063bb1 --- /dev/null +++ b/src/assets/examples/material/basic-tooltip/basic-tooltip.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BasicTooltipComponent } from './basic-tooltip.component'; + +describe('BasicTooltipComponent', () => { + let component: BasicTooltipComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BasicTooltipComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BasicTooltipComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/basic-tooltip/basic-tooltip.component.ts b/src/assets/examples/material/basic-tooltip/basic-tooltip.component.ts new file mode 100644 index 0000000..310f065 --- /dev/null +++ b/src/assets/examples/material/basic-tooltip/basic-tooltip.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-basic-tooltip', + templateUrl: './basic-tooltip.component.html', + styleUrls: ['./basic-tooltip.component.scss'] +}) +export class BasicTooltipComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/bottom-sheet/bottom-sheet-overview/bottom-sheet-overview.component.html b/src/assets/examples/material/bottom-sheet/bottom-sheet-overview/bottom-sheet-overview.component.html new file mode 100644 index 0000000..a4ecc8b --- /dev/null +++ b/src/assets/examples/material/bottom-sheet/bottom-sheet-overview/bottom-sheet-overview.component.html @@ -0,0 +1,21 @@ + + + Google Keep + Add to a note + + + + Google Docs + Embed in a document + + + + Google Plus + Share with your friends + + + + Google Hangouts + Show to your coworkers + + diff --git a/src/assets/examples/material/bottom-sheet/bottom-sheet-overview/bottom-sheet-overview.component.scss b/src/assets/examples/material/bottom-sheet/bottom-sheet-overview/bottom-sheet-overview.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/bottom-sheet/bottom-sheet-overview/bottom-sheet-overview.component.spec.ts b/src/assets/examples/material/bottom-sheet/bottom-sheet-overview/bottom-sheet-overview.component.spec.ts new file mode 100644 index 0000000..79422b5 --- /dev/null +++ b/src/assets/examples/material/bottom-sheet/bottom-sheet-overview/bottom-sheet-overview.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BottomSheetOverviewComponent } from './bottom-sheet-overview.component'; + +describe('BottomSheetOverviewComponent', () => { + let component: BottomSheetOverviewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BottomSheetOverviewComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BottomSheetOverviewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/bottom-sheet/bottom-sheet-overview/bottom-sheet-overview.component.ts b/src/assets/examples/material/bottom-sheet/bottom-sheet-overview/bottom-sheet-overview.component.ts new file mode 100644 index 0000000..3798b1b --- /dev/null +++ b/src/assets/examples/material/bottom-sheet/bottom-sheet-overview/bottom-sheet-overview.component.ts @@ -0,0 +1,21 @@ +import { Component, OnInit } from '@angular/core'; +import { MatBottomSheetRef } from '@angular/material/bottom-sheet'; + +@Component({ + selector: 'app-bottom-sheet-overview', + templateUrl: './bottom-sheet-overview.component.html', + styleUrls: ['./bottom-sheet-overview.component.scss'] +}) +export class BottomSheetOverviewComponent implements OnInit { + + constructor(private bottomSheetRef: MatBottomSheetRef) {} + + openLink(event: MouseEvent): void { + this.bottomSheetRef.dismiss(); + event.preventDefault(); + } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/bottom-sheet/bottom-sheet.component.html b/src/assets/examples/material/bottom-sheet/bottom-sheet.component.html new file mode 100644 index 0000000..d980521 --- /dev/null +++ b/src/assets/examples/material/bottom-sheet/bottom-sheet.component.html @@ -0,0 +1,3 @@ +

You have received a file called "cat-picture.jpeg".

+ + diff --git a/src/assets/examples/material/bottom-sheet/bottom-sheet.component.scss b/src/assets/examples/material/bottom-sheet/bottom-sheet.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/bottom-sheet/bottom-sheet.component.spec.ts b/src/assets/examples/material/bottom-sheet/bottom-sheet.component.spec.ts new file mode 100644 index 0000000..e35c936 --- /dev/null +++ b/src/assets/examples/material/bottom-sheet/bottom-sheet.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BottomSheetComponent } from './bottom-sheet.component'; + +describe('BottomSheetComponent', () => { + let component: BottomSheetComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BottomSheetComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BottomSheetComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/bottom-sheet/bottom-sheet.component.ts b/src/assets/examples/material/bottom-sheet/bottom-sheet.component.ts new file mode 100644 index 0000000..83d046e --- /dev/null +++ b/src/assets/examples/material/bottom-sheet/bottom-sheet.component.ts @@ -0,0 +1,21 @@ +import { Component, OnInit } from '@angular/core'; +import { MatBottomSheet } from '@angular/material/bottom-sheet'; +import { BottomSheetOverviewComponent } from './bottom-sheet-overview/bottom-sheet-overview.component'; + +@Component({ + selector: 'app-bottom-sheet', + templateUrl: './bottom-sheet.component.html', + styleUrls: ['./bottom-sheet.component.scss'] +}) +export class BottomSheetComponent implements OnInit { + + constructor(private bottomSheet: MatBottomSheet) {} + + openBottomSheet(): void { + this.bottomSheet.open(BottomSheetOverviewComponent); + } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/button-examples/button-examples.component.html b/src/assets/examples/material/button-examples/button-examples.component.html new file mode 100644 index 0000000..b3304cf --- /dev/null +++ b/src/assets/examples/material/button-examples/button-examples.component.html @@ -0,0 +1,43 @@ +
+

Basic buttons

+ + + + + +
+ +
+

Raised buttons

+ + + + + +
+ +
+

Fab buttons

+ + +
+ +
+

Toggle buttons

+ + + format_align_left + + + format_align_center + + + format_align_right + + + format_align_justify + + +
diff --git a/src/assets/examples/material/button-examples/button-examples.component.scss b/src/assets/examples/material/button-examples/button-examples.component.scss new file mode 100644 index 0000000..2e808d5 --- /dev/null +++ b/src/assets/examples/material/button-examples/button-examples.component.scss @@ -0,0 +1 @@ +//No SCSS \ No newline at end of file diff --git a/src/assets/examples/material/button-examples/button-examples.component.spec.ts b/src/assets/examples/material/button-examples/button-examples.component.spec.ts new file mode 100644 index 0000000..94e4b50 --- /dev/null +++ b/src/assets/examples/material/button-examples/button-examples.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ButtonExamplesComponent } from './button-examples.component'; + +describe('ButtonExamplesComponent', () => { + let component: ButtonExamplesComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ButtonExamplesComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ButtonExamplesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/button-examples/button-examples.component.ts b/src/assets/examples/material/button-examples/button-examples.component.ts new file mode 100644 index 0000000..f3d7d47 --- /dev/null +++ b/src/assets/examples/material/button-examples/button-examples.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-button-examples', + templateUrl: './button-examples.component.html', + styleUrls: ['./button-examples.component.scss'] +}) +export class ButtonExamplesComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/button-toggle/button-toggle.component.html b/src/assets/examples/material/button-toggle/button-toggle.component.html new file mode 100644 index 0000000..d36939a --- /dev/null +++ b/src/assets/examples/material/button-toggle/button-toggle.component.html @@ -0,0 +1,16 @@ + + + format_align_left + + + format_align_center + + + format_align_right + + + format_align_justify + + +
Selected value: {{group.value}}
+ \ No newline at end of file diff --git a/src/assets/examples/material/button-toggle/button-toggle.component.scss b/src/assets/examples/material/button-toggle/button-toggle.component.scss new file mode 100644 index 0000000..1e6efb2 --- /dev/null +++ b/src/assets/examples/material/button-toggle/button-toggle.component.scss @@ -0,0 +1,4 @@ +.example-selected-value { + margin: 15px 0; + } + \ No newline at end of file diff --git a/src/assets/examples/material/button-toggle/button-toggle.component.spec.ts b/src/assets/examples/material/button-toggle/button-toggle.component.spec.ts new file mode 100644 index 0000000..e693e71 --- /dev/null +++ b/src/assets/examples/material/button-toggle/button-toggle.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ButtonToggleComponent } from './button-toggle.component'; + +describe('ButtonToggleComponent', () => { + let component: ButtonToggleComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ButtonToggleComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ButtonToggleComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/button-toggle/button-toggle.component.ts b/src/assets/examples/material/button-toggle/button-toggle.component.ts new file mode 100644 index 0000000..4acf7a0 --- /dev/null +++ b/src/assets/examples/material/button-toggle/button-toggle.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-button-toggle', + templateUrl: './button-toggle.component.html', + styleUrls: ['./button-toggle.component.scss'] +}) +export class ButtonToggleComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/buttons/buttons.component.html b/src/assets/examples/material/buttons/buttons.component.html new file mode 100644 index 0000000..a28baa0 --- /dev/null +++ b/src/assets/examples/material/buttons/buttons.component.html @@ -0,0 +1,85 @@ +

Basic Buttons


+
+ + + + + + Link +
+

+

Raised Buttons


+
+ + + + + + Link +
+

+

Stroked Buttons


+
+ + + + + + Link +
+

+

Flat Buttons


+
+ + + + + + Link +
+

+

Icon Buttons


+
+ + + + + +
+

+

Fab Buttons


+
+ + + + + + + Link +
+

+ +

Mini Fab Buttons


+
+ + + + + + + Link +
diff --git a/src/assets/examples/material/buttons/buttons.component.scss b/src/assets/examples/material/buttons/buttons.component.scss new file mode 100644 index 0000000..3408788 --- /dev/null +++ b/src/assets/examples/material/buttons/buttons.component.scss @@ -0,0 +1,4 @@ +.example-button-row button, +.example-button-row a { + margin-right: 8px; +} diff --git a/src/assets/examples/material/buttons/buttons.component.spec.ts b/src/assets/examples/material/buttons/buttons.component.spec.ts new file mode 100644 index 0000000..4f0b4bd --- /dev/null +++ b/src/assets/examples/material/buttons/buttons.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ButtonsComponent } from './buttons.component'; + +describe('ButtonsComponent', () => { + let component: ButtonsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ButtonsComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ButtonsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/buttons/buttons.component.ts b/src/assets/examples/material/buttons/buttons.component.ts new file mode 100644 index 0000000..70af7dd --- /dev/null +++ b/src/assets/examples/material/buttons/buttons.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-buttons', + templateUrl: './buttons.component.html', + styleUrls: ['./buttons.component.scss'] +}) +export class ButtonsComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/changing-tooltip/changing-tooltip.component.html b/src/assets/examples/material/changing-tooltip/changing-tooltip.component.html new file mode 100644 index 0000000..234a18f --- /dev/null +++ b/src/assets/examples/material/changing-tooltip/changing-tooltip.component.html @@ -0,0 +1,9 @@ + + + + + diff --git a/src/assets/examples/material/changing-tooltip/changing-tooltip.component.scss b/src/assets/examples/material/changing-tooltip/changing-tooltip.component.scss new file mode 100644 index 0000000..46e50d6 --- /dev/null +++ b/src/assets/examples/material/changing-tooltip/changing-tooltip.component.scss @@ -0,0 +1,4 @@ +.example-user-input { + margin-right: 8px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/changing-tooltip/changing-tooltip.component.spec.ts b/src/assets/examples/material/changing-tooltip/changing-tooltip.component.spec.ts new file mode 100644 index 0000000..e70978e --- /dev/null +++ b/src/assets/examples/material/changing-tooltip/changing-tooltip.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ChangingTooltipComponent } from './changing-tooltip.component'; + +describe('ChangingTooltipComponent', () => { + let component: ChangingTooltipComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ChangingTooltipComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ChangingTooltipComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/changing-tooltip/changing-tooltip.component.ts b/src/assets/examples/material/changing-tooltip/changing-tooltip.component.ts new file mode 100644 index 0000000..d1136bc --- /dev/null +++ b/src/assets/examples/material/changing-tooltip/changing-tooltip.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl} from '@angular/forms'; + +@Component({ + selector: 'app-changing-tooltip', + templateUrl: './changing-tooltip.component.html', + styleUrls: ['./changing-tooltip.component.scss'] +}) +export class ChangingTooltipComponent implements OnInit { + + message = new FormControl('Info about the action'); + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/checkbox-tree/checkbox-tree.component.html b/src/assets/examples/material/checkbox-tree/checkbox-tree.component.html new file mode 100644 index 0000000..66f4022 --- /dev/null +++ b/src/assets/examples/material/checkbox-tree/checkbox-tree.component.html @@ -0,0 +1,30 @@ + + + + {{node.item}} + + + + + + + + + + + + + {{node.item}} + + + + \ No newline at end of file diff --git a/src/assets/examples/material/checkbox-tree/checkbox-tree.component.scss b/src/assets/examples/material/checkbox-tree/checkbox-tree.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/checkbox-tree/checkbox-tree.component.spec.ts b/src/assets/examples/material/checkbox-tree/checkbox-tree.component.spec.ts new file mode 100644 index 0000000..37e8f14 --- /dev/null +++ b/src/assets/examples/material/checkbox-tree/checkbox-tree.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CheckboxTreeComponent } from './checkbox-tree.component'; + +describe('CheckboxTreeComponent', () => { + let component: CheckboxTreeComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CheckboxTreeComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CheckboxTreeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/checkbox-tree/checkbox-tree.component.ts b/src/assets/examples/material/checkbox-tree/checkbox-tree.component.ts new file mode 100644 index 0000000..0d07fd4 --- /dev/null +++ b/src/assets/examples/material/checkbox-tree/checkbox-tree.component.ts @@ -0,0 +1,264 @@ +import {SelectionModel} from '@angular/cdk/collections'; +import {FlatTreeControl} from '@angular/cdk/tree'; +import {Component, Injectable} from '@angular/core'; +import {MatTreeFlatDataSource, MatTreeFlattener} from '@angular/material/tree'; +import {BehaviorSubject} from 'rxjs'; + + +/** + * Node for to-do item + */ +export class TodoItemNode { + children: TodoItemNode[]; + item: string; +} + +/** Flat to-do item node with expandable and level information */ +export class TodoItemFlatNode { + item: string; + level: number; + expandable: boolean; +} + +/** + * The Json object for to-do list data. + */ +const TREE_DATA = { + Groceries: { + 'Almond Meal flour': null, + 'Organic eggs': null, + 'Protein Powder': null, + Fruits: { + Apple: null, + Berries: ['Blueberry', 'Raspberry'], + Orange: null + } + }, + Reminders: [ + 'Cook dinner', + 'Read the Material Design spec', + 'Upgrade Application to Angular' + ] +}; + +/** + * Checklist database, it can build a tree structured Json object. + * Each node in Json object represents a to-do item or a category. + * If a node is a category, it has children items and new items can be added under the category. + */ +@Injectable() +export class ChecklistDatabase { + dataChange = new BehaviorSubject([]); + + get data(): TodoItemNode[] { return this.dataChange.value; } + + constructor() { + this.initialize(); + } + + initialize() { + // Build the tree nodes from Json object. The result is a list of `TodoItemNode` with nested + // file node as children. + const data = this.buildFileTree(TREE_DATA, 0); + + // Notify the change. + this.dataChange.next(data); + } + + /** + * Build the file structure tree. The `value` is the Json object, or a sub-tree of a Json object. + * The return value is the list of `TodoItemNode`. + */ + buildFileTree(obj: {[key: string]: any}, level: number): TodoItemNode[] { + return Object.keys(obj).reduce((accumulator, key) => { + const value = obj[key]; + const node = new TodoItemNode(); + node.item = key; + + if (value != null) { + if (typeof value === 'object') { + node.children = this.buildFileTree(value, level + 1); + } else { + node.item = value; + } + } + + return accumulator.concat(node); + }, []); + } + + /** Add an item to to-do list */ + insertItem(parent: TodoItemNode, name: string) { + if (parent.children) { + parent.children.push({item: name} as TodoItemNode); + this.dataChange.next(this.data); + } + } + + updateItem(node: TodoItemNode, name: string) { + node.item = name; + this.dataChange.next(this.data); + } +} + +@Component({ + selector: 'app-checkbox-tree', + templateUrl: './checkbox-tree.component.html', + styleUrls: ['./checkbox-tree.component.scss'], + providers: [ChecklistDatabase] +}) +export class CheckboxTreeComponent { + +/** Map from flat node to nested node. This helps us finding the nested node to be modified */ +flatNodeMap = new Map(); + +/** Map from nested node to flattened node. This helps us to keep the same object for selection */ +nestedNodeMap = new Map(); + +/** A selected parent node to be inserted */ +selectedParent: TodoItemFlatNode | null = null; + +/** The new item's name */ +newItemName = ''; + +treeControl: FlatTreeControl; + +treeFlattener: MatTreeFlattener; + +dataSource: MatTreeFlatDataSource; + +/** The selection for checklist */ +checklistSelection = new SelectionModel(true /* multiple */); + +constructor(private database: ChecklistDatabase) { + this.treeFlattener = new MatTreeFlattener(this.transformer, this.getLevel, + this.isExpandable, this.getChildren); + this.treeControl = new FlatTreeControl(this.getLevel, this.isExpandable); + this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener); + + database.dataChange.subscribe(data => { + this.dataSource.data = data; + }); +} + +getLevel = (node: TodoItemFlatNode) => node.level; + +isExpandable = (node: TodoItemFlatNode) => node.expandable; + +getChildren = (node: TodoItemNode): TodoItemNode[] => node.children; + +hasChild = (_: number, _nodeData: TodoItemFlatNode) => _nodeData.expandable; + +hasNoContent = (_: number, _nodeData: TodoItemFlatNode) => _nodeData.item === ''; + +/** + * Transformer to convert nested node to flat node. Record the nodes in maps for later use. + */ +transformer = (node: TodoItemNode, level: number) => { + const existingNode = this.nestedNodeMap.get(node); + const flatNode = existingNode && existingNode.item === node.item + ? existingNode + : new TodoItemFlatNode(); + flatNode.item = node.item; + flatNode.level = level; + flatNode.expandable = !!node.children; + this.flatNodeMap.set(flatNode, node); + this.nestedNodeMap.set(node, flatNode); + return flatNode; +} + +/** Whether all the descendants of the node are selected. */ +descendantsAllSelected(node: TodoItemFlatNode): boolean { + const descendants = this.treeControl.getDescendants(node); + const descAllSelected = descendants.every(child => + this.checklistSelection.isSelected(child) + ); + return descAllSelected; +} + +/** Whether part of the descendants are selected */ +descendantsPartiallySelected(node: TodoItemFlatNode): boolean { + const descendants = this.treeControl.getDescendants(node); + const result = descendants.some(child => this.checklistSelection.isSelected(child)); + return result && !this.descendantsAllSelected(node); +} + +/** Toggle the to-do item selection. Select/deselect all the descendants node */ +todoItemSelectionToggle(node: TodoItemFlatNode): void { + this.checklistSelection.toggle(node); + const descendants = this.treeControl.getDescendants(node); + this.checklistSelection.isSelected(node) + ? this.checklistSelection.select(...descendants) + : this.checklistSelection.deselect(...descendants); + + // Force update for the parent + descendants.every(child => + this.checklistSelection.isSelected(child) + ); + this.checkAllParentsSelection(node); +} + +/** Toggle a leaf to-do item selection. Check all the parents to see if they changed */ +todoLeafItemSelectionToggle(node: TodoItemFlatNode): void { + this.checklistSelection.toggle(node); + this.checkAllParentsSelection(node); +} + +/* Checks all the parents when a leaf node is selected/unselected */ +checkAllParentsSelection(node: TodoItemFlatNode): void { + let parent: TodoItemFlatNode | null = this.getParentNode(node); + while (parent) { + this.checkRootNodeSelection(parent); + parent = this.getParentNode(parent); + } +} + +/** Check root node checked state and change it accordingly */ +checkRootNodeSelection(node: TodoItemFlatNode): void { + const nodeSelected = this.checklistSelection.isSelected(node); + const descendants = this.treeControl.getDescendants(node); + const descAllSelected = descendants.every(child => + this.checklistSelection.isSelected(child) + ); + if (nodeSelected && !descAllSelected) { + this.checklistSelection.deselect(node); + } else if (!nodeSelected && descAllSelected) { + this.checklistSelection.select(node); + } +} + +/* Get the parent node of a node */ +getParentNode(node: TodoItemFlatNode): TodoItemFlatNode | null { + const currentLevel = this.getLevel(node); + + if (currentLevel < 1) { + return null; + } + + const startIndex = this.treeControl.dataNodes.indexOf(node) - 1; + + for (let i = startIndex; i >= 0; i--) { + const currentNode = this.treeControl.dataNodes[i]; + + if (this.getLevel(currentNode) < currentLevel) { + return currentNode; + } + } + return null; +} + +/** Select the category so we can insert the new item. */ +addNewItem(node: TodoItemFlatNode) { + const parentNode = this.flatNodeMap.get(node); + this.database.insertItem(parentNode!, ''); + this.treeControl.expand(node); +} + +/** Save the node to database */ +saveNode(node: TodoItemFlatNode, itemValue: string) { + const nestedNode = this.flatNodeMap.get(node); + this.database.updateItem(nestedNode!, itemValue); +} + + +} diff --git a/src/assets/examples/material/clear-button-input/clear-button-input.component.html b/src/assets/examples/material/clear-button-input/clear-button-input.component.html new file mode 100644 index 0000000..4a135e1 --- /dev/null +++ b/src/assets/examples/material/clear-button-input/clear-button-input.component.html @@ -0,0 +1,6 @@ + + + + diff --git a/src/assets/examples/material/clear-button-input/clear-button-input.component.scss b/src/assets/examples/material/clear-button-input/clear-button-input.component.scss new file mode 100644 index 0000000..44beb8d --- /dev/null +++ b/src/assets/examples/material/clear-button-input/clear-button-input.component.scss @@ -0,0 +1,4 @@ +.example-form-field { + width: 200px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/clear-button-input/clear-button-input.component.spec.ts b/src/assets/examples/material/clear-button-input/clear-button-input.component.spec.ts new file mode 100644 index 0000000..86ee5a0 --- /dev/null +++ b/src/assets/examples/material/clear-button-input/clear-button-input.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ClearButtonInputComponent } from './clear-button-input.component'; + +describe('ClearButtonInputComponent', () => { + let component: ClearButtonInputComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ClearButtonInputComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ClearButtonInputComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/clear-button-input/clear-button-input.component.ts b/src/assets/examples/material/clear-button-input/clear-button-input.component.ts new file mode 100644 index 0000000..1452d01 --- /dev/null +++ b/src/assets/examples/material/clear-button-input/clear-button-input.component.ts @@ -0,0 +1,17 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-clear-button-input', + templateUrl: './clear-button-input.component.html', + styleUrls: ['./clear-button-input.component.scss'] +}) +export class ClearButtonInputComponent implements OnInit { + + value = 'Clear me'; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/configurable-checkbox/configurable-checkbox.component.html b/src/assets/examples/material/configurable-checkbox/configurable-checkbox.component.html new file mode 100644 index 0000000..a413ae6 --- /dev/null +++ b/src/assets/examples/material/configurable-checkbox/configurable-checkbox.component.html @@ -0,0 +1,40 @@ + + +

Checkbox configuration

+ +
+ Checked + Indeterminate +
+ +
+ + + After + Before + +
+ +
+ Disabled +
+
+
+ + + +

Result

+ +
+ + I'm a checkbox + +
+
+
+ diff --git a/src/assets/examples/material/configurable-checkbox/configurable-checkbox.component.scss b/src/assets/examples/material/configurable-checkbox/configurable-checkbox.component.scss new file mode 100644 index 0000000..ae79026 --- /dev/null +++ b/src/assets/examples/material/configurable-checkbox/configurable-checkbox.component.scss @@ -0,0 +1,15 @@ +.example-h2 { + margin: 10px; + } + + .example-section { + display: flex; + align-content: center; + align-items: center; + height: 60px; + } + + .example-margin { + margin: 0 10px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/configurable-checkbox/configurable-checkbox.component.spec.ts b/src/assets/examples/material/configurable-checkbox/configurable-checkbox.component.spec.ts new file mode 100644 index 0000000..07498d7 --- /dev/null +++ b/src/assets/examples/material/configurable-checkbox/configurable-checkbox.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ConfigurableCheckboxComponent } from './configurable-checkbox.component'; + +describe('ConfigurableCheckboxComponent', () => { + let component: ConfigurableCheckboxComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ConfigurableCheckboxComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ConfigurableCheckboxComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/configurable-checkbox/configurable-checkbox.component.ts b/src/assets/examples/material/configurable-checkbox/configurable-checkbox.component.ts new file mode 100644 index 0000000..32bfb2d --- /dev/null +++ b/src/assets/examples/material/configurable-checkbox/configurable-checkbox.component.ts @@ -0,0 +1,20 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-configurable-checkbox', + templateUrl: './configurable-checkbox.component.html', + styleUrls: ['./configurable-checkbox.component.scss'] +}) +export class ConfigurableCheckboxComponent implements OnInit { + + checked = false; + indeterminate = false; + labelPosition = 'after'; + disabled = false; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/configurable-sidenav/configurable-sidenav.component.html b/src/assets/examples/material/configurable-sidenav/configurable-sidenav.component.html new file mode 100644 index 0000000..80add10 --- /dev/null +++ b/src/assets/examples/material/configurable-sidenav/configurable-sidenav.component.html @@ -0,0 +1,25 @@ + + +

+

+ + + Over + Side + Push + +

+
+ + +

+

+ + + Over + Side + Push + +

+
+
\ No newline at end of file diff --git a/src/assets/examples/material/configurable-sidenav/configurable-sidenav.component.scss b/src/assets/examples/material/configurable-sidenav/configurable-sidenav.component.scss new file mode 100644 index 0000000..87f1db6 --- /dev/null +++ b/src/assets/examples/material/configurable-sidenav/configurable-sidenav.component.scss @@ -0,0 +1,15 @@ +.example-container { + // position: absolute; + // top: 0; + // bottom: 0; + // left: 0; + // right: 0; + } + + .example-radio-group { + display: block; + border: 1px solid #555; + margin: 20px; + padding: 10px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/configurable-sidenav/configurable-sidenav.component.spec.ts b/src/assets/examples/material/configurable-sidenav/configurable-sidenav.component.spec.ts new file mode 100644 index 0000000..d0afb3f --- /dev/null +++ b/src/assets/examples/material/configurable-sidenav/configurable-sidenav.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ConfigurableSidenavComponent } from './configurable-sidenav.component'; + +describe('ConfigurableSidenavComponent', () => { + let component: ConfigurableSidenavComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ConfigurableSidenavComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ConfigurableSidenavComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/configurable-sidenav/configurable-sidenav.component.ts b/src/assets/examples/material/configurable-sidenav/configurable-sidenav.component.ts new file mode 100644 index 0000000..928763f --- /dev/null +++ b/src/assets/examples/material/configurable-sidenav/configurable-sidenav.component.ts @@ -0,0 +1,18 @@ +import { FormControl } from '@angular/forms'; +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-configurable-sidenav', + templateUrl: './configurable-sidenav.component.html', + styleUrls: ['./configurable-sidenav.component.scss'] +}) +export class ConfigurableSidenavComponent implements OnInit { + + mode = new FormControl('over'); + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/configurable-toggle/configurable-toggle.component.html b/src/assets/examples/material/configurable-toggle/configurable-toggle.component.html new file mode 100644 index 0000000..b7f41c0 --- /dev/null +++ b/src/assets/examples/material/configurable-toggle/configurable-toggle.component.html @@ -0,0 +1,44 @@ + + +

Slider configuration

+ +
+ + + + Primary + + + Accent + + + Warn + + +
+ +
+ Checked +
+ +
+ Disabled +
+
+
+ + + +

Result

+ +
+ + Slide me! + +
+
+
diff --git a/src/assets/examples/material/configurable-toggle/configurable-toggle.component.scss b/src/assets/examples/material/configurable-toggle/configurable-toggle.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/configurable-toggle/configurable-toggle.component.spec.ts b/src/assets/examples/material/configurable-toggle/configurable-toggle.component.spec.ts new file mode 100644 index 0000000..a8d09fb --- /dev/null +++ b/src/assets/examples/material/configurable-toggle/configurable-toggle.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ConfigurableToggleComponent } from './configurable-toggle.component'; + +describe('ConfigurableToggleComponent', () => { + let component: ConfigurableToggleComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ConfigurableToggleComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ConfigurableToggleComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/configurable-toggle/configurable-toggle.component.ts b/src/assets/examples/material/configurable-toggle/configurable-toggle.component.ts new file mode 100644 index 0000000..7085593 --- /dev/null +++ b/src/assets/examples/material/configurable-toggle/configurable-toggle.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-configurable-toggle', + templateUrl: './configurable-toggle.component.html', + styleUrls: ['./configurable-toggle.component.scss'] +}) +export class ConfigurableToggleComponent implements OnInit { + color; + checked; + disabled; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/custom-bar/custom-bar.component.html b/src/assets/examples/material/custom-bar/custom-bar.component.html new file mode 100644 index 0000000..9396cbe --- /dev/null +++ b/src/assets/examples/material/custom-bar/custom-bar.component.html @@ -0,0 +1,64 @@ + + +

Progress bar configuration

+ +
+ + + + Primary + + + Accent + + + Warn + + +
+ +
+ + + + Determinate + + + Indeterminate + + + Buffer + + + Query + + +
+ +
+ + +
+
+ + +
+
+
+ + + +

Result

+ +
+ + +
+
+
+ \ No newline at end of file diff --git a/src/assets/examples/material/custom-bar/custom-bar.component.scss b/src/assets/examples/material/custom-bar/custom-bar.component.scss new file mode 100644 index 0000000..ae79026 --- /dev/null +++ b/src/assets/examples/material/custom-bar/custom-bar.component.scss @@ -0,0 +1,15 @@ +.example-h2 { + margin: 10px; + } + + .example-section { + display: flex; + align-content: center; + align-items: center; + height: 60px; + } + + .example-margin { + margin: 0 10px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/custom-bar/custom-bar.component.spec.ts b/src/assets/examples/material/custom-bar/custom-bar.component.spec.ts new file mode 100644 index 0000000..583ded1 --- /dev/null +++ b/src/assets/examples/material/custom-bar/custom-bar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CustomBarComponent } from './custom-bar.component'; + +describe('CustomBarComponent', () => { + let component: CustomBarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CustomBarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CustomBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/custom-bar/custom-bar.component.ts b/src/assets/examples/material/custom-bar/custom-bar.component.ts new file mode 100644 index 0000000..93c67aa --- /dev/null +++ b/src/assets/examples/material/custom-bar/custom-bar.component.ts @@ -0,0 +1,20 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-custom-bar', + templateUrl: './custom-bar.component.html', + styleUrls: ['./custom-bar.component.scss'] +}) +export class CustomBarComponent implements OnInit { + + color = 'primary'; + mode = 'determinate'; + value = 50; + bufferValue = 75; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/custom-class-tooltip/custom-class-tooltip.component.html b/src/assets/examples/material/custom-class-tooltip/custom-class-tooltip.component.html new file mode 100644 index 0000000..fde04a9 --- /dev/null +++ b/src/assets/examples/material/custom-class-tooltip/custom-class-tooltip.component.html @@ -0,0 +1,7 @@ + diff --git a/src/assets/examples/material/custom-class-tooltip/custom-class-tooltip.component.scss b/src/assets/examples/material/custom-class-tooltip/custom-class-tooltip.component.scss new file mode 100644 index 0000000..4d463e8 --- /dev/null +++ b/src/assets/examples/material/custom-class-tooltip/custom-class-tooltip.component.scss @@ -0,0 +1,8 @@ +.example-button { + margin-top: 16px; + } + + .example-tooltip-red { + background: #b71c1c; + } + \ No newline at end of file diff --git a/src/assets/examples/material/custom-class-tooltip/custom-class-tooltip.component.spec.ts b/src/assets/examples/material/custom-class-tooltip/custom-class-tooltip.component.spec.ts new file mode 100644 index 0000000..371b047 --- /dev/null +++ b/src/assets/examples/material/custom-class-tooltip/custom-class-tooltip.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CustomClassTooltipComponent } from './custom-class-tooltip.component'; + +describe('CustomClassTooltipComponent', () => { + let component: CustomClassTooltipComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CustomClassTooltipComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CustomClassTooltipComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/custom-class-tooltip/custom-class-tooltip.component.ts b/src/assets/examples/material/custom-class-tooltip/custom-class-tooltip.component.ts new file mode 100644 index 0000000..8e6742c --- /dev/null +++ b/src/assets/examples/material/custom-class-tooltip/custom-class-tooltip.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector: 'app-custom-class-tooltip', + templateUrl: './custom-class-tooltip.component.html', + styleUrls: ['./custom-class-tooltip.component.scss'], + // Need to remove view encapsulation so that the custom tooltip style defined in + // `tooltip-custom-class-example.css` will not be scoped to this component's view. + encapsulation: ViewEncapsulation.None +}) +export class CustomClassTooltipComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/custom-datepicker/custom-datepicker.component.html b/src/assets/examples/material/custom-datepicker/custom-datepicker.component.html new file mode 100644 index 0000000..4868f2d --- /dev/null +++ b/src/assets/examples/material/custom-datepicker/custom-datepicker.component.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/examples/material/custom-datepicker/custom-datepicker.component.scss b/src/assets/examples/material/custom-datepicker/custom-datepicker.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/custom-datepicker/custom-datepicker.component.spec.ts b/src/assets/examples/material/custom-datepicker/custom-datepicker.component.spec.ts new file mode 100644 index 0000000..95f60bb --- /dev/null +++ b/src/assets/examples/material/custom-datepicker/custom-datepicker.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CustomDatepickerComponent } from './custom-datepicker.component'; + +describe('CustomDatepickerComponent', () => { + let component: CustomDatepickerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CustomDatepickerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CustomDatepickerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/custom-datepicker/custom-datepicker.component.ts b/src/assets/examples/material/custom-datepicker/custom-datepicker.component.ts new file mode 100644 index 0000000..4d3f389 --- /dev/null +++ b/src/assets/examples/material/custom-datepicker/custom-datepicker.component.ts @@ -0,0 +1,50 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl} from '@angular/forms'; +import {MomentDateAdapter} from '@angular/material-moment-adapter'; +import {DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE} from '@angular/material/core'; + +// Depending on whether rollup is used, moment needs to be imported differently. +// Since Moment.js doesn't have a default export, we normally need to import using the `* as` +// syntax. However, rollup creates a synthetic default module and we thus need to import it using +// the `default as` syntax. +import * as _moment from 'moment'; + +const moment = _moment; + +// See the Moment.js docs for the meaning of these formats: +// https://momentjs.com/docs/#/displaying/format/ +export const MY_FORMATS = { + parse: { + dateInput: 'LL', + }, + display: { + dateInput: 'LL', + monthYearLabel: 'MMM YYYY', + dateA11yLabel: 'LL', + monthYearA11yLabel: 'MMMM YYYY', + }, +}; + +@Component({ + selector: 'app-custom-datepicker', + templateUrl: './custom-datepicker.component.html', + styleUrls: ['./custom-datepicker.component.scss'], + providers: [ + // `MomentDateAdapter` can be automatically provided by importing `MomentDateModule` in your + // application's root module. We provide it at the component level here, due to limitations of + // our example generation script. + {provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE]}, + + {provide: MAT_DATE_FORMATS, useValue: MY_FORMATS}, + ], +}) +export class CustomDatepickerComponent implements OnInit { + + date = new FormControl(moment()); + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/custom-loading-buttons/custom-loading-buttons.component.html b/src/assets/examples/material/custom-loading-buttons/custom-loading-buttons.component.html new file mode 100644 index 0000000..123eff0 --- /dev/null +++ b/src/assets/examples/material/custom-loading-buttons/custom-loading-buttons.component.html @@ -0,0 +1,11 @@ +

ngModule

+

SharedComponentsModule

+ +Click Me diff --git a/src/assets/examples/material/custom-loading-buttons/custom-loading-buttons.component.scss b/src/assets/examples/material/custom-loading-buttons/custom-loading-buttons.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/custom-loading-buttons/custom-loading-buttons.component.spec.ts b/src/assets/examples/material/custom-loading-buttons/custom-loading-buttons.component.spec.ts new file mode 100644 index 0000000..bb8f22f --- /dev/null +++ b/src/assets/examples/material/custom-loading-buttons/custom-loading-buttons.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CustomLoadingButtonsComponent } from './custom-loading-buttons.component'; + +describe('CustomLoadingButtonsComponent', () => { + let component: CustomLoadingButtonsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CustomLoadingButtonsComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CustomLoadingButtonsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/custom-loading-buttons/custom-loading-buttons.component.ts b/src/assets/examples/material/custom-loading-buttons/custom-loading-buttons.component.ts new file mode 100644 index 0000000..abc2a10 --- /dev/null +++ b/src/assets/examples/material/custom-loading-buttons/custom-loading-buttons.component.ts @@ -0,0 +1,45 @@ +import { Component, OnInit, ChangeDetectorRef } from "@angular/core"; + +@Component({ + selector: "app-custom-loading-buttons", + templateUrl: "./custom-loading-buttons.component.html", + styleUrls: ["./custom-loading-buttons.component.scss"] +}) +export class CustomLoadingButtonsComponent implements OnInit { + defaultLoading: boolean; + primaryLoading: boolean; + accentLoading: boolean; + warnLoading: boolean; + buttons = [ + { + name: "default", + loading: false + }, + { + name: "primary", + loading: false + }, + { + name: "accent", + loading: false + }, + { + name: "warn", + loading: false + } + ]; + + constructor( + private cdr: ChangeDetectorRef + ) {} + + ngOnInit() {} + + showLoading(button) { + button.loading = true; + setTimeout(() => { + button.loading = false; + this.cdr.detectChanges(); + }, 3000); + } +} diff --git a/src/assets/examples/material/custom-paginator/custom-paginator.component.html b/src/assets/examples/material/custom-paginator/custom-paginator.component.html new file mode 100644 index 0000000..665cacf --- /dev/null +++ b/src/assets/examples/material/custom-paginator/custom-paginator.component.html @@ -0,0 +1,28 @@ + + List length: + + + + + Page size: + + + + Page size options: + + + + + + +
+
Page Change Event Properties
+
List length: {{pageEvent.length}}
+
Page size: {{pageEvent.pageSize}}
+
Page index: {{pageEvent.pageIndex}}
+
diff --git a/src/assets/examples/material/custom-paginator/custom-paginator.component.scss b/src/assets/examples/material/custom-paginator/custom-paginator.component.scss new file mode 100644 index 0000000..692ed8c --- /dev/null +++ b/src/assets/examples/material/custom-paginator/custom-paginator.component.scss @@ -0,0 +1,4 @@ +mat-form-field { + margin-right: 12px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/custom-paginator/custom-paginator.component.spec.ts b/src/assets/examples/material/custom-paginator/custom-paginator.component.spec.ts new file mode 100644 index 0000000..ff8b3f4 --- /dev/null +++ b/src/assets/examples/material/custom-paginator/custom-paginator.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CustomPaginatorComponent } from './custom-paginator.component'; + +describe('CustomPaginatorComponent', () => { + let component: CustomPaginatorComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CustomPaginatorComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CustomPaginatorComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/custom-paginator/custom-paginator.component.ts b/src/assets/examples/material/custom-paginator/custom-paginator.component.ts new file mode 100644 index 0000000..f673b25 --- /dev/null +++ b/src/assets/examples/material/custom-paginator/custom-paginator.component.ts @@ -0,0 +1,28 @@ +import { Component, OnInit } from '@angular/core'; +import { PageEvent } from '@angular/material/paginator'; + +@Component({ + selector: 'app-custom-paginator', + templateUrl: './custom-paginator.component.html', + styleUrls: ['./custom-paginator.component.scss'] +}) +export class CustomPaginatorComponent implements OnInit { + + // MatPaginator Inputs + length = 100; + pageSize = 10; + pageSizeOptions: number[] = [5, 10, 25, 100]; + + // MatPaginator Output + pageEvent: PageEvent; + + constructor() { } + + ngOnInit() { + } + + setPageSizeOptions(setPageSizeOptionsInput: string) { + this.pageSizeOptions = setPageSizeOptionsInput.split(',').map(str => +str); + } + +} diff --git a/src/assets/examples/material/custom-panel-select/custom-panel-select.component.html b/src/assets/examples/material/custom-panel-select/custom-panel-select.component.html new file mode 100644 index 0000000..1e48e43 --- /dev/null +++ b/src/assets/examples/material/custom-panel-select/custom-panel-select.component.html @@ -0,0 +1,9 @@ + + Panel color + + Red + Green + Blue + + diff --git a/src/assets/examples/material/custom-panel-select/custom-panel-select.component.scss b/src/assets/examples/material/custom-panel-select/custom-panel-select.component.scss new file mode 100644 index 0000000..20137c7 --- /dev/null +++ b/src/assets/examples/material/custom-panel-select/custom-panel-select.component.scss @@ -0,0 +1,12 @@ +.example-panel-red.mat-select-panel { + background: rgba(255, 0, 0, 0.5); + } + + .example-panel-green.mat-select-panel { + background: rgba(0, 255, 0, 0.5); + } + + .example-panel-blue.mat-select-panel { + background: rgba(0, 0, 255, 0.5); + } + \ No newline at end of file diff --git a/src/assets/examples/material/custom-panel-select/custom-panel-select.component.spec.ts b/src/assets/examples/material/custom-panel-select/custom-panel-select.component.spec.ts new file mode 100644 index 0000000..28211d2 --- /dev/null +++ b/src/assets/examples/material/custom-panel-select/custom-panel-select.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CustomPanelSelectComponent } from './custom-panel-select.component'; + +describe('CustomPanelSelectComponent', () => { + let component: CustomPanelSelectComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CustomPanelSelectComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CustomPanelSelectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/custom-panel-select/custom-panel-select.component.ts b/src/assets/examples/material/custom-panel-select/custom-panel-select.component.ts new file mode 100644 index 0000000..ec281b9 --- /dev/null +++ b/src/assets/examples/material/custom-panel-select/custom-panel-select.component.ts @@ -0,0 +1,21 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import {FormControl} from '@angular/forms'; + +@Component({ + selector: 'app-custom-panel-select', + templateUrl: './custom-panel-select.component.html', + styleUrls: ['./custom-panel-select.component.scss'], + // Encapsulation has to be disabled in order for the + // component style to apply to the select panel. + encapsulation: ViewEncapsulation.None, +}) +export class CustomPanelSelectComponent implements OnInit { + + panelColor = new FormControl('red'); + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/custom-position-tooltip/custom-position-tooltip.component.html b/src/assets/examples/material/custom-position-tooltip/custom-position-tooltip.component.html new file mode 100644 index 0000000..444dbad --- /dev/null +++ b/src/assets/examples/material/custom-position-tooltip/custom-position-tooltip.component.html @@ -0,0 +1,14 @@ + + + + {{positionOption}} + + + + + diff --git a/src/assets/examples/material/custom-position-tooltip/custom-position-tooltip.component.scss b/src/assets/examples/material/custom-position-tooltip/custom-position-tooltip.component.scss new file mode 100644 index 0000000..46e50d6 --- /dev/null +++ b/src/assets/examples/material/custom-position-tooltip/custom-position-tooltip.component.scss @@ -0,0 +1,4 @@ +.example-user-input { + margin-right: 8px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/custom-position-tooltip/custom-position-tooltip.component.spec.ts b/src/assets/examples/material/custom-position-tooltip/custom-position-tooltip.component.spec.ts new file mode 100644 index 0000000..c6b0026 --- /dev/null +++ b/src/assets/examples/material/custom-position-tooltip/custom-position-tooltip.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CustomPositionTooltipComponent } from './custom-position-tooltip.component'; + +describe('CustomPositionTooltipComponent', () => { + let component: CustomPositionTooltipComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CustomPositionTooltipComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CustomPositionTooltipComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/custom-position-tooltip/custom-position-tooltip.component.ts b/src/assets/examples/material/custom-position-tooltip/custom-position-tooltip.component.ts new file mode 100644 index 0000000..ee7ad04 --- /dev/null +++ b/src/assets/examples/material/custom-position-tooltip/custom-position-tooltip.component.ts @@ -0,0 +1,20 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl} from '@angular/forms'; +import { TooltipPosition } from '@angular/material/tooltip'; + +@Component({ + selector: 'app-custom-position-tooltip', + templateUrl: './custom-position-tooltip.component.html', + styleUrls: ['./custom-position-tooltip.component.scss'] +}) +export class CustomPositionTooltipComponent implements OnInit { + + positionOptions: TooltipPosition[] = ['after', 'before', 'above', 'below', 'left', 'right']; + position = new FormControl(this.positionOptions[0]); + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/custom-ripples/custom-ripples.component.html b/src/assets/examples/material/custom-ripples/custom-ripples.component.html new file mode 100644 index 0000000..fb36d93 --- /dev/null +++ b/src/assets/examples/material/custom-ripples/custom-ripples.component.html @@ -0,0 +1,21 @@ +Centered +Disabled +Unbounded + + + + + + + + + +
+ Click me +
diff --git a/src/assets/examples/material/custom-ripples/custom-ripples.component.scss b/src/assets/examples/material/custom-ripples/custom-ripples.component.scss new file mode 100644 index 0000000..b603984 --- /dev/null +++ b/src/assets/examples/material/custom-ripples/custom-ripples.component.scss @@ -0,0 +1,26 @@ +.example-ripple-container { + cursor: pointer; + text-align: center; + + width: 300px; + height: 300px; + line-height: 300px; + + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + + -webkit-user-drag: none; + -webkit-tap-highlight-color: transparent; + } + + /** Styles to make the demo look better. */ + .example-ripple-checkbox { + margin: 6px 12px 6px 0; + } + + .example-ripple-form-field { + margin: 0 12px 0 0; + } + \ No newline at end of file diff --git a/src/assets/examples/material/custom-ripples/custom-ripples.component.spec.ts b/src/assets/examples/material/custom-ripples/custom-ripples.component.spec.ts new file mode 100644 index 0000000..26ef897 --- /dev/null +++ b/src/assets/examples/material/custom-ripples/custom-ripples.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CustomRipplesComponent } from './custom-ripples.component'; + +describe('CustomRipplesComponent', () => { + let component: CustomRipplesComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CustomRipplesComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CustomRipplesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/custom-ripples/custom-ripples.component.ts b/src/assets/examples/material/custom-ripples/custom-ripples.component.ts new file mode 100644 index 0000000..c086ea4 --- /dev/null +++ b/src/assets/examples/material/custom-ripples/custom-ripples.component.ts @@ -0,0 +1,22 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-custom-ripples', + templateUrl: './custom-ripples.component.html', + styleUrls: ['./custom-ripples.component.scss'] +}) +export class CustomRipplesComponent implements OnInit { + + centered = false; + disabled = false; + unbounded = false; + + radius: number; + color: string; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/custom-snackbar/custom-snackbar-overview/custom-snackbar-overview.component.html b/src/assets/examples/material/custom-snackbar/custom-snackbar-overview/custom-snackbar-overview.component.html new file mode 100644 index 0000000..cfba7c4 --- /dev/null +++ b/src/assets/examples/material/custom-snackbar/custom-snackbar-overview/custom-snackbar-overview.component.html @@ -0,0 +1,3 @@ + + Pizza party!!! 🍕 + diff --git a/src/assets/examples/material/custom-snackbar/custom-snackbar-overview/custom-snackbar-overview.component.scss b/src/assets/examples/material/custom-snackbar/custom-snackbar-overview/custom-snackbar-overview.component.scss new file mode 100644 index 0000000..61d7802 --- /dev/null +++ b/src/assets/examples/material/custom-snackbar/custom-snackbar-overview/custom-snackbar-overview.component.scss @@ -0,0 +1,3 @@ +.example-pizza-party { + color: hotpink; + } \ No newline at end of file diff --git a/src/assets/examples/material/custom-snackbar/custom-snackbar-overview/custom-snackbar-overview.component.spec.ts b/src/assets/examples/material/custom-snackbar/custom-snackbar-overview/custom-snackbar-overview.component.spec.ts new file mode 100644 index 0000000..adffe20 --- /dev/null +++ b/src/assets/examples/material/custom-snackbar/custom-snackbar-overview/custom-snackbar-overview.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CustomSnackbarOverviewComponent } from './custom-snackbar-overview.component'; + +describe('CustomSnackbarOverviewComponent', () => { + let component: CustomSnackbarOverviewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CustomSnackbarOverviewComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CustomSnackbarOverviewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/custom-snackbar/custom-snackbar-overview/custom-snackbar-overview.component.ts b/src/assets/examples/material/custom-snackbar/custom-snackbar-overview/custom-snackbar-overview.component.ts new file mode 100644 index 0000000..c7be81b --- /dev/null +++ b/src/assets/examples/material/custom-snackbar/custom-snackbar-overview/custom-snackbar-overview.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-custom-snackbar-overview', + templateUrl: './custom-snackbar-overview.component.html', + styleUrls: ['./custom-snackbar-overview.component.scss'] +}) +export class CustomSnackbarOverviewComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/custom-snackbar/custom-snackbar.component.html b/src/assets/examples/material/custom-snackbar/custom-snackbar.component.html new file mode 100644 index 0000000..c54dfc6 --- /dev/null +++ b/src/assets/examples/material/custom-snackbar/custom-snackbar.component.html @@ -0,0 +1,8 @@ + + Snack bar duration (seconds) + + + + diff --git a/src/assets/examples/material/custom-snackbar/custom-snackbar.component.scss b/src/assets/examples/material/custom-snackbar/custom-snackbar.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/custom-snackbar/custom-snackbar.component.spec.ts b/src/assets/examples/material/custom-snackbar/custom-snackbar.component.spec.ts new file mode 100644 index 0000000..e305eb4 --- /dev/null +++ b/src/assets/examples/material/custom-snackbar/custom-snackbar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CustomSnackbarComponent } from './custom-snackbar.component'; + +describe('CustomSnackbarComponent', () => { + let component: CustomSnackbarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CustomSnackbarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CustomSnackbarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/custom-snackbar/custom-snackbar.component.ts b/src/assets/examples/material/custom-snackbar/custom-snackbar.component.ts new file mode 100644 index 0000000..25f10b4 --- /dev/null +++ b/src/assets/examples/material/custom-snackbar/custom-snackbar.component.ts @@ -0,0 +1,25 @@ +import { MatSnackBar } from '@angular/material/snack-bar'; +import { Component, OnInit } from '@angular/core'; +import { CustomSnackbarOverviewComponent } from './custom-snackbar-overview/custom-snackbar-overview.component'; + +@Component({ + selector: 'app-custom-snackbar', + templateUrl: './custom-snackbar.component.html', + styleUrls: ['./custom-snackbar.component.scss'] +}) +export class CustomSnackbarComponent implements OnInit { + + durationInSeconds = 5; + + constructor(private snackBar: MatSnackBar) {} + + openSnackBar() { + this.snackBar.openFromComponent(CustomSnackbarOverviewComponent, { + duration: this.durationInSeconds * 1000, + }); + } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/custom-spinner/custom-spinner.component.html b/src/assets/examples/material/custom-spinner/custom-spinner.component.html new file mode 100644 index 0000000..37d4852 --- /dev/null +++ b/src/assets/examples/material/custom-spinner/custom-spinner.component.html @@ -0,0 +1,50 @@ + + +

Progress spinner configuration

+ +
+ + + + Primary + + + Accent + + + Warn + + +
+ +
+ + + + Determinate + + + Indeterminate + + +
+ +
+ + +
+
+
+ + +

Result

+ + + +
+
+ \ No newline at end of file diff --git a/src/assets/examples/material/custom-spinner/custom-spinner.component.scss b/src/assets/examples/material/custom-spinner/custom-spinner.component.scss new file mode 100644 index 0000000..ae79026 --- /dev/null +++ b/src/assets/examples/material/custom-spinner/custom-spinner.component.scss @@ -0,0 +1,15 @@ +.example-h2 { + margin: 10px; + } + + .example-section { + display: flex; + align-content: center; + align-items: center; + height: 60px; + } + + .example-margin { + margin: 0 10px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/custom-spinner/custom-spinner.component.spec.ts b/src/assets/examples/material/custom-spinner/custom-spinner.component.spec.ts new file mode 100644 index 0000000..4d8bc0c --- /dev/null +++ b/src/assets/examples/material/custom-spinner/custom-spinner.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CustomSpinnerComponent } from './custom-spinner.component'; + +describe('CustomSpinnerComponent', () => { + let component: CustomSpinnerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CustomSpinnerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CustomSpinnerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/custom-spinner/custom-spinner.component.ts b/src/assets/examples/material/custom-spinner/custom-spinner.component.ts new file mode 100644 index 0000000..481fb55 --- /dev/null +++ b/src/assets/examples/material/custom-spinner/custom-spinner.component.ts @@ -0,0 +1,19 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-custom-spinner', + templateUrl: './custom-spinner.component.html', + styleUrls: ['./custom-spinner.component.scss'] +}) +export class CustomSpinnerComponent implements OnInit { + + color = 'primary'; + mode = 'determinate'; + value = 50; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/custom-tab-group/custom-tab-group.component.html b/src/assets/examples/material/custom-tab-group/custom-tab-group.component.html new file mode 100644 index 0000000..30546df --- /dev/null +++ b/src/assets/examples/material/custom-tab-group/custom-tab-group.component.html @@ -0,0 +1,37 @@ +
+ + Top + Bottom + + Tab-group +
+ +
+
+ + Primary + Accent + + Color +
+ +
+ + Primary + Accent + + Background Color +
+ + + Content 1 + Content 2 + Content 3 + + \ No newline at end of file diff --git a/src/assets/examples/material/custom-tab-group/custom-tab-group.component.scss b/src/assets/examples/material/custom-tab-group/custom-tab-group.component.scss new file mode 100644 index 0000000..3bbc7d4 --- /dev/null +++ b/src/assets/examples/material/custom-tab-group/custom-tab-group.component.scss @@ -0,0 +1,5 @@ +.example-button-toggle-label { + display: inline-block; + margin: 16px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/custom-tab-group/custom-tab-group.component.spec.ts b/src/assets/examples/material/custom-tab-group/custom-tab-group.component.spec.ts new file mode 100644 index 0000000..e29af55 --- /dev/null +++ b/src/assets/examples/material/custom-tab-group/custom-tab-group.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CustomTabGroupComponent } from './custom-tab-group.component'; + +describe('CustomTabGroupComponent', () => { + let component: CustomTabGroupComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CustomTabGroupComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CustomTabGroupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/custom-tab-group/custom-tab-group.component.ts b/src/assets/examples/material/custom-tab-group/custom-tab-group.component.ts new file mode 100644 index 0000000..c8b02f6 --- /dev/null +++ b/src/assets/examples/material/custom-tab-group/custom-tab-group.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-custom-tab-group', + templateUrl: './custom-tab-group.component.html', + styleUrls: ['./custom-tab-group.component.scss'] +}) +export class CustomTabGroupComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/customized-stepper/customized-stepper.component.html b/src/assets/examples/material/customized-stepper/customized-stepper.component.html new file mode 100644 index 0000000..b5bb61c --- /dev/null +++ b/src/assets/examples/material/customized-stepper/customized-stepper.component.html @@ -0,0 +1,61 @@ + + +
+ Fill out your name + + + +
+ +
+
+
+ +
+ Fill out your address + + + +
+ + +
+
+
+ + Done + You are now done. +
+ + +
+
+
+ + + +

Put down your phones.

+
+ +
+
+ +

Socialize with each other.

+
+ + +
+
+ +

You're welcome.

+
+ + + + call_end + + + forum + +
+ \ No newline at end of file diff --git a/src/assets/examples/material/customized-stepper/customized-stepper.component.scss b/src/assets/examples/material/customized-stepper/customized-stepper.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/customized-stepper/customized-stepper.component.spec.ts b/src/assets/examples/material/customized-stepper/customized-stepper.component.spec.ts new file mode 100644 index 0000000..4c040c7 --- /dev/null +++ b/src/assets/examples/material/customized-stepper/customized-stepper.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CustomizedStepperComponent } from './customized-stepper.component'; + +describe('CustomizedStepperComponent', () => { + let component: CustomizedStepperComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CustomizedStepperComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CustomizedStepperComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/customized-stepper/customized-stepper.component.ts b/src/assets/examples/material/customized-stepper/customized-stepper.component.ts new file mode 100644 index 0000000..2274250 --- /dev/null +++ b/src/assets/examples/material/customized-stepper/customized-stepper.component.ts @@ -0,0 +1,29 @@ +import { Component, OnInit } from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {STEPPER_GLOBAL_OPTIONS} from '@angular/cdk/stepper'; + +@Component({ + selector: 'app-customized-stepper', + templateUrl: './customized-stepper.component.html', + styleUrls: ['./customized-stepper.component.scss'], + providers: [{ + provide: STEPPER_GLOBAL_OPTIONS, useValue: {displayDefaultIndicatorType: false, showError: true} + }] +}) +export class CustomizedStepperComponent implements OnInit { + + firstFormGroup: FormGroup; + secondFormGroup: FormGroup; + + constructor(private _formBuilder: FormBuilder) {} + + ngOnInit() { + this.firstFormGroup = this._formBuilder.group({ + firstCtrl: ['', Validators.required] + }); + this.secondFormGroup = this._formBuilder.group({ + secondCtrl: ['', Validators.required] + }); + } + +} diff --git a/src/assets/examples/material/data-dialog/data-dialog-overview/data-dialog-overview.component.html b/src/assets/examples/material/data-dialog/data-dialog-overview/data-dialog-overview.component.html new file mode 100644 index 0000000..6d263ba --- /dev/null +++ b/src/assets/examples/material/data-dialog/data-dialog-overview/data-dialog-overview.component.html @@ -0,0 +1,15 @@ +

Favorite Animal

+
+ My favorite animal is: +
    +
  • + Panda +
  • +
  • + Unicorn +
  • +
  • + Lion +
  • +
+
diff --git a/src/assets/examples/material/data-dialog/data-dialog-overview/data-dialog-overview.component.scss b/src/assets/examples/material/data-dialog/data-dialog-overview/data-dialog-overview.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/data-dialog/data-dialog-overview/data-dialog-overview.component.spec.ts b/src/assets/examples/material/data-dialog/data-dialog-overview/data-dialog-overview.component.spec.ts new file mode 100644 index 0000000..b64c396 --- /dev/null +++ b/src/assets/examples/material/data-dialog/data-dialog-overview/data-dialog-overview.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DataDialogOverviewComponent } from './data-dialog-overview.component'; + +describe('DataDialogOverviewComponent', () => { + let component: DataDialogOverviewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DataDialogOverviewComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DataDialogOverviewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/data-dialog/data-dialog-overview/data-dialog-overview.component.ts b/src/assets/examples/material/data-dialog/data-dialog-overview/data-dialog-overview.component.ts new file mode 100644 index 0000000..0c051e6 --- /dev/null +++ b/src/assets/examples/material/data-dialog/data-dialog-overview/data-dialog-overview.component.ts @@ -0,0 +1,16 @@ +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { Component, OnInit, Inject } from '@angular/core'; + +@Component({ + selector: 'app-data-dialog-overview', + templateUrl: './data-dialog-overview.component.html', + styleUrls: ['./data-dialog-overview.component.scss'] +}) +export class DataDialogOverviewComponent implements OnInit { + + constructor(@Inject(MAT_DIALOG_DATA) public data: any) {} + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/data-dialog/data-dialog.component.html b/src/assets/examples/material/data-dialog/data-dialog.component.html new file mode 100644 index 0000000..cdfc2fb --- /dev/null +++ b/src/assets/examples/material/data-dialog/data-dialog.component.html @@ -0,0 +1 @@ + diff --git a/src/assets/examples/material/data-dialog/data-dialog.component.scss b/src/assets/examples/material/data-dialog/data-dialog.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/data-dialog/data-dialog.component.spec.ts b/src/assets/examples/material/data-dialog/data-dialog.component.spec.ts new file mode 100644 index 0000000..f71774e --- /dev/null +++ b/src/assets/examples/material/data-dialog/data-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DataDialogComponent } from './data-dialog.component'; + +describe('DataDialogComponent', () => { + let component: DataDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DataDialogComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DataDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/data-dialog/data-dialog.component.ts b/src/assets/examples/material/data-dialog/data-dialog.component.ts new file mode 100644 index 0000000..862bde6 --- /dev/null +++ b/src/assets/examples/material/data-dialog/data-dialog.component.ts @@ -0,0 +1,29 @@ +import { MatDialog } from '@angular/material/dialog'; +import { Component, OnInit } from '@angular/core'; +import { DataDialogOverviewComponent } from './data-dialog-overview/data-dialog-overview.component'; + +export interface DialogData { + animal: 'panda' | 'unicorn' | 'lion'; +} + +@Component({ + selector: 'app-data-dialog', + templateUrl: './data-dialog.component.html', + styleUrls: ['./data-dialog.component.scss'] +}) +export class DataDialogComponent implements OnInit { + + constructor(public dialog: MatDialog) {} + + openDialog() { + this.dialog.open(DataDialogOverviewComponent, { + data: { + animal: 'panda' + } + }); + } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/delay-tooltip/delay-tooltip.component.html b/src/assets/examples/material/delay-tooltip/delay-tooltip.component.html new file mode 100644 index 0000000..2abdb30 --- /dev/null +++ b/src/assets/examples/material/delay-tooltip/delay-tooltip.component.html @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/src/assets/examples/material/delay-tooltip/delay-tooltip.component.scss b/src/assets/examples/material/delay-tooltip/delay-tooltip.component.scss new file mode 100644 index 0000000..f0cc963 --- /dev/null +++ b/src/assets/examples/material/delay-tooltip/delay-tooltip.component.scss @@ -0,0 +1,5 @@ +.example-user-input { + display: block; + width: 150px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/delay-tooltip/delay-tooltip.component.spec.ts b/src/assets/examples/material/delay-tooltip/delay-tooltip.component.spec.ts new file mode 100644 index 0000000..a5b0da3 --- /dev/null +++ b/src/assets/examples/material/delay-tooltip/delay-tooltip.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DelayTooltipComponent } from './delay-tooltip.component'; + +describe('DelayTooltipComponent', () => { + let component: DelayTooltipComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DelayTooltipComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DelayTooltipComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/delay-tooltip/delay-tooltip.component.ts b/src/assets/examples/material/delay-tooltip/delay-tooltip.component.ts new file mode 100644 index 0000000..f5016a7 --- /dev/null +++ b/src/assets/examples/material/delay-tooltip/delay-tooltip.component.ts @@ -0,0 +1,19 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl} from '@angular/forms'; + +@Component({ + selector: 'app-delay-tooltip', + templateUrl: './delay-tooltip.component.html', + styleUrls: ['./delay-tooltip.component.scss'] +}) +export class DelayTooltipComponent implements OnInit { + + showDelay = new FormControl(1000); + hideDelay = new FormControl(2000); + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/different-locale-datepicker/different-locale-datepicker.component.html b/src/assets/examples/material/different-locale-datepicker/different-locale-datepicker.component.html new file mode 100644 index 0000000..f92432a --- /dev/null +++ b/src/assets/examples/material/different-locale-datepicker/different-locale-datepicker.component.html @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/examples/material/different-locale-datepicker/different-locale-datepicker.component.scss b/src/assets/examples/material/different-locale-datepicker/different-locale-datepicker.component.scss new file mode 100644 index 0000000..692ed8c --- /dev/null +++ b/src/assets/examples/material/different-locale-datepicker/different-locale-datepicker.component.scss @@ -0,0 +1,4 @@ +mat-form-field { + margin-right: 12px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/different-locale-datepicker/different-locale-datepicker.component.spec.ts b/src/assets/examples/material/different-locale-datepicker/different-locale-datepicker.component.spec.ts new file mode 100644 index 0000000..34df5bf --- /dev/null +++ b/src/assets/examples/material/different-locale-datepicker/different-locale-datepicker.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DifferentLocaleDatepickerComponent } from './different-locale-datepicker.component'; + +describe('DifferentLocaleDatepickerComponent', () => { + let component: DifferentLocaleDatepickerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DifferentLocaleDatepickerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DifferentLocaleDatepickerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/different-locale-datepicker/different-locale-datepicker.component.ts b/src/assets/examples/material/different-locale-datepicker/different-locale-datepicker.component.ts new file mode 100644 index 0000000..494c705 --- /dev/null +++ b/src/assets/examples/material/different-locale-datepicker/different-locale-datepicker.component.ts @@ -0,0 +1,28 @@ +import {Component} from '@angular/core'; +import {DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE} from '@angular/material/core'; +import {MAT_MOMENT_DATE_FORMATS, MomentDateAdapter} from '@angular/material-moment-adapter'; + +@Component({ + selector: 'app-different-locale-datepicker', + templateUrl: './different-locale-datepicker.component.html', + styleUrls: ['./different-locale-datepicker.component.scss'], + providers: [ + // The locale would typically be provided on the root module of your application. We do it at + // the component level here, due to limitations of our example generation script. + {provide: MAT_DATE_LOCALE, useValue: 'ja-JP'}, + + // `MomentDateAdapter` and `MAT_MOMENT_DATE_FORMATS` can be automatically provided by importing + // `MatMomentDateModule` in your applications root module. We provide it at the component level + // here, due to limitations of our example generation script. + {provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE]}, + {provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS}, + ], +}) +export class DifferentLocaleDatepickerComponent { + + constructor(private adapter: DateAdapter) {} + + french() { + this.adapter.setLocale('fr'); + } +} diff --git a/src/assets/examples/material/disabled-datepicker/disabled-datepicker.component.html b/src/assets/examples/material/disabled-datepicker/disabled-datepicker.component.html new file mode 100644 index 0000000..ad3b075 --- /dev/null +++ b/src/assets/examples/material/disabled-datepicker/disabled-datepicker.component.html @@ -0,0 +1,23 @@ +

+ + + + + +

+ +

+ + + + + +

+ +

+ + + + + +

diff --git a/src/assets/examples/material/disabled-datepicker/disabled-datepicker.component.scss b/src/assets/examples/material/disabled-datepicker/disabled-datepicker.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/disabled-datepicker/disabled-datepicker.component.spec.ts b/src/assets/examples/material/disabled-datepicker/disabled-datepicker.component.spec.ts new file mode 100644 index 0000000..5809956 --- /dev/null +++ b/src/assets/examples/material/disabled-datepicker/disabled-datepicker.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DisabledDatepickerComponent } from './disabled-datepicker.component'; + +describe('DisabledDatepickerComponent', () => { + let component: DisabledDatepickerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DisabledDatepickerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DisabledDatepickerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/disabled-datepicker/disabled-datepicker.component.ts b/src/assets/examples/material/disabled-datepicker/disabled-datepicker.component.ts new file mode 100644 index 0000000..c40db59 --- /dev/null +++ b/src/assets/examples/material/disabled-datepicker/disabled-datepicker.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-disabled-datepicker', + templateUrl: './disabled-datepicker.component.html', + styleUrls: ['./disabled-datepicker.component.scss'] +}) +export class DisabledDatepickerComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/disabled-select/disabled-select.component.html b/src/assets/examples/material/disabled-select/disabled-select.component.html new file mode 100644 index 0000000..baf14a8 --- /dev/null +++ b/src/assets/examples/material/disabled-select/disabled-select.component.html @@ -0,0 +1,29 @@ +

+ disabled-select works! +

+

+ Disable select +

+ +

mat-select

+ + Choose an option + + Option 1 + Option 2 (disabled) + Option 3 + + + +

native html select

+ + Choose an option + + + diff --git a/src/assets/examples/material/disabled-select/disabled-select.component.scss b/src/assets/examples/material/disabled-select/disabled-select.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/disabled-select/disabled-select.component.spec.ts b/src/assets/examples/material/disabled-select/disabled-select.component.spec.ts new file mode 100644 index 0000000..da14584 --- /dev/null +++ b/src/assets/examples/material/disabled-select/disabled-select.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DisabledSelectComponent } from './disabled-select.component'; + +describe('DisabledSelectComponent', () => { + let component: DisabledSelectComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DisabledSelectComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DisabledSelectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/disabled-select/disabled-select.component.ts b/src/assets/examples/material/disabled-select/disabled-select.component.ts new file mode 100644 index 0000000..0db383a --- /dev/null +++ b/src/assets/examples/material/disabled-select/disabled-select.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl} from '@angular/forms'; + +@Component({ + selector: 'app-disabled-select', + templateUrl: './disabled-select.component.html', + styleUrls: ['./disabled-select.component.scss'] +}) +export class DisabledSelectComponent implements OnInit { + + disableSelect = new FormControl(false); + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/disabled-tooltip/disabled-tooltip.component.html b/src/assets/examples/material/disabled-tooltip/disabled-tooltip.component.html new file mode 100644 index 0000000..449ca44 --- /dev/null +++ b/src/assets/examples/material/disabled-tooltip/disabled-tooltip.component.html @@ -0,0 +1,10 @@ + + + + Tooltip disabled + diff --git a/src/assets/examples/material/disabled-tooltip/disabled-tooltip.component.scss b/src/assets/examples/material/disabled-tooltip/disabled-tooltip.component.scss new file mode 100644 index 0000000..7643c64 --- /dev/null +++ b/src/assets/examples/material/disabled-tooltip/disabled-tooltip.component.scss @@ -0,0 +1,4 @@ +.example-disabled-checkbox { + margin-left: 8px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/disabled-tooltip/disabled-tooltip.component.spec.ts b/src/assets/examples/material/disabled-tooltip/disabled-tooltip.component.spec.ts new file mode 100644 index 0000000..11bdc50 --- /dev/null +++ b/src/assets/examples/material/disabled-tooltip/disabled-tooltip.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DisabledTooltipComponent } from './disabled-tooltip.component'; + +describe('DisabledTooltipComponent', () => { + let component: DisabledTooltipComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DisabledTooltipComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DisabledTooltipComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/disabled-tooltip/disabled-tooltip.component.ts b/src/assets/examples/material/disabled-tooltip/disabled-tooltip.component.ts new file mode 100644 index 0000000..be680d0 --- /dev/null +++ b/src/assets/examples/material/disabled-tooltip/disabled-tooltip.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl} from '@angular/forms'; + +@Component({ + selector: 'app-disabled-tooltip', + templateUrl: './disabled-tooltip.component.html', + styleUrls: ['./disabled-tooltip.component.scss'] +}) +export class DisabledTooltipComponent implements OnInit { + + disabled = new FormControl(false); + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/display-value-autocomplete/display-value-autocomplete.component.html b/src/assets/examples/material/display-value-autocomplete/display-value-autocomplete.component.html new file mode 100644 index 0000000..5daac57 --- /dev/null +++ b/src/assets/examples/material/display-value-autocomplete/display-value-autocomplete.component.html @@ -0,0 +1,10 @@ +
+ + + + + {{option.name}} + + + +
diff --git a/src/assets/examples/material/display-value-autocomplete/display-value-autocomplete.component.scss b/src/assets/examples/material/display-value-autocomplete/display-value-autocomplete.component.scss new file mode 100644 index 0000000..9a473b4 --- /dev/null +++ b/src/assets/examples/material/display-value-autocomplete/display-value-autocomplete.component.scss @@ -0,0 +1,10 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; + } + + .example-full-width { + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/display-value-autocomplete/display-value-autocomplete.component.spec.ts b/src/assets/examples/material/display-value-autocomplete/display-value-autocomplete.component.spec.ts new file mode 100644 index 0000000..2f15515 --- /dev/null +++ b/src/assets/examples/material/display-value-autocomplete/display-value-autocomplete.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DisplayValueAutocompleteComponent } from './display-value-autocomplete.component'; + +describe('DisplayValueAutocompleteComponent', () => { + let component: DisplayValueAutocompleteComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DisplayValueAutocompleteComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DisplayValueAutocompleteComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/display-value-autocomplete/display-value-autocomplete.component.ts b/src/assets/examples/material/display-value-autocomplete/display-value-autocomplete.component.ts new file mode 100644 index 0000000..4f7b91a --- /dev/null +++ b/src/assets/examples/material/display-value-autocomplete/display-value-autocomplete.component.ts @@ -0,0 +1,46 @@ +import {Component, OnInit} from '@angular/core'; +import {FormControl} from '@angular/forms'; +import {Observable} from 'rxjs'; +import {map, startWith} from 'rxjs/operators'; + +export interface User { + name: string; +} + +@Component({ + selector: 'app-display-value-autocomplete', + templateUrl: './display-value-autocomplete.component.html', + styleUrls: ['./display-value-autocomplete.component.scss'] +}) +export class DisplayValueAutocompleteComponent implements OnInit { + + myControl = new FormControl(); + + options: User[] = [ + {name: 'Mary'}, + {name: 'Shelley'}, + {name: 'Igor'} + ]; + + filteredOptions: Observable; + + ngOnInit() { + this.filteredOptions = this.myControl.valueChanges + .pipe( + startWith(''), + map((value:any) => typeof value === 'string' ? value : value.name), + map(name => name ? this._filter(name) : this.options.slice()) + ); + } + + displayFn(user?: User): string | undefined { + return user ? user.name : undefined; + } + + private _filter(name: string): User[] { + const filterValue = name.toLowerCase(); + + return this.options.filter(option => option.name.toLowerCase().indexOf(filterValue) === 0); + } + +} diff --git a/src/assets/examples/material/drawer-sidenav/drawer-sidenav.component.html b/src/assets/examples/material/drawer-sidenav/drawer-sidenav.component.html new file mode 100644 index 0000000..0a11bdc --- /dev/null +++ b/src/assets/examples/material/drawer-sidenav/drawer-sidenav.component.html @@ -0,0 +1,13 @@ + + Drawer content + + Main content + Main content + Main content + Main content + Main content + Main content + Main content + Main content + + diff --git a/src/assets/examples/material/drawer-sidenav/drawer-sidenav.component.scss b/src/assets/examples/material/drawer-sidenav/drawer-sidenav.component.scss new file mode 100644 index 0000000..fa488f9 --- /dev/null +++ b/src/assets/examples/material/drawer-sidenav/drawer-sidenav.component.scss @@ -0,0 +1,7 @@ +.example-container { + width: 400px; + height: 200px; + margin: 10px; + border: 1px solid #555; + } + \ No newline at end of file diff --git a/src/assets/examples/material/drawer-sidenav/drawer-sidenav.component.spec.ts b/src/assets/examples/material/drawer-sidenav/drawer-sidenav.component.spec.ts new file mode 100644 index 0000000..4567768 --- /dev/null +++ b/src/assets/examples/material/drawer-sidenav/drawer-sidenav.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DrawerSidenavComponent } from './drawer-sidenav.component'; + +describe('DrawerSidenavComponent', () => { + let component: DrawerSidenavComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DrawerSidenavComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DrawerSidenavComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/drawer-sidenav/drawer-sidenav.component.ts b/src/assets/examples/material/drawer-sidenav/drawer-sidenav.component.ts new file mode 100644 index 0000000..271f76b --- /dev/null +++ b/src/assets/examples/material/drawer-sidenav/drawer-sidenav.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-drawer-sidenav', + templateUrl: './drawer-sidenav.component.html', + styleUrls: ['./drawer-sidenav.component.scss'] +}) +export class DrawerSidenavComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/dynamic-data-tree/dynamic-data-tree.component.html b/src/assets/examples/material/dynamic-data-tree/dynamic-data-tree.component.html new file mode 100644 index 0000000..f1075b0 --- /dev/null +++ b/src/assets/examples/material/dynamic-data-tree/dynamic-data-tree.component.html @@ -0,0 +1,19 @@ + + + + {{node.item}} + + + + {{node.item}} + + + + \ No newline at end of file diff --git a/src/assets/examples/material/dynamic-data-tree/dynamic-data-tree.component.scss b/src/assets/examples/material/dynamic-data-tree/dynamic-data-tree.component.scss new file mode 100644 index 0000000..f8da11a --- /dev/null +++ b/src/assets/examples/material/dynamic-data-tree/dynamic-data-tree.component.scss @@ -0,0 +1,4 @@ +.example-tree-progress-bar { + margin-left: 30px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/dynamic-data-tree/dynamic-data-tree.component.spec.ts b/src/assets/examples/material/dynamic-data-tree/dynamic-data-tree.component.spec.ts new file mode 100644 index 0000000..9704bcf --- /dev/null +++ b/src/assets/examples/material/dynamic-data-tree/dynamic-data-tree.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DynamicDataTreeComponent } from './dynamic-data-tree.component'; + +describe('DynamicDataTreeComponent', () => { + let component: DynamicDataTreeComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DynamicDataTreeComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DynamicDataTreeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/dynamic-data-tree/dynamic-data-tree.component.ts b/src/assets/examples/material/dynamic-data-tree/dynamic-data-tree.component.ts new file mode 100644 index 0000000..5b00e9d --- /dev/null +++ b/src/assets/examples/material/dynamic-data-tree/dynamic-data-tree.component.ts @@ -0,0 +1,143 @@ +import { OnInit } from '@angular/core'; +import {CollectionViewer, SelectionChange} from '@angular/cdk/collections'; +import {FlatTreeControl} from '@angular/cdk/tree'; +import {Component, Injectable} from '@angular/core'; +import {BehaviorSubject, merge, Observable} from 'rxjs'; +import {map} from 'rxjs/operators'; + +/** Flat node with expandable and level information */ +export class DynamicFlatNode { + constructor(public item: string, public level = 1, public expandable = false, + public isLoading = false) {} +} + +/** + * Database for dynamic data. When expanding a node in the tree, the data source will need to fetch + * the descendants data from the database. + */ +@Injectable() +export class DynamicDatabase { + dataMap = new Map([ + ['Fruits', ['Apple', 'Orange', 'Banana']], + ['Vegetables', ['Tomato', 'Potato', 'Onion']], + ['Apple', ['Fuji', 'Macintosh']], + ['Onion', ['Yellow', 'White', 'Purple']] + ]); + + rootLevelNodes: string[] = ['Fruits', 'Vegetables']; + + /** Initial data from database */ + initialData(): DynamicFlatNode[] { + return this.rootLevelNodes.map(name => new DynamicFlatNode(name, 0, true)); + } + + getChildren(node: string): string[] | undefined { + return this.dataMap.get(node); + } + + isExpandable(node: string): boolean { + return this.dataMap.has(node); + } +} +/** + * File database, it can build a tree structured Json object from string. + * Each node in Json object represents a file or a directory. For a file, it has filename and type. + * For a directory, it has filename and children (a list of files or directories). + * The input will be a json object string, and the output is a list of `FileNode` with nested + * structure. + */ +@Injectable() +export class DynamicDataSource { + + dataChange = new BehaviorSubject([]); + + get data(): DynamicFlatNode[] { return this.dataChange.value; } + set data(value: DynamicFlatNode[]) { + this.treeControl.dataNodes = value; + this.dataChange.next(value); + } + + constructor(private treeControl: FlatTreeControl, + private database: DynamicDatabase) {} + + connect(collectionViewer: CollectionViewer): Observable { + this.treeControl.expansionModel.changed.subscribe(change => { + if ((change as SelectionChange).added || + (change as SelectionChange).removed) { + this.handleTreeControl(change as SelectionChange); + } + }); + + return merge(collectionViewer.viewChange, this.dataChange).pipe(map(() => this.data)); + } + + /** Handle expand/collapse behaviors */ + handleTreeControl(change: SelectionChange) { + if (change.added) { + change.added.forEach(node => this.toggleNode(node, true)); + } + if (change.removed) { + change.removed.slice().reverse().forEach(node => this.toggleNode(node, false)); + } + } + + /** + * Toggle the node, remove from display list + */ + toggleNode(node: DynamicFlatNode, expand: boolean) { + const children = this.database.getChildren(node.item); + const index = this.data.indexOf(node); + if (!children || index < 0) { // If no children, or cannot find the node, no op + return; + } + + node.isLoading = true; + + setTimeout(() => { + if (expand) { + const nodes = children.map(name => + new DynamicFlatNode(name, node.level + 1, this.database.isExpandable(name))); + this.data.splice(index + 1, 0, ...nodes); + } else { + let count = 0; + for (let i = index + 1; i < this.data.length + && this.data[i].level > node.level; i++, count++) {} + this.data.splice(index + 1, count); + } + + // notify the change + this.dataChange.next(this.data); + node.isLoading = false; + }, 1000); + } +} + +@Component({ + selector: 'app-dynamic-data-tree', + templateUrl: './dynamic-data-tree.component.html', + styleUrls: ['./dynamic-data-tree.component.scss'], + providers: [DynamicDatabase] +}) +export class DynamicDataTreeComponent implements OnInit { + + constructor(database: DynamicDatabase) { + this.treeControl = new FlatTreeControl(this.getLevel, this.isExpandable); + this.dataSource = new DynamicDataSource(this.treeControl, database); + + this.dataSource.data = database.initialData(); + } + + treeControl: FlatTreeControl; + + dataSource: DynamicDataSource; + + getLevel = (node: DynamicFlatNode) => node.level; + + isExpandable = (node: DynamicFlatNode) => node.expandable; + + hasChild = (_: number, _nodeData: DynamicFlatNode) => _nodeData.expandable; + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/dynamic-grid/dynamic-grid.component.html b/src/assets/examples/material/dynamic-grid/dynamic-grid.component.html new file mode 100644 index 0000000..c79507b --- /dev/null +++ b/src/assets/examples/material/dynamic-grid/dynamic-grid.component.html @@ -0,0 +1,9 @@ + + + {{tile.text}} + + diff --git a/src/assets/examples/material/dynamic-grid/dynamic-grid.component.scss b/src/assets/examples/material/dynamic-grid/dynamic-grid.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/dynamic-grid/dynamic-grid.component.spec.ts b/src/assets/examples/material/dynamic-grid/dynamic-grid.component.spec.ts new file mode 100644 index 0000000..0f3060c --- /dev/null +++ b/src/assets/examples/material/dynamic-grid/dynamic-grid.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DynamicGridComponent } from './dynamic-grid.component'; + +describe('DynamicGridComponent', () => { + let component: DynamicGridComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DynamicGridComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DynamicGridComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/dynamic-grid/dynamic-grid.component.ts b/src/assets/examples/material/dynamic-grid/dynamic-grid.component.ts new file mode 100644 index 0000000..02396c8 --- /dev/null +++ b/src/assets/examples/material/dynamic-grid/dynamic-grid.component.ts @@ -0,0 +1,29 @@ +import { Component, OnInit } from '@angular/core'; + +export interface Tile { + color: string; + cols: number; + rows: number; + text: string; +} + +@Component({ + selector: 'app-dynamic-grid', + templateUrl: './dynamic-grid.component.html', + styleUrls: ['./dynamic-grid.component.scss'] +}) +export class DynamicGridComponent implements OnInit { + + tiles: Tile[] = [ + {text: 'One', cols: 3, rows: 1, color: 'lightblue'}, + {text: 'Two', cols: 1, rows: 2, color: 'lightgreen'}, + {text: 'Three', cols: 1, rows: 1, color: 'lightpink'}, + {text: 'Four', cols: 2, rows: 1, color: '#DDBDF1'}, + ]; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/dynamic-tab-group/dynamic-tab-group.component.html b/src/assets/examples/material/dynamic-tab-group/dynamic-tab-group.component.html new file mode 100644 index 0000000..cc4e5f0 --- /dev/null +++ b/src/assets/examples/material/dynamic-tab-group/dynamic-tab-group.component.html @@ -0,0 +1,30 @@ +
+ Selected tab index: + + + +
+ +
+ + Select tab after adding +
+ + + + Contents for {{tab}} tab + + + + + \ No newline at end of file diff --git a/src/assets/examples/material/dynamic-tab-group/dynamic-tab-group.component.scss b/src/assets/examples/material/dynamic-tab-group/dynamic-tab-group.component.scss new file mode 100644 index 0000000..a28708d --- /dev/null +++ b/src/assets/examples/material/dynamic-tab-group/dynamic-tab-group.component.scss @@ -0,0 +1,5 @@ +.example-input-label, +.example-add-tab-button, +.example-delete-tab-button { + margin: 8px; +} diff --git a/src/assets/examples/material/dynamic-tab-group/dynamic-tab-group.component.spec.ts b/src/assets/examples/material/dynamic-tab-group/dynamic-tab-group.component.spec.ts new file mode 100644 index 0000000..6090e96 --- /dev/null +++ b/src/assets/examples/material/dynamic-tab-group/dynamic-tab-group.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DynamicTabGroupComponent } from './dynamic-tab-group.component'; + +describe('DynamicTabGroupComponent', () => { + let component: DynamicTabGroupComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DynamicTabGroupComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DynamicTabGroupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/dynamic-tab-group/dynamic-tab-group.component.ts b/src/assets/examples/material/dynamic-tab-group/dynamic-tab-group.component.ts new file mode 100644 index 0000000..11a7015 --- /dev/null +++ b/src/assets/examples/material/dynamic-tab-group/dynamic-tab-group.component.ts @@ -0,0 +1,31 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl} from '@angular/forms'; + +@Component({ + selector: 'app-dynamic-tab-group', + templateUrl: './dynamic-tab-group.component.html', + styleUrls: ['./dynamic-tab-group.component.scss'] +}) +export class DynamicTabGroupComponent implements OnInit { + + tabs = ['First', 'Second', 'Third']; + selected = new FormControl(0); + + constructor() { } + + ngOnInit() { + } + + addTab(selectAfterAdding: boolean) { + this.tabs.push('New'); + + if (selectAfterAdding) { + this.selected.setValue(this.tabs.length - 1); + } + } + + removeTab(index: number) { + this.tabs.splice(index, 1); + } + +} diff --git a/src/assets/examples/material/error-form-field/error-form-field.component.html b/src/assets/examples/material/error-form-field/error-form-field.component.html new file mode 100644 index 0000000..4b06c9b --- /dev/null +++ b/src/assets/examples/material/error-form-field/error-form-field.component.html @@ -0,0 +1,6 @@ +
+ + + {{getErrorMessage()}} + +
diff --git a/src/assets/examples/material/error-form-field/error-form-field.component.scss b/src/assets/examples/material/error-form-field/error-form-field.component.scss new file mode 100644 index 0000000..621f9a7 --- /dev/null +++ b/src/assets/examples/material/error-form-field/error-form-field.component.scss @@ -0,0 +1,9 @@ +.example-container { + display: flex; + flex-direction: column; + } + + .example-container > * { + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/error-form-field/error-form-field.component.spec.ts b/src/assets/examples/material/error-form-field/error-form-field.component.spec.ts new file mode 100644 index 0000000..4972e83 --- /dev/null +++ b/src/assets/examples/material/error-form-field/error-form-field.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ErrorFormFieldComponent } from './error-form-field.component'; + +describe('ErrorFormFieldComponent', () => { + let component: ErrorFormFieldComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ErrorFormFieldComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ErrorFormFieldComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/error-form-field/error-form-field.component.ts b/src/assets/examples/material/error-form-field/error-form-field.component.ts new file mode 100644 index 0000000..75100bc --- /dev/null +++ b/src/assets/examples/material/error-form-field/error-form-field.component.ts @@ -0,0 +1,23 @@ +import { Component, OnInit } from "@angular/core"; +import { FormControl, Validators } from "@angular/forms"; + +@Component({ + selector: "app-error-form-field", + templateUrl: "./error-form-field.component.html", + styleUrls: ["./error-form-field.component.scss"] +}) +export class ErrorFormFieldComponent implements OnInit { + email = new FormControl("", [Validators.required, Validators.email]); + + constructor() {} + + ngOnInit() {} + + getErrorMessage() { + return this.email.hasError("required") + ? "You must enter a value" + : this.email.hasError("email") + ? "Not a valid email" + : ""; + } +} diff --git a/src/assets/examples/material/error-input/error-input.component.html b/src/assets/examples/material/error-input/error-input.component.html new file mode 100644 index 0000000..a9a0244 --- /dev/null +++ b/src/assets/examples/material/error-input/error-input.component.html @@ -0,0 +1,13 @@ +
+ + + Errors appear instantly! + + Please enter a valid email address + + + Email is required + + +
diff --git a/src/assets/examples/material/error-input/error-input.component.scss b/src/assets/examples/material/error-input/error-input.component.scss new file mode 100644 index 0000000..9a473b4 --- /dev/null +++ b/src/assets/examples/material/error-input/error-input.component.scss @@ -0,0 +1,10 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; + } + + .example-full-width { + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/error-input/error-input.component.spec.ts b/src/assets/examples/material/error-input/error-input.component.spec.ts new file mode 100644 index 0000000..079e8ec --- /dev/null +++ b/src/assets/examples/material/error-input/error-input.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ErrorInputComponent } from './error-input.component'; + +describe('ErrorInputComponent', () => { + let component: ErrorInputComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ErrorInputComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ErrorInputComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/error-input/error-input.component.ts b/src/assets/examples/material/error-input/error-input.component.ts new file mode 100644 index 0000000..01ccf59 --- /dev/null +++ b/src/assets/examples/material/error-input/error-input.component.ts @@ -0,0 +1,30 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl, FormGroupDirective, NgForm, Validators} from '@angular/forms'; +import {ErrorStateMatcher} from '@angular/material/core'; + +/** Error when invalid control is dirty, touched, or submitted. */ +export class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } +} + +@Component({ + selector: 'app-error-input', + templateUrl: './error-input.component.html', + styleUrls: ['./error-input.component.scss'] +}) +export class ErrorInputComponent implements OnInit { + + emailFormControl = new FormControl('', [ + Validators.required, + Validators.email, + ]); + + matcher = new MyErrorStateMatcher(); + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/error-message-input/error-message-input.component.html b/src/assets/examples/material/error-message-input/error-message-input.component.html new file mode 100644 index 0000000..cf241ee --- /dev/null +++ b/src/assets/examples/material/error-message-input/error-message-input.component.html @@ -0,0 +1,11 @@ +
+ + + + Please enter a valid email address + + + Email is required + + +
diff --git a/src/assets/examples/material/error-message-input/error-message-input.component.scss b/src/assets/examples/material/error-message-input/error-message-input.component.scss new file mode 100644 index 0000000..9a473b4 --- /dev/null +++ b/src/assets/examples/material/error-message-input/error-message-input.component.scss @@ -0,0 +1,10 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; + } + + .example-full-width { + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/error-message-input/error-message-input.component.spec.ts b/src/assets/examples/material/error-message-input/error-message-input.component.spec.ts new file mode 100644 index 0000000..0ba6060 --- /dev/null +++ b/src/assets/examples/material/error-message-input/error-message-input.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ErrorMessageInputComponent } from './error-message-input.component'; + +describe('ErrorMessageInputComponent', () => { + let component: ErrorMessageInputComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ErrorMessageInputComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ErrorMessageInputComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/error-message-input/error-message-input.component.ts b/src/assets/examples/material/error-message-input/error-message-input.component.ts new file mode 100644 index 0000000..7db9e7b --- /dev/null +++ b/src/assets/examples/material/error-message-input/error-message-input.component.ts @@ -0,0 +1,21 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl, Validators} from '@angular/forms'; + +@Component({ + selector: 'app-error-message-input', + templateUrl: './error-message-input.component.html', + styleUrls: ['./error-message-input.component.scss'] +}) +export class ErrorMessageInputComponent implements OnInit { + + emailFormControl = new FormControl('', [ + Validators.required, + Validators.email, + ]); + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/error-select/error-select.component.html b/src/assets/examples/material/error-select/error-select.component.html new file mode 100644 index 0000000..9e5f17b --- /dev/null +++ b/src/assets/examples/material/error-select/error-select.component.html @@ -0,0 +1,28 @@ +

mat-select

+ + Choose one + + Clear + Valid option + Invalid option + + Errors appear instantly! + You must make a selection + + Your selection is invalid + + + +

native html select

+ + Choose one + + You must make a selection + + Your selection is invalid + + diff --git a/src/assets/examples/material/error-select/error-select.component.scss b/src/assets/examples/material/error-select/error-select.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/error-select/error-select.component.spec.ts b/src/assets/examples/material/error-select/error-select.component.spec.ts new file mode 100644 index 0000000..199730c --- /dev/null +++ b/src/assets/examples/material/error-select/error-select.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ErrorSelectComponent } from './error-select.component'; + +describe('ErrorSelectComponent', () => { + let component: ErrorSelectComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ErrorSelectComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ErrorSelectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/error-select/error-select.component.ts b/src/assets/examples/material/error-select/error-select.component.ts new file mode 100644 index 0000000..9011c99 --- /dev/null +++ b/src/assets/examples/material/error-select/error-select.component.ts @@ -0,0 +1,42 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl, FormGroupDirective, NgForm, Validators} from '@angular/forms'; +import {ErrorStateMatcher} from '@angular/material/core'; + +/** Error when invalid control is dirty, touched, or submitted. */ +export class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } +} + +@Component({ + selector: 'app-error-select', + templateUrl: './error-select.component.html', + styleUrls: ['./error-select.component.scss'] +}) +export class ErrorSelectComponent implements OnInit { + + selected = new FormControl('valid', [ + Validators.required, + Validators.pattern('valid'), + ]); + + selectFormControl = new FormControl('valid', [ + Validators.required, + Validators.pattern('valid'), + ]); + + nativeSelectFormControl = new FormControl('valid', [ + Validators.required, + Validators.pattern('valid'), + ]); + + matcher = new MyErrorStateMatcher(); + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/error-stepper/error-stepper.component.html b/src/assets/examples/material/error-stepper/error-stepper.component.html new file mode 100644 index 0000000..dbd2eaa --- /dev/null +++ b/src/assets/examples/material/error-stepper/error-stepper.component.html @@ -0,0 +1,33 @@ + + +
+ Fill out your name + + + +
+ +
+
+
+ +
+ Fill out your address + + + +
+ + +
+
+
+ + Done + You are now done. +
+ + +
+
+
diff --git a/src/assets/examples/material/error-stepper/error-stepper.component.scss b/src/assets/examples/material/error-stepper/error-stepper.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/error-stepper/error-stepper.component.spec.ts b/src/assets/examples/material/error-stepper/error-stepper.component.spec.ts new file mode 100644 index 0000000..ac3e2b6 --- /dev/null +++ b/src/assets/examples/material/error-stepper/error-stepper.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ErrorStepperComponent } from './error-stepper.component'; + +describe('ErrorStepperComponent', () => { + let component: ErrorStepperComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ErrorStepperComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ErrorStepperComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/error-stepper/error-stepper.component.ts b/src/assets/examples/material/error-stepper/error-stepper.component.ts new file mode 100644 index 0000000..8aa0bf2 --- /dev/null +++ b/src/assets/examples/material/error-stepper/error-stepper.component.ts @@ -0,0 +1,29 @@ +import {Component, OnInit} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {STEPPER_GLOBAL_OPTIONS} from '@angular/cdk/stepper'; + +@Component({ + selector: 'app-error-stepper', + templateUrl: './error-stepper.component.html', + styleUrls: ['./error-stepper.component.scss'], + providers: [{ + provide: STEPPER_GLOBAL_OPTIONS, useValue: {showError: true} + }] +}) +export class ErrorStepperComponent implements OnInit { + + firstFormGroup: FormGroup; + secondFormGroup: FormGroup; + + constructor(private _formBuilder: FormBuilder) {} + + ngOnInit() { + this.firstFormGroup = this._formBuilder.group({ + firstCtrl: ['', Validators.required] + }); + this.secondFormGroup = this._formBuilder.group({ + secondCtrl: ['', Validators.required] + }); + } + +} diff --git a/src/assets/examples/material/escape-backdrop-sidenav/escape-backdrop-sidenav.component.html b/src/assets/examples/material/escape-backdrop-sidenav/escape-backdrop-sidenav.component.html new file mode 100644 index 0000000..a2c1886 --- /dev/null +++ b/src/assets/examples/material/escape-backdrop-sidenav/escape-backdrop-sidenav.component.html @@ -0,0 +1,11 @@ + + +

+
+ + +

+

Closed due to: {{reason}}

+
+
\ No newline at end of file diff --git a/src/assets/examples/material/escape-backdrop-sidenav/escape-backdrop-sidenav.component.scss b/src/assets/examples/material/escape-backdrop-sidenav/escape-backdrop-sidenav.component.scss new file mode 100644 index 0000000..afacdb8 --- /dev/null +++ b/src/assets/examples/material/escape-backdrop-sidenav/escape-backdrop-sidenav.component.scss @@ -0,0 +1,8 @@ +.example-container { + // position: absolute; + // top: 0; + // bottom: 0; + // left: 0; + // right: 0; + } + \ No newline at end of file diff --git a/src/assets/examples/material/escape-backdrop-sidenav/escape-backdrop-sidenav.component.spec.ts b/src/assets/examples/material/escape-backdrop-sidenav/escape-backdrop-sidenav.component.spec.ts new file mode 100644 index 0000000..eb8d9da --- /dev/null +++ b/src/assets/examples/material/escape-backdrop-sidenav/escape-backdrop-sidenav.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EscapeBackdropSidenavComponent } from './escape-backdrop-sidenav.component'; + +describe('EscapeBackdropSidenavComponent', () => { + let component: EscapeBackdropSidenavComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EscapeBackdropSidenavComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EscapeBackdropSidenavComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/escape-backdrop-sidenav/escape-backdrop-sidenav.component.ts b/src/assets/examples/material/escape-backdrop-sidenav/escape-backdrop-sidenav.component.ts new file mode 100644 index 0000000..7ea0cee --- /dev/null +++ b/src/assets/examples/material/escape-backdrop-sidenav/escape-backdrop-sidenav.component.ts @@ -0,0 +1,27 @@ +import { MatSidenav } from '@angular/material/sidenav'; +import { Component, OnInit, ViewChild } from '@angular/core'; + +@Component({ + selector: 'app-escape-backdrop-sidenav', + templateUrl: './escape-backdrop-sidenav.component.html', + styleUrls: ['./escape-backdrop-sidenav.component.scss'] +}) +export class EscapeBackdropSidenavComponent implements OnInit { + + @ViewChild('sidenav') sidenav: MatSidenav; + + reason = ''; + + constructor() { } + + ngOnInit() { + } + + close(reason: string) { + this.reason = reason; + this.sidenav.close(); + } + + + +} diff --git a/src/assets/examples/material/event-datepicker/event-datepicker.component.html b/src/assets/examples/material/event-datepicker/event-datepicker.component.html new file mode 100644 index 0000000..1935c71 --- /dev/null +++ b/src/assets/examples/material/event-datepicker/event-datepicker.component.html @@ -0,0 +1,10 @@ + + + + + + +
+
{{e}}
+
diff --git a/src/assets/examples/material/event-datepicker/event-datepicker.component.scss b/src/assets/examples/material/event-datepicker/event-datepicker.component.scss new file mode 100644 index 0000000..be335f5 --- /dev/null +++ b/src/assets/examples/material/event-datepicker/event-datepicker.component.scss @@ -0,0 +1,7 @@ +.example-events { + width: 400px; + height: 200px; + border: 1px solid #555; + overflow: auto; + } + \ No newline at end of file diff --git a/src/assets/examples/material/event-datepicker/event-datepicker.component.spec.ts b/src/assets/examples/material/event-datepicker/event-datepicker.component.spec.ts new file mode 100644 index 0000000..f2cb6f6 --- /dev/null +++ b/src/assets/examples/material/event-datepicker/event-datepicker.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EventDatepickerComponent } from './event-datepicker.component'; + +describe('EventDatepickerComponent', () => { + let component: EventDatepickerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EventDatepickerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EventDatepickerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/event-datepicker/event-datepicker.component.ts b/src/assets/examples/material/event-datepicker/event-datepicker.component.ts new file mode 100644 index 0000000..229bad0 --- /dev/null +++ b/src/assets/examples/material/event-datepicker/event-datepicker.component.ts @@ -0,0 +1,23 @@ +import { OnInit } from '@angular/core'; +import {Component} from '@angular/core'; +import {MatDatepickerInputEvent} from '@angular/material/datepicker'; + +@Component({ + selector: 'app-event-datepicker', + templateUrl: './event-datepicker.component.html', + styleUrls: ['./event-datepicker.component.scss'] +}) +export class EventDatepickerComponent implements OnInit { + + events: string[] = []; + + constructor() { } + + ngOnInit() { + } + + addEvent(type: string, event: MatDatepickerInputEvent) { + this.events.push(`${type}: ${event.value}`); + } + +} diff --git a/src/assets/examples/material/feature-select/feature-select.component.html b/src/assets/examples/material/feature-select/feature-select.component.html new file mode 100644 index 0000000..d10b0d4 --- /dev/null +++ b/src/assets/examples/material/feature-select/feature-select.component.html @@ -0,0 +1,28 @@ +

mat select

+ + Favorite animal + + -- + + {{animal.name}} + + + Please choose an animal + {{animalControl.value?.sound}} + + +

native html select

+ + Select your car (required) + + + This field is required + + You can pick up your favorite car here + + diff --git a/src/assets/examples/material/feature-select/feature-select.component.scss b/src/assets/examples/material/feature-select/feature-select.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/feature-select/feature-select.component.spec.ts b/src/assets/examples/material/feature-select/feature-select.component.spec.ts new file mode 100644 index 0000000..a0101e6 --- /dev/null +++ b/src/assets/examples/material/feature-select/feature-select.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FeatureSelectComponent } from './feature-select.component'; + +describe('FeatureSelectComponent', () => { + let component: FeatureSelectComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FeatureSelectComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FeatureSelectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/feature-select/feature-select.component.ts b/src/assets/examples/material/feature-select/feature-select.component.ts new file mode 100644 index 0000000..3c66a6f --- /dev/null +++ b/src/assets/examples/material/feature-select/feature-select.component.ts @@ -0,0 +1,30 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl, Validators} from '@angular/forms'; + +export interface Animal { + name: string; + sound: string; +} + +@Component({ + selector: 'app-feature-select', + templateUrl: './feature-select.component.html', + styleUrls: ['./feature-select.component.scss'] +}) +export class FeatureSelectComponent implements OnInit { + + animalControl = new FormControl('', [Validators.required]); + selectFormControl = new FormControl('', Validators.required); + animals: Animal[] = [ + {name: 'Dog', sound: 'Woof!'}, + {name: 'Cat', sound: 'Meow!'}, + {name: 'Cow', sound: 'Moo!'}, + {name: 'Fox', sound: 'Wa-pa-pa-pa-pa-pa-pow!'}, + ]; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/filter-autocomplete/filter-autocomplete.component.html b/src/assets/examples/material/filter-autocomplete/filter-autocomplete.component.html new file mode 100644 index 0000000..3a5aefa --- /dev/null +++ b/src/assets/examples/material/filter-autocomplete/filter-autocomplete.component.html @@ -0,0 +1,10 @@ +
+ + + + + {{option}} + + + +
diff --git a/src/assets/examples/material/filter-autocomplete/filter-autocomplete.component.scss b/src/assets/examples/material/filter-autocomplete/filter-autocomplete.component.scss new file mode 100644 index 0000000..9a473b4 --- /dev/null +++ b/src/assets/examples/material/filter-autocomplete/filter-autocomplete.component.scss @@ -0,0 +1,10 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; + } + + .example-full-width { + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/filter-autocomplete/filter-autocomplete.component.spec.ts b/src/assets/examples/material/filter-autocomplete/filter-autocomplete.component.spec.ts new file mode 100644 index 0000000..bc5c411 --- /dev/null +++ b/src/assets/examples/material/filter-autocomplete/filter-autocomplete.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FilterAutocompleteComponent } from './filter-autocomplete.component'; + +describe('FilterAutocompleteComponent', () => { + let component: FilterAutocompleteComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FilterAutocompleteComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FilterAutocompleteComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/filter-autocomplete/filter-autocomplete.component.ts b/src/assets/examples/material/filter-autocomplete/filter-autocomplete.component.ts new file mode 100644 index 0000000..d8fda01 --- /dev/null +++ b/src/assets/examples/material/filter-autocomplete/filter-autocomplete.component.ts @@ -0,0 +1,33 @@ +import {Component, OnInit} from '@angular/core'; +import {FormControl} from '@angular/forms'; +import {Observable} from 'rxjs'; +import {map, startWith} from 'rxjs/operators'; + +@Component({ + selector: 'app-filter-autocomplete', + templateUrl: './filter-autocomplete.component.html', + styleUrls: ['./filter-autocomplete.component.scss'] +}) +export class FilterAutocompleteComponent implements OnInit { + + constructor() { } + + myControl = new FormControl(); + options: string[] = ['One', 'Two', 'Three']; + filteredOptions: Observable; + + ngOnInit() { + this.filteredOptions = this.myControl.valueChanges + .pipe( + startWith(''), + map(value => this._filter(value)) + ); + } + + private _filter(value: string): string[] { + const filterValue = value.toLowerCase(); + + return this.options.filter(option => option.toLowerCase().includes(filterValue)); + } + +} diff --git a/src/assets/examples/material/filter-datepicker/filter-datepicker.component.html b/src/assets/examples/material/filter-datepicker/filter-datepicker.component.html new file mode 100644 index 0000000..6a44973 --- /dev/null +++ b/src/assets/examples/material/filter-datepicker/filter-datepicker.component.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/examples/material/filter-datepicker/filter-datepicker.component.scss b/src/assets/examples/material/filter-datepicker/filter-datepicker.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/filter-datepicker/filter-datepicker.component.spec.ts b/src/assets/examples/material/filter-datepicker/filter-datepicker.component.spec.ts new file mode 100644 index 0000000..e72ad62 --- /dev/null +++ b/src/assets/examples/material/filter-datepicker/filter-datepicker.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FilterDatepickerComponent } from './filter-datepicker.component'; + +describe('FilterDatepickerComponent', () => { + let component: FilterDatepickerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FilterDatepickerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FilterDatepickerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/filter-datepicker/filter-datepicker.component.ts b/src/assets/examples/material/filter-datepicker/filter-datepicker.component.ts new file mode 100644 index 0000000..a92c14f --- /dev/null +++ b/src/assets/examples/material/filter-datepicker/filter-datepicker.component.ts @@ -0,0 +1,21 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-filter-datepicker', + templateUrl: './filter-datepicker.component.html', + styleUrls: ['./filter-datepicker.component.scss'] +}) +export class FilterDatepickerComponent implements OnInit { + + myFilter = (d: Date): boolean => { + const day = d.getDay(); + // Prevent Saturday and Sunday from being selected. + return day !== 0 && day !== 6; + } + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/filter-table/filter-table.component.html b/src/assets/examples/material/filter-table/filter-table.component.html new file mode 100644 index 0000000..f0e4e00 --- /dev/null +++ b/src/assets/examples/material/filter-table/filter-table.component.html @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
No. {{element.position}} Name {{element.name}} Weight {{element.weight}} Symbol {{element.symbol}}
diff --git a/src/assets/examples/material/filter-table/filter-table.component.scss b/src/assets/examples/material/filter-table/filter-table.component.scss new file mode 100644 index 0000000..d8e79b1 --- /dev/null +++ b/src/assets/examples/material/filter-table/filter-table.component.scss @@ -0,0 +1,10 @@ +/* Structure */ +table { + width: 100%; + } + + .mat-form-field { + font-size: 14px; + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/filter-table/filter-table.component.spec.ts b/src/assets/examples/material/filter-table/filter-table.component.spec.ts new file mode 100644 index 0000000..bb4831e --- /dev/null +++ b/src/assets/examples/material/filter-table/filter-table.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FilterTableComponent } from './filter-table.component'; + +describe('FilterTableComponent', () => { + let component: FilterTableComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FilterTableComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FilterTableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/filter-table/filter-table.component.ts b/src/assets/examples/material/filter-table/filter-table.component.ts new file mode 100644 index 0000000..a853502 --- /dev/null +++ b/src/assets/examples/material/filter-table/filter-table.component.ts @@ -0,0 +1,43 @@ +import { Component, OnInit } from '@angular/core'; +import { MatTableDataSource } from '@angular/material/table'; + +export interface PeriodicElement { + name: string; + position: number; + weight: number; + symbol: string; +} + +const ELEMENT_DATA: PeriodicElement[] = [ + {position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H'}, + {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'}, + {position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li'}, + {position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be'}, + {position: 5, name: 'Boron', weight: 10.811, symbol: 'B'}, + {position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C'}, + {position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N'}, + {position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O'}, + {position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F'}, + {position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne'}, +]; + +@Component({ + selector: 'app-filter-table', + templateUrl: './filter-table.component.html', + styleUrls: ['./filter-table.component.scss'] +}) +export class FilterTableComponent implements OnInit { + + displayedColumns: string[] = ['position', 'name', 'weight', 'symbol']; + dataSource = new MatTableDataSource(ELEMENT_DATA); + + constructor() { } + + ngOnInit() { + } + + applyFilter(filterValue: string) { + this.dataSource.filter = filterValue.trim().toLowerCase(); + } + +} diff --git a/src/assets/examples/material/fixed-sidenav/fixed-sidenav.component.html b/src/assets/examples/material/fixed-sidenav/fixed-sidenav.component.html new file mode 100644 index 0000000..5ecf3fb --- /dev/null +++ b/src/assets/examples/material/fixed-sidenav/fixed-sidenav.component.html @@ -0,0 +1,44 @@ + + + + + + {{ options.value.fixed ? "Fixed" : "Non-fixed" }} Sidenav + + + +

Fixed

+

+ + + +

+

+ + + +

+

+
+
+ + +
diff --git a/src/assets/examples/material/fixed-sidenav/fixed-sidenav.component.scss b/src/assets/examples/material/fixed-sidenav/fixed-sidenav.component.scss new file mode 100644 index 0000000..129ed07 --- /dev/null +++ b/src/assets/examples/material/fixed-sidenav/fixed-sidenav.component.scss @@ -0,0 +1,30 @@ +.example-container { + position: absolute; + top: 60px; + bottom: 60px; + left: 0; + right: 0; + } + + .example-sidenav { + display: flex; + align-items: center; + justify-content: center; + width: 200px; + background: rgba(255, 0, 0, 0.5); + } + + .example-header { + position: fixed; + top: 0; + left: 0; + right: 0; + } + + .example-footer { + position: fixed; + bottom: 0; + left: 0; + right: 0; + } + \ No newline at end of file diff --git a/src/assets/examples/material/fixed-sidenav/fixed-sidenav.component.spec.ts b/src/assets/examples/material/fixed-sidenav/fixed-sidenav.component.spec.ts new file mode 100644 index 0000000..c33b510 --- /dev/null +++ b/src/assets/examples/material/fixed-sidenav/fixed-sidenav.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FixedSidenavComponent } from './fixed-sidenav.component'; + +describe('FixedSidenavComponent', () => { + let component: FixedSidenavComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FixedSidenavComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FixedSidenavComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/fixed-sidenav/fixed-sidenav.component.ts b/src/assets/examples/material/fixed-sidenav/fixed-sidenav.component.ts new file mode 100644 index 0000000..aad9a58 --- /dev/null +++ b/src/assets/examples/material/fixed-sidenav/fixed-sidenav.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import {FormBuilder, FormGroup} from '@angular/forms'; + +@Component({ + selector: 'app-fixed-sidenav', + templateUrl: './fixed-sidenav.component.html', + styleUrls: ['./fixed-sidenav.component.scss'] +}) +export class FixedSidenavComponent implements OnInit { + + options: FormGroup; + + constructor(fb: FormBuilder) { + this.options = fb.group({ + bottom: 0, + fixed: false, + top: 0 + }); + } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/flat-tree/flat-tree.component.html b/src/assets/examples/material/flat-tree/flat-tree.component.html new file mode 100644 index 0000000..4bf277f --- /dev/null +++ b/src/assets/examples/material/flat-tree/flat-tree.component.html @@ -0,0 +1,19 @@ + + + + + + {{node.name}} + + + + + {{node.name}} + + + \ No newline at end of file diff --git a/src/assets/examples/material/flat-tree/flat-tree.component.scss b/src/assets/examples/material/flat-tree/flat-tree.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/flat-tree/flat-tree.component.spec.ts b/src/assets/examples/material/flat-tree/flat-tree.component.spec.ts new file mode 100644 index 0000000..edfa5ec --- /dev/null +++ b/src/assets/examples/material/flat-tree/flat-tree.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FlatTreeComponent } from './flat-tree.component'; + +describe('FlatTreeComponent', () => { + let component: FlatTreeComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FlatTreeComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FlatTreeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/flat-tree/flat-tree.component.ts b/src/assets/examples/material/flat-tree/flat-tree.component.ts new file mode 100644 index 0000000..d72a52d --- /dev/null +++ b/src/assets/examples/material/flat-tree/flat-tree.component.ts @@ -0,0 +1,78 @@ +import { Component, OnInit } from '@angular/core'; +import {FlatTreeControl} from '@angular/cdk/tree'; +import {MatTreeFlatDataSource, MatTreeFlattener} from '@angular/material/tree'; + +/** + * Food data with nested structure. + * Each node has a name and an optiona list of children. + */ +interface FoodNode { + name: string; + children?: FoodNode[]; +} + +const TREE_DATA: FoodNode[] = [ + { + name: 'Fruit', + children: [ + {name: 'Apple'}, + {name: 'Banana'}, + {name: 'Fruit loops'}, + ] + }, { + name: 'Vegetables', + children: [ + { + name: 'Green', + children: [ + {name: 'Broccoli'}, + {name: 'Brussel sprouts'}, + ] + }, { + name: 'Orange', + children: [ + {name: 'Pumpkins'}, + {name: 'Carrots'}, + ] + }, + ] + }, +]; + +/** Flat node with expandable and level information */ +interface ExampleFlatNode { + expandable: boolean; + name: string; + level: number; +} + +@Component({ + selector: 'app-flat-tree', + templateUrl: './flat-tree.component.html', + styleUrls: ['./flat-tree.component.scss'] +}) +export class FlatTreeComponent { + + private transformer = (node: FoodNode, level: number) => { + return { + expandable: !!node.children && node.children.length > 0, + name: node.name, + level: level, + }; + } + + treeControl = new FlatTreeControl( + node => node.level, node => node.expandable); + + treeFlattener = new MatTreeFlattener( + this.transformer, node => node.level, node => node.expandable, node => node.children); + + dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener); + + constructor() { + this.dataSource.data = TREE_DATA; + } + + hasChild = (_: number, node: ExampleFlatNode) => node.expandable; + +} diff --git a/src/assets/examples/material/footer-table/footer-table.component.html b/src/assets/examples/material/footer-table/footer-table.component.html new file mode 100644 index 0000000..c5faed4 --- /dev/null +++ b/src/assets/examples/material/footer-table/footer-table.component.html @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + +
Item {{transaction.item}} Total Cost {{transaction.cost | currency}} {{getTotalCost() | currency}}
diff --git a/src/assets/examples/material/footer-table/footer-table.component.scss b/src/assets/examples/material/footer-table/footer-table.component.scss new file mode 100644 index 0000000..f93f9b4 --- /dev/null +++ b/src/assets/examples/material/footer-table/footer-table.component.scss @@ -0,0 +1,8 @@ +table { + width: 100%; + } + + tr.mat-footer-row { + font-weight: bold; + } + \ No newline at end of file diff --git a/src/assets/examples/material/footer-table/footer-table.component.spec.ts b/src/assets/examples/material/footer-table/footer-table.component.spec.ts new file mode 100644 index 0000000..1b68a6f --- /dev/null +++ b/src/assets/examples/material/footer-table/footer-table.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FooterTableComponent } from './footer-table.component'; + +describe('FooterTableComponent', () => { + let component: FooterTableComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FooterTableComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FooterTableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/footer-table/footer-table.component.ts b/src/assets/examples/material/footer-table/footer-table.component.ts new file mode 100644 index 0000000..0832a92 --- /dev/null +++ b/src/assets/examples/material/footer-table/footer-table.component.ts @@ -0,0 +1,35 @@ +import { Component, OnInit } from '@angular/core'; + +export interface Transaction { + item: string; + cost: number; +} + +@Component({ + selector: 'app-footer-table', + templateUrl: './footer-table.component.html', + styleUrls: ['./footer-table.component.scss'] +}) +export class FooterTableComponent implements OnInit { + + displayedColumns: string[] = ['item', 'cost']; + transactions: Transaction[] = [ + {item: 'Beach ball', cost: 4}, + {item: 'Towel', cost: 5}, + {item: 'Frisbee', cost: 2}, + {item: 'Sunscreen', cost: 4}, + {item: 'Cooler', cost: 25}, + {item: 'Swim suit', cost: 15}, + ]; + + /** Gets the total cost of all transactions. */ + getTotalCost() { + return this.transactions.map(t => t.cost).reduce((acc, value) => acc + value, 0); + } + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/form-input/form-input.component.html b/src/assets/examples/material/form-input/form-input.component.html new file mode 100644 index 0000000..8cf31e0 --- /dev/null +++ b/src/assets/examples/material/form-input/form-input.component.html @@ -0,0 +1,36 @@ +
+ + + + + + + +
+ + + +
+ +

+ + + + + + +

+ + + + + +
+ + + + + + {{postalCode.value.length}} / 5 +
+
diff --git a/src/assets/examples/material/form-input/form-input.component.scss b/src/assets/examples/material/form-input/form-input.component.scss new file mode 100644 index 0000000..73bd16f --- /dev/null +++ b/src/assets/examples/material/form-input/form-input.component.scss @@ -0,0 +1,14 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; + } + + .example-full-width { + width: 100%; + } + + td { + padding-right: 8px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/form-input/form-input.component.spec.ts b/src/assets/examples/material/form-input/form-input.component.spec.ts new file mode 100644 index 0000000..d0d4bba --- /dev/null +++ b/src/assets/examples/material/form-input/form-input.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FormInputComponent } from './form-input.component'; + +describe('FormInputComponent', () => { + let component: FormInputComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FormInputComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FormInputComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/form-input/form-input.component.ts b/src/assets/examples/material/form-input/form-input.component.ts new file mode 100644 index 0000000..4c034b5 --- /dev/null +++ b/src/assets/examples/material/form-input/form-input.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-form-input', + templateUrl: './form-input.component.html', + styleUrls: ['./form-input.component.scss'] +}) +export class FormInputComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/form-select/form-select.component.html b/src/assets/examples/material/form-select/form-select.component.html new file mode 100644 index 0000000..f2b02b6 --- /dev/null +++ b/src/assets/examples/material/form-select/form-select.component.html @@ -0,0 +1,23 @@ +
+

mat-select

+ + Favorite food + + + {{food.viewValue}} + + + +

Selected food: {{selectedValue}}

+

native html select

+ + Favorite car + + +

Selected car: {{selectedCar}}

+
diff --git a/src/assets/examples/material/form-select/form-select.component.scss b/src/assets/examples/material/form-select/form-select.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/form-select/form-select.component.spec.ts b/src/assets/examples/material/form-select/form-select.component.spec.ts new file mode 100644 index 0000000..3b8813b --- /dev/null +++ b/src/assets/examples/material/form-select/form-select.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FormSelectComponent } from './form-select.component'; + +describe('FormSelectComponent', () => { + let component: FormSelectComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FormSelectComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FormSelectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/form-select/form-select.component.ts b/src/assets/examples/material/form-select/form-select.component.ts new file mode 100644 index 0000000..0ec9331 --- /dev/null +++ b/src/assets/examples/material/form-select/form-select.component.ts @@ -0,0 +1,40 @@ +import { Component, OnInit } from '@angular/core'; + +export interface Food { + value: string; + viewValue: string; +} + +export interface Car { + value: string; + viewValue: string; +} + +@Component({ + selector: 'app-form-select', + templateUrl: './form-select.component.html', + styleUrls: ['./form-select.component.scss'] +}) +export class FormSelectComponent implements OnInit { + + selectedValue: string; + selectedCar: string; + + foods: Food[] = [ + {value: 'steak-0', viewValue: 'Steak'}, + {value: 'pizza-1', viewValue: 'Pizza'}, + {value: 'tacos-2', viewValue: 'Tacos'} + ]; + + cars: Car[] = [ + {value: 'volvo', viewValue: 'Volvo'}, + {value: 'saab', viewValue: 'Saab'}, + {value: 'mercedes', viewValue: 'Mercedes'} + ]; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/highlight-first-autocomplete/highlight-first-autocomplete.component.html b/src/assets/examples/material/highlight-first-autocomplete/highlight-first-autocomplete.component.html new file mode 100644 index 0000000..50dd982 --- /dev/null +++ b/src/assets/examples/material/highlight-first-autocomplete/highlight-first-autocomplete.component.html @@ -0,0 +1,10 @@ +
+ + + + + {{option}} + + + +
diff --git a/src/assets/examples/material/highlight-first-autocomplete/highlight-first-autocomplete.component.scss b/src/assets/examples/material/highlight-first-autocomplete/highlight-first-autocomplete.component.scss new file mode 100644 index 0000000..9a473b4 --- /dev/null +++ b/src/assets/examples/material/highlight-first-autocomplete/highlight-first-autocomplete.component.scss @@ -0,0 +1,10 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; + } + + .example-full-width { + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/highlight-first-autocomplete/highlight-first-autocomplete.component.spec.ts b/src/assets/examples/material/highlight-first-autocomplete/highlight-first-autocomplete.component.spec.ts new file mode 100644 index 0000000..dc45ba7 --- /dev/null +++ b/src/assets/examples/material/highlight-first-autocomplete/highlight-first-autocomplete.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HighlightFirstAutocompleteComponent } from './highlight-first-autocomplete.component'; + +describe('HighlightFirstAutocompleteComponent', () => { + let component: HighlightFirstAutocompleteComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HighlightFirstAutocompleteComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HighlightFirstAutocompleteComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/highlight-first-autocomplete/highlight-first-autocomplete.component.ts b/src/assets/examples/material/highlight-first-autocomplete/highlight-first-autocomplete.component.ts new file mode 100644 index 0000000..064e813 --- /dev/null +++ b/src/assets/examples/material/highlight-first-autocomplete/highlight-first-autocomplete.component.ts @@ -0,0 +1,30 @@ +import {Component, OnInit} from '@angular/core'; +import {FormControl} from '@angular/forms'; +import {Observable} from 'rxjs'; +import {map, startWith} from 'rxjs/operators'; + +@Component({ + selector: 'app-highlight-first-autocomplete', + templateUrl: './highlight-first-autocomplete.component.html', + styleUrls: ['./highlight-first-autocomplete.component.scss'] +}) +export class HighlightFirstAutocompleteComponent implements OnInit { + + myControl = new FormControl(); + options: string[] = ['One', 'Two', 'Three']; + filteredOptions: Observable; + + ngOnInit() { + this.filteredOptions = this.myControl.valueChanges.pipe( + startWith(''), + map(value => this._filter(value)) + ); + } + + private _filter(value: string): string[] { + const filterValue = value.toLowerCase(); + + return this.options.filter(option => option.toLowerCase().indexOf(filterValue) === 0); + } + +} diff --git a/src/assets/examples/material/hints-form-field/hints-form-field.component.html b/src/assets/examples/material/hints-form-field/hints-form-field.component.html new file mode 100644 index 0000000..a402d98 --- /dev/null +++ b/src/assets/examples/material/hints-form-field/hints-form-field.component.html @@ -0,0 +1,13 @@ +
+ + + {{input.value?.length || 0}}/10 + + + + + Option + + Here's the dropdown arrow ^ + +
diff --git a/src/assets/examples/material/hints-form-field/hints-form-field.component.scss b/src/assets/examples/material/hints-form-field/hints-form-field.component.scss new file mode 100644 index 0000000..621f9a7 --- /dev/null +++ b/src/assets/examples/material/hints-form-field/hints-form-field.component.scss @@ -0,0 +1,9 @@ +.example-container { + display: flex; + flex-direction: column; + } + + .example-container > * { + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/hints-form-field/hints-form-field.component.spec.ts b/src/assets/examples/material/hints-form-field/hints-form-field.component.spec.ts new file mode 100644 index 0000000..e54f57b --- /dev/null +++ b/src/assets/examples/material/hints-form-field/hints-form-field.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HintsFormFieldComponent } from './hints-form-field.component'; + +describe('HintsFormFieldComponent', () => { + let component: HintsFormFieldComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HintsFormFieldComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HintsFormFieldComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/hints-form-field/hints-form-field.component.ts b/src/assets/examples/material/hints-form-field/hints-form-field.component.ts new file mode 100644 index 0000000..b91124b --- /dev/null +++ b/src/assets/examples/material/hints-form-field/hints-form-field.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-hints-form-field', + templateUrl: './hints-form-field.component.html', + styleUrls: ['./hints-form-field.component.scss'] +}) +export class HintsFormFieldComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/hints-input/hints-input.component.html b/src/assets/examples/material/hints-input/hints-input.component.html new file mode 100644 index 0000000..b7595cf --- /dev/null +++ b/src/assets/examples/material/hints-input/hints-input.component.html @@ -0,0 +1,9 @@ +
+ + + + Don't disclose personal info + {{message.value.length}} / 256 + + +
diff --git a/src/assets/examples/material/hints-input/hints-input.component.scss b/src/assets/examples/material/hints-input/hints-input.component.scss new file mode 100644 index 0000000..9a473b4 --- /dev/null +++ b/src/assets/examples/material/hints-input/hints-input.component.scss @@ -0,0 +1,10 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; + } + + .example-full-width { + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/hints-input/hints-input.component.spec.ts b/src/assets/examples/material/hints-input/hints-input.component.spec.ts new file mode 100644 index 0000000..bc7c3fc --- /dev/null +++ b/src/assets/examples/material/hints-input/hints-input.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HintsInputComponent } from './hints-input.component'; + +describe('HintsInputComponent', () => { + let component: HintsInputComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HintsInputComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HintsInputComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/hints-input/hints-input.component.ts b/src/assets/examples/material/hints-input/hints-input.component.ts new file mode 100644 index 0000000..17f37a8 --- /dev/null +++ b/src/assets/examples/material/hints-input/hints-input.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-hints-input', + templateUrl: './hints-input.component.html', + styleUrls: ['./hints-input.component.scss'] +}) +export class HintsInputComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/icon-menu/icon-menu.component.html b/src/assets/examples/material/icon-menu/icon-menu.component.html new file mode 100644 index 0000000..fb66054 --- /dev/null +++ b/src/assets/examples/material/icon-menu/icon-menu.component.html @@ -0,0 +1,17 @@ + + + + + + diff --git a/src/assets/examples/material/icon-menu/icon-menu.component.scss b/src/assets/examples/material/icon-menu/icon-menu.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/icon-menu/icon-menu.component.spec.ts b/src/assets/examples/material/icon-menu/icon-menu.component.spec.ts new file mode 100644 index 0000000..2b78de9 --- /dev/null +++ b/src/assets/examples/material/icon-menu/icon-menu.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { IconMenuComponent } from './icon-menu.component'; + +describe('IconMenuComponent', () => { + let component: IconMenuComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ IconMenuComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(IconMenuComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/icon-menu/icon-menu.component.ts b/src/assets/examples/material/icon-menu/icon-menu.component.ts new file mode 100644 index 0000000..00b2030 --- /dev/null +++ b/src/assets/examples/material/icon-menu/icon-menu.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-icon-menu', + templateUrl: './icon-menu.component.html', + styleUrls: ['./icon-menu.component.scss'] +}) +export class IconMenuComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/indeterminate-bar/indeterminate-bar.component.html b/src/assets/examples/material/indeterminate-bar/indeterminate-bar.component.html new file mode 100644 index 0000000..635b0ba --- /dev/null +++ b/src/assets/examples/material/indeterminate-bar/indeterminate-bar.component.html @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/assets/examples/material/indeterminate-bar/indeterminate-bar.component.scss b/src/assets/examples/material/indeterminate-bar/indeterminate-bar.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/indeterminate-bar/indeterminate-bar.component.spec.ts b/src/assets/examples/material/indeterminate-bar/indeterminate-bar.component.spec.ts new file mode 100644 index 0000000..b3bb947 --- /dev/null +++ b/src/assets/examples/material/indeterminate-bar/indeterminate-bar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { IndeterminateBarComponent } from './indeterminate-bar.component'; + +describe('IndeterminateBarComponent', () => { + let component: IndeterminateBarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ IndeterminateBarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(IndeterminateBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/indeterminate-bar/indeterminate-bar.component.ts b/src/assets/examples/material/indeterminate-bar/indeterminate-bar.component.ts new file mode 100644 index 0000000..ab2bcbd --- /dev/null +++ b/src/assets/examples/material/indeterminate-bar/indeterminate-bar.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-indeterminate-bar', + templateUrl: './indeterminate-bar.component.html', + styleUrls: ['./indeterminate-bar.component.scss'] +}) +export class IndeterminateBarComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/index.ts b/src/assets/examples/material/index.ts new file mode 100644 index 0000000..8d06fb7 --- /dev/null +++ b/src/assets/examples/material/index.ts @@ -0,0 +1,1040 @@ +import { CustomSnackbarOverviewComponent } from './custom-snackbar/custom-snackbar-overview/custom-snackbar-overview.component'; +import { CustomSnackbarComponent } from './custom-snackbar/custom-snackbar.component'; +import { BasicSnackbarComponent } from './basic-snackbar/basic-snackbar.component'; +import { ScrollableDialogOverviewComponent } from './scrollable-dialog/scrollable-dialog-overview/scrollable-dialog-overview.component'; +import { ScrollableDialogComponent } from './scrollable-dialog/scrollable-dialog.component'; +import { DataDialogOverviewComponent } from './data-dialog/data-dialog-overview/data-dialog-overview.component'; +import { BasicDialogOverviewComponent } from './basic-dialog/basic-dialog-overview/basic-dialog-overview.component'; +import { BasicDialogComponent } from './basic-dialog/basic-dialog.component'; +import { BottomSheetOverviewComponent } from './bottom-sheet/bottom-sheet-overview/bottom-sheet-overview.component'; +import { BottomSheetComponent } from './bottom-sheet/bottom-sheet.component'; +import { FooterTableComponent } from './footer-table/footer-table.component'; +import { PaginationTableComponent } from './pagination-table/pagination-table.component'; +import { BasicTableComponent } from './basic-table/basic-table.component'; +import { TableSortingComponent } from './table-sorting/table-sorting.component'; +import { BasicSortHeaderComponent } from './basic-sort-header/basic-sort-header.component'; +import { CustomPaginatorComponent } from './custom-paginator/custom-paginator.component'; +import { BasicPaginatorComponent } from './basic-paginator/basic-paginator.component'; +import { AutoHideTooltipComponent } from './auto-hide-tooltip/auto-hide-tooltip.component'; +import { CustomPositionTooltipComponent } from './custom-position-tooltip/custom-position-tooltip.component'; +import { BasicTooltipComponent } from './basic-tooltip/basic-tooltip.component'; +import { CustomBarComponent } from './custom-bar/custom-bar.component'; +import { BasicBarComponent } from './basic-bar/basic-bar.component'; +import { CustomSpinnerComponent } from './custom-spinner/custom-spinner.component'; +import { BasicSpinnerComponent } from './basic-spinner/basic-spinner.component'; +import { BasicIconComponent } from './basic-icon/basic-icon.component'; +import { InputChipComponent } from './input-chip/input-chip.component'; +import { AutocompleteChipComponent } from './autocomplete-chip/autocomplete-chip.component'; +import { BasicChipComponent } from './basic-chip/basic-chip.component'; +import { BasicBadgeComponent } from './basic-badge/basic-badge.component'; +import { BasicButtonToggleComponent } from './basic-button-toggle/basic-button-toggle.component'; +import { ButtonToggleComponent } from './button-toggle/button-toggle.component'; +import { CheckboxTreeComponent } from './checkbox-tree/checkbox-tree.component'; +import { NestedTreeComponent } from './nested-tree/nested-tree.component'; +import { CustomTabGroupComponent } from './custom-tab-group/custom-tab-group.component'; +import { AnimationTabGroupComponent } from './animation-tab-group/animation-tab-group.component'; +import { BasicTabGroupComponent } from './basic-tab-group/basic-tab-group.component'; +import { CustomizedStepperComponent } from './customized-stepper/customized-stepper.component'; +import { VerticalStepperComponent } from './vertical-stepper/vertical-stepper.component'; +import { BasicStepperComponent } from './basic-stepper/basic-stepper.component'; +import { BasicGridComponent } from './basic-grid/basic-grid.component'; +import { AccordinExpansionPanelComponent } from './accordin-expansion-panel/accordin-expansion-panel.component'; +import { BasicDividerComponent } from './basic-divider/basic-divider.component'; +import { MultiSectionCardComponent } from './multi-section-card/multi-section-card.component'; +import { BasicCardComponent } from './basic-card/basic-card.component'; +import { BasicToolbarComponent } from './basic-toolbar/basic-toolbar.component'; +import { FixedSidenavComponent } from './fixed-sidenav/fixed-sidenav.component'; +import { AutoresizeSidenavComponent } from './autoresize-sidenav/autoresize-sidenav.component'; +import { EscapeBackdropSidenavComponent } from './escape-backdrop-sidenav/escape-backdrop-sidenav.component'; +import { ConfigurableSidenavComponent } from './configurable-sidenav/configurable-sidenav.component'; +import { OpenCloseSidenavComponent } from './open-close-sidenav/open-close-sidenav.component'; +import { TwoSidenavComponent } from './two-sidenav/two-sidenav.component'; +import { BasicSidenavComponent } from './basic-sidenav/basic-sidenav.component'; +import { IconMenuComponent } from './icon-menu/icon-menu.component'; +import { BasicMenuComponent } from './basic-menu/basic-menu.component'; +import { ConfigurableToggleComponent } from './configurable-toggle/configurable-toggle.component'; +import { BasicToggleComponent } from './basic-toggle/basic-toggle.component'; +import { BasicSliderComponent } from './basic-slider/basic-slider.component'; +import { ErrorSelectComponent } from './error-select/error-select.component'; +import { RipplelessSelectComponent } from './rippleless-select/rippleless-select.component'; +import { ResetSelectComponent } from './reset-select/reset-select.component'; +import { DisabledSelectComponent } from './disabled-select/disabled-select.component'; +import { FeatureSelectComponent } from './feature-select/feature-select.component'; +import { FormSelectComponent } from './form-select/form-select.component'; +import { BasicSelectComponent } from './basic-select/basic-select.component'; +import { BasicRadioComponent } from './basic-radio/basic-radio.component'; +import { SuffixPrefixInputComponent } from './suffix-prefix-input/suffix-prefix-input.component'; +import { HintsInputComponent } from './hints-input/hints-input.component'; +import { FormInputComponent } from './form-input/form-input.component'; +import { ClearButtonInputComponent } from './clear-button-input/clear-button-input.component'; +import { AutoResizingTexareaComponent } from './auto-resizing-texarea/auto-resizing-texarea.component'; +import { ErrorInputComponent } from './error-input/error-input.component'; +import { BasicInputComponent } from './basic-input/basic-input.component'; +import { HintsFormFieldComponent } from './hints-form-field/hints-form-field.component'; +import { AppearanceFormFieldComponent } from './appearance-form-field/appearance-form-field.component'; +import { CustomDatepickerComponent } from './custom-datepicker/custom-datepicker.component'; +import { DifferentLocaleDatepickerComponent } from './different-locale-datepicker/different-locale-datepicker.component'; +import { DisabledDatepickerComponent } from './disabled-datepicker/disabled-datepicker.component'; +import { EventDatepickerComponent } from './event-datepicker/event-datepicker.component'; +import { FilterDatepickerComponent } from './filter-datepicker/filter-datepicker.component'; +import { MinMaxDatepickerComponent } from './min-max-datepicker/min-max-datepicker.component'; +import { BasicDatepickerComponent } from './basic-datepicker/basic-datepicker.component'; +import { ConfigurableCheckboxComponent } from './configurable-checkbox/configurable-checkbox.component'; +import { BasicCheckboxComponent } from './basic-checkbox/basic-checkbox.component'; +import { HighlightFirstAutocompleteComponent } from './highlight-first-autocomplete/highlight-first-autocomplete.component'; +import { FilterAutocompleteComponent } from './filter-autocomplete/filter-autocomplete.component'; +import { ButtonExamplesComponent } from "./button-examples/button-examples.component"; +import { AutocompleteOverviewComponent } from "./autocomplete-overview/autocomplete-overview.component"; +import { SimpleAutocompleteComponent } from "./simple-autocomplete/simple-autocomplete.component"; +import { DisplayValueAutocompleteComponent } from './display-value-autocomplete/display-value-autocomplete.component'; +import { OptionGroupAutocompleteComponent } from './option-group-autocomplete/option-group-autocomplete.component'; +import { StartDateDatepickerComponent } from './start-date-datepicker/start-date-datepicker.component'; +import { SelectedValueDatepickerComponent } from './selected-value-datepicker/selected-value-datepicker.component'; +import { TouchDatepickerComponent } from './touch-datepicker/touch-datepicker.component'; +import { OpenMethodDatepickerComponent } from './open-method-datepicker/open-method-datepicker.component'; +import { MomentJsDatepickerComponent } from './moment-js-datepicker/moment-js-datepicker.component'; +import { SimpleFormFieldComponent } from './simple-form-field/simple-form-field.component'; +import { LabelFormFieldComponent } from './label-form-field/label-form-field.component'; +import { ErrorFormFieldComponent } from './error-form-field/error-form-field.component'; +import { PrefixSuffixFormFieldComponent } from './prefix-suffix-form-field/prefix-suffix-form-field.component'; +import { ThemingFormFieldComponent } from './theming-form-field/theming-form-field.component'; +import { ErrorMessageInputComponent } from './error-message-input/error-message-input.component'; +import { NgmodelRadioComponent } from './ngmodel-radio/ngmodel-radio.component'; +import { TwoWayBindingSelectComponent } from './two-way-binding-select/two-way-binding-select.component'; +import { OptionGroupSelectComponent } from './option-group-select/option-group-select.component'; +import { MultipleSelectComponent } from './multiple-select/multiple-select.component'; +import { TriggerSelectComponent } from './trigger-select/trigger-select.component'; +import { CustomPanelSelectComponent } from './custom-panel-select/custom-panel-select.component'; +import { SliderComponent } from './slider/slider.component'; +import { NestedMenuComponent } from './nested-menu/nested-menu.component'; +import { DrawerSidenavComponent } from './drawer-sidenav/drawer-sidenav.component'; +import { ResponsiveSidenavComponent } from './responsive-sidenav/responsive-sidenav.component'; +import { MultiRowToolbarComponent } from './multi-row-toolbar/multi-row-toolbar.component'; +import { BasicExpansionPanelComponent } from './basic-expansion-panel/basic-expansion-panel.component'; +import { DynamicGridComponent } from './dynamic-grid/dynamic-grid.component'; +import { BasicListComponent } from './basic-list/basic-list.component'; +import { SectionListComponent } from './section-list/section-list.component'; +import { ErrorStepperComponent } from './error-stepper/error-stepper.component'; +import { AlignTabGroupComponent } from './align-tab-group/align-tab-group.component'; +import { DynamicTabGroupComponent } from './dynamic-tab-group/dynamic-tab-group.component'; +import { NavTabGroupComponent } from './nav-tab-group/nav-tab-group.component'; +import { FlatTreeComponent } from './flat-tree/flat-tree.component'; +import { DynamicDataTreeComponent } from './dynamic-data-tree/dynamic-data-tree.component'; +import { ButtonsComponent } from './buttons/buttons.component'; +import { StackedChipComponent } from './stacked-chip/stacked-chip.component'; +import { SvgIconComponent } from './svg-icon/svg-icon.component'; +import { IndeterminateBarComponent } from './indeterminate-bar/indeterminate-bar.component'; +import { CustomRipplesComponent } from './custom-ripples/custom-ripples.component'; +import { CustomClassTooltipComponent } from './custom-class-tooltip/custom-class-tooltip.component'; +import { DelayTooltipComponent } from './delay-tooltip/delay-tooltip.component'; +import { DisabledTooltipComponent } from './disabled-tooltip/disabled-tooltip.component'; +import { ManualHideTooltipComponent } from './manual-hide-tooltip/manual-hide-tooltip.component'; +import { ChangingTooltipComponent } from './changing-tooltip/changing-tooltip.component'; +import { SortingTableComponent } from './sorting-table/sorting-table.component'; +import { SelectionTableComponent } from './selection-table/selection-table.component'; +import { StickyHeaderTableComponent } from './sticky-header-table/sticky-header-table.component'; +import { StickyFooterTableComponent } from './sticky-footer-table/sticky-footer-table.component'; +import { StickyColumnTableComponent } from './sticky-column-table/sticky-column-table.component'; +import { FilterTableComponent } from './filter-table/filter-table.component'; +import { DataDialogComponent } from './data-dialog/data-dialog.component'; +import { CustomLoadingButtonsComponent } from './custom-loading-buttons/custom-loading-buttons.component'; + + +// ng g c ../assets/examples/hints-form-field --skip-import + +export const MATERIAL_EXAMPLE_COMPONENT_MAP = { + 'buttons': [ + 'buttons', + 'custom-loading-buttons' + ], + 'button-toggle': [ + 'basic-button-toggle', + 'button-toggle' + ], + 'autocomplete': [ + 'autocomplete-overview', + 'simple-autocomplete', + 'filter-autocomplete', + 'display-value-autocomplete', + 'highlight-first-autocomplete', + 'option-group-autocomplete' + ], + 'checkbox': [ + 'basic-checkbox', + 'configurable-checkbox' + ], + 'datepicker': [ + 'basic-datepicker', + 'start-date-datepicker', + 'selected-value-datepicker', + 'min-max-datepicker', + 'filter-datepicker', + 'event-datepicker', + 'disabled-datepicker', + 'touch-datepicker', + 'open-method-datepicker', + 'different-locale-datepicker', + 'moment-js-datepicker', + 'custom-datepicker', + ], + 'form-field': [ + 'simple-form-field', + 'label-form-field', + 'appearance-form-field', + 'hints-form-field', + 'error-form-field', + 'prefix-suffix-form-field', + 'theming-form-field', + // 'telephone-form-field' + ], + 'input-field': [ + 'basic-input', + 'auto-resizing-texarea', + 'clear-button-input', + 'error-input', + 'error-message-input', + 'form-input', + 'hints-input', + 'suffix-prefix-input', + ], + 'radio-button': [ + 'basic-radio', + 'ngmodel-radio', + ], + 'select': [ + 'basic-select', + 'two-way-binding-select', + 'form-select', + 'feature-select', + 'disabled-select', + 'reset-select', + 'option-group-select', + 'multiple-select', + 'trigger-select', + 'rippleless-select', + 'custom-panel-select', + 'error-select' + ], + 'slider': [ + 'basic-slider', + 'configurable-slider' + ], + 'slider-toggle': [ + 'basic-toggle', + 'configurable-toggle' + ], + 'menu': [ + 'basic-menu', + 'nested-menu', + 'icon-menu', + ], + 'sidenav': [ + 'basic-sidenav', + 'drawer-sidenav', + 'two-sidenav', + 'open-close-sidenav', + 'configurable-sidenav', + 'escape-backdrop-sidenav', + 'autoresize-sidenav', + 'fixed-sidenav', + 'responsive-sidenav', + ], + 'toolbar': [ + 'basic-toolbar', + 'multi-row-toolbar' + ], + 'card': [ + 'basic-card', + 'multi-section-card' + ], + 'divider': [ + 'basic-divider' + ], + 'expansion-panel': [ + 'basic-expansion-panel', + 'accordin-expansion-panel', + ], + 'grid': [ + 'basic-grid', + 'dynamic-grid' + ], + 'list': [ + 'basic-list', + 'section-list' + ], + 'stepper': [ + 'basic-stepper', + 'vertical-stepper', + 'error-stepper', + 'customized-stepper' + ], + 'tab-group': [ + 'basic-tab-group', + 'align-tab-group', + 'animation-tab-group', + 'dynamic-tab-group', + 'nav-tab-group', + 'custom-tab-group', + ], + 'tree': [ + 'flat-tree', + 'nested-tree', + 'checkbox-tree', + 'dynamic-data-tree' + ], + 'badge': [ + 'basic-badge' + ], + 'chips': [ + 'basic-chip', + 'autocomplete-chip', + 'input-chip', + 'stacked-chip' + ], + 'icons': [ + 'basic-icon', + 'svg-icon' + ], + 'progress-spinner': [ + 'basic-spinner', + 'custom-spinner' + ], + 'progress-bar': [ + 'basic-bar', + 'custom-bar', + 'indeterminate-bar' + ], + 'ripples': [ + 'custom-ripples' + ], + 'tooltip': [ + 'basic-tooltip', + 'custom-position-tooltip', + 'custom-class-tooltip', + 'delay-tooltip', + 'disabled-tooltip', + 'manual-hide-tooltip', + 'changing-tooltip', + 'auto-hide-tooltip' + ], + 'paginator': [ + 'basic-paginator', + 'custom-paginator' + ], + 'sort-header': [ + 'basic-sort-header', + 'table-sorting' + ], + 'table': [ + 'basic-table', + 'pagination-table', + 'sorting-table', + 'filter-table', + 'selection-table', + 'footer-table', + 'sticky-header-table', + 'sticky-footer-table', + 'sticky-column-table', + ], + 'bottom-sheet': [ + 'bottom-sheet' + ], + 'dialog': [ + 'basic-dialog', + 'data-dialog', + 'scrollable-dialog' + ], + 'snackbar': [ + 'basic-snackbar', + 'custom-snackbar' + ] +} + +export const MATERIAL_EXAMPLE_COMPONENTS = { + 'autocomplete-overview': { + title: 'Autocomplete overview', + component: AutocompleteOverviewComponent + }, + 'simple-autocomplete': { + title: 'Simple autocomplete', + component: SimpleAutocompleteComponent + }, + 'filter-autocomplete': { + title: 'Filter autocomplete', + component: FilterAutocompleteComponent + }, + 'display-value-autocomplete': { + title: 'Display value autocomplete', + component: DisplayValueAutocompleteComponent + }, + 'highlight-first-autocomplete': { + title: 'Highlight the first autocomplete option', + component: HighlightFirstAutocompleteComponent + }, + 'option-group-autocomplete': { + title: 'Option groups autocomplete', + component: OptionGroupAutocompleteComponent + }, + 'basic-checkbox': { + title: 'Basic checkboxes', + component: BasicCheckboxComponent + }, + 'configurable-checkbox': { + title: 'Configurable checkboxes', + component: ConfigurableCheckboxComponent + }, + 'basic-datepicker': { + title: 'Basic datepicker', + component: BasicDatepickerComponent + }, + 'start-date-datepicker': { + title: 'Datepicker with starting date', + component: StartDateDatepickerComponent + }, + 'selected-value-datepicker': { + title: 'Datepicker with selected date', + component: SelectedValueDatepickerComponent + }, + 'min-max-datepicker': { + title: 'Datepicker with minimum and maximum date', + component: MinMaxDatepickerComponent + }, + 'filter-datepicker': { + title: 'Datepicker with filtered date', + component: FilterDatepickerComponent + }, + 'event-datepicker': { + title: 'Datepicker input and change event', + component: EventDatepickerComponent + }, + 'disabled-datepicker': { + title: 'Disabled datepicker', + component: DisabledDatepickerComponent + }, + 'touch-datepicker': { + title: 'Disabled with touh UI', + component: TouchDatepickerComponent + }, + 'open-method-datepicker': { + title: 'Datepicker open method', + component: OpenMethodDatepickerComponent + }, + 'different-locale-datepicker': { + title: 'Datepicker with different locale', + component: DifferentLocaleDatepickerComponent + }, + 'moment-js-datepicker': { + title: 'Datepicker that uses Moment.js dates', + component: MomentJsDatepickerComponent + }, + 'custom-datepicker': { + title: 'Datepicker with custom formats', + component: CustomDatepickerComponent + }, + 'simple-form-field': { + title: 'Simple form field', + component: SimpleFormFieldComponent + }, + 'label-form-field': { + title: 'Form field with label', + component: LabelFormFieldComponent + }, + 'appearance-form-field': { + title: 'Form field appearance variants', + component: AppearanceFormFieldComponent + }, + 'hints-form-field': { + title: 'Form field with hints', + component: HintsFormFieldComponent + }, + 'error-form-field': { + title: 'Form field with error messages', + component: ErrorFormFieldComponent + }, + 'prefix-suffix-form-field': { + title: 'Form field with prefix & suffix', + component: PrefixSuffixFormFieldComponent + }, + 'theming-form-field': { + title: 'Form field theming', + component: ThemingFormFieldComponent + }, + // 'telephone-form-field': { + // title: 'Form field with custom telephone number input control', + // component: TelephoneFormFieldComponent + // }, + 'basic-input': { + title: 'Basic Inputs', + component: BasicInputComponent + }, + 'error-input': { + title: 'Input with a custom ErrorStateMatcher', + component: ErrorInputComponent + }, + 'auto-resizing-texarea': { + title: 'Auto-resizing textarea', + component: AutoResizingTexareaComponent + }, + 'clear-button-input': { + title: 'Input with a clear button', + component: ClearButtonInputComponent + }, + 'error-message-input': { + title: 'Input with error messages', + component: ErrorMessageInputComponent + }, + 'form-input': { + title: 'Inputs in a form', + component: FormInputComponent + }, + 'hints-input': { + title: 'Input with hints', + component: HintsInputComponent + }, + 'suffix-prefix-input': { + title: 'Inputs with prefixes and suffixes', + component: SuffixPrefixInputComponent + }, + 'basic-radio': { + title: 'Basic radios', + component: BasicRadioComponent + }, + 'ngmodel-radio': { + title: 'Radios with ngMode', + component: NgmodelRadioComponent + }, + 'basic-select': { + title: 'Basic select', + component: BasicSelectComponent + }, + 'two-way-binding-select': { + title: 'Select with 2-way value binding', + component: TwoWayBindingSelectComponent + }, + 'form-select': { + title: 'Select in a form', + component: FormSelectComponent + }, + 'feature-select': { + title: 'Select with form field features', + component: FeatureSelectComponent + }, + 'disabled-select': { + title: 'Disabled select', + component: DisabledSelectComponent + }, + 'reset-select': { + title: 'Select with reset option', + component: ResetSelectComponent + }, + 'option-group-select': { + title: 'Select with option groups', + component: OptionGroupSelectComponent + }, + 'multiple-select': { + title: 'Select with multiple selection', + component: MultipleSelectComponent + }, + 'trigger-select': { + title: 'Select with custom trigger text', + component: TriggerSelectComponent + }, + 'rippleless-select': { + title: 'Select with no option ripple', + component: RipplelessSelectComponent + }, + 'custom-panel-select': { + title: 'Select with custom panel styling', + component: CustomPanelSelectComponent + }, + 'error-select': { + title: 'Select with a custom ErrorStateMatcher', + component: ErrorSelectComponent + }, + 'configurable-slider': { + title: 'Configurable slider', + component: SliderComponent + }, + 'basic-slider': { + title: 'Basic slider', + component: BasicSliderComponent + }, + 'basic-toggle': { + title: 'Basic slide-toggle', + component: BasicToggleComponent + }, + 'configurable-toggle': { + title: 'Configurable slide-toggle', + component: ConfigurableToggleComponent + }, + 'basic-menu': { + title: 'Basic menu', + component: BasicMenuComponent + }, + 'nested-menu': { + title: 'Nested menu', + component: NestedMenuComponent + }, + 'icon-menu': { + title: 'Menu with icons', + component: IconMenuComponent + }, + 'basic-sidenav': { + title: 'Basic sidenav', + component: BasicSidenavComponent + }, + 'drawer-sidenav': { + title: 'Basic drawer', + component: DrawerSidenavComponent + }, + 'two-sidenav': { + title: 'Implicit main content with two sidenavs', + component: TwoSidenavComponent + }, + 'open-close-sidenav': { + title: 'Sidenav open & close behavior', + component: OpenCloseSidenavComponent + }, + 'configurable-sidenav': { + title: 'Sidenav with configurable mode', + component: ConfigurableSidenavComponent + }, + 'escape-backdrop-sidenav': { + title: 'Sidenav with custom escape and backdrop click behavior', + component: EscapeBackdropSidenavComponent + }, + 'autoresize-sidenav': { + title: 'Autosize sidenav', + component: AutoresizeSidenavComponent + }, + 'fixed-sidenav': { + title: 'Fixed sidenav', + component: FixedSidenavComponent + }, + 'responsive-sidenav': { + title: 'Responsive sidenav', + component: ResponsiveSidenavComponent + }, + 'basic-toolbar': { + title: 'Basic toolbar', + component: BasicToolbarComponent + }, + 'multi-row-toolbar': { + title: 'Multi-row toolbar', + component: MultiRowToolbarComponent + }, + 'basic-card': { + title: 'Basic card', + component: BasicCardComponent + }, + 'multi-section-card': { + title: 'Card with multiple sections', + component: MultiSectionCardComponent + }, + 'basic-divider': { + title: 'Basic divider', + component: BasicDividerComponent + }, + 'basic-expansion-panel': { + title: 'Basic expansion panel', + component: BasicExpansionPanelComponent + }, + 'accordin-expansion-panel': { + title: 'Expansion panel as accordion', + component: AccordinExpansionPanelComponent + }, + 'basic-grid': { + title: 'Basic grid', + component: BasicGridComponent + }, + 'dynamic-grid': { + title: 'Dynamic grid', + component: DynamicGridComponent + }, + 'basic-list': { + title: 'Basic list', + component: BasicListComponent + }, + 'section-list': { + title: 'List with sections', + component: SectionListComponent + }, + 'basic-stepper': { + title: 'Stepper overview', + component: BasicStepperComponent + }, + 'vertical-stepper': { + title: 'Vertical stepper', + component: VerticalStepperComponent + }, + 'error-stepper': { + title: 'Stepper that displays errors in the steps', + component: ErrorStepperComponent + }, + 'customized-stepper': { + title: 'Stepper with customized states', + component: CustomizedStepperComponent + }, + 'basic-tab-group': { + title: 'Basic use of the tab group', + component: BasicTabGroupComponent + }, + 'align-tab-group': { + title: 'Tab group with aligned labels', + component: AlignTabGroupComponent + }, + 'animation-tab-group': { + title: 'Tab group animations', + component: AnimationTabGroupComponent + }, + 'dynamic-tab-group': { + title: 'Tab group with dynamically changing tabs', + component: DynamicTabGroupComponent + }, + 'nav-tab-group': { + title: 'Basic use of the tab nav bar', + component: NavTabGroupComponent + }, + 'custom-tab-group': { + title: 'Customizing the theme options on the tab group', + component: CustomTabGroupComponent + }, + 'flat-tree': { + title: 'Tree with flat nodes', + component: FlatTreeComponent + }, + 'nested-tree': { + title: 'Tree with nested nodes', + component: NestedTreeComponent + }, + 'checkbox-tree': { + title: 'Tree with checkboxes', + component: CheckboxTreeComponent + }, + 'dynamic-data-tree': { + title: 'Tree with dynamic data', + component: DynamicDataTreeComponent + }, + 'buttons': { + title: 'Various buttons', + component: ButtonsComponent + }, + 'custom-loading-buttons': { + title: 'Loading buttons', + component: CustomLoadingButtonsComponent + }, + 'button-toggle': { + title: 'Exclusive selection', + component: ButtonToggleComponent + }, + 'basic-button-toggle': { + title: 'Basic button toggle', + component: BasicButtonToggleComponent + }, + 'basic-badge': { + title: 'Badge overview', + component: BasicBadgeComponent + }, + 'basic-chip': { + title: 'Basic chips', + component: BasicChipComponent + }, + 'autocomplete-chip': { + title: 'Chips Autocomplete', + component: AutocompleteChipComponent + }, + 'input-chip': { + title: 'Chips with input', + component: InputChipComponent + }, + 'stacked-chip': { + title: 'Stacked chips', + component: StackedChipComponent + }, + 'basic-icon': { + title: 'Basic icon', + component: BasicIconComponent + }, + 'svg-icon': { + title: 'SVG icon', + component: SvgIconComponent + }, + 'basic-spinner': { + title: 'Basic spinner', + component: BasicSpinnerComponent + }, + 'custom-spinner': { + title: 'Configurable progress spinner', + component: CustomSpinnerComponent + }, + 'basic-bar': { + title: 'Determinate progress-bar', + component: BasicBarComponent + }, + 'custom-bar': { + title: 'Configurable progress-bar', + component: CustomBarComponent + }, + 'indeterminate-bar': { + title: 'Indeterminate progress-bar', + component: IndeterminateBarComponent + }, + 'custom-ripples': { + title: 'MatRipple basic usage', + component: CustomRipplesComponent + }, + 'basic-tooltip': { + title: 'Basic tooltip', + component: BasicTooltipComponent + }, + 'custom-position-tooltip': { + title: 'Tooltip with a custom position', + component: CustomPositionTooltipComponent + }, + 'custom-class-tooltip': { + title: 'Tooltip that can have a custom class applied', + component: CustomClassTooltipComponent + }, + 'delay-tooltip': { + title: 'Tooltip with a show and hide delay', + component: DelayTooltipComponent + }, + 'disabled-tooltip': { + title: 'Tooltip that can be disabled', + component: DisabledTooltipComponent + }, + 'manual-hide-tooltip': { + title: 'Tooltip that can be manually shown/hidden', + component: ManualHideTooltipComponent + }, + 'changing-tooltip': { + title: 'Tooltip with a changing message', + component: ChangingTooltipComponent + }, + 'auto-hide-tooltip': { + title: 'Tooltip that demonstrates auto-hiding when it clips out of its scrolling container', + component: AutoHideTooltipComponent + }, + 'basic-paginator': { + title: 'Paginator', + component: BasicPaginatorComponent + }, + 'custom-paginator': { + title: 'Configurable paginator', + component: CustomPaginatorComponent + }, + 'basic-sort-header': { + title: 'Sorting overview', + component: BasicSortHeaderComponent + }, + 'table-sorting': { + title: 'Table with sorting', + component: TableSortingComponent + }, + 'basic-table': { + title: 'Basic use of `` with horizontal scroll', + component: BasicTableComponent + }, + 'pagination-table': { + title: 'Table with pagination', + component: PaginationTableComponent + }, + 'sorting-table': { + title: 'Table with sorting', + component: SortingTableComponent + }, + 'filter-table': { + title: 'Table with filtering', + component: FilterTableComponent + }, + 'selection-table': { + title: 'Table with selection', + component: SelectionTableComponent + }, + 'footer-table': { + title: 'Footer row table', + component: FooterTableComponent + }, + 'sticky-header-table': { + title: 'Table with sticky header', + component: StickyHeaderTableComponent + }, + 'sticky-footer-table': { + title: 'Table with sticky footer', + component: StickyFooterTableComponent + }, + 'sticky-column-table': { + title: 'Table with sticky columns', + component: StickyColumnTableComponent + }, + 'bottom-sheet': { + title: 'Bottom Sheet Overview', + component: BottomSheetComponent + }, + 'basic-dialog': { + title: 'Dialog Overview', + component: BasicDialogComponent + }, + 'data-dialog': { + title: 'Injecting data when opening a dialog', + component: DataDialogComponent + }, + 'scrollable-dialog': { + title: 'Dialog with header, scrollable content and actions', + component: ScrollableDialogComponent + }, + 'basic-snackbar': { + title: 'Basic snack-bar', + component: BasicSnackbarComponent + }, + 'custom-snackbar': { + title: 'Snack-bar with a custom component', + component: CustomSnackbarComponent + }, + + +} + +export const MATERIAL_EXAMPLE_COMPONENT_LIST = [ + ButtonExamplesComponent, + AutocompleteOverviewComponent, + SimpleAutocompleteComponent, + FilterAutocompleteComponent, + DisplayValueAutocompleteComponent, + HighlightFirstAutocompleteComponent, + OptionGroupAutocompleteComponent, + BasicCheckboxComponent, + ConfigurableCheckboxComponent, + BasicDatepickerComponent, + StartDateDatepickerComponent, + SelectedValueDatepickerComponent, + MinMaxDatepickerComponent, + FilterDatepickerComponent, + EventDatepickerComponent, + DisabledDatepickerComponent, + TouchDatepickerComponent, + OpenMethodDatepickerComponent, + DifferentLocaleDatepickerComponent, + MomentJsDatepickerComponent, + CustomDatepickerComponent, + SimpleFormFieldComponent, + LabelFormFieldComponent, + AppearanceFormFieldComponent, + HintsFormFieldComponent, + ErrorFormFieldComponent, + PrefixSuffixFormFieldComponent, + ThemingFormFieldComponent, + BasicInputComponent, + ErrorInputComponent, + AutoResizingTexareaComponent, + ClearButtonInputComponent, + ErrorMessageInputComponent, + FormInputComponent, + HintsInputComponent, + SuffixPrefixInputComponent, + BasicRadioComponent, + NgmodelRadioComponent, + BasicSelectComponent, + TwoWayBindingSelectComponent, + FormSelectComponent, + FeatureSelectComponent, + DisabledSelectComponent, + ResetSelectComponent, + OptionGroupSelectComponent, + MultipleSelectComponent, + TriggerSelectComponent, + RipplelessSelectComponent, + CustomPanelSelectComponent, + ErrorSelectComponent, + SliderComponent, + BasicSliderComponent, + BasicToggleComponent, + ConfigurableToggleComponent, + BasicMenuComponent, + NestedMenuComponent, + IconMenuComponent, + BasicSidenavComponent, + DrawerSidenavComponent, + TwoSidenavComponent, + OpenCloseSidenavComponent, + ConfigurableSidenavComponent, + EscapeBackdropSidenavComponent, + AutoresizeSidenavComponent, + FixedSidenavComponent, + ResponsiveSidenavComponent, + BasicToolbarComponent, + MultiRowToolbarComponent, + BasicCardComponent, + MultiSectionCardComponent, + BasicSidenavComponent, + BasicExpansionPanelComponent, + AccordinExpansionPanelComponent, + BasicGridComponent, + DynamicGridComponent, + BasicListComponent, + SectionListComponent, + BasicStepperComponent, + VerticalStepperComponent, + ErrorStepperComponent, + CustomizedStepperComponent, + BasicTabGroupComponent, + AlignTabGroupComponent, + AnimationTabGroupComponent, + DynamicTabGroupComponent, + NavTabGroupComponent, + CustomTabGroupComponent, + FlatTreeComponent, + NestedTreeComponent, + CheckboxTreeComponent, + DynamicDataTreeComponent, + ButtonsComponent, + CustomLoadingButtonsComponent, + ButtonToggleComponent, + BasicButtonToggleComponent, + BasicBadgeComponent, + BasicChipComponent, + AutocompleteChipComponent, + InputChipComponent, + StackedChipComponent, + BasicIconComponent, + SvgIconComponent, + BasicSpinnerComponent, + CustomSpinnerComponent, + BasicBarComponent, + CustomBarComponent, + IndeterminateBarComponent, + CustomRipplesComponent, + BasicTooltipComponent, + CustomPositionTooltipComponent, + CustomClassTooltipComponent, + DelayTooltipComponent, + DisabledTooltipComponent, + ManualHideTooltipComponent, + ChangingTooltipComponent, + AutoHideTooltipComponent, + BasicPaginatorComponent, + CustomPaginatorComponent, + BasicSortHeaderComponent, + TableSortingComponent, + BasicTableComponent, + PaginationTableComponent, + SortingTableComponent, + FilterTableComponent, + SelectionTableComponent, + FooterTableComponent, + StickyHeaderTableComponent, + StickyFooterTableComponent, + StickyColumnTableComponent, + BottomSheetComponent, + BottomSheetOverviewComponent, + BasicDialogComponent, + BasicDialogOverviewComponent, + DataDialogComponent, + DataDialogOverviewComponent, + ScrollableDialogComponent, + ScrollableDialogOverviewComponent, + BasicSnackbarComponent, + CustomSnackbarComponent, + BasicDividerComponent, + CustomSnackbarOverviewComponent +] \ No newline at end of file diff --git a/src/assets/examples/material/input-chip/input-chip.component.html b/src/assets/examples/material/input-chip/input-chip.component.html new file mode 100644 index 0000000..d5de071 --- /dev/null +++ b/src/assets/examples/material/input-chip/input-chip.component.html @@ -0,0 +1,15 @@ + + + + {{fruit.name}} + cancel + + + + + \ No newline at end of file diff --git a/src/assets/examples/material/input-chip/input-chip.component.scss b/src/assets/examples/material/input-chip/input-chip.component.scss new file mode 100644 index 0000000..26b0a93 --- /dev/null +++ b/src/assets/examples/material/input-chip/input-chip.component.scss @@ -0,0 +1,6 @@ +.example-chip-list { + width: 100%; + } + .mat-chip:not(.mat-basic-chip) { + display: flex; + } \ No newline at end of file diff --git a/src/assets/examples/material/input-chip/input-chip.component.spec.ts b/src/assets/examples/material/input-chip/input-chip.component.spec.ts new file mode 100644 index 0000000..4260282 --- /dev/null +++ b/src/assets/examples/material/input-chip/input-chip.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { InputChipComponent } from './input-chip.component'; + +describe('InputChipComponent', () => { + let component: InputChipComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ InputChipComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(InputChipComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/input-chip/input-chip.component.ts b/src/assets/examples/material/input-chip/input-chip.component.ts new file mode 100644 index 0000000..7c7a9ff --- /dev/null +++ b/src/assets/examples/material/input-chip/input-chip.component.ts @@ -0,0 +1,50 @@ +import {COMMA, ENTER} from '@angular/cdk/keycodes'; +import {Component} from '@angular/core'; +import { MatChipInputEvent } from '@angular/material/chips'; + +export interface Fruit { + name: string; +} + +@Component({ + selector: 'app-input-chip', + templateUrl: './input-chip.component.html', + styleUrls: ['./input-chip.component.scss'] +}) +export class InputChipComponent { + + visible = true; + selectable = true; + removable = true; + addOnBlur = true; + readonly separatorKeysCodes: number[] = [ENTER, COMMA]; + fruits: Fruit[] = [ + {name: 'Lemon'}, + {name: 'Lime'}, + {name: 'Apple'}, + ]; + + add(event: MatChipInputEvent): void { + const input = event.input; + const value = event.value; + + // Add our fruit + if ((value || '').trim()) { + this.fruits.push({name: value.trim()}); + } + + // Reset the input value + if (input) { + input.value = ''; + } + } + + remove(fruit: Fruit): void { + const index = this.fruits.indexOf(fruit); + + if (index >= 0) { + this.fruits.splice(index, 1); + } + } + +} diff --git a/src/assets/examples/material/label-form-field/label-form-field.component.html b/src/assets/examples/material/label-form-field/label-form-field.component.html new file mode 100644 index 0000000..4d0b412 --- /dev/null +++ b/src/assets/examples/material/label-form-field/label-form-field.component.html @@ -0,0 +1,34 @@ +
+
+ Hide required marker +
+ + + Auto + Always + Never + +
+ + + + + + + + Both a label and a placeholder + + + + + + -- None -- + Option + + favorite Fancy label + +
diff --git a/src/assets/examples/material/label-form-field/label-form-field.component.scss b/src/assets/examples/material/label-form-field/label-form-field.component.scss new file mode 100644 index 0000000..e774267 --- /dev/null +++ b/src/assets/examples/material/label-form-field/label-form-field.component.scss @@ -0,0 +1,21 @@ +.example-container { + display: flex; + flex-direction: column; + } + + .example-container > * { + width: 100%; + } + + .example-container form { + margin-bottom: 20px; + } + + .example-container form > * { + margin: 5px 0; + } + + .example-container .mat-radio-button { + margin: 0 12px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/label-form-field/label-form-field.component.spec.ts b/src/assets/examples/material/label-form-field/label-form-field.component.spec.ts new file mode 100644 index 0000000..ab552d4 --- /dev/null +++ b/src/assets/examples/material/label-form-field/label-form-field.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LabelFormFieldComponent } from './label-form-field.component'; + +describe('LabelFormFieldComponent', () => { + let component: LabelFormFieldComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ LabelFormFieldComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LabelFormFieldComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/label-form-field/label-form-field.component.ts b/src/assets/examples/material/label-form-field/label-form-field.component.ts new file mode 100644 index 0000000..a7fea32 --- /dev/null +++ b/src/assets/examples/material/label-form-field/label-form-field.component.ts @@ -0,0 +1,20 @@ +import {Component} from '@angular/core'; +import {FormBuilder, FormGroup} from '@angular/forms'; + +@Component({ + selector: 'app-label-form-field', + templateUrl: './label-form-field.component.html', + styleUrls: ['./label-form-field.component.scss'] +}) +export class LabelFormFieldComponent { + + options: FormGroup; + + constructor(fb: FormBuilder) { + this.options = fb.group({ + hideRequired: false, + floatLabel: 'auto', + }); + } + +} diff --git a/src/assets/examples/material/manual-hide-tooltip/manual-hide-tooltip.component.html b/src/assets/examples/material/manual-hide-tooltip/manual-hide-tooltip.component.html new file mode 100644 index 0000000..4a0791a --- /dev/null +++ b/src/assets/examples/material/manual-hide-tooltip/manual-hide-tooltip.component.html @@ -0,0 +1,28 @@ +
+ Click the following buttons to... + + + +
+ + \ No newline at end of file diff --git a/src/assets/examples/material/manual-hide-tooltip/manual-hide-tooltip.component.scss b/src/assets/examples/material/manual-hide-tooltip/manual-hide-tooltip.component.scss new file mode 100644 index 0000000..b8a9b6d --- /dev/null +++ b/src/assets/examples/material/manual-hide-tooltip/manual-hide-tooltip.component.scss @@ -0,0 +1,4 @@ +.example-action-button { + margin-top: 16px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/manual-hide-tooltip/manual-hide-tooltip.component.spec.ts b/src/assets/examples/material/manual-hide-tooltip/manual-hide-tooltip.component.spec.ts new file mode 100644 index 0000000..2bd4e91 --- /dev/null +++ b/src/assets/examples/material/manual-hide-tooltip/manual-hide-tooltip.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ManualHideTooltipComponent } from './manual-hide-tooltip.component'; + +describe('ManualHideTooltipComponent', () => { + let component: ManualHideTooltipComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ManualHideTooltipComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ManualHideTooltipComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/manual-hide-tooltip/manual-hide-tooltip.component.ts b/src/assets/examples/material/manual-hide-tooltip/manual-hide-tooltip.component.ts new file mode 100644 index 0000000..a6ac450 --- /dev/null +++ b/src/assets/examples/material/manual-hide-tooltip/manual-hide-tooltip.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-manual-hide-tooltip', + templateUrl: './manual-hide-tooltip.component.html', + styleUrls: ['./manual-hide-tooltip.component.scss'] +}) +export class ManualHideTooltipComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/material-examples.module.ts b/src/assets/examples/material/material-examples.module.ts new file mode 100644 index 0000000..6fb007a --- /dev/null +++ b/src/assets/examples/material/material-examples.module.ts @@ -0,0 +1,20 @@ +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MATERIAL_EXAMPLE_COMPONENT_LIST } from '.'; +import { SharedMaterialModule } from 'app/shared/shared-material.module'; +import { SharedComponentsModule } from 'app/shared/components/shared-components.module'; + +@NgModule({ + declarations: [...MATERIAL_EXAMPLE_COMPONENT_LIST], + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + SharedComponentsModule, + SharedMaterialModule + ], + exports: [...MATERIAL_EXAMPLE_COMPONENT_LIST], + entryComponents: [...MATERIAL_EXAMPLE_COMPONENT_LIST] +}) +export class MaterialExamplesModule { } diff --git a/src/assets/examples/material/min-max-datepicker/min-max-datepicker.component.html b/src/assets/examples/material/min-max-datepicker/min-max-datepicker.component.html new file mode 100644 index 0000000..4ee60cd --- /dev/null +++ b/src/assets/examples/material/min-max-datepicker/min-max-datepicker.component.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/examples/material/min-max-datepicker/min-max-datepicker.component.scss b/src/assets/examples/material/min-max-datepicker/min-max-datepicker.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/min-max-datepicker/min-max-datepicker.component.spec.ts b/src/assets/examples/material/min-max-datepicker/min-max-datepicker.component.spec.ts new file mode 100644 index 0000000..94810a6 --- /dev/null +++ b/src/assets/examples/material/min-max-datepicker/min-max-datepicker.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MinMaxDatepickerComponent } from './min-max-datepicker.component'; + +describe('MinMaxDatepickerComponent', () => { + let component: MinMaxDatepickerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MinMaxDatepickerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MinMaxDatepickerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/min-max-datepicker/min-max-datepicker.component.ts b/src/assets/examples/material/min-max-datepicker/min-max-datepicker.component.ts new file mode 100644 index 0000000..8d6a306 --- /dev/null +++ b/src/assets/examples/material/min-max-datepicker/min-max-datepicker.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-min-max-datepicker', + templateUrl: './min-max-datepicker.component.html', + styleUrls: ['./min-max-datepicker.component.scss'] +}) +export class MinMaxDatepickerComponent implements OnInit { + + minDate = new Date(2000, 0, 1); + maxDate = new Date(2020, 0, 1); + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/moment-js-datepicker/moment-js-datepicker.component.html b/src/assets/examples/material/moment-js-datepicker/moment-js-datepicker.component.html new file mode 100644 index 0000000..a6ae46c --- /dev/null +++ b/src/assets/examples/material/moment-js-datepicker/moment-js-datepicker.component.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/examples/material/moment-js-datepicker/moment-js-datepicker.component.scss b/src/assets/examples/material/moment-js-datepicker/moment-js-datepicker.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/moment-js-datepicker/moment-js-datepicker.component.spec.ts b/src/assets/examples/material/moment-js-datepicker/moment-js-datepicker.component.spec.ts new file mode 100644 index 0000000..b4bdd24 --- /dev/null +++ b/src/assets/examples/material/moment-js-datepicker/moment-js-datepicker.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MomentJsDatepickerComponent } from './moment-js-datepicker.component'; + +describe('MomentJsDatepickerComponent', () => { + let component: MomentJsDatepickerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MomentJsDatepickerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MomentJsDatepickerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/moment-js-datepicker/moment-js-datepicker.component.ts b/src/assets/examples/material/moment-js-datepicker/moment-js-datepicker.component.ts new file mode 100644 index 0000000..195ef9c --- /dev/null +++ b/src/assets/examples/material/moment-js-datepicker/moment-js-datepicker.component.ts @@ -0,0 +1,36 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl} from '@angular/forms'; +import {MAT_MOMENT_DATE_FORMATS, MomentDateAdapter} from '@angular/material-moment-adapter'; +import {DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE} from '@angular/material/core'; + +// Depending on whether rollup is used, moment needs to be imported differently. +// Since Moment.js doesn't have a default export, we normally need to import using the `* as` +// syntax. However, rollup creates a synthetic default module and we thus need to import it using +// the `default as` syntax. +import * as _moment from 'moment'; +// tslint:disable-next-line:no-duplicate-imports +const moment = _moment; + +@Component({ + selector: 'app-moment-js-datepicker', + templateUrl: './moment-js-datepicker.component.html', + styleUrls: ['./moment-js-datepicker.component.scss'], + providers: [ + // `MomentDateAdapter` and `MAT_MOMENT_DATE_FORMATS` can be automatically provided by importing + // `MatMomentDateModule` in your applications root module. We provide it at the component level + // here, due to limitations of our example generation script. + {provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE]}, + {provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS}, + ], +}) +export class MomentJsDatepickerComponent implements OnInit { + + // Datepicker takes `Moment` objects instead of `Date` objects. + date = new FormControl(moment([2017, 0, 1])); + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/multi-row-toolbar/multi-row-toolbar.component.html b/src/assets/examples/material/multi-row-toolbar/multi-row-toolbar.component.html new file mode 100644 index 0000000..4c2071c --- /dev/null +++ b/src/assets/examples/material/multi-row-toolbar/multi-row-toolbar.component.html @@ -0,0 +1,18 @@ + + + Custom Toolbar + + + + Second Line + + verified_user + + + + Third Line + + favorite + delete + + diff --git a/src/assets/examples/material/multi-row-toolbar/multi-row-toolbar.component.scss b/src/assets/examples/material/multi-row-toolbar/multi-row-toolbar.component.scss new file mode 100644 index 0000000..2a56ae5 --- /dev/null +++ b/src/assets/examples/material/multi-row-toolbar/multi-row-toolbar.component.scss @@ -0,0 +1,8 @@ +.example-icon { + padding: 0 14px; + } + + .example-spacer { + flex: 1 1 auto; + } + \ No newline at end of file diff --git a/src/assets/examples/material/multi-row-toolbar/multi-row-toolbar.component.spec.ts b/src/assets/examples/material/multi-row-toolbar/multi-row-toolbar.component.spec.ts new file mode 100644 index 0000000..bfdfa58 --- /dev/null +++ b/src/assets/examples/material/multi-row-toolbar/multi-row-toolbar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MultiRowToolbarComponent } from './multi-row-toolbar.component'; + +describe('MultiRowToolbarComponent', () => { + let component: MultiRowToolbarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MultiRowToolbarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MultiRowToolbarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/multi-row-toolbar/multi-row-toolbar.component.ts b/src/assets/examples/material/multi-row-toolbar/multi-row-toolbar.component.ts new file mode 100644 index 0000000..94783bd --- /dev/null +++ b/src/assets/examples/material/multi-row-toolbar/multi-row-toolbar.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-multi-row-toolbar', + templateUrl: './multi-row-toolbar.component.html', + styleUrls: ['./multi-row-toolbar.component.scss'] +}) +export class MultiRowToolbarComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/multi-section-card/multi-section-card.component.html b/src/assets/examples/material/multi-section-card/multi-section-card.component.html new file mode 100644 index 0000000..e7fdeb8 --- /dev/null +++ b/src/assets/examples/material/multi-section-card/multi-section-card.component.html @@ -0,0 +1,19 @@ + + +
+ Shiba Inu + Dog Breed +
+ Photo of a Shiba Inu + +

+ The Shiba Inu is the smallest of the six original and distinct spitz breeds of dog from Japan. + A small, agile dog that copes very well with mountainous terrain, the Shiba Inu was originally + bred for hunting. +

+
+ + + + +
diff --git a/src/assets/examples/material/multi-section-card/multi-section-card.component.scss b/src/assets/examples/material/multi-section-card/multi-section-card.component.scss new file mode 100644 index 0000000..1a5b60e --- /dev/null +++ b/src/assets/examples/material/multi-section-card/multi-section-card.component.scss @@ -0,0 +1,9 @@ +.example-card { + max-width: 400px; + } + + .example-header-image { + background-image: url('https://material.angular.io/assets/img/examples/shiba1.jpg'); + background-size: cover; + } + \ No newline at end of file diff --git a/src/assets/examples/material/multi-section-card/multi-section-card.component.spec.ts b/src/assets/examples/material/multi-section-card/multi-section-card.component.spec.ts new file mode 100644 index 0000000..d1ab4f2 --- /dev/null +++ b/src/assets/examples/material/multi-section-card/multi-section-card.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MultiSectionCardComponent } from './multi-section-card.component'; + +describe('MultiSectionCardComponent', () => { + let component: MultiSectionCardComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MultiSectionCardComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MultiSectionCardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/multi-section-card/multi-section-card.component.ts b/src/assets/examples/material/multi-section-card/multi-section-card.component.ts new file mode 100644 index 0000000..62f41fb --- /dev/null +++ b/src/assets/examples/material/multi-section-card/multi-section-card.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-multi-section-card', + templateUrl: './multi-section-card.component.html', + styleUrls: ['./multi-section-card.component.scss'] +}) +export class MultiSectionCardComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/multiple-select/multiple-select.component.html b/src/assets/examples/material/multiple-select/multiple-select.component.html new file mode 100644 index 0000000..fdd7aeb --- /dev/null +++ b/src/assets/examples/material/multiple-select/multiple-select.component.html @@ -0,0 +1,9 @@ +

+ multiple-select works! +

+ + Toppings + + {{topping}} + + diff --git a/src/assets/examples/material/multiple-select/multiple-select.component.scss b/src/assets/examples/material/multiple-select/multiple-select.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/multiple-select/multiple-select.component.spec.ts b/src/assets/examples/material/multiple-select/multiple-select.component.spec.ts new file mode 100644 index 0000000..c310ce4 --- /dev/null +++ b/src/assets/examples/material/multiple-select/multiple-select.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MultipleSelectComponent } from './multiple-select.component'; + +describe('MultipleSelectComponent', () => { + let component: MultipleSelectComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MultipleSelectComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MultipleSelectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/multiple-select/multiple-select.component.ts b/src/assets/examples/material/multiple-select/multiple-select.component.ts new file mode 100644 index 0000000..5d9b8d5 --- /dev/null +++ b/src/assets/examples/material/multiple-select/multiple-select.component.ts @@ -0,0 +1,19 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl} from '@angular/forms'; + +@Component({ + selector: 'app-multiple-select', + templateUrl: './multiple-select.component.html', + styleUrls: ['./multiple-select.component.scss'] +}) +export class MultipleSelectComponent implements OnInit { + + toppings = new FormControl(); + toppingList: string[] = ['Extra cheese', 'Mushroom', 'Onion', 'Pepperoni', 'Sausage', 'Tomato']; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/nav-tab-group/nav-tab-group.component.html b/src/assets/examples/material/nav-tab-group/nav-tab-group.component.html new file mode 100644 index 0000000..538f335 --- /dev/null +++ b/src/assets/examples/material/nav-tab-group/nav-tab-group.component.html @@ -0,0 +1,12 @@ + + + diff --git a/src/assets/examples/material/nav-tab-group/nav-tab-group.component.scss b/src/assets/examples/material/nav-tab-group/nav-tab-group.component.scss new file mode 100644 index 0000000..ebfb85b --- /dev/null +++ b/src/assets/examples/material/nav-tab-group/nav-tab-group.component.scss @@ -0,0 +1,4 @@ +.example-action-button { + margin-bottom: 8px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/nav-tab-group/nav-tab-group.component.spec.ts b/src/assets/examples/material/nav-tab-group/nav-tab-group.component.spec.ts new file mode 100644 index 0000000..76d1fab --- /dev/null +++ b/src/assets/examples/material/nav-tab-group/nav-tab-group.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NavTabGroupComponent } from './nav-tab-group.component'; + +describe('NavTabGroupComponent', () => { + let component: NavTabGroupComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NavTabGroupComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NavTabGroupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/nav-tab-group/nav-tab-group.component.ts b/src/assets/examples/material/nav-tab-group/nav-tab-group.component.ts new file mode 100644 index 0000000..1ff7ed9 --- /dev/null +++ b/src/assets/examples/material/nav-tab-group/nav-tab-group.component.ts @@ -0,0 +1,23 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-nav-tab-group', + templateUrl: './nav-tab-group.component.html', + styleUrls: ['./nav-tab-group.component.scss'] +}) +export class NavTabGroupComponent implements OnInit { + + links = ['First', 'Second', 'Third']; + activeLink = this.links[0]; + background = ''; + + toggleBackground() { + this.background = this.background ? '' : 'primary'; + } + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/nested-menu/nested-menu.component.html b/src/assets/examples/material/nested-menu/nested-menu.component.html new file mode 100644 index 0000000..6145854 --- /dev/null +++ b/src/assets/examples/material/nested-menu/nested-menu.component.html @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/examples/material/nested-menu/nested-menu.component.scss b/src/assets/examples/material/nested-menu/nested-menu.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/nested-menu/nested-menu.component.spec.ts b/src/assets/examples/material/nested-menu/nested-menu.component.spec.ts new file mode 100644 index 0000000..c209914 --- /dev/null +++ b/src/assets/examples/material/nested-menu/nested-menu.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NestedMenuComponent } from './nested-menu.component'; + +describe('NestedMenuComponent', () => { + let component: NestedMenuComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NestedMenuComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NestedMenuComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/nested-menu/nested-menu.component.ts b/src/assets/examples/material/nested-menu/nested-menu.component.ts new file mode 100644 index 0000000..b38ad78 --- /dev/null +++ b/src/assets/examples/material/nested-menu/nested-menu.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-nested-menu', + templateUrl: './nested-menu.component.html', + styleUrls: ['./nested-menu.component.scss'] +}) +export class NestedMenuComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/nested-tree/nested-tree.component.html b/src/assets/examples/material/nested-tree/nested-tree.component.html new file mode 100644 index 0000000..8260e1c --- /dev/null +++ b/src/assets/examples/material/nested-tree/nested-tree.component.html @@ -0,0 +1,28 @@ + + + +
  • + + + {{node.name}} +
  • +
    + + +
  • +
    + + {{node.name}} +
    +
      + +
    +
  • +
    +
    + \ No newline at end of file diff --git a/src/assets/examples/material/nested-tree/nested-tree.component.scss b/src/assets/examples/material/nested-tree/nested-tree.component.scss new file mode 100644 index 0000000..91c0502 --- /dev/null +++ b/src/assets/examples/material/nested-tree/nested-tree.component.scss @@ -0,0 +1,11 @@ +.example-tree-invisible { + display: none; + } + + .example-tree ul, + .example-tree li { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; + } + \ No newline at end of file diff --git a/src/assets/examples/material/nested-tree/nested-tree.component.spec.ts b/src/assets/examples/material/nested-tree/nested-tree.component.spec.ts new file mode 100644 index 0000000..66946b0 --- /dev/null +++ b/src/assets/examples/material/nested-tree/nested-tree.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NestedTreeComponent } from './nested-tree.component'; + +describe('NestedTreeComponent', () => { + let component: NestedTreeComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NestedTreeComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NestedTreeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/nested-tree/nested-tree.component.ts b/src/assets/examples/material/nested-tree/nested-tree.component.ts new file mode 100644 index 0000000..c3b981a --- /dev/null +++ b/src/assets/examples/material/nested-tree/nested-tree.component.ts @@ -0,0 +1,61 @@ +import { Component, OnInit } from '@angular/core'; +import {NestedTreeControl} from '@angular/cdk/tree'; +import {MatTreeNestedDataSource} from '@angular/material/tree'; + +/** + * Food data with nested structure. + * Each node has a name and an optiona list of children. + */ +interface FoodNode { + name: string; + children?: FoodNode[]; +} + +const TREE_DATA: FoodNode[] = [ + { + name: 'Fruit', + children: [ + {name: 'Apple'}, + {name: 'Banana'}, + {name: 'Fruit loops'}, + ] + }, { + name: 'Vegetables', + children: [ + { + name: 'Green', + children: [ + {name: 'Broccoli'}, + {name: 'Brussel sprouts'}, + ] + }, { + name: 'Orange', + children: [ + {name: 'Pumpkins'}, + {name: 'Carrots'}, + ] + }, + ] + }, +]; + +@Component({ + selector: 'app-nested-tree', + templateUrl: './nested-tree.component.html', + styleUrls: ['./nested-tree.component.scss'] +}) +export class NestedTreeComponent implements OnInit { + + treeControl = new NestedTreeControl(node => node.children); + dataSource = new MatTreeNestedDataSource(); + + constructor() { + this.dataSource.data = TREE_DATA; + } + + hasChild = (_: number, node: FoodNode) => !!node.children && node.children.length > 0; + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/ngmodel-radio/ngmodel-radio.component.html b/src/assets/examples/material/ngmodel-radio/ngmodel-radio.component.html new file mode 100644 index 0000000..5369faa --- /dev/null +++ b/src/assets/examples/material/ngmodel-radio/ngmodel-radio.component.html @@ -0,0 +1,10 @@ + + + + {{season}} + + +
    Your favorite season is: {{favoriteSeason}}
    diff --git a/src/assets/examples/material/ngmodel-radio/ngmodel-radio.component.scss b/src/assets/examples/material/ngmodel-radio/ngmodel-radio.component.scss new file mode 100644 index 0000000..839b6a3 --- /dev/null +++ b/src/assets/examples/material/ngmodel-radio/ngmodel-radio.component.scss @@ -0,0 +1,10 @@ +.example-radio-group { + display: flex; + flex-direction: column; + margin: 15px 0; + } + + .example-radio-button { + margin: 5px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/ngmodel-radio/ngmodel-radio.component.spec.ts b/src/assets/examples/material/ngmodel-radio/ngmodel-radio.component.spec.ts new file mode 100644 index 0000000..c58e090 --- /dev/null +++ b/src/assets/examples/material/ngmodel-radio/ngmodel-radio.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NgmodelRadioComponent } from './ngmodel-radio.component'; + +describe('NgmodelRadioComponent', () => { + let component: NgmodelRadioComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NgmodelRadioComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NgmodelRadioComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/ngmodel-radio/ngmodel-radio.component.ts b/src/assets/examples/material/ngmodel-radio/ngmodel-radio.component.ts new file mode 100644 index 0000000..856eafb --- /dev/null +++ b/src/assets/examples/material/ngmodel-radio/ngmodel-radio.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-ngmodel-radio', + templateUrl: './ngmodel-radio.component.html', + styleUrls: ['./ngmodel-radio.component.scss'] +}) +export class NgmodelRadioComponent implements OnInit { + + favoriteSeason: string; + seasons: string[] = ['Winter', 'Spring', 'Summer', 'Autumn']; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/open-close-sidenav/open-close-sidenav.component.html b/src/assets/examples/material/open-close-sidenav/open-close-sidenav.component.html new file mode 100644 index 0000000..2c03572 --- /dev/null +++ b/src/assets/examples/material/open-close-sidenav/open-close-sidenav.component.html @@ -0,0 +1,15 @@ + + + Sidenav content + + + +

    sidenav.opened

    +

    +

    Events:

    +
    +
    {{e}}
    +
    +
    +
    \ No newline at end of file diff --git a/src/assets/examples/material/open-close-sidenav/open-close-sidenav.component.scss b/src/assets/examples/material/open-close-sidenav/open-close-sidenav.component.scss new file mode 100644 index 0000000..c4e7a91 --- /dev/null +++ b/src/assets/examples/material/open-close-sidenav/open-close-sidenav.component.scss @@ -0,0 +1,15 @@ +.example-container { + // position: absolute; + // top: 0; + // bottom: 0; + // left: 0; + // right: 0; + } + + .example-events { + width: 300px; + height: 200px; + overflow: auto; + border: 1px solid #555; + } + \ No newline at end of file diff --git a/src/assets/examples/material/open-close-sidenav/open-close-sidenav.component.spec.ts b/src/assets/examples/material/open-close-sidenav/open-close-sidenav.component.spec.ts new file mode 100644 index 0000000..89f48d9 --- /dev/null +++ b/src/assets/examples/material/open-close-sidenav/open-close-sidenav.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OpenCloseSidenavComponent } from './open-close-sidenav.component'; + +describe('OpenCloseSidenavComponent', () => { + let component: OpenCloseSidenavComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OpenCloseSidenavComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OpenCloseSidenavComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/open-close-sidenav/open-close-sidenav.component.ts b/src/assets/examples/material/open-close-sidenav/open-close-sidenav.component.ts new file mode 100644 index 0000000..1a89b8f --- /dev/null +++ b/src/assets/examples/material/open-close-sidenav/open-close-sidenav.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-open-close-sidenav', + templateUrl: './open-close-sidenav.component.html', + styleUrls: ['./open-close-sidenav.component.scss'] +}) +export class OpenCloseSidenavComponent implements OnInit { + + events: string[] = []; + opened: boolean; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/open-method-datepicker/open-method-datepicker.component.html b/src/assets/examples/material/open-method-datepicker/open-method-datepicker.component.html new file mode 100644 index 0000000..453fe29 --- /dev/null +++ b/src/assets/examples/material/open-method-datepicker/open-method-datepicker.component.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/examples/material/open-method-datepicker/open-method-datepicker.component.scss b/src/assets/examples/material/open-method-datepicker/open-method-datepicker.component.scss new file mode 100644 index 0000000..692ed8c --- /dev/null +++ b/src/assets/examples/material/open-method-datepicker/open-method-datepicker.component.scss @@ -0,0 +1,4 @@ +mat-form-field { + margin-right: 12px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/open-method-datepicker/open-method-datepicker.component.spec.ts b/src/assets/examples/material/open-method-datepicker/open-method-datepicker.component.spec.ts new file mode 100644 index 0000000..9b827a5 --- /dev/null +++ b/src/assets/examples/material/open-method-datepicker/open-method-datepicker.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OpenMethodDatepickerComponent } from './open-method-datepicker.component'; + +describe('OpenMethodDatepickerComponent', () => { + let component: OpenMethodDatepickerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OpenMethodDatepickerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OpenMethodDatepickerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/open-method-datepicker/open-method-datepicker.component.ts b/src/assets/examples/material/open-method-datepicker/open-method-datepicker.component.ts new file mode 100644 index 0000000..6447680 --- /dev/null +++ b/src/assets/examples/material/open-method-datepicker/open-method-datepicker.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-open-method-datepicker', + templateUrl: './open-method-datepicker.component.html', + styleUrls: ['./open-method-datepicker.component.scss'] +}) +export class OpenMethodDatepickerComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/option-group-autocomplete/option-group-autocomplete.component.html b/src/assets/examples/material/option-group-autocomplete/option-group-autocomplete.component.html new file mode 100644 index 0000000..0d9a4bf --- /dev/null +++ b/src/assets/examples/material/option-group-autocomplete/option-group-autocomplete.component.html @@ -0,0 +1,12 @@ +
    + + + + + + {{name}} + + + + + diff --git a/src/assets/examples/material/option-group-autocomplete/option-group-autocomplete.component.scss b/src/assets/examples/material/option-group-autocomplete/option-group-autocomplete.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/option-group-autocomplete/option-group-autocomplete.component.spec.ts b/src/assets/examples/material/option-group-autocomplete/option-group-autocomplete.component.spec.ts new file mode 100644 index 0000000..227a28d --- /dev/null +++ b/src/assets/examples/material/option-group-autocomplete/option-group-autocomplete.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OptionGroupAutocompleteComponent } from './option-group-autocomplete.component'; + +describe('OptionGroupAutocompleteComponent', () => { + let component: OptionGroupAutocompleteComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OptionGroupAutocompleteComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OptionGroupAutocompleteComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/option-group-autocomplete/option-group-autocomplete.component.ts b/src/assets/examples/material/option-group-autocomplete/option-group-autocomplete.component.ts new file mode 100644 index 0000000..801dc10 --- /dev/null +++ b/src/assets/examples/material/option-group-autocomplete/option-group-autocomplete.component.ts @@ -0,0 +1,111 @@ +import {Component, OnInit} from '@angular/core'; +import {FormBuilder, FormGroup} from '@angular/forms'; +import {Observable} from 'rxjs'; +import {startWith, map} from 'rxjs/operators'; + +export interface StateGroup { + letter: string; + names: string[]; +} + +export const _filter = (opt: string[], value: string): string[] => { + const filterValue = value.toLowerCase(); + + return opt.filter(item => item.toLowerCase().indexOf(filterValue) === 0); +}; + +@Component({ + selector: 'app-option-group-autocomplete', + templateUrl: './option-group-autocomplete.component.html', + styleUrls: ['./option-group-autocomplete.component.scss'] +}) +export class OptionGroupAutocompleteComponent implements OnInit { + + stateForm: FormGroup = this.fb.group({ + stateGroup: '', + }); + + stateGroups: StateGroup[] = [{ + letter: 'A', + names: ['Alabama', 'Alaska', 'Arizona', 'Arkansas'] + }, { + letter: 'C', + names: ['California', 'Colorado', 'Connecticut'] + }, { + letter: 'D', + names: ['Delaware'] + }, { + letter: 'F', + names: ['Florida'] + }, { + letter: 'G', + names: ['Georgia'] + }, { + letter: 'H', + names: ['Hawaii'] + }, { + letter: 'I', + names: ['Idaho', 'Illinois', 'Indiana', 'Iowa'] + }, { + letter: 'K', + names: ['Kansas', 'Kentucky'] + }, { + letter: 'L', + names: ['Louisiana'] + }, { + letter: 'M', + names: ['Maine', 'Maryland', 'Massachusetts', 'Michigan', + 'Minnesota', 'Mississippi', 'Missouri', 'Montana'] + }, { + letter: 'N', + names: ['Nebraska', 'Nevada', 'New Hampshire', 'New Jersey', + 'New Mexico', 'New York', 'North Carolina', 'North Dakota'] + }, { + letter: 'O', + names: ['Ohio', 'Oklahoma', 'Oregon'] + }, { + letter: 'P', + names: ['Pennsylvania'] + }, { + letter: 'R', + names: ['Rhode Island'] + }, { + letter: 'S', + names: ['South Carolina', 'South Dakota'] + }, { + letter: 'T', + names: ['Tennessee', 'Texas'] + }, { + letter: 'U', + names: ['Utah'] + }, { + letter: 'V', + names: ['Vermont', 'Virginia'] + }, { + letter: 'W', + names: ['Washington', 'West Virginia', 'Wisconsin', 'Wyoming'] + }]; + + stateGroupOptions: Observable; + + constructor(private fb: FormBuilder) {} + + ngOnInit() { + this.stateGroupOptions = this.stateForm.get('stateGroup')!.valueChanges + .pipe( + startWith(''), + map(value => this._filterGroup(value)) + ); + } + + private _filterGroup(value: string): StateGroup[] { + if (value) { + return this.stateGroups + .map(group => ({letter: group.letter, names: _filter(group.names, value)})) + .filter(group => group.names.length > 0); + } + + return this.stateGroups; + } + +} diff --git a/src/assets/examples/material/option-group-select/option-group-select.component.html b/src/assets/examples/material/option-group-select/option-group-select.component.html new file mode 100644 index 0000000..6482720 --- /dev/null +++ b/src/assets/examples/material/option-group-select/option-group-select.component.html @@ -0,0 +1,28 @@ +

    mat-select

    + + Pokemon + + -- None -- + + + {{pokemon.viewValue}} + + + + + +

    native html select

    + + Cars + + diff --git a/src/assets/examples/material/option-group-select/option-group-select.component.scss b/src/assets/examples/material/option-group-select/option-group-select.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/option-group-select/option-group-select.component.spec.ts b/src/assets/examples/material/option-group-select/option-group-select.component.spec.ts new file mode 100644 index 0000000..edc693a --- /dev/null +++ b/src/assets/examples/material/option-group-select/option-group-select.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OptionGroupSelectComponent } from './option-group-select.component'; + +describe('OptionGroupSelectComponent', () => { + let component: OptionGroupSelectComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OptionGroupSelectComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OptionGroupSelectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/option-group-select/option-group-select.component.ts b/src/assets/examples/material/option-group-select/option-group-select.component.ts new file mode 100644 index 0000000..3e7cd23 --- /dev/null +++ b/src/assets/examples/material/option-group-select/option-group-select.component.ts @@ -0,0 +1,63 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl} from '@angular/forms'; + +export interface Pokemon { + value: string; + viewValue: string; +} + +export interface PokemonGroup { + disabled?: boolean; + name: string; + pokemon: Pokemon[]; +} + +@Component({ + selector: 'app-option-group-select', + templateUrl: './option-group-select.component.html', + styleUrls: ['./option-group-select.component.scss'] +}) +export class OptionGroupSelectComponent implements OnInit { + + pokemonControl = new FormControl(); + pokemonGroups: PokemonGroup[] = [ + { + name: 'Grass', + pokemon: [ + {value: 'bulbasaur-0', viewValue: 'Bulbasaur'}, + {value: 'oddish-1', viewValue: 'Oddish'}, + {value: 'bellsprout-2', viewValue: 'Bellsprout'} + ] + }, + { + name: 'Water', + pokemon: [ + {value: 'squirtle-3', viewValue: 'Squirtle'}, + {value: 'psyduck-4', viewValue: 'Psyduck'}, + {value: 'horsea-5', viewValue: 'Horsea'} + ] + }, + { + name: 'Fire', + disabled: true, + pokemon: [ + {value: 'charmander-6', viewValue: 'Charmander'}, + {value: 'vulpix-7', viewValue: 'Vulpix'}, + {value: 'flareon-8', viewValue: 'Flareon'} + ] + }, + { + name: 'Psychic', + pokemon: [ + {value: 'mew-9', viewValue: 'Mew'}, + {value: 'mewtwo-10', viewValue: 'Mewtwo'}, + ] + } + ]; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/pagination-table/pagination-table.component.html b/src/assets/examples/material/pagination-table/pagination-table.component.html new file mode 100644 index 0000000..a410ebb --- /dev/null +++ b/src/assets/examples/material/pagination-table/pagination-table.component.html @@ -0,0 +1,33 @@ +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No. {{element.position}} Name {{element.name}} Weight {{element.weight}} Symbol {{element.symbol}}
    + + +
    diff --git a/src/assets/examples/material/pagination-table/pagination-table.component.scss b/src/assets/examples/material/pagination-table/pagination-table.component.scss new file mode 100644 index 0000000..ca85107 --- /dev/null +++ b/src/assets/examples/material/pagination-table/pagination-table.component.scss @@ -0,0 +1,4 @@ +table { + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/pagination-table/pagination-table.component.spec.ts b/src/assets/examples/material/pagination-table/pagination-table.component.spec.ts new file mode 100644 index 0000000..0d470ac --- /dev/null +++ b/src/assets/examples/material/pagination-table/pagination-table.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PaginationTableComponent } from './pagination-table.component'; + +describe('PaginationTableComponent', () => { + let component: PaginationTableComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ PaginationTableComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PaginationTableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/pagination-table/pagination-table.component.ts b/src/assets/examples/material/pagination-table/pagination-table.component.ts new file mode 100644 index 0000000..a997ff0 --- /dev/null +++ b/src/assets/examples/material/pagination-table/pagination-table.component.ts @@ -0,0 +1,51 @@ +import {Component, OnInit, ViewChild} from '@angular/core'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatTableDataSource } from '@angular/material/table'; + +export interface PeriodicElement { + name: string; + position: number; + weight: number; + symbol: string; +} + +const ELEMENT_DATA: PeriodicElement[] = [ + {position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H'}, + {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'}, + {position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li'}, + {position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be'}, + {position: 5, name: 'Boron', weight: 10.811, symbol: 'B'}, + {position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C'}, + {position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N'}, + {position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O'}, + {position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F'}, + {position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne'}, + {position: 11, name: 'Sodium', weight: 22.9897, symbol: 'Na'}, + {position: 12, name: 'Magnesium', weight: 24.305, symbol: 'Mg'}, + {position: 13, name: 'Aluminum', weight: 26.9815, symbol: 'Al'}, + {position: 14, name: 'Silicon', weight: 28.0855, symbol: 'Si'}, + {position: 15, name: 'Phosphorus', weight: 30.9738, symbol: 'P'}, + {position: 16, name: 'Sulfur', weight: 32.065, symbol: 'S'}, + {position: 17, name: 'Chlorine', weight: 35.453, symbol: 'Cl'}, + {position: 18, name: 'Argon', weight: 39.948, symbol: 'Ar'}, + {position: 19, name: 'Potassium', weight: 39.0983, symbol: 'K'}, + {position: 20, name: 'Calcium', weight: 40.078, symbol: 'Ca'}, +]; + +@Component({ + selector: 'app-pagination-table', + templateUrl: './pagination-table.component.html', + styleUrls: ['./pagination-table.component.scss'] +}) +export class PaginationTableComponent implements OnInit { + + displayedColumns: string[] = ['position', 'name', 'weight', 'symbol']; + dataSource = new MatTableDataSource(ELEMENT_DATA); + + @ViewChild(MatPaginator) paginator: MatPaginator; + + ngOnInit() { + this.dataSource.paginator = this.paginator; + } + +} diff --git a/src/assets/examples/material/prefix-suffix-form-field/prefix-suffix-form-field.component.html b/src/assets/examples/material/prefix-suffix-form-field/prefix-suffix-form-field.component.html new file mode 100644 index 0000000..5edb299 --- /dev/null +++ b/src/assets/examples/material/prefix-suffix-form-field/prefix-suffix-form-field.component.html @@ -0,0 +1,14 @@ +
    + + + + + + + + + .00 + +
    diff --git a/src/assets/examples/material/prefix-suffix-form-field/prefix-suffix-form-field.component.scss b/src/assets/examples/material/prefix-suffix-form-field/prefix-suffix-form-field.component.scss new file mode 100644 index 0000000..fb0ea2b --- /dev/null +++ b/src/assets/examples/material/prefix-suffix-form-field/prefix-suffix-form-field.component.scss @@ -0,0 +1,22 @@ +.example-container { + display: flex; + flex-direction: column; + } + + .example-container > * { + width: 100%; + } + + .example-right-align { + text-align: right; + } + + input.example-right-align::-webkit-outer-spin-button, + input.example-right-align::-webkit-inner-spin-button { + display: none; + } + + input.example-right-align { + -moz-appearance: textfield; + } + \ No newline at end of file diff --git a/src/assets/examples/material/prefix-suffix-form-field/prefix-suffix-form-field.component.spec.ts b/src/assets/examples/material/prefix-suffix-form-field/prefix-suffix-form-field.component.spec.ts new file mode 100644 index 0000000..512941c --- /dev/null +++ b/src/assets/examples/material/prefix-suffix-form-field/prefix-suffix-form-field.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PrefixSuffixFormFieldComponent } from './prefix-suffix-form-field.component'; + +describe('PrefixSuffixFormFieldComponent', () => { + let component: PrefixSuffixFormFieldComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ PrefixSuffixFormFieldComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PrefixSuffixFormFieldComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/prefix-suffix-form-field/prefix-suffix-form-field.component.ts b/src/assets/examples/material/prefix-suffix-form-field/prefix-suffix-form-field.component.ts new file mode 100644 index 0000000..489402e --- /dev/null +++ b/src/assets/examples/material/prefix-suffix-form-field/prefix-suffix-form-field.component.ts @@ -0,0 +1,17 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-prefix-suffix-form-field', + templateUrl: './prefix-suffix-form-field.component.html', + styleUrls: ['./prefix-suffix-form-field.component.scss'] +}) +export class PrefixSuffixFormFieldComponent implements OnInit { + + hide = true; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/reset-select/reset-select.component.html b/src/assets/examples/material/reset-select/reset-select.component.html new file mode 100644 index 0000000..e0f7345 --- /dev/null +++ b/src/assets/examples/material/reset-select/reset-select.component.html @@ -0,0 +1,20 @@ +

    mat-select

    + + State + + None + {{state}} + + + +

    native html select

    + + Select your car + + diff --git a/src/assets/examples/material/reset-select/reset-select.component.scss b/src/assets/examples/material/reset-select/reset-select.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/reset-select/reset-select.component.spec.ts b/src/assets/examples/material/reset-select/reset-select.component.spec.ts new file mode 100644 index 0000000..456076f --- /dev/null +++ b/src/assets/examples/material/reset-select/reset-select.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ResetSelectComponent } from './reset-select.component'; + +describe('ResetSelectComponent', () => { + let component: ResetSelectComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ResetSelectComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ResetSelectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/reset-select/reset-select.component.ts b/src/assets/examples/material/reset-select/reset-select.component.ts new file mode 100644 index 0000000..60a6fb7 --- /dev/null +++ b/src/assets/examples/material/reset-select/reset-select.component.ts @@ -0,0 +1,25 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-reset-select', + templateUrl: './reset-select.component.html', + styleUrls: ['./reset-select.component.scss'] +}) +export class ResetSelectComponent implements OnInit { + + states: string[] = [ + 'Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 'Delaware', + 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', + 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi', + 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 'New Jersey', 'New Mexico', + 'New York', 'North Carolina', 'North Dakota', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', + 'Rhode Island', 'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', + 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming' + ]; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/responsive-sidenav/responsive-sidenav.component.html b/src/assets/examples/material/responsive-sidenav/responsive-sidenav.component.html new file mode 100644 index 0000000..e08fe97 --- /dev/null +++ b/src/assets/examples/material/responsive-sidenav/responsive-sidenav.component.html @@ -0,0 +1,20 @@ +
    + + +

    Responsive App

    +
    + + + + + {{nav}} + + + + +

    {{content}}

    +
    +
    +
    \ No newline at end of file diff --git a/src/assets/examples/material/responsive-sidenav/responsive-sidenav.component.scss b/src/assets/examples/material/responsive-sidenav/responsive-sidenav.component.scss new file mode 100644 index 0000000..5cb2ca5 --- /dev/null +++ b/src/assets/examples/material/responsive-sidenav/responsive-sidenav.component.scss @@ -0,0 +1,32 @@ +.example-container { + display: flex; + flex-direction: column; + // position: absolute; + // top: 0; + // bottom: 0; + // left: 0; + // right: 0; + } + + .example-is-mobile .example-toolbar { + position: fixed; + /* Make sure the toolbar will stay on top of the content as it scrolls past. */ + z-index: 2; + } + + h1.example-app-name { + margin-left: 8px; + } + + .example-sidenav-container { + /* When the sidenav is not fixed, stretch the sidenav container to fill the available space. This + causes `` to act as our scrolling element for desktop layouts. */ + flex: 1; + } + + .example-is-mobile .example-sidenav-container { + /* When the sidenav is fixed, don't constrain the height of the sidenav container. This allows the + `` to be our scrolling element for mobile layouts. */ + flex: 1 0 auto; + } + \ No newline at end of file diff --git a/src/assets/examples/material/responsive-sidenav/responsive-sidenav.component.spec.ts b/src/assets/examples/material/responsive-sidenav/responsive-sidenav.component.spec.ts new file mode 100644 index 0000000..9566986 --- /dev/null +++ b/src/assets/examples/material/responsive-sidenav/responsive-sidenav.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ResponsiveSidenavComponent } from './responsive-sidenav.component'; + +describe('ResponsiveSidenavComponent', () => { + let component: ResponsiveSidenavComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ResponsiveSidenavComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ResponsiveSidenavComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/responsive-sidenav/responsive-sidenav.component.ts b/src/assets/examples/material/responsive-sidenav/responsive-sidenav.component.ts new file mode 100644 index 0000000..6f4b45e --- /dev/null +++ b/src/assets/examples/material/responsive-sidenav/responsive-sidenav.component.ts @@ -0,0 +1,28 @@ +import {ChangeDetectorRef, Component, OnDestroy} from '@angular/core'; +import { MediaMatcher } from '@angular/cdk/layout'; + +@Component({ + selector: 'app-responsive-sidenav', + templateUrl: './responsive-sidenav.component.html', + styleUrls: ['./responsive-sidenav.component.scss'] +}) +export class ResponsiveSidenavComponent implements OnDestroy { + + mobileQuery: MediaQueryList; + + fillerNav = Array.from({length: 10}, (_, i) => `Nav Item ${i + 1}`); + + fillerContent = Array.from({length: 5}, () => `my content`); + + private _mobileQueryListener: () => void; + + constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher) { + this.mobileQuery = media.matchMedia('(max-width: 600px)'); + this._mobileQueryListener = () => changeDetectorRef.detectChanges(); + this.mobileQuery.addListener(this._mobileQueryListener); + } + + ngOnDestroy(): void { + this.mobileQuery.removeListener(this._mobileQueryListener); + } +} diff --git a/src/assets/examples/material/rippleless-select/rippleless-select.component.html b/src/assets/examples/material/rippleless-select/rippleless-select.component.html new file mode 100644 index 0000000..4c722ae --- /dev/null +++ b/src/assets/examples/material/rippleless-select/rippleless-select.component.html @@ -0,0 +1,8 @@ + + Select an option + + Option 1 + Option 2 + Option 3 + + diff --git a/src/assets/examples/material/rippleless-select/rippleless-select.component.scss b/src/assets/examples/material/rippleless-select/rippleless-select.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/rippleless-select/rippleless-select.component.spec.ts b/src/assets/examples/material/rippleless-select/rippleless-select.component.spec.ts new file mode 100644 index 0000000..25c8ae0 --- /dev/null +++ b/src/assets/examples/material/rippleless-select/rippleless-select.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RipplelessSelectComponent } from './rippleless-select.component'; + +describe('RipplelessSelectComponent', () => { + let component: RipplelessSelectComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ RipplelessSelectComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RipplelessSelectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/rippleless-select/rippleless-select.component.ts b/src/assets/examples/material/rippleless-select/rippleless-select.component.ts new file mode 100644 index 0000000..6b09fdc --- /dev/null +++ b/src/assets/examples/material/rippleless-select/rippleless-select.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-rippleless-select', + templateUrl: './rippleless-select.component.html', + styleUrls: ['./rippleless-select.component.scss'] +}) +export class RipplelessSelectComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/scrollable-dialog/scrollable-dialog-overview/scrollable-dialog-overview.component.html b/src/assets/examples/material/scrollable-dialog/scrollable-dialog-overview/scrollable-dialog-overview.component.html new file mode 100644 index 0000000..a5f12bc --- /dev/null +++ b/src/assets/examples/material/scrollable-dialog/scrollable-dialog-overview/scrollable-dialog-overview.component.html @@ -0,0 +1,64 @@ +

    Install Angular

    + +

    Develop across all platforms

    +

    Learn one way to build applications with Angular and reuse your code and abilities to build + apps for any deployment target. For web, mobile web, native mobile and native desktop.

    + +

    Speed & Performance

    +

    Achieve the maximum speed possible on the Web Platform today, and take it further, via Web + Workers and server-side rendering. Angular puts you in control over scalability. Meet huge + data requirements by building data models on RxJS, Immutable.js or another push-model.

    + +

    Incredible tooling

    +

    Build features quickly with simple, declarative templates. Extend the template language with + your own components and use a wide array of existing components. Get immediate Angular-specific + help and feedback with nearly every IDE and editor. All this comes together so you can focus + on building amazing apps rather than trying to make the code work.

    + +

    Loved by millions

    +

    From prototype through global deployment, Angular delivers the productivity and scalable + infrastructure that supports Google's largest applications.

    + +

    What is Angular?

    + +

    Angular is a platform that makes it easy to build applications with the web. Angular + combines declarative templates, dependency injection, end to end tooling, and integrated + best practices to solve development challenges. Angular empowers developers to build + applications that live on the web, mobile, or the desktop

    + +

    Architecture overview

    + +

    Angular is a platform and framework for building client applications in HTML and TypeScript. + Angular is itself written in TypeScript. It implements core and optional functionality as a + set of TypeScript libraries that you import into your apps.

    + +

    The basic building blocks of an Angular application are NgModules, which provide a compilation + context for components. NgModules collect related code into functional sets; an Angular app is + defined by a set of NgModules. An app always has at least a root module that enables + bootstrapping, and typically has many more feature modules.

    + +

    Components define views, which are sets of screen elements that Angular can choose among and + modify according to your program logic and data. Every app has at least a root component.

    + +

    Components use services, which provide specific functionality not directly related to views. + Service providers can be injected into components as dependencies, making your code modular, + reusable, and efficient.

    + +

    Both components and services are simply classes, with decorators that mark their type and + provide metadata that tells Angular how to use them.

    + +

    The metadata for a component class associates it with a template that defines a view. A + template combines ordinary HTML with Angular directives and binding markup that allow Angular + to modify the HTML before rendering it for display.

    + +

    The metadata for a service class provides the information Angular needs to make it available + to components through Dependency Injection (DI).

    + +

    An app's components typically define many views, arranged hierarchically. Angular provides + the Router service to help you define navigation paths among views. The router provides + sophisticated in-browser navigational capabilities.

    +
    + + + + diff --git a/src/assets/examples/material/scrollable-dialog/scrollable-dialog-overview/scrollable-dialog-overview.component.scss b/src/assets/examples/material/scrollable-dialog/scrollable-dialog-overview/scrollable-dialog-overview.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/scrollable-dialog/scrollable-dialog-overview/scrollable-dialog-overview.component.spec.ts b/src/assets/examples/material/scrollable-dialog/scrollable-dialog-overview/scrollable-dialog-overview.component.spec.ts new file mode 100644 index 0000000..a9908e9 --- /dev/null +++ b/src/assets/examples/material/scrollable-dialog/scrollable-dialog-overview/scrollable-dialog-overview.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ScrollableDialogOverviewComponent } from './scrollable-dialog-overview.component'; + +describe('ScrollableDialogOverviewComponent', () => { + let component: ScrollableDialogOverviewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ScrollableDialogOverviewComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ScrollableDialogOverviewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/scrollable-dialog/scrollable-dialog-overview/scrollable-dialog-overview.component.ts b/src/assets/examples/material/scrollable-dialog/scrollable-dialog-overview/scrollable-dialog-overview.component.ts new file mode 100644 index 0000000..2759a4c --- /dev/null +++ b/src/assets/examples/material/scrollable-dialog/scrollable-dialog-overview/scrollable-dialog-overview.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-scrollable-dialog-overview', + templateUrl: './scrollable-dialog-overview.component.html', + styleUrls: ['./scrollable-dialog-overview.component.scss'] +}) +export class ScrollableDialogOverviewComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/scrollable-dialog/scrollable-dialog.component.html b/src/assets/examples/material/scrollable-dialog/scrollable-dialog.component.html new file mode 100644 index 0000000..cdfc2fb --- /dev/null +++ b/src/assets/examples/material/scrollable-dialog/scrollable-dialog.component.html @@ -0,0 +1 @@ + diff --git a/src/assets/examples/material/scrollable-dialog/scrollable-dialog.component.scss b/src/assets/examples/material/scrollable-dialog/scrollable-dialog.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/scrollable-dialog/scrollable-dialog.component.spec.ts b/src/assets/examples/material/scrollable-dialog/scrollable-dialog.component.spec.ts new file mode 100644 index 0000000..2dfa190 --- /dev/null +++ b/src/assets/examples/material/scrollable-dialog/scrollable-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ScrollableDialogComponent } from './scrollable-dialog.component'; + +describe('ScrollableDialogComponent', () => { + let component: ScrollableDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ScrollableDialogComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ScrollableDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/scrollable-dialog/scrollable-dialog.component.ts b/src/assets/examples/material/scrollable-dialog/scrollable-dialog.component.ts new file mode 100644 index 0000000..31767e4 --- /dev/null +++ b/src/assets/examples/material/scrollable-dialog/scrollable-dialog.component.ts @@ -0,0 +1,25 @@ +import { MatDialog } from '@angular/material/dialog'; +import { Component, OnInit } from '@angular/core'; +import { ScrollableDialogOverviewComponent } from './scrollable-dialog-overview/scrollable-dialog-overview.component'; + +@Component({ + selector: 'app-scrollable-dialog', + templateUrl: './scrollable-dialog.component.html', + styleUrls: ['./scrollable-dialog.component.scss'] +}) +export class ScrollableDialogComponent implements OnInit { + + constructor(public dialog: MatDialog) {} + + openDialog() { + const dialogRef = this.dialog.open(ScrollableDialogOverviewComponent); + + dialogRef.afterClosed().subscribe(result => { + // console.log(`Dialog result: ${result}`); + }); + } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/section-list/section-list.component.html b/src/assets/examples/material/section-list/section-list.component.html new file mode 100644 index 0000000..ecb32bb --- /dev/null +++ b/src/assets/examples/material/section-list/section-list.component.html @@ -0,0 +1,15 @@ + +

    Folders

    + + folder +

    {{folder.name}}

    +

    {{folder.updated | date}}

    +
    + +

    Notes

    + + note +

    {{note.name}}

    +

    {{note.updated | date}}

    +
    +
    diff --git a/src/assets/examples/material/section-list/section-list.component.scss b/src/assets/examples/material/section-list/section-list.component.scss new file mode 100644 index 0000000..ef1bfb5 --- /dev/null +++ b/src/assets/examples/material/section-list/section-list.component.scss @@ -0,0 +1,4 @@ +.mat-list-icon { + color: rgba(0, 0, 0, 0.54); + } + \ No newline at end of file diff --git a/src/assets/examples/material/section-list/section-list.component.spec.ts b/src/assets/examples/material/section-list/section-list.component.spec.ts new file mode 100644 index 0000000..8703be2 --- /dev/null +++ b/src/assets/examples/material/section-list/section-list.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SectionListComponent } from './section-list.component'; + +describe('SectionListComponent', () => { + let component: SectionListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SectionListComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SectionListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/section-list/section-list.component.ts b/src/assets/examples/material/section-list/section-list.component.ts new file mode 100644 index 0000000..bdff611 --- /dev/null +++ b/src/assets/examples/material/section-list/section-list.component.ts @@ -0,0 +1,45 @@ +import { Component, OnInit } from '@angular/core'; + +export interface Section { + name: string; + updated: Date; +} + +@Component({ + selector: 'app-section-list', + templateUrl: './section-list.component.html', + styleUrls: ['./section-list.component.scss'] +}) +export class SectionListComponent implements OnInit { + + folders: Section[] = [ + { + name: 'Photos', + updated: new Date('1/1/16'), + }, + { + name: 'Recipes', + updated: new Date('1/17/16'), + }, + { + name: 'Work', + updated: new Date('1/28/16'), + } + ]; + notes: Section[] = [ + { + name: 'Vacation Itinerary', + updated: new Date('2/20/16'), + }, + { + name: 'Kitchen Remodel', + updated: new Date('1/18/16'), + } + ]; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/selected-value-datepicker/selected-value-datepicker.component.html b/src/assets/examples/material/selected-value-datepicker/selected-value-datepicker.component.html new file mode 100644 index 0000000..fbd5f59 --- /dev/null +++ b/src/assets/examples/material/selected-value-datepicker/selected-value-datepicker.component.html @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/examples/material/selected-value-datepicker/selected-value-datepicker.component.scss b/src/assets/examples/material/selected-value-datepicker/selected-value-datepicker.component.scss new file mode 100644 index 0000000..692ed8c --- /dev/null +++ b/src/assets/examples/material/selected-value-datepicker/selected-value-datepicker.component.scss @@ -0,0 +1,4 @@ +mat-form-field { + margin-right: 12px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/selected-value-datepicker/selected-value-datepicker.component.spec.ts b/src/assets/examples/material/selected-value-datepicker/selected-value-datepicker.component.spec.ts new file mode 100644 index 0000000..28aa3c5 --- /dev/null +++ b/src/assets/examples/material/selected-value-datepicker/selected-value-datepicker.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SelectedValueDatepickerComponent } from './selected-value-datepicker.component'; + +describe('SelectedValueDatepickerComponent', () => { + let component: SelectedValueDatepickerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SelectedValueDatepickerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SelectedValueDatepickerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/selected-value-datepicker/selected-value-datepicker.component.ts b/src/assets/examples/material/selected-value-datepicker/selected-value-datepicker.component.ts new file mode 100644 index 0000000..c81793c --- /dev/null +++ b/src/assets/examples/material/selected-value-datepicker/selected-value-datepicker.component.ts @@ -0,0 +1,17 @@ +import {Component} from '@angular/core'; +import {FormControl} from '@angular/forms'; + +@Component({ + selector: 'app-selected-value-datepicker', + templateUrl: './selected-value-datepicker.component.html', + styleUrls: ['./selected-value-datepicker.component.scss'] +}) +export class SelectedValueDatepickerComponent { + + date = new FormControl(new Date()); + serializedDate = new FormControl((new Date()).toISOString()); + + constructor() { } + + +} diff --git a/src/assets/examples/material/selection-table/selection-table.component.html b/src/assets/examples/material/selection-table/selection-table.component.html new file mode 100644 index 0000000..9bf76f1 --- /dev/null +++ b/src/assets/examples/material/selection-table/selection-table.component.html @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + No. {{element.position}} Name {{element.name}} Weight {{element.weight}} Symbol {{element.symbol}}
    diff --git a/src/assets/examples/material/selection-table/selection-table.component.scss b/src/assets/examples/material/selection-table/selection-table.component.scss new file mode 100644 index 0000000..ca85107 --- /dev/null +++ b/src/assets/examples/material/selection-table/selection-table.component.scss @@ -0,0 +1,4 @@ +table { + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/selection-table/selection-table.component.spec.ts b/src/assets/examples/material/selection-table/selection-table.component.spec.ts new file mode 100644 index 0000000..410b253 --- /dev/null +++ b/src/assets/examples/material/selection-table/selection-table.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SelectionTableComponent } from './selection-table.component'; + +describe('SelectionTableComponent', () => { + let component: SelectionTableComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SelectionTableComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SelectionTableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/selection-table/selection-table.component.ts b/src/assets/examples/material/selection-table/selection-table.component.ts new file mode 100644 index 0000000..6f8bd69 --- /dev/null +++ b/src/assets/examples/material/selection-table/selection-table.component.ts @@ -0,0 +1,58 @@ +import {SelectionModel} from '@angular/cdk/collections'; +import {Component} from '@angular/core'; +import { MatTableDataSource } from '@angular/material/table'; + +export interface PeriodicElement { + name: string; + position: number; + weight: number; + symbol: string; +} + +const ELEMENT_DATA: PeriodicElement[] = [ + {position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H'}, + {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'}, + {position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li'}, + {position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be'}, + {position: 5, name: 'Boron', weight: 10.811, symbol: 'B'}, + {position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C'}, + {position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N'}, + {position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O'}, + {position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F'}, + {position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne'}, +]; + +@Component({ + selector: 'app-selection-table', + templateUrl: './selection-table.component.html', + styleUrls: ['./selection-table.component.scss'] +}) +export class SelectionTableComponent { + + displayedColumns: string[] = ['select', 'position', 'name', 'weight', 'symbol']; + dataSource = new MatTableDataSource(ELEMENT_DATA); + selection = new SelectionModel(true, []); + + /** Whether the number of selected elements matches the total number of rows. */ + isAllSelected() { + const numSelected = this.selection.selected.length; + const numRows = this.dataSource.data.length; + return numSelected === numRows; + } + + /** Selects all rows if they are not all selected; otherwise clear selection. */ + masterToggle() { + this.isAllSelected() ? + this.selection.clear() : + this.dataSource.data.forEach(row => this.selection.select(row)); + } + + /** The label for the checkbox on the passed row */ + checkboxLabel(row?: PeriodicElement): string { + if (!row) { + return `${this.isAllSelected() ? 'select' : 'deselect'} all`; + } + return `${this.selection.isSelected(row) ? 'deselect' : 'select'} row ${row.position + 1}`; + } + +} diff --git a/src/assets/examples/material/simple-autocomplete/simple-autocomplete.component.html b/src/assets/examples/material/simple-autocomplete/simple-autocomplete.component.html new file mode 100644 index 0000000..cfd6bdf --- /dev/null +++ b/src/assets/examples/material/simple-autocomplete/simple-autocomplete.component.html @@ -0,0 +1,10 @@ +
    + + + + + {{option}} + + + +
    diff --git a/src/assets/examples/material/simple-autocomplete/simple-autocomplete.component.scss b/src/assets/examples/material/simple-autocomplete/simple-autocomplete.component.scss new file mode 100644 index 0000000..9a473b4 --- /dev/null +++ b/src/assets/examples/material/simple-autocomplete/simple-autocomplete.component.scss @@ -0,0 +1,10 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; + } + + .example-full-width { + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/simple-autocomplete/simple-autocomplete.component.spec.ts b/src/assets/examples/material/simple-autocomplete/simple-autocomplete.component.spec.ts new file mode 100644 index 0000000..59ec075 --- /dev/null +++ b/src/assets/examples/material/simple-autocomplete/simple-autocomplete.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SimpleAutocompleteComponent } from './simple-autocomplete.component'; + +describe('SimpleAutocompleteComponent', () => { + let component: SimpleAutocompleteComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SimpleAutocompleteComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SimpleAutocompleteComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/simple-autocomplete/simple-autocomplete.component.ts b/src/assets/examples/material/simple-autocomplete/simple-autocomplete.component.ts new file mode 100644 index 0000000..f5ebfaf --- /dev/null +++ b/src/assets/examples/material/simple-autocomplete/simple-autocomplete.component.ts @@ -0,0 +1,19 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl} from '@angular/forms'; + +@Component({ + selector: 'app-simple-autocomplete', + templateUrl: './simple-autocomplete.component.html', + styleUrls: ['./simple-autocomplete.component.scss'] +}) +export class SimpleAutocompleteComponent implements OnInit { + + myControl = new FormControl(); + options: string[] = ['One', 'Two', 'Three']; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/simple-form-field/simple-form-field.component.html b/src/assets/examples/material/simple-form-field/simple-form-field.component.html new file mode 100644 index 0000000..6427e7d --- /dev/null +++ b/src/assets/examples/material/simple-form-field/simple-form-field.component.html @@ -0,0 +1,15 @@ +
    + + + + + + + + + + + Option + + +
    diff --git a/src/assets/examples/material/simple-form-field/simple-form-field.component.scss b/src/assets/examples/material/simple-form-field/simple-form-field.component.scss new file mode 100644 index 0000000..621f9a7 --- /dev/null +++ b/src/assets/examples/material/simple-form-field/simple-form-field.component.scss @@ -0,0 +1,9 @@ +.example-container { + display: flex; + flex-direction: column; + } + + .example-container > * { + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/simple-form-field/simple-form-field.component.spec.ts b/src/assets/examples/material/simple-form-field/simple-form-field.component.spec.ts new file mode 100644 index 0000000..42aab4c --- /dev/null +++ b/src/assets/examples/material/simple-form-field/simple-form-field.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SimpleFormFieldComponent } from './simple-form-field.component'; + +describe('SimpleFormFieldComponent', () => { + let component: SimpleFormFieldComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SimpleFormFieldComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SimpleFormFieldComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/simple-form-field/simple-form-field.component.ts b/src/assets/examples/material/simple-form-field/simple-form-field.component.ts new file mode 100644 index 0000000..857dee7 --- /dev/null +++ b/src/assets/examples/material/simple-form-field/simple-form-field.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-simple-form-field', + templateUrl: './simple-form-field.component.html', + styleUrls: ['./simple-form-field.component.scss'] +}) +export class SimpleFormFieldComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/slider/slider.component.html b/src/assets/examples/material/slider/slider.component.html new file mode 100644 index 0000000..8f3544a --- /dev/null +++ b/src/assets/examples/material/slider/slider.component.html @@ -0,0 +1,63 @@ + + +

    Slider configuration

    + +
    + + + + + + + + + + + + +
    + +
    + Show ticks + + Auto ticks + + + + +
    + +
    + Show thumb label +
    + +
    + Vertical + Inverted +
    + +
    + Disabled +
    + +
    +
    + + + +

    Result

    + + + +
    +
    diff --git a/src/assets/examples/material/slider/slider.component.scss b/src/assets/examples/material/slider/slider.component.scss new file mode 100644 index 0000000..cb7c641 --- /dev/null +++ b/src/assets/examples/material/slider/slider.component.scss @@ -0,0 +1,23 @@ +.example-h2 { + margin: 10px; + } + + .example-section { + display: flex; + align-content: center; + align-items: center; + height: 60px; + } + + .example-margin { + margin: 10px; + } + + .mat-slider-horizontal { + width: 300px; + } + + .mat-slider-vertical { + height: 300px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/slider/slider.component.spec.ts b/src/assets/examples/material/slider/slider.component.spec.ts new file mode 100644 index 0000000..3c3e069 --- /dev/null +++ b/src/assets/examples/material/slider/slider.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SliderComponent } from './slider.component'; + +describe('SliderComponent', () => { + let component: SliderComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SliderComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SliderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/slider/slider.component.ts b/src/assets/examples/material/slider/slider.component.ts new file mode 100644 index 0000000..d03fbcb --- /dev/null +++ b/src/assets/examples/material/slider/slider.component.ts @@ -0,0 +1,35 @@ +import { Component, OnInit } from '@angular/core'; +import {coerceNumberProperty} from '@angular/cdk/coercion'; + +@Component({ + selector: 'app-slider', + templateUrl: './slider.component.html', + styleUrls: ['./slider.component.scss'] +}) +export class SliderComponent implements OnInit { + + autoTicks = false; + disabled = false; + invert = false; + max = 100; + min = 0; + showTicks = false; + step = 1; + thumbLabel = false; + value = 0; + vertical = false; + + get tickInterval(): number | 'auto' { + return this.showTicks ? (this.autoTicks ? 'auto' : this._tickInterval) : 0; + } + set tickInterval(value) { + this._tickInterval = coerceNumberProperty(value); + } + private _tickInterval = 1; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/sorting-table/sorting-table.component.html b/src/assets/examples/material/sorting-table/sorting-table.component.html new file mode 100644 index 0000000..977bed0 --- /dev/null +++ b/src/assets/examples/material/sorting-table/sorting-table.component.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No. {{element.position}} Name {{element.name}} Weight {{element.weight}} Symbol {{element.symbol}}
    diff --git a/src/assets/examples/material/sorting-table/sorting-table.component.scss b/src/assets/examples/material/sorting-table/sorting-table.component.scss new file mode 100644 index 0000000..20f3b6e --- /dev/null +++ b/src/assets/examples/material/sorting-table/sorting-table.component.scss @@ -0,0 +1,8 @@ +table { + width: 100%; + } + + th.mat-sort-header-sorted { + color: black; + } + \ No newline at end of file diff --git a/src/assets/examples/material/sorting-table/sorting-table.component.spec.ts b/src/assets/examples/material/sorting-table/sorting-table.component.spec.ts new file mode 100644 index 0000000..c3cdf65 --- /dev/null +++ b/src/assets/examples/material/sorting-table/sorting-table.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SortingTableComponent } from './sorting-table.component'; + +describe('SortingTableComponent', () => { + let component: SortingTableComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SortingTableComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SortingTableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/sorting-table/sorting-table.component.ts b/src/assets/examples/material/sorting-table/sorting-table.component.ts new file mode 100644 index 0000000..22f382e --- /dev/null +++ b/src/assets/examples/material/sorting-table/sorting-table.component.ts @@ -0,0 +1,41 @@ +import {Component, OnInit, ViewChild} from '@angular/core'; +import { MatSort } from '@angular/material/sort'; +import { MatTableDataSource } from '@angular/material/table'; + +export interface PeriodicElement { + name: string; + position: number; + weight: number; + symbol: string; +} + +const ELEMENT_DATA: PeriodicElement[] = [ + {position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H'}, + {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'}, + {position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li'}, + {position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be'}, + {position: 5, name: 'Boron', weight: 10.811, symbol: 'B'}, + {position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C'}, + {position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N'}, + {position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O'}, + {position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F'}, + {position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne'}, +]; + +@Component({ + selector: 'app-sorting-table', + templateUrl: './sorting-table.component.html', + styleUrls: ['./sorting-table.component.scss'] +}) +export class SortingTableComponent implements OnInit { + + displayedColumns: string[] = ['position', 'name', 'weight', 'symbol']; + dataSource = new MatTableDataSource(ELEMENT_DATA); + + @ViewChild(MatSort) sort: MatSort; + + ngOnInit() { + this.dataSource.sort = this.sort; + } + +} diff --git a/src/assets/examples/material/stacked-chip/stacked-chip.component.html b/src/assets/examples/material/stacked-chip/stacked-chip.component.html new file mode 100644 index 0000000..be85e43 --- /dev/null +++ b/src/assets/examples/material/stacked-chip/stacked-chip.component.html @@ -0,0 +1,6 @@ + + + {{chip.name}} + + + \ No newline at end of file diff --git a/src/assets/examples/material/stacked-chip/stacked-chip.component.scss b/src/assets/examples/material/stacked-chip/stacked-chip.component.scss new file mode 100644 index 0000000..63548be --- /dev/null +++ b/src/assets/examples/material/stacked-chip/stacked-chip.component.scss @@ -0,0 +1,4 @@ +mat-chip { + max-width: 200px; + } + \ No newline at end of file diff --git a/src/assets/examples/material/stacked-chip/stacked-chip.component.spec.ts b/src/assets/examples/material/stacked-chip/stacked-chip.component.spec.ts new file mode 100644 index 0000000..2511fa6 --- /dev/null +++ b/src/assets/examples/material/stacked-chip/stacked-chip.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { StackedChipComponent } from './stacked-chip.component'; + +describe('StackedChipComponent', () => { + let component: StackedChipComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ StackedChipComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(StackedChipComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/stacked-chip/stacked-chip.component.ts b/src/assets/examples/material/stacked-chip/stacked-chip.component.ts new file mode 100644 index 0000000..e20c94c --- /dev/null +++ b/src/assets/examples/material/stacked-chip/stacked-chip.component.ts @@ -0,0 +1,23 @@ +import {Component} from '@angular/core'; +import {ThemePalette} from '@angular/material/core'; + +export interface ChipColor { + name: string; + color: ThemePalette; +} + +@Component({ + selector: 'app-stacked-chip', + templateUrl: './stacked-chip.component.html', + styleUrls: ['./stacked-chip.component.scss'] +}) +export class StackedChipComponent{ + + availableColors: ChipColor[] = [ + {name: 'none', color: undefined}, + {name: 'Primary', color: 'primary'}, + {name: 'Accent', color: 'accent'}, + {name: 'Warn', color: 'warn'} + ]; + +} diff --git a/src/assets/examples/material/start-date-datepicker/start-date-datepicker.component.html b/src/assets/examples/material/start-date-datepicker/start-date-datepicker.component.html new file mode 100644 index 0000000..e10afca --- /dev/null +++ b/src/assets/examples/material/start-date-datepicker/start-date-datepicker.component.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/examples/material/start-date-datepicker/start-date-datepicker.component.scss b/src/assets/examples/material/start-date-datepicker/start-date-datepicker.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/start-date-datepicker/start-date-datepicker.component.spec.ts b/src/assets/examples/material/start-date-datepicker/start-date-datepicker.component.spec.ts new file mode 100644 index 0000000..2f4825a --- /dev/null +++ b/src/assets/examples/material/start-date-datepicker/start-date-datepicker.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { StartDateDatepickerComponent } from './start-date-datepicker.component'; + +describe('StartDateDatepickerComponent', () => { + let component: StartDateDatepickerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ StartDateDatepickerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(StartDateDatepickerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/start-date-datepicker/start-date-datepicker.component.ts b/src/assets/examples/material/start-date-datepicker/start-date-datepicker.component.ts new file mode 100644 index 0000000..16f4307 --- /dev/null +++ b/src/assets/examples/material/start-date-datepicker/start-date-datepicker.component.ts @@ -0,0 +1,17 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-start-date-datepicker', + templateUrl: './start-date-datepicker.component.html', + styleUrls: ['./start-date-datepicker.component.scss'] +}) +export class StartDateDatepickerComponent implements OnInit { + + startDate = new Date(1990, 0, 1); + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/sticky-column-table/sticky-column-table.component.html b/src/assets/examples/material/sticky-column-table/sticky-column-table.component.html new file mode 100644 index 0000000..73b460f --- /dev/null +++ b/src/assets/examples/material/sticky-column-table/sticky-column-table.component.html @@ -0,0 +1,39 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Name {{element.name}} No. {{element.position}} Weight {{element.weight}} Symbol {{element.symbol}} + more_vert +
    +
    diff --git a/src/assets/examples/material/sticky-column-table/sticky-column-table.component.scss b/src/assets/examples/material/sticky-column-table/sticky-column-table.component.scss new file mode 100644 index 0000000..e8559e7 --- /dev/null +++ b/src/assets/examples/material/sticky-column-table/sticky-column-table.component.scss @@ -0,0 +1,27 @@ +.example-container { + height: 400px; + width: 550px; + overflow: auto; + } + + table { + width: 800px; + } + + td.mat-column-star { + width: 20px; + padding-right: 8px; + } + + th.mat-column-position, td.mat-column-position { + padding-left: 8px; + } + + .mat-table-sticky:first-child { + border-right: 1px solid #e0e0e0; + } + + .mat-table-sticky:last-child { + border-left: 1px solid #e0e0e0; + } + \ No newline at end of file diff --git a/src/assets/examples/material/sticky-column-table/sticky-column-table.component.spec.ts b/src/assets/examples/material/sticky-column-table/sticky-column-table.component.spec.ts new file mode 100644 index 0000000..c1340f3 --- /dev/null +++ b/src/assets/examples/material/sticky-column-table/sticky-column-table.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { StickyColumnTableComponent } from './sticky-column-table.component'; + +describe('StickyColumnTableComponent', () => { + let component: StickyColumnTableComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ StickyColumnTableComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(StickyColumnTableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/sticky-column-table/sticky-column-table.component.ts b/src/assets/examples/material/sticky-column-table/sticky-column-table.component.ts new file mode 100644 index 0000000..adfeaa1 --- /dev/null +++ b/src/assets/examples/material/sticky-column-table/sticky-column-table.component.ts @@ -0,0 +1,44 @@ +import { Component, OnInit } from "@angular/core"; + +export interface PeriodicElement { + name: string; + position: number; + weight: number; + symbol: string; +} + +const ELEMENT_DATA: PeriodicElement[] = [ + { position: 1, name: "Hydrogen", weight: 1.0079, symbol: "H" }, + { position: 2, name: "Helium", weight: 4.0026, symbol: "He" }, + { position: 3, name: "Lithium", weight: 6.941, symbol: "Li" }, + { position: 4, name: "Beryllium", weight: 9.0122, symbol: "Be" }, + { position: 5, name: "Boron", weight: 10.811, symbol: "B" }, + { position: 6, name: "Carbon", weight: 12.0107, symbol: "C" }, + { position: 7, name: "Nitrogen", weight: 14.0067, symbol: "N" }, + { position: 8, name: "Oxygen", weight: 15.9994, symbol: "O" }, + { position: 9, name: "Fluorine", weight: 18.9984, symbol: "F" }, + { position: 10, name: "Neon", weight: 20.1797, symbol: "Ne" } +]; + +@Component({ + selector: "app-sticky-column-table", + templateUrl: "./sticky-column-table.component.html", + styleUrls: ["./sticky-column-table.component.scss"] +}) +export class StickyColumnTableComponent implements OnInit { + displayedColumns = [ + "name", + "position", + "weight", + "symbol", + "position", + "weight", + "symbol", + "star" + ]; + dataSource = ELEMENT_DATA; + + constructor() {} + + ngOnInit() {} +} diff --git a/src/assets/examples/material/sticky-footer-table/sticky-footer-table.component.html b/src/assets/examples/material/sticky-footer-table/sticky-footer-table.component.html new file mode 100644 index 0000000..c8c7557 --- /dev/null +++ b/src/assets/examples/material/sticky-footer-table/sticky-footer-table.component.html @@ -0,0 +1,21 @@ +
    + + + + + + + + + + + + + + + + + + +
    Item {{transaction.item}} Total Cost {{transaction.cost | currency}} {{getTotalCost() | currency}}
    +
    diff --git a/src/assets/examples/material/sticky-footer-table/sticky-footer-table.component.scss b/src/assets/examples/material/sticky-footer-table/sticky-footer-table.component.scss new file mode 100644 index 0000000..dd960d8 --- /dev/null +++ b/src/assets/examples/material/sticky-footer-table/sticky-footer-table.component.scss @@ -0,0 +1,17 @@ +.example-container { + height: 270px; + overflow: auto; + } + + table { + width: 100%; + } + + tr.mat-footer-row { + font-weight: bold; + } + + .mat-table-sticky { + border-top: 1px solid #e0e0e0; + } + \ No newline at end of file diff --git a/src/assets/examples/material/sticky-footer-table/sticky-footer-table.component.spec.ts b/src/assets/examples/material/sticky-footer-table/sticky-footer-table.component.spec.ts new file mode 100644 index 0000000..063ac40 --- /dev/null +++ b/src/assets/examples/material/sticky-footer-table/sticky-footer-table.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { StickyFooterTableComponent } from './sticky-footer-table.component'; + +describe('StickyFooterTableComponent', () => { + let component: StickyFooterTableComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ StickyFooterTableComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(StickyFooterTableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/sticky-footer-table/sticky-footer-table.component.ts b/src/assets/examples/material/sticky-footer-table/sticky-footer-table.component.ts new file mode 100644 index 0000000..8a2f3cc --- /dev/null +++ b/src/assets/examples/material/sticky-footer-table/sticky-footer-table.component.ts @@ -0,0 +1,35 @@ +import { Component, OnInit } from '@angular/core'; + +export interface Transaction { + item: string; + cost: number; +} + +@Component({ + selector: 'app-sticky-footer-table', + templateUrl: './sticky-footer-table.component.html', + styleUrls: ['./sticky-footer-table.component.scss'] +}) +export class StickyFooterTableComponent implements OnInit { + + displayedColumns = ['item', 'cost']; + transactions: Transaction[] = [ + {item: 'Beach ball', cost: 4}, + {item: 'Towel', cost: 5}, + {item: 'Frisbee', cost: 2}, + {item: 'Sunscreen', cost: 4}, + {item: 'Cooler', cost: 25}, + {item: 'Swim suit', cost: 15}, + ]; + + /** Gets the total cost of all transactions. */ + getTotalCost() { + return this.transactions.map(t => t.cost).reduce((acc, value) => acc + value, 0); + } + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/sticky-header-table/sticky-header-table.component.html b/src/assets/examples/material/sticky-header-table/sticky-header-table.component.html new file mode 100644 index 0000000..ccf93e2 --- /dev/null +++ b/src/assets/examples/material/sticky-header-table/sticky-header-table.component.html @@ -0,0 +1,31 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No. {{element.position}} Name {{element.name}} Weight {{element.weight}} Symbol {{element.symbol}}
    +
    \ No newline at end of file diff --git a/src/assets/examples/material/sticky-header-table/sticky-header-table.component.scss b/src/assets/examples/material/sticky-header-table/sticky-header-table.component.scss new file mode 100644 index 0000000..ad125b6 --- /dev/null +++ b/src/assets/examples/material/sticky-header-table/sticky-header-table.component.scss @@ -0,0 +1,9 @@ +.example-container { + height: 400px; + overflow: auto; + } + + table { + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/sticky-header-table/sticky-header-table.component.spec.ts b/src/assets/examples/material/sticky-header-table/sticky-header-table.component.spec.ts new file mode 100644 index 0000000..0f52a89 --- /dev/null +++ b/src/assets/examples/material/sticky-header-table/sticky-header-table.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { StickyHeaderTableComponent } from './sticky-header-table.component'; + +describe('StickyHeaderTableComponent', () => { + let component: StickyHeaderTableComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ StickyHeaderTableComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(StickyHeaderTableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/sticky-header-table/sticky-header-table.component.ts b/src/assets/examples/material/sticky-header-table/sticky-header-table.component.ts new file mode 100644 index 0000000..709a9c4 --- /dev/null +++ b/src/assets/examples/material/sticky-header-table/sticky-header-table.component.ts @@ -0,0 +1,38 @@ +import { Component, OnInit } from '@angular/core'; + +export interface PeriodicElement { + name: string; + position: number; + weight: number; + symbol: string; +} + +const ELEMENT_DATA: PeriodicElement[] = [ + {position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H'}, + {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'}, + {position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li'}, + {position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be'}, + {position: 5, name: 'Boron', weight: 10.811, symbol: 'B'}, + {position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C'}, + {position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N'}, + {position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O'}, + {position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F'}, + {position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne'}, +]; + +@Component({ + selector: 'app-sticky-header-table', + templateUrl: './sticky-header-table.component.html', + styleUrls: ['./sticky-header-table.component.scss'] +}) +export class StickyHeaderTableComponent implements OnInit { + + displayedColumns = ['position', 'name', 'weight', 'symbol']; + dataSource = ELEMENT_DATA; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/suffix-prefix-input/suffix-prefix-input.component.html b/src/assets/examples/material/suffix-prefix-input/suffix-prefix-input.component.html new file mode 100644 index 0000000..7bff7e4 --- /dev/null +++ b/src/assets/examples/material/suffix-prefix-input/suffix-prefix-input.component.html @@ -0,0 +1,9 @@ +
    + + + +1   + + mode_edit + + +
    diff --git a/src/assets/examples/material/suffix-prefix-input/suffix-prefix-input.component.scss b/src/assets/examples/material/suffix-prefix-input/suffix-prefix-input.component.scss new file mode 100644 index 0000000..9a473b4 --- /dev/null +++ b/src/assets/examples/material/suffix-prefix-input/suffix-prefix-input.component.scss @@ -0,0 +1,10 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; + } + + .example-full-width { + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/suffix-prefix-input/suffix-prefix-input.component.spec.ts b/src/assets/examples/material/suffix-prefix-input/suffix-prefix-input.component.spec.ts new file mode 100644 index 0000000..3f51751 --- /dev/null +++ b/src/assets/examples/material/suffix-prefix-input/suffix-prefix-input.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SuffixPrefixInputComponent } from './suffix-prefix-input.component'; + +describe('SuffixPrefixInputComponent', () => { + let component: SuffixPrefixInputComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SuffixPrefixInputComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SuffixPrefixInputComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/suffix-prefix-input/suffix-prefix-input.component.ts b/src/assets/examples/material/suffix-prefix-input/suffix-prefix-input.component.ts new file mode 100644 index 0000000..c385f11 --- /dev/null +++ b/src/assets/examples/material/suffix-prefix-input/suffix-prefix-input.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-suffix-prefix-input', + templateUrl: './suffix-prefix-input.component.html', + styleUrls: ['./suffix-prefix-input.component.scss'] +}) +export class SuffixPrefixInputComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/svg-icon/svg-icon.component.html b/src/assets/examples/material/svg-icon/svg-icon.component.html new file mode 100644 index 0000000..1559771 --- /dev/null +++ b/src/assets/examples/material/svg-icon/svg-icon.component.html @@ -0,0 +1 @@ + diff --git a/src/assets/examples/material/svg-icon/svg-icon.component.scss b/src/assets/examples/material/svg-icon/svg-icon.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/svg-icon/svg-icon.component.spec.ts b/src/assets/examples/material/svg-icon/svg-icon.component.spec.ts new file mode 100644 index 0000000..768ee2b --- /dev/null +++ b/src/assets/examples/material/svg-icon/svg-icon.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SvgIconComponent } from './svg-icon.component'; + +describe('SvgIconComponent', () => { + let component: SvgIconComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SvgIconComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SvgIconComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/svg-icon/svg-icon.component.ts b/src/assets/examples/material/svg-icon/svg-icon.component.ts new file mode 100644 index 0000000..e332927 --- /dev/null +++ b/src/assets/examples/material/svg-icon/svg-icon.component.ts @@ -0,0 +1,21 @@ +import { Component, OnInit } from '@angular/core'; +import {DomSanitizer} from '@angular/platform-browser'; +import { MatIconRegistry } from '@angular/material/icon'; + +@Component({ + selector: 'app-svg-icon', + templateUrl: './svg-icon.component.html', + styleUrls: ['./svg-icon.component.scss'] +}) +export class SvgIconComponent implements OnInit { + + constructor(iconRegistry: MatIconRegistry, sanitizer: DomSanitizer) { + iconRegistry.addSvgIcon( + 'thumbs-up', + sanitizer.bypassSecurityTrustResourceUrl('./assets/images/svgIconExample.svg')); + } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/table-sorting/table-sorting.component.html b/src/assets/examples/material/table-sorting/table-sorting.component.html new file mode 100644 index 0000000..977bed0 --- /dev/null +++ b/src/assets/examples/material/table-sorting/table-sorting.component.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No. {{element.position}} Name {{element.name}} Weight {{element.weight}} Symbol {{element.symbol}}
    diff --git a/src/assets/examples/material/table-sorting/table-sorting.component.scss b/src/assets/examples/material/table-sorting/table-sorting.component.scss new file mode 100644 index 0000000..20f3b6e --- /dev/null +++ b/src/assets/examples/material/table-sorting/table-sorting.component.scss @@ -0,0 +1,8 @@ +table { + width: 100%; + } + + th.mat-sort-header-sorted { + color: black; + } + \ No newline at end of file diff --git a/src/assets/examples/material/table-sorting/table-sorting.component.spec.ts b/src/assets/examples/material/table-sorting/table-sorting.component.spec.ts new file mode 100644 index 0000000..8cf153f --- /dev/null +++ b/src/assets/examples/material/table-sorting/table-sorting.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TableSortingComponent } from './table-sorting.component'; + +describe('TableSortingComponent', () => { + let component: TableSortingComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TableSortingComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TableSortingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/table-sorting/table-sorting.component.ts b/src/assets/examples/material/table-sorting/table-sorting.component.ts new file mode 100644 index 0000000..8ecb9be --- /dev/null +++ b/src/assets/examples/material/table-sorting/table-sorting.component.ts @@ -0,0 +1,41 @@ +import {Component, OnInit, ViewChild} from '@angular/core'; +import { MatSort } from '@angular/material/sort'; +import { MatTableDataSource } from '@angular/material/table'; + +export interface PeriodicElement { + name: string; + position: number; + weight: number; + symbol: string; +} + +const ELEMENT_DATA: PeriodicElement[] = [ + {position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H'}, + {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'}, + {position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li'}, + {position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be'}, + {position: 5, name: 'Boron', weight: 10.811, symbol: 'B'}, + {position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C'}, + {position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N'}, + {position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O'}, + {position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F'}, + {position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne'}, +]; + +@Component({ + selector: 'app-table-sorting', + templateUrl: './table-sorting.component.html', + styleUrls: ['./table-sorting.component.scss'] +}) +export class TableSortingComponent implements OnInit { + + displayedColumns: string[] = ['position', 'name', 'weight', 'symbol']; + dataSource = new MatTableDataSource(ELEMENT_DATA); + + @ViewChild(MatSort) sort: MatSort; + + ngOnInit() { + this.dataSource.sort = this.sort; + } + +} diff --git a/src/assets/examples/material/theming-form-field/theming-form-field.component.html b/src/assets/examples/material/theming-form-field/theming-form-field.component.html new file mode 100644 index 0000000..5c61418 --- /dev/null +++ b/src/assets/examples/material/theming-form-field/theming-form-field.component.html @@ -0,0 +1,14 @@ +
    + + + Primary + Accent + Warn + + + + + + Min size: 10px + +
    diff --git a/src/assets/examples/material/theming-form-field/theming-form-field.component.scss b/src/assets/examples/material/theming-form-field/theming-form-field.component.scss new file mode 100644 index 0000000..621f9a7 --- /dev/null +++ b/src/assets/examples/material/theming-form-field/theming-form-field.component.scss @@ -0,0 +1,9 @@ +.example-container { + display: flex; + flex-direction: column; + } + + .example-container > * { + width: 100%; + } + \ No newline at end of file diff --git a/src/assets/examples/material/theming-form-field/theming-form-field.component.spec.ts b/src/assets/examples/material/theming-form-field/theming-form-field.component.spec.ts new file mode 100644 index 0000000..111dd6d --- /dev/null +++ b/src/assets/examples/material/theming-form-field/theming-form-field.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ThemingFormFieldComponent } from './theming-form-field.component'; + +describe('ThemingFormFieldComponent', () => { + let component: ThemingFormFieldComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ThemingFormFieldComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ThemingFormFieldComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/theming-form-field/theming-form-field.component.ts b/src/assets/examples/material/theming-form-field/theming-form-field.component.ts new file mode 100644 index 0000000..6521ebc --- /dev/null +++ b/src/assets/examples/material/theming-form-field/theming-form-field.component.ts @@ -0,0 +1,27 @@ +import { Component, OnInit } from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; + +@Component({ + selector: 'app-theming-form-field', + templateUrl: './theming-form-field.component.html', + styleUrls: ['./theming-form-field.component.scss'] +}) +export class ThemingFormFieldComponent implements OnInit { + + options: FormGroup; + + constructor(fb: FormBuilder) { + this.options = fb.group({ + color: 'primary', + fontSize: [16, Validators.min(10)], + }); + } + + getFontSize() { + return Math.max(10, this.options.value.fontSize); + } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/touch-datepicker/touch-datepicker.component.html b/src/assets/examples/material/touch-datepicker/touch-datepicker.component.html new file mode 100644 index 0000000..70a7e61 --- /dev/null +++ b/src/assets/examples/material/touch-datepicker/touch-datepicker.component.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/examples/material/touch-datepicker/touch-datepicker.component.scss b/src/assets/examples/material/touch-datepicker/touch-datepicker.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/touch-datepicker/touch-datepicker.component.spec.ts b/src/assets/examples/material/touch-datepicker/touch-datepicker.component.spec.ts new file mode 100644 index 0000000..7ba021a --- /dev/null +++ b/src/assets/examples/material/touch-datepicker/touch-datepicker.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TouchDatepickerComponent } from './touch-datepicker.component'; + +describe('TouchDatepickerComponent', () => { + let component: TouchDatepickerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TouchDatepickerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TouchDatepickerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/touch-datepicker/touch-datepicker.component.ts b/src/assets/examples/material/touch-datepicker/touch-datepicker.component.ts new file mode 100644 index 0000000..d525de9 --- /dev/null +++ b/src/assets/examples/material/touch-datepicker/touch-datepicker.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-touch-datepicker', + templateUrl: './touch-datepicker.component.html', + styleUrls: ['./touch-datepicker.component.scss'] +}) +export class TouchDatepickerComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/trigger-select/trigger-select.component.html b/src/assets/examples/material/trigger-select/trigger-select.component.html new file mode 100644 index 0000000..9c6f896 --- /dev/null +++ b/src/assets/examples/material/trigger-select/trigger-select.component.html @@ -0,0 +1,11 @@ + + + + {{toppings.value ? toppings.value[0] : ''}} + + (+{{toppings.value.length - 1}} {{toppings.value?.length === 2 ? 'other' : 'others'}}) + + + {{topping}} + + diff --git a/src/assets/examples/material/trigger-select/trigger-select.component.scss b/src/assets/examples/material/trigger-select/trigger-select.component.scss new file mode 100644 index 0000000..19ed971 --- /dev/null +++ b/src/assets/examples/material/trigger-select/trigger-select.component.scss @@ -0,0 +1,5 @@ +.example-additional-selection { + opacity: 0.75; + font-size: 0.75em; + } + \ No newline at end of file diff --git a/src/assets/examples/material/trigger-select/trigger-select.component.spec.ts b/src/assets/examples/material/trigger-select/trigger-select.component.spec.ts new file mode 100644 index 0000000..4211f8b --- /dev/null +++ b/src/assets/examples/material/trigger-select/trigger-select.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TriggerSelectComponent } from './trigger-select.component'; + +describe('TriggerSelectComponent', () => { + let component: TriggerSelectComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TriggerSelectComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TriggerSelectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/trigger-select/trigger-select.component.ts b/src/assets/examples/material/trigger-select/trigger-select.component.ts new file mode 100644 index 0000000..86062fa --- /dev/null +++ b/src/assets/examples/material/trigger-select/trigger-select.component.ts @@ -0,0 +1,20 @@ +import { Component, OnInit } from '@angular/core'; +import {FormControl} from '@angular/forms'; + +@Component({ + selector: 'app-trigger-select', + templateUrl: './trigger-select.component.html', + styleUrls: ['./trigger-select.component.scss'] +}) +export class TriggerSelectComponent implements OnInit { + + toppings = new FormControl(); + + toppingList: string[] = ['Extra cheese', 'Mushroom', 'Onion', 'Pepperoni', 'Sausage', 'Tomato']; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/two-sidenav/two-sidenav.component.html b/src/assets/examples/material/two-sidenav/two-sidenav.component.html new file mode 100644 index 0000000..308ac10 --- /dev/null +++ b/src/assets/examples/material/two-sidenav/two-sidenav.component.html @@ -0,0 +1,5 @@ + + Start content + End content + Implicit main content + diff --git a/src/assets/examples/material/two-sidenav/two-sidenav.component.scss b/src/assets/examples/material/two-sidenav/two-sidenav.component.scss new file mode 100644 index 0000000..afacdb8 --- /dev/null +++ b/src/assets/examples/material/two-sidenav/two-sidenav.component.scss @@ -0,0 +1,8 @@ +.example-container { + // position: absolute; + // top: 0; + // bottom: 0; + // left: 0; + // right: 0; + } + \ No newline at end of file diff --git a/src/assets/examples/material/two-sidenav/two-sidenav.component.spec.ts b/src/assets/examples/material/two-sidenav/two-sidenav.component.spec.ts new file mode 100644 index 0000000..b457aba --- /dev/null +++ b/src/assets/examples/material/two-sidenav/two-sidenav.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TwoSidenavComponent } from './two-sidenav.component'; + +describe('TwoSidenavComponent', () => { + let component: TwoSidenavComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TwoSidenavComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TwoSidenavComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/two-sidenav/two-sidenav.component.ts b/src/assets/examples/material/two-sidenav/two-sidenav.component.ts new file mode 100644 index 0000000..965e4ad --- /dev/null +++ b/src/assets/examples/material/two-sidenav/two-sidenav.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-two-sidenav', + templateUrl: './two-sidenav.component.html', + styleUrls: ['./two-sidenav.component.scss'] +}) +export class TwoSidenavComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/two-way-binding-select/two-way-binding-select.component.html b/src/assets/examples/material/two-way-binding-select/two-way-binding-select.component.html new file mode 100644 index 0000000..f8d0566 --- /dev/null +++ b/src/assets/examples/material/two-way-binding-select/two-way-binding-select.component.html @@ -0,0 +1,14 @@ +

    + two-way-binding-select works! +

    + + Select an option + + None + Option 1 + Option 2 + Option 3 + + + +

    You selected: {{selected}}

    diff --git a/src/assets/examples/material/two-way-binding-select/two-way-binding-select.component.scss b/src/assets/examples/material/two-way-binding-select/two-way-binding-select.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/two-way-binding-select/two-way-binding-select.component.spec.ts b/src/assets/examples/material/two-way-binding-select/two-way-binding-select.component.spec.ts new file mode 100644 index 0000000..748e99b --- /dev/null +++ b/src/assets/examples/material/two-way-binding-select/two-way-binding-select.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TwoWayBindingSelectComponent } from './two-way-binding-select.component'; + +describe('TwoWayBindingSelectComponent', () => { + let component: TwoWayBindingSelectComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TwoWayBindingSelectComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TwoWayBindingSelectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/two-way-binding-select/two-way-binding-select.component.ts b/src/assets/examples/material/two-way-binding-select/two-way-binding-select.component.ts new file mode 100644 index 0000000..4426b21 --- /dev/null +++ b/src/assets/examples/material/two-way-binding-select/two-way-binding-select.component.ts @@ -0,0 +1,17 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-two-way-binding-select', + templateUrl: './two-way-binding-select.component.html', + styleUrls: ['./two-way-binding-select.component.scss'] +}) +export class TwoWayBindingSelectComponent implements OnInit { + + selected = 'option2'; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/assets/examples/material/vertical-stepper/vertical-stepper.component.html b/src/assets/examples/material/vertical-stepper/vertical-stepper.component.html new file mode 100644 index 0000000..422e28d --- /dev/null +++ b/src/assets/examples/material/vertical-stepper/vertical-stepper.component.html @@ -0,0 +1,36 @@ + + + +
    + Fill out your name + + + +
    + +
    +
    +
    + +
    + Fill out your address + + + +
    + + +
    +
    +
    + + Done + You are now done. +
    + + +
    +
    +
    diff --git a/src/assets/examples/material/vertical-stepper/vertical-stepper.component.scss b/src/assets/examples/material/vertical-stepper/vertical-stepper.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/examples/material/vertical-stepper/vertical-stepper.component.spec.ts b/src/assets/examples/material/vertical-stepper/vertical-stepper.component.spec.ts new file mode 100644 index 0000000..9ecce5e --- /dev/null +++ b/src/assets/examples/material/vertical-stepper/vertical-stepper.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VerticalStepperComponent } from './vertical-stepper.component'; + +describe('VerticalStepperComponent', () => { + let component: VerticalStepperComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ VerticalStepperComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(VerticalStepperComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/assets/examples/material/vertical-stepper/vertical-stepper.component.ts b/src/assets/examples/material/vertical-stepper/vertical-stepper.component.ts new file mode 100644 index 0000000..cd9c162 --- /dev/null +++ b/src/assets/examples/material/vertical-stepper/vertical-stepper.component.ts @@ -0,0 +1,26 @@ +import {Component, OnInit} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; + +@Component({ + selector: 'app-vertical-stepper', + templateUrl: './vertical-stepper.component.html', + styleUrls: ['./vertical-stepper.component.scss'] +}) +export class VerticalStepperComponent implements OnInit { + + isLinear = false; + firstFormGroup: FormGroup; + secondFormGroup: FormGroup; + + constructor(private _formBuilder: FormBuilder) {} + + ngOnInit() { + this.firstFormGroup = this._formBuilder.group({ + firstCtrl: ['', Validators.required] + }); + this.secondFormGroup = this._formBuilder.group({ + secondCtrl: ['', Validators.required] + }); + } + +} diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json new file mode 100644 index 0000000..5e3b601 --- /dev/null +++ b/src/assets/i18n/en.json @@ -0,0 +1,78 @@ +{ + "DASHBOARD": "Dashboard", + "APPS": "Apps", + "INBOX": "Inbox", + "CHAT": "Chat", + "CALENDAR": "Calendar", + "DIALOGS": "Dialogs", + "CONFIRM": "Confirm", + "LOADER": "Loader", + + "MATERIAL": "Material", + "BUTTONS": "Buttons", + "CARDS": "Cards", + "SELECT": "Select", + "AUTOCOMPLETE": "Autocomplete", + "INPUT": "Input", + "CHECKBOX": "Checkbox", + "DATEPICKER": "Datepicker", + "RADIO": "Radio", + "TOOLBAR": "Toolbar", + "LISTS": "Lists", + "GRIDS": "Grids", + "PROGRESS": "Progress", + "TABS": "Tabs", + "SWITCH": "Switch", + "TOOLTIP": "Tooltip", + "MENU": "Menu", + "MEMBER": "Member", + "SAVE": "Save", + "SLIDER": "Slider", + "SNACKBAR": "Snackbar", + + "FORMS": "Forms", + "EDITOR": "Editor", + "BASIC": "Basic", + "UPLOAD": "Upload", + "WIZARD": "Wizard", + + "TABLES": "Tables", + "TOUR": "Tour", + "FULLSCREEN": "Fullscreen", + "PAGING": "Paging", + "FILTER": "Filter", + + "MAP": "Map", + "CHARTS": "Charts", + "DND": "Drag and Drop", + + "PAGES": "Pages", + "SESSIONS": "Sessions", + "SIGNIN": "Signin", + "SIGNUP": "Signup", + "FORGOT": "Forgot", + "LOCKSCREEN": "Lockscreen", + + "OTHERS": "Others", + "GALLERY": "Gallery", + "PRICINGS": "Pricings", + "USERS": "Users", + "PROFILE": "Profile", + "BLANK": "Blank", + "MATICONS": "Material Icons", + "ADD": "Add", + "ITEM": "Item", + "SUBITEM": "Subitem", + "DOC": "Documentation", + "NOTFOUND": "Not Found", + "ERROR": "Error", + "OVERVIEW": "Overview", + "SETTINGS": "Settings", + + "ECOMMERCE": "Ecommerce", + "SHOP": "Shop", + "PRODUCTS": "Products", + "PRODUCT DETAILS": "Product Details", + "CART": "Cart", + "CHECKOUT": "Checkout" +} \ No newline at end of file diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json new file mode 100644 index 0000000..fdf0099 --- /dev/null +++ b/src/assets/i18n/es.json @@ -0,0 +1,78 @@ +{ + "DASHBOARD": "Tablero", + "APPS": "Apps", + "INBOX": "Mensaje", + "CHAT": "Charla", + "CALENDAR": "Calendario", + "DIALOGS": "Diálogo", + "CONFIRM": "Confirmar", + "LOADER": "Loader", + + "MEMBER": "Miembro", + "MATERIAL": "Material", + "BUTTONS": "Botones", + "CARDS": "Tarjeta", + "SELECT": "Seleccionar", + "AUTOCOMPLETE": "Autocomplete", + "INPUT": "Entrada", + "CHECKBOX": "Checkbox", + "DATEPICKER": "Datepicker", + "RADIO": "Radio", + "TOOLBAR": "Toolbar", + "LISTS": "lista", + "GRIDS": "Grids", + "PROGRESS": "Progreso", + "TABS": "Tabs", + "SWITCH": "Cambio", + "TOOLTIP": "Tooltip", + "MENU": "Menú", + "SAVE": "Salvar", + "SLIDER": "Slider", + "SNACKBAR": "Snackbar", + + "FORMS": "Formularios", + "EDITOR": "Editor", + "BASIC": "Sencillo", + "UPLOAD": "Upload", + "WIZARD": "paso a paso", + + "TABLES": "Mesas", + "FULLSCREEN": "Pantalla Completa", + "PAGING": "Paging", + "FILTER": "Filtrar", + + "MAP": "Mapa", + "CHARTS": "Gráfico", + "DND": "Arrastrar y soltar", + + "PAGES": "Página", + "TOUR": "Gira", + "SESSIONS": "Sesiones", + "SIGNIN": "Registrarse", + "SIGNUP": "Regístrate", + "FORGOT": "Forgot", + "LOCKSCREEN": "Lockscreen", + + "OTHERS": "Otros", + "GALLERY": "Gallery", + "PRICINGS": "Pricings", + "USERS": "Users", + "PROFILE": "Perfil", + "BLANK": "Blank", + "MATICONS": "Material Iconos", + "ADD": "Añadir", + "ITEM": "ít.", + "SUBITEM": "Subitem", + "DOC": "Documentación", + "NOTFOUND": "Perdió", + "ERROR": "Error", + "OVERVIEW": "Resumen", + "SETTINGS": "Ajustes", + + "ECOMMERCE": "Ecommerce", + "SHOP": "Shop", + "PRODUCTS": "Products", + "PRODUCT DETAILS": "Product Details", + "CART": "Cart", + "CHECKOUT": "Checkout" +} \ No newline at end of file diff --git a/src/assets/images/5-star.png b/src/assets/images/5-star.png new file mode 100644 index 0000000..324a884 Binary files /dev/null and b/src/assets/images/5-star.png differ diff --git a/src/assets/images/UI-Lib-dummy.svg b/src/assets/images/UI-Lib-dummy.svg new file mode 100644 index 0000000..8c7e0d2 --- /dev/null +++ b/src/assets/images/UI-Lib-dummy.svg @@ -0,0 +1,36 @@ + + + + + background + + + + + + + Layer 1 + + + + background + + + + + + + Layer 1 + + + UI-Lib + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/backgrounds/card-coffee-cup.jpg b/src/assets/images/backgrounds/card-coffee-cup.jpg new file mode 100644 index 0000000..63bef18 Binary files /dev/null and b/src/assets/images/backgrounds/card-coffee-cup.jpg differ diff --git a/src/assets/images/backgrounds/fancy-twilight.jpg b/src/assets/images/backgrounds/fancy-twilight.jpg new file mode 100644 index 0000000..f94c9c7 Binary files /dev/null and b/src/assets/images/backgrounds/fancy-twilight.jpg differ diff --git a/src/assets/images/backgrounds/sea-twilight.jpg b/src/assets/images/backgrounds/sea-twilight.jpg new file mode 100644 index 0000000..603af0c Binary files /dev/null and b/src/assets/images/backgrounds/sea-twilight.jpg differ diff --git a/src/assets/images/backgrounds/trianglify-1.png b/src/assets/images/backgrounds/trianglify-1.png new file mode 100644 index 0000000..cfc857e Binary files /dev/null and b/src/assets/images/backgrounds/trianglify-1.png differ diff --git a/src/assets/images/backgrounds/trianglify-2.png b/src/assets/images/backgrounds/trianglify-2.png new file mode 100644 index 0000000..1249a34 Binary files /dev/null and b/src/assets/images/backgrounds/trianglify-2.png differ diff --git a/src/assets/images/backgrounds/trianglify-3.png b/src/assets/images/backgrounds/trianglify-3.png new file mode 100644 index 0000000..17c1b75 Binary files /dev/null and b/src/assets/images/backgrounds/trianglify-3.png differ diff --git a/src/assets/images/backgrounds/trianglify-4.png b/src/assets/images/backgrounds/trianglify-4.png new file mode 100644 index 0000000..901aebf Binary files /dev/null and b/src/assets/images/backgrounds/trianglify-4.png differ diff --git a/src/assets/images/backgrounds/waterfall.jpg b/src/assets/images/backgrounds/waterfall.jpg new file mode 100644 index 0000000..bcbb812 Binary files /dev/null and b/src/assets/images/backgrounds/waterfall.jpg differ diff --git a/src/assets/images/badges/badge-1.svg b/src/assets/images/badges/badge-1.svg new file mode 100644 index 0000000..e28abb1 --- /dev/null +++ b/src/assets/images/badges/badge-1.svg @@ -0,0 +1,94 @@ + + + + Group + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/badges/badge-2.svg b/src/assets/images/badges/badge-2.svg new file mode 100644 index 0000000..da9c95d --- /dev/null +++ b/src/assets/images/badges/badge-2.svg @@ -0,0 +1,27 @@ + + + + Group 5 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/badges/badge-3.svg b/src/assets/images/badges/badge-3.svg new file mode 100644 index 0000000..5adb75d --- /dev/null +++ b/src/assets/images/badges/badge-3.svg @@ -0,0 +1,38 @@ + + + + Group 6 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/badges/badge-4.svg b/src/assets/images/badges/badge-4.svg new file mode 100644 index 0000000..fef1b50 --- /dev/null +++ b/src/assets/images/badges/badge-4.svg @@ -0,0 +1,89 @@ + + + + Group 4 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/badges/badge-5.svg b/src/assets/images/badges/badge-5.svg new file mode 100644 index 0000000..eae5f4c --- /dev/null +++ b/src/assets/images/badges/badge-5.svg @@ -0,0 +1,22 @@ + + + + Group 2 + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/badges/badge-6.svg b/src/assets/images/badges/badge-6.svg new file mode 100644 index 0000000..fec4ad7 --- /dev/null +++ b/src/assets/images/badges/badge-6.svg @@ -0,0 +1,80 @@ + + + + Group 3 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/badges/badge-7.svg b/src/assets/images/badges/badge-7.svg new file mode 100644 index 0000000..ffe5354 --- /dev/null +++ b/src/assets/images/badges/badge-7.svg @@ -0,0 +1,38 @@ + + + + Group 8 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/badges/badge-8.svg b/src/assets/images/badges/badge-8.svg new file mode 100644 index 0000000..c4e6f17 --- /dev/null +++ b/src/assets/images/badges/badge-8.svg @@ -0,0 +1,84 @@ + + + + Group 9 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/badges/badge-9.svg b/src/assets/images/badges/badge-9.svg new file mode 100644 index 0000000..f3b90e9 --- /dev/null +++ b/src/assets/images/badges/badge-9.svg @@ -0,0 +1,96 @@ + + + + Group 10 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/bg-2.jpg b/src/assets/images/bg-2.jpg new file mode 100644 index 0000000..5238878 Binary files /dev/null and b/src/assets/images/bg-2.jpg differ diff --git a/src/assets/images/cancel.png b/src/assets/images/cancel.png new file mode 100644 index 0000000..b584b2c Binary files /dev/null and b/src/assets/images/cancel.png differ diff --git a/src/assets/images/circles.png b/src/assets/images/circles.png new file mode 100644 index 0000000..18615e2 Binary files /dev/null and b/src/assets/images/circles.png differ diff --git a/src/assets/images/cryptocurrencies/ADA.png b/src/assets/images/cryptocurrencies/ADA.png new file mode 100644 index 0000000..9f8a494 Binary files /dev/null and b/src/assets/images/cryptocurrencies/ADA.png differ diff --git a/src/assets/images/cryptocurrencies/ADX.png b/src/assets/images/cryptocurrencies/ADX.png new file mode 100644 index 0000000..188600f Binary files /dev/null and b/src/assets/images/cryptocurrencies/ADX.png differ diff --git a/src/assets/images/cryptocurrencies/AE.png b/src/assets/images/cryptocurrencies/AE.png new file mode 100644 index 0000000..2bf0e5c Binary files /dev/null and b/src/assets/images/cryptocurrencies/AE.png differ diff --git a/src/assets/images/cryptocurrencies/ARDR.png b/src/assets/images/cryptocurrencies/ARDR.png new file mode 100644 index 0000000..e14cb5e Binary files /dev/null and b/src/assets/images/cryptocurrencies/ARDR.png differ diff --git a/src/assets/images/cryptocurrencies/ARK.png b/src/assets/images/cryptocurrencies/ARK.png new file mode 100644 index 0000000..b1f1460 Binary files /dev/null and b/src/assets/images/cryptocurrencies/ARK.png differ diff --git a/src/assets/images/cryptocurrencies/BAT.png b/src/assets/images/cryptocurrencies/BAT.png new file mode 100644 index 0000000..3c8d392 Binary files /dev/null and b/src/assets/images/cryptocurrencies/BAT.png differ diff --git a/src/assets/images/cryptocurrencies/BCC.png b/src/assets/images/cryptocurrencies/BCC.png new file mode 100644 index 0000000..03dd680 Binary files /dev/null and b/src/assets/images/cryptocurrencies/BCC.png differ diff --git a/src/assets/images/cryptocurrencies/BCH.png b/src/assets/images/cryptocurrencies/BCH.png new file mode 100644 index 0000000..31ffb49 Binary files /dev/null and b/src/assets/images/cryptocurrencies/BCH.png differ diff --git a/src/assets/images/cryptocurrencies/BCN.png b/src/assets/images/cryptocurrencies/BCN.png new file mode 100644 index 0000000..63128d7 Binary files /dev/null and b/src/assets/images/cryptocurrencies/BCN.png differ diff --git a/src/assets/images/cryptocurrencies/BLOCK.png b/src/assets/images/cryptocurrencies/BLOCK.png new file mode 100644 index 0000000..1bb3957 Binary files /dev/null and b/src/assets/images/cryptocurrencies/BLOCK.png differ diff --git a/src/assets/images/cryptocurrencies/BNB.png b/src/assets/images/cryptocurrencies/BNB.png new file mode 100644 index 0000000..75dc47e Binary files /dev/null and b/src/assets/images/cryptocurrencies/BNB.png differ diff --git a/src/assets/images/cryptocurrencies/BNT.png b/src/assets/images/cryptocurrencies/BNT.png new file mode 100644 index 0000000..a458c10 Binary files /dev/null and b/src/assets/images/cryptocurrencies/BNT.png differ diff --git a/src/assets/images/cryptocurrencies/BTC.png b/src/assets/images/cryptocurrencies/BTC.png new file mode 100644 index 0000000..b280bda Binary files /dev/null and b/src/assets/images/cryptocurrencies/BTC.png differ diff --git a/src/assets/images/cryptocurrencies/BTCD.png b/src/assets/images/cryptocurrencies/BTCD.png new file mode 100644 index 0000000..8180417 Binary files /dev/null and b/src/assets/images/cryptocurrencies/BTCD.png differ diff --git a/src/assets/images/cryptocurrencies/BTG.png b/src/assets/images/cryptocurrencies/BTG.png new file mode 100644 index 0000000..6c0d653 Binary files /dev/null and b/src/assets/images/cryptocurrencies/BTG.png differ diff --git a/src/assets/images/cryptocurrencies/BTM.png b/src/assets/images/cryptocurrencies/BTM.png new file mode 100644 index 0000000..6845ae8 Binary files /dev/null and b/src/assets/images/cryptocurrencies/BTM.png differ diff --git a/src/assets/images/cryptocurrencies/BTS.png b/src/assets/images/cryptocurrencies/BTS.png new file mode 100644 index 0000000..066707a Binary files /dev/null and b/src/assets/images/cryptocurrencies/BTS.png differ diff --git a/src/assets/images/cryptocurrencies/CNX.png b/src/assets/images/cryptocurrencies/CNX.png new file mode 100644 index 0000000..37f7b52 Binary files /dev/null and b/src/assets/images/cryptocurrencies/CNX.png differ diff --git a/src/assets/images/cryptocurrencies/CVC.png b/src/assets/images/cryptocurrencies/CVC.png new file mode 100644 index 0000000..24b228b Binary files /dev/null and b/src/assets/images/cryptocurrencies/CVC.png differ diff --git a/src/assets/images/cryptocurrencies/DASH.png b/src/assets/images/cryptocurrencies/DASH.png new file mode 100644 index 0000000..7744bfa Binary files /dev/null and b/src/assets/images/cryptocurrencies/DASH.png differ diff --git a/src/assets/images/cryptocurrencies/DCR.png b/src/assets/images/cryptocurrencies/DCR.png new file mode 100644 index 0000000..48b1c44 Binary files /dev/null and b/src/assets/images/cryptocurrencies/DCR.png differ diff --git a/src/assets/images/cryptocurrencies/DGB.png b/src/assets/images/cryptocurrencies/DGB.png new file mode 100644 index 0000000..06b2a92 Binary files /dev/null and b/src/assets/images/cryptocurrencies/DGB.png differ diff --git a/src/assets/images/cryptocurrencies/DGD.png b/src/assets/images/cryptocurrencies/DGD.png new file mode 100644 index 0000000..d28ed51 Binary files /dev/null and b/src/assets/images/cryptocurrencies/DGD.png differ diff --git a/src/assets/images/cryptocurrencies/DOGE.png b/src/assets/images/cryptocurrencies/DOGE.png new file mode 100644 index 0000000..51f1ee0 Binary files /dev/null and b/src/assets/images/cryptocurrencies/DOGE.png differ diff --git a/src/assets/images/cryptocurrencies/EDG.png b/src/assets/images/cryptocurrencies/EDG.png new file mode 100644 index 0000000..4a70eef Binary files /dev/null and b/src/assets/images/cryptocurrencies/EDG.png differ diff --git a/src/assets/images/cryptocurrencies/EMC2.png b/src/assets/images/cryptocurrencies/EMC2.png new file mode 100644 index 0000000..bfd35d4 Binary files /dev/null and b/src/assets/images/cryptocurrencies/EMC2.png differ diff --git a/src/assets/images/cryptocurrencies/EOS.png b/src/assets/images/cryptocurrencies/EOS.png new file mode 100644 index 0000000..e9dd9ac Binary files /dev/null and b/src/assets/images/cryptocurrencies/EOS.png differ diff --git a/src/assets/images/cryptocurrencies/ETC.png b/src/assets/images/cryptocurrencies/ETC.png new file mode 100644 index 0000000..f60a3b7 Binary files /dev/null and b/src/assets/images/cryptocurrencies/ETC.png differ diff --git a/src/assets/images/cryptocurrencies/ETH.png b/src/assets/images/cryptocurrencies/ETH.png new file mode 100644 index 0000000..8f8c71e Binary files /dev/null and b/src/assets/images/cryptocurrencies/ETH.png differ diff --git a/src/assets/images/cryptocurrencies/ETHOS.png b/src/assets/images/cryptocurrencies/ETHOS.png new file mode 100644 index 0000000..f6dd084 Binary files /dev/null and b/src/assets/images/cryptocurrencies/ETHOS.png differ diff --git a/src/assets/images/cryptocurrencies/ETP.png b/src/assets/images/cryptocurrencies/ETP.png new file mode 100644 index 0000000..cf5bb9c Binary files /dev/null and b/src/assets/images/cryptocurrencies/ETP.png differ diff --git a/src/assets/images/cryptocurrencies/FCT.png b/src/assets/images/cryptocurrencies/FCT.png new file mode 100644 index 0000000..4946ead Binary files /dev/null and b/src/assets/images/cryptocurrencies/FCT.png differ diff --git a/src/assets/images/cryptocurrencies/FUN.png b/src/assets/images/cryptocurrencies/FUN.png new file mode 100644 index 0000000..484f992 Binary files /dev/null and b/src/assets/images/cryptocurrencies/FUN.png differ diff --git a/src/assets/images/cryptocurrencies/GAME.png b/src/assets/images/cryptocurrencies/GAME.png new file mode 100644 index 0000000..d481682 Binary files /dev/null and b/src/assets/images/cryptocurrencies/GAME.png differ diff --git a/src/assets/images/cryptocurrencies/GAS.png b/src/assets/images/cryptocurrencies/GAS.png new file mode 100644 index 0000000..2d141e6 Binary files /dev/null and b/src/assets/images/cryptocurrencies/GAS.png differ diff --git a/src/assets/images/cryptocurrencies/GBYTE.png b/src/assets/images/cryptocurrencies/GBYTE.png new file mode 100644 index 0000000..afd3f5a Binary files /dev/null and b/src/assets/images/cryptocurrencies/GBYTE.png differ diff --git a/src/assets/images/cryptocurrencies/GNO.png b/src/assets/images/cryptocurrencies/GNO.png new file mode 100644 index 0000000..1089257 Binary files /dev/null and b/src/assets/images/cryptocurrencies/GNO.png differ diff --git a/src/assets/images/cryptocurrencies/GNT.png b/src/assets/images/cryptocurrencies/GNT.png new file mode 100644 index 0000000..3ff72cc Binary files /dev/null and b/src/assets/images/cryptocurrencies/GNT.png differ diff --git a/src/assets/images/cryptocurrencies/GRS.png b/src/assets/images/cryptocurrencies/GRS.png new file mode 100644 index 0000000..312d6aa Binary files /dev/null and b/src/assets/images/cryptocurrencies/GRS.png differ diff --git a/src/assets/images/cryptocurrencies/GXS.png b/src/assets/images/cryptocurrencies/GXS.png new file mode 100644 index 0000000..8c11fd9 Binary files /dev/null and b/src/assets/images/cryptocurrencies/GXS.png differ diff --git a/src/assets/images/cryptocurrencies/HSR.png b/src/assets/images/cryptocurrencies/HSR.png new file mode 100644 index 0000000..00b7765 Binary files /dev/null and b/src/assets/images/cryptocurrencies/HSR.png differ diff --git a/src/assets/images/cryptocurrencies/ICN.png b/src/assets/images/cryptocurrencies/ICN.png new file mode 100644 index 0000000..f2693b9 Binary files /dev/null and b/src/assets/images/cryptocurrencies/ICN.png differ diff --git a/src/assets/images/cryptocurrencies/IOT.png b/src/assets/images/cryptocurrencies/IOT.png new file mode 100644 index 0000000..7b28bb5 Binary files /dev/null and b/src/assets/images/cryptocurrencies/IOT.png differ diff --git a/src/assets/images/cryptocurrencies/KMD.png b/src/assets/images/cryptocurrencies/KMD.png new file mode 100644 index 0000000..bdd9871 Binary files /dev/null and b/src/assets/images/cryptocurrencies/KMD.png differ diff --git a/src/assets/images/cryptocurrencies/KNC.png b/src/assets/images/cryptocurrencies/KNC.png new file mode 100644 index 0000000..f4e07b8 Binary files /dev/null and b/src/assets/images/cryptocurrencies/KNC.png differ diff --git a/src/assets/images/cryptocurrencies/LSK.png b/src/assets/images/cryptocurrencies/LSK.png new file mode 100644 index 0000000..9118d29 Binary files /dev/null and b/src/assets/images/cryptocurrencies/LSK.png differ diff --git a/src/assets/images/cryptocurrencies/LTC.png b/src/assets/images/cryptocurrencies/LTC.png new file mode 100644 index 0000000..8e07534 Binary files /dev/null and b/src/assets/images/cryptocurrencies/LTC.png differ diff --git a/src/assets/images/cryptocurrencies/MAID.png b/src/assets/images/cryptocurrencies/MAID.png new file mode 100644 index 0000000..e9de15d Binary files /dev/null and b/src/assets/images/cryptocurrencies/MAID.png differ diff --git a/src/assets/images/cryptocurrencies/MCO.png b/src/assets/images/cryptocurrencies/MCO.png new file mode 100644 index 0000000..9a084b0 Binary files /dev/null and b/src/assets/images/cryptocurrencies/MCO.png differ diff --git a/src/assets/images/cryptocurrencies/MNX.png b/src/assets/images/cryptocurrencies/MNX.png new file mode 100644 index 0000000..0782384 Binary files /dev/null and b/src/assets/images/cryptocurrencies/MNX.png differ diff --git a/src/assets/images/cryptocurrencies/MONA.png b/src/assets/images/cryptocurrencies/MONA.png new file mode 100644 index 0000000..d1ea958 Binary files /dev/null and b/src/assets/images/cryptocurrencies/MONA.png differ diff --git a/src/assets/images/cryptocurrencies/MTL.png b/src/assets/images/cryptocurrencies/MTL.png new file mode 100644 index 0000000..2000545 Binary files /dev/null and b/src/assets/images/cryptocurrencies/MTL.png differ diff --git a/src/assets/images/cryptocurrencies/NAV.png b/src/assets/images/cryptocurrencies/NAV.png new file mode 100644 index 0000000..5cf4177 Binary files /dev/null and b/src/assets/images/cryptocurrencies/NAV.png differ diff --git a/src/assets/images/cryptocurrencies/NEO.png b/src/assets/images/cryptocurrencies/NEO.png new file mode 100644 index 0000000..f7c4903 Binary files /dev/null and b/src/assets/images/cryptocurrencies/NEO.png differ diff --git a/src/assets/images/cryptocurrencies/NXS.png b/src/assets/images/cryptocurrencies/NXS.png new file mode 100644 index 0000000..2457705 Binary files /dev/null and b/src/assets/images/cryptocurrencies/NXS.png differ diff --git a/src/assets/images/cryptocurrencies/NXT.png b/src/assets/images/cryptocurrencies/NXT.png new file mode 100644 index 0000000..38bdb78 Binary files /dev/null and b/src/assets/images/cryptocurrencies/NXT.png differ diff --git a/src/assets/images/cryptocurrencies/OMG.png b/src/assets/images/cryptocurrencies/OMG.png new file mode 100644 index 0000000..9a72df5 Binary files /dev/null and b/src/assets/images/cryptocurrencies/OMG.png differ diff --git a/src/assets/images/cryptocurrencies/PAY.png b/src/assets/images/cryptocurrencies/PAY.png new file mode 100644 index 0000000..53017b5 Binary files /dev/null and b/src/assets/images/cryptocurrencies/PAY.png differ diff --git a/src/assets/images/cryptocurrencies/PIVX.png b/src/assets/images/cryptocurrencies/PIVX.png new file mode 100644 index 0000000..04017f5 Binary files /dev/null and b/src/assets/images/cryptocurrencies/PIVX.png differ diff --git a/src/assets/images/cryptocurrencies/POT.png b/src/assets/images/cryptocurrencies/POT.png new file mode 100644 index 0000000..77bbf32 Binary files /dev/null and b/src/assets/images/cryptocurrencies/POT.png differ diff --git a/src/assets/images/cryptocurrencies/POWER.png b/src/assets/images/cryptocurrencies/POWER.png new file mode 100644 index 0000000..db12ffa Binary files /dev/null and b/src/assets/images/cryptocurrencies/POWER.png differ diff --git a/src/assets/images/cryptocurrencies/PPC.png b/src/assets/images/cryptocurrencies/PPC.png new file mode 100644 index 0000000..44cfc4b Binary files /dev/null and b/src/assets/images/cryptocurrencies/PPC.png differ diff --git a/src/assets/images/cryptocurrencies/PPT.png b/src/assets/images/cryptocurrencies/PPT.png new file mode 100644 index 0000000..6d80a98 Binary files /dev/null and b/src/assets/images/cryptocurrencies/PPT.png differ diff --git a/src/assets/images/cryptocurrencies/PURA.png b/src/assets/images/cryptocurrencies/PURA.png new file mode 100644 index 0000000..d652b5a Binary files /dev/null and b/src/assets/images/cryptocurrencies/PURA.png differ diff --git a/src/assets/images/cryptocurrencies/QASH.png b/src/assets/images/cryptocurrencies/QASH.png new file mode 100644 index 0000000..a8350de Binary files /dev/null and b/src/assets/images/cryptocurrencies/QASH.png differ diff --git a/src/assets/images/cryptocurrencies/QTUM.png b/src/assets/images/cryptocurrencies/QTUM.png new file mode 100644 index 0000000..75e1cc8 Binary files /dev/null and b/src/assets/images/cryptocurrencies/QTUM.png differ diff --git a/src/assets/images/cryptocurrencies/RDN.png b/src/assets/images/cryptocurrencies/RDN.png new file mode 100644 index 0000000..8fbe622 Binary files /dev/null and b/src/assets/images/cryptocurrencies/RDN.png differ diff --git a/src/assets/images/cryptocurrencies/REP.png b/src/assets/images/cryptocurrencies/REP.png new file mode 100644 index 0000000..73b6746 Binary files /dev/null and b/src/assets/images/cryptocurrencies/REP.png differ diff --git a/src/assets/images/cryptocurrencies/SALT.png b/src/assets/images/cryptocurrencies/SALT.png new file mode 100644 index 0000000..2b0a5b2 Binary files /dev/null and b/src/assets/images/cryptocurrencies/SALT.png differ diff --git a/src/assets/images/cryptocurrencies/SAN.png b/src/assets/images/cryptocurrencies/SAN.png new file mode 100644 index 0000000..b3052a7 Binary files /dev/null and b/src/assets/images/cryptocurrencies/SAN.png differ diff --git a/src/assets/images/cryptocurrencies/SC.png b/src/assets/images/cryptocurrencies/SC.png new file mode 100644 index 0000000..e20dad6 Binary files /dev/null and b/src/assets/images/cryptocurrencies/SC.png differ diff --git a/src/assets/images/cryptocurrencies/SKY.png b/src/assets/images/cryptocurrencies/SKY.png new file mode 100644 index 0000000..0b99eb3 Binary files /dev/null and b/src/assets/images/cryptocurrencies/SKY.png differ diff --git a/src/assets/images/cryptocurrencies/SNGLS.png b/src/assets/images/cryptocurrencies/SNGLS.png new file mode 100644 index 0000000..51fa105 Binary files /dev/null and b/src/assets/images/cryptocurrencies/SNGLS.png differ diff --git a/src/assets/images/cryptocurrencies/SNT.png b/src/assets/images/cryptocurrencies/SNT.png new file mode 100644 index 0000000..a8a792b Binary files /dev/null and b/src/assets/images/cryptocurrencies/SNT.png differ diff --git a/src/assets/images/cryptocurrencies/START.png b/src/assets/images/cryptocurrencies/START.png new file mode 100644 index 0000000..22306b9 Binary files /dev/null and b/src/assets/images/cryptocurrencies/START.png differ diff --git a/src/assets/images/cryptocurrencies/STEEM.png b/src/assets/images/cryptocurrencies/STEEM.png new file mode 100644 index 0000000..2d5b88a Binary files /dev/null and b/src/assets/images/cryptocurrencies/STEEM.png differ diff --git a/src/assets/images/cryptocurrencies/STORJ.png b/src/assets/images/cryptocurrencies/STORJ.png new file mode 100644 index 0000000..2ea2338 Binary files /dev/null and b/src/assets/images/cryptocurrencies/STORJ.png differ diff --git a/src/assets/images/cryptocurrencies/SYS.png b/src/assets/images/cryptocurrencies/SYS.png new file mode 100644 index 0000000..ff87768 Binary files /dev/null and b/src/assets/images/cryptocurrencies/SYS.png differ diff --git a/src/assets/images/cryptocurrencies/TRX.png b/src/assets/images/cryptocurrencies/TRX.png new file mode 100644 index 0000000..52a11c1 Binary files /dev/null and b/src/assets/images/cryptocurrencies/TRX.png differ diff --git a/src/assets/images/cryptocurrencies/UBQ.png b/src/assets/images/cryptocurrencies/UBQ.png new file mode 100644 index 0000000..3be2e8d Binary files /dev/null and b/src/assets/images/cryptocurrencies/UBQ.png differ diff --git a/src/assets/images/cryptocurrencies/USDT.png b/src/assets/images/cryptocurrencies/USDT.png new file mode 100644 index 0000000..0328497 Binary files /dev/null and b/src/assets/images/cryptocurrencies/USDT.png differ diff --git a/src/assets/images/cryptocurrencies/VEN.png b/src/assets/images/cryptocurrencies/VEN.png new file mode 100644 index 0000000..3511761 Binary files /dev/null and b/src/assets/images/cryptocurrencies/VEN.png differ diff --git a/src/assets/images/cryptocurrencies/VTC.png b/src/assets/images/cryptocurrencies/VTC.png new file mode 100644 index 0000000..bc38d41 Binary files /dev/null and b/src/assets/images/cryptocurrencies/VTC.png differ diff --git a/src/assets/images/cryptocurrencies/WAVES.png b/src/assets/images/cryptocurrencies/WAVES.png new file mode 100644 index 0000000..d612698 Binary files /dev/null and b/src/assets/images/cryptocurrencies/WAVES.png differ diff --git a/src/assets/images/cryptocurrencies/WTC.png b/src/assets/images/cryptocurrencies/WTC.png new file mode 100644 index 0000000..3fe9e67 Binary files /dev/null and b/src/assets/images/cryptocurrencies/WTC.png differ diff --git a/src/assets/images/cryptocurrencies/XEM.png b/src/assets/images/cryptocurrencies/XEM.png new file mode 100644 index 0000000..abdb7eb Binary files /dev/null and b/src/assets/images/cryptocurrencies/XEM.png differ diff --git a/src/assets/images/cryptocurrencies/XLM.png b/src/assets/images/cryptocurrencies/XLM.png new file mode 100644 index 0000000..9318686 Binary files /dev/null and b/src/assets/images/cryptocurrencies/XLM.png differ diff --git a/src/assets/images/cryptocurrencies/XMR.png b/src/assets/images/cryptocurrencies/XMR.png new file mode 100644 index 0000000..c9b7146 Binary files /dev/null and b/src/assets/images/cryptocurrencies/XMR.png differ diff --git a/src/assets/images/cryptocurrencies/XRP.png b/src/assets/images/cryptocurrencies/XRP.png new file mode 100644 index 0000000..e5eaba5 Binary files /dev/null and b/src/assets/images/cryptocurrencies/XRP.png differ diff --git a/src/assets/images/cryptocurrencies/XUC.png b/src/assets/images/cryptocurrencies/XUC.png new file mode 100644 index 0000000..a185f68 Binary files /dev/null and b/src/assets/images/cryptocurrencies/XUC.png differ diff --git a/src/assets/images/cryptocurrencies/XVG.png b/src/assets/images/cryptocurrencies/XVG.png new file mode 100644 index 0000000..cf873af Binary files /dev/null and b/src/assets/images/cryptocurrencies/XVG.png differ diff --git a/src/assets/images/cryptocurrencies/XZC.png b/src/assets/images/cryptocurrencies/XZC.png new file mode 100644 index 0000000..d066bc4 Binary files /dev/null and b/src/assets/images/cryptocurrencies/XZC.png differ diff --git a/src/assets/images/cryptocurrencies/ZEC.png b/src/assets/images/cryptocurrencies/ZEC.png new file mode 100644 index 0000000..712a000 Binary files /dev/null and b/src/assets/images/cryptocurrencies/ZEC.png differ diff --git a/src/assets/images/cryptocurrencies/ZEN.png b/src/assets/images/cryptocurrencies/ZEN.png new file mode 100644 index 0000000..3cfc908 Binary files /dev/null and b/src/assets/images/cryptocurrencies/ZEN.png differ diff --git a/src/assets/images/cryptocurrencies/ZRX.png b/src/assets/images/cryptocurrencies/ZRX.png new file mode 100644 index 0000000..141b862 Binary files /dev/null and b/src/assets/images/cryptocurrencies/ZRX.png differ diff --git a/src/assets/images/debit-card.png b/src/assets/images/debit-card.png new file mode 100644 index 0000000..256ff13 Binary files /dev/null and b/src/assets/images/debit-card.png differ diff --git a/src/assets/images/demo_all.jpg b/src/assets/images/demo_all.jpg new file mode 100644 index 0000000..6a7e6ae Binary files /dev/null and b/src/assets/images/demo_all.jpg differ diff --git a/src/assets/images/demo_home_one.jpg b/src/assets/images/demo_home_one.jpg new file mode 100644 index 0000000..9864dee Binary files /dev/null and b/src/assets/images/demo_home_one.jpg differ diff --git a/src/assets/images/demo_home_two.jpg b/src/assets/images/demo_home_two.jpg new file mode 100644 index 0000000..b60a90d Binary files /dev/null and b/src/assets/images/demo_home_two.jpg differ diff --git a/src/assets/images/dots.png b/src/assets/images/dots.png new file mode 100644 index 0000000..3b46f9e Binary files /dev/null and b/src/assets/images/dots.png differ diff --git a/src/assets/images/edit.svg b/src/assets/images/edit.svg new file mode 100644 index 0000000..d785c30 --- /dev/null +++ b/src/assets/images/edit.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/egret-screen.jpg b/src/assets/images/egret-screen.jpg new file mode 100644 index 0000000..a102ff6 Binary files /dev/null and b/src/assets/images/egret-screen.jpg differ diff --git a/src/assets/images/egret-screen.png b/src/assets/images/egret-screen.png new file mode 100644 index 0000000..09d0ff0 Binary files /dev/null and b/src/assets/images/egret-screen.png differ diff --git a/src/assets/images/face-1.jpg b/src/assets/images/face-1.jpg new file mode 100644 index 0000000..a0e3221 Binary files /dev/null and b/src/assets/images/face-1.jpg differ diff --git a/src/assets/images/face-2.jpg b/src/assets/images/face-2.jpg new file mode 100644 index 0000000..805ff1d Binary files /dev/null and b/src/assets/images/face-2.jpg differ diff --git a/src/assets/images/face-3.jpg b/src/assets/images/face-3.jpg new file mode 100644 index 0000000..bb4eecf Binary files /dev/null and b/src/assets/images/face-3.jpg differ diff --git a/src/assets/images/face-4.jpg b/src/assets/images/face-4.jpg new file mode 100644 index 0000000..f95c4b8 Binary files /dev/null and b/src/assets/images/face-4.jpg differ diff --git a/src/assets/images/face-5.jpg b/src/assets/images/face-5.jpg new file mode 100644 index 0000000..f8cd870 Binary files /dev/null and b/src/assets/images/face-5.jpg differ diff --git a/src/assets/images/face-6.jpg b/src/assets/images/face-6.jpg new file mode 100644 index 0000000..7b5e841 Binary files /dev/null and b/src/assets/images/face-6.jpg differ diff --git a/src/assets/images/face-7.jpg b/src/assets/images/face-7.jpg new file mode 100644 index 0000000..ed1dc0c Binary files /dev/null and b/src/assets/images/face-7.jpg differ diff --git a/src/assets/images/faces/10.jpg b/src/assets/images/faces/10.jpg new file mode 100644 index 0000000..d8f93a5 Binary files /dev/null and b/src/assets/images/faces/10.jpg differ diff --git a/src/assets/images/faces/12.jpg b/src/assets/images/faces/12.jpg new file mode 100644 index 0000000..80f1690 Binary files /dev/null and b/src/assets/images/faces/12.jpg differ diff --git a/src/assets/images/faces/13.jpg b/src/assets/images/faces/13.jpg new file mode 100644 index 0000000..77e8861 Binary files /dev/null and b/src/assets/images/faces/13.jpg differ diff --git a/src/assets/images/faces/15.jpg b/src/assets/images/faces/15.jpg new file mode 100644 index 0000000..f948d5d Binary files /dev/null and b/src/assets/images/faces/15.jpg differ diff --git a/src/assets/images/faces/16.jpg b/src/assets/images/faces/16.jpg new file mode 100644 index 0000000..f362aa9 Binary files /dev/null and b/src/assets/images/faces/16.jpg differ diff --git a/src/assets/images/faces/17.jpg b/src/assets/images/faces/17.jpg new file mode 100644 index 0000000..47c16c8 Binary files /dev/null and b/src/assets/images/faces/17.jpg differ diff --git a/src/assets/images/faces/2.jpg b/src/assets/images/faces/2.jpg new file mode 100644 index 0000000..3e1b601 Binary files /dev/null and b/src/assets/images/faces/2.jpg differ diff --git a/src/assets/images/faces/3.jpg b/src/assets/images/faces/3.jpg new file mode 100644 index 0000000..6ab5f1e Binary files /dev/null and b/src/assets/images/faces/3.jpg differ diff --git a/src/assets/images/faces/4.jpg b/src/assets/images/faces/4.jpg new file mode 100644 index 0000000..a62d443 Binary files /dev/null and b/src/assets/images/faces/4.jpg differ diff --git a/src/assets/images/faces/5.jpg b/src/assets/images/faces/5.jpg new file mode 100644 index 0000000..98c7cb4 Binary files /dev/null and b/src/assets/images/faces/5.jpg differ diff --git a/src/assets/images/faces/9.jpg b/src/assets/images/faces/9.jpg new file mode 100644 index 0000000..8fabd47 Binary files /dev/null and b/src/assets/images/faces/9.jpg differ diff --git a/src/assets/images/gr.png b/src/assets/images/gr.png new file mode 100644 index 0000000..3cf705b Binary files /dev/null and b/src/assets/images/gr.png differ diff --git a/src/assets/images/home-bg-black.png b/src/assets/images/home-bg-black.png new file mode 100644 index 0000000..89fc1fe Binary files /dev/null and b/src/assets/images/home-bg-black.png differ diff --git a/src/assets/images/home-bg-indigo.jpg b/src/assets/images/home-bg-indigo.jpg new file mode 100644 index 0000000..bd34109 Binary files /dev/null and b/src/assets/images/home-bg-indigo.jpg differ diff --git a/src/assets/images/home-bg.jpg b/src/assets/images/home-bg.jpg new file mode 100644 index 0000000..bd34109 Binary files /dev/null and b/src/assets/images/home-bg.jpg differ diff --git a/src/assets/images/home-bg.png b/src/assets/images/home-bg.png new file mode 100644 index 0000000..eabbe16 Binary files /dev/null and b/src/assets/images/home-bg.png differ diff --git a/src/assets/images/illustrations/1.svg b/src/assets/images/illustrations/1.svg new file mode 100644 index 0000000..022a100 --- /dev/null +++ b/src/assets/images/illustrations/1.svg @@ -0,0 +1,43 @@ + + analyze + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/illustrations/2.svg b/src/assets/images/illustrations/2.svg new file mode 100644 index 0000000..d8d139a --- /dev/null +++ b/src/assets/images/illustrations/2.svg @@ -0,0 +1,59 @@ + + done checking + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/illustrations/404.svg b/src/assets/images/illustrations/404.svg new file mode 100644 index 0000000..9628680 --- /dev/null +++ b/src/assets/images/illustrations/404.svg @@ -0,0 +1 @@ +page not found \ No newline at end of file diff --git a/src/assets/images/illustrations/agreement.svg b/src/assets/images/illustrations/agreement.svg new file mode 100644 index 0000000..3721333 --- /dev/null +++ b/src/assets/images/illustrations/agreement.svg @@ -0,0 +1 @@ +agreement \ No newline at end of file diff --git a/src/assets/images/illustrations/all_the_data.svg b/src/assets/images/illustrations/all_the_data.svg new file mode 100644 index 0000000..473312b --- /dev/null +++ b/src/assets/images/illustrations/all_the_data.svg @@ -0,0 +1 @@ +all the data \ No newline at end of file diff --git a/src/assets/images/illustrations/announcement.svg b/src/assets/images/illustrations/announcement.svg new file mode 100644 index 0000000..e7ab1c5 --- /dev/null +++ b/src/assets/images/illustrations/announcement.svg @@ -0,0 +1,25 @@ + + + + Group + Created with Sketch. + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/illustrations/baby.svg b/src/assets/images/illustrations/baby.svg new file mode 100644 index 0000000..6f04c3c --- /dev/null +++ b/src/assets/images/illustrations/baby.svg @@ -0,0 +1 @@ +baby \ No newline at end of file diff --git a/src/assets/images/illustrations/breaking_barriers.svg b/src/assets/images/illustrations/breaking_barriers.svg new file mode 100644 index 0000000..dad2c0a --- /dev/null +++ b/src/assets/images/illustrations/breaking_barriers.svg @@ -0,0 +1 @@ +breaking obstacles \ No newline at end of file diff --git a/src/assets/images/illustrations/business_deal.svg b/src/assets/images/illustrations/business_deal.svg new file mode 100644 index 0000000..7353100 --- /dev/null +++ b/src/assets/images/illustrations/business_deal.svg @@ -0,0 +1 @@ +business deal \ No newline at end of file diff --git a/src/assets/images/illustrations/designer.svg b/src/assets/images/illustrations/designer.svg new file mode 100644 index 0000000..5c0c254 --- /dev/null +++ b/src/assets/images/illustrations/designer.svg @@ -0,0 +1,65 @@ + + + + undraw_Designer_by46 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/illustrations/dreamer.svg b/src/assets/images/illustrations/dreamer.svg new file mode 100644 index 0000000..cc0472d --- /dev/null +++ b/src/assets/images/illustrations/dreamer.svg @@ -0,0 +1 @@ +dreamer \ No newline at end of file diff --git a/src/assets/images/illustrations/lighthouse.svg b/src/assets/images/illustrations/lighthouse.svg new file mode 100644 index 0000000..b8730d8 --- /dev/null +++ b/src/assets/images/illustrations/lighthouse.svg @@ -0,0 +1,70 @@ + + + + + + + + + Lighthouse + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/illustrations/posting_photo.svg b/src/assets/images/illustrations/posting_photo.svg new file mode 100644 index 0000000..ddb866e --- /dev/null +++ b/src/assets/images/illustrations/posting_photo.svg @@ -0,0 +1,71 @@ + + posting photo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/illustrations/upgrade.svg b/src/assets/images/illustrations/upgrade.svg new file mode 100644 index 0000000..c5cfc5b --- /dev/null +++ b/src/assets/images/illustrations/upgrade.svg @@ -0,0 +1,66 @@ + + + + undraw_upgrade_06a0 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/logo-circle.png b/src/assets/images/logo-circle.png new file mode 100644 index 0000000..6552a4a Binary files /dev/null and b/src/assets/images/logo-circle.png differ diff --git a/src/assets/images/logo-circle.svg b/src/assets/images/logo-circle.svg new file mode 100644 index 0000000..25c08bd --- /dev/null +++ b/src/assets/images/logo-circle.svg @@ -0,0 +1,25 @@ + + + + Logo + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/logo-full-200px.png b/src/assets/images/logo-full-200px.png new file mode 100644 index 0000000..49b5de3 Binary files /dev/null and b/src/assets/images/logo-full-200px.png differ diff --git a/src/assets/images/logo-full-strong.png b/src/assets/images/logo-full-strong.png new file mode 100644 index 0000000..1503be6 Binary files /dev/null and b/src/assets/images/logo-full-strong.png differ diff --git a/src/assets/images/logo-full-white.png b/src/assets/images/logo-full-white.png new file mode 100644 index 0000000..3bee460 Binary files /dev/null and b/src/assets/images/logo-full-white.png differ diff --git a/src/assets/images/logo-full.png b/src/assets/images/logo-full.png new file mode 100644 index 0000000..fa3575c Binary files /dev/null and b/src/assets/images/logo-full.png differ diff --git a/src/assets/images/logo-lg.png b/src/assets/images/logo-lg.png new file mode 100644 index 0000000..223d87d Binary files /dev/null and b/src/assets/images/logo-lg.png differ diff --git a/src/assets/images/logo-text-white.png b/src/assets/images/logo-text-white.png new file mode 100644 index 0000000..82b11e6 Binary files /dev/null and b/src/assets/images/logo-text-white.png differ diff --git a/src/assets/images/logo-text.png b/src/assets/images/logo-text.png new file mode 100644 index 0000000..1177a59 Binary files /dev/null and b/src/assets/images/logo-text.png differ diff --git a/src/assets/images/logo.png b/src/assets/images/logo.png new file mode 100644 index 0000000..71be5c8 Binary files /dev/null and b/src/assets/images/logo.png differ diff --git a/src/assets/images/logo.svg b/src/assets/images/logo.svg new file mode 100644 index 0000000..8e977f4 --- /dev/null +++ b/src/assets/images/logo.svg @@ -0,0 +1,26 @@ + + + + Group + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/images/logos/angular.png b/src/assets/images/logos/angular.png new file mode 100644 index 0000000..c510293 Binary files /dev/null and b/src/assets/images/logos/angular.png differ diff --git a/src/assets/images/logos/bootstrap.png b/src/assets/images/logos/bootstrap.png new file mode 100644 index 0000000..3fbdeac Binary files /dev/null and b/src/assets/images/logos/bootstrap.png differ diff --git a/src/assets/images/logos/gulp.png b/src/assets/images/logos/gulp.png new file mode 100644 index 0000000..5389b02 Binary files /dev/null and b/src/assets/images/logos/gulp.png differ diff --git a/src/assets/images/logos/laravel.png b/src/assets/images/logos/laravel.png new file mode 100644 index 0000000..977504e Binary files /dev/null and b/src/assets/images/logos/laravel.png differ diff --git a/src/assets/images/logos/logo-1.png b/src/assets/images/logos/logo-1.png new file mode 100644 index 0000000..91e28d7 Binary files /dev/null and b/src/assets/images/logos/logo-1.png differ diff --git a/src/assets/images/logos/logo-2.png b/src/assets/images/logos/logo-2.png new file mode 100644 index 0000000..c9f200f Binary files /dev/null and b/src/assets/images/logos/logo-2.png differ diff --git a/src/assets/images/logos/logo-3.png b/src/assets/images/logos/logo-3.png new file mode 100644 index 0000000..1dbb707 Binary files /dev/null and b/src/assets/images/logos/logo-3.png differ diff --git a/src/assets/images/logos/logo-4.png b/src/assets/images/logos/logo-4.png new file mode 100644 index 0000000..0820dc2 Binary files /dev/null and b/src/assets/images/logos/logo-4.png differ diff --git a/src/assets/images/logos/logo-5.png b/src/assets/images/logos/logo-5.png new file mode 100644 index 0000000..479d636 Binary files /dev/null and b/src/assets/images/logos/logo-5.png differ diff --git a/src/assets/images/logos/logo-6.png b/src/assets/images/logos/logo-6.png new file mode 100644 index 0000000..d3209e9 Binary files /dev/null and b/src/assets/images/logos/logo-6.png differ diff --git a/src/assets/images/logos/logo-7.png b/src/assets/images/logos/logo-7.png new file mode 100644 index 0000000..88d1d1f Binary files /dev/null and b/src/assets/images/logos/logo-7.png differ diff --git a/src/assets/images/logos/logo-8.png b/src/assets/images/logos/logo-8.png new file mode 100644 index 0000000..fff1bde Binary files /dev/null and b/src/assets/images/logos/logo-8.png differ diff --git a/src/assets/images/logos/logo-9.png b/src/assets/images/logos/logo-9.png new file mode 100644 index 0000000..7bc6313 Binary files /dev/null and b/src/assets/images/logos/logo-9.png differ diff --git a/src/assets/images/logos/react.png b/src/assets/images/logos/react.png new file mode 100644 index 0000000..fa3575c Binary files /dev/null and b/src/assets/images/logos/react.png differ diff --git a/src/assets/images/logos/sass.png b/src/assets/images/logos/sass.png new file mode 100644 index 0000000..97f60b7 Binary files /dev/null and b/src/assets/images/logos/sass.png differ diff --git a/src/assets/images/logos/webpack.png b/src/assets/images/logos/webpack.png new file mode 100644 index 0000000..f147ab6 Binary files /dev/null and b/src/assets/images/logos/webpack.png differ diff --git a/src/assets/images/mock-logo-1.png b/src/assets/images/mock-logo-1.png new file mode 100644 index 0000000..1a22f9c Binary files /dev/null and b/src/assets/images/mock-logo-1.png differ diff --git a/src/assets/images/mock-logo-2.png b/src/assets/images/mock-logo-2.png new file mode 100644 index 0000000..514e4cb Binary files /dev/null and b/src/assets/images/mock-logo-2.png differ diff --git a/src/assets/images/mock-logo-3.png b/src/assets/images/mock-logo-3.png new file mode 100644 index 0000000..6cac6a2 Binary files /dev/null and b/src/assets/images/mock-logo-3.png differ diff --git a/src/assets/images/mock-logo-4.png b/src/assets/images/mock-logo-4.png new file mode 100644 index 0000000..4aa168e Binary files /dev/null and b/src/assets/images/mock-logo-4.png differ diff --git a/src/assets/images/oc.png b/src/assets/images/oc.png new file mode 100644 index 0000000..b8ca7b9 Binary files /dev/null and b/src/assets/images/oc.png differ diff --git a/src/assets/images/payment-methods/amazon.png b/src/assets/images/payment-methods/amazon.png new file mode 100644 index 0000000..3865022 Binary files /dev/null and b/src/assets/images/payment-methods/amazon.png differ diff --git a/src/assets/images/payment-methods/amex.png b/src/assets/images/payment-methods/amex.png new file mode 100644 index 0000000..bc1a31f Binary files /dev/null and b/src/assets/images/payment-methods/amex.png differ diff --git a/src/assets/images/payment-methods/cirrus.png b/src/assets/images/payment-methods/cirrus.png new file mode 100644 index 0000000..14af40d Binary files /dev/null and b/src/assets/images/payment-methods/cirrus.png differ diff --git a/src/assets/images/payment-methods/maestro.png b/src/assets/images/payment-methods/maestro.png new file mode 100644 index 0000000..c00f17d Binary files /dev/null and b/src/assets/images/payment-methods/maestro.png differ diff --git a/src/assets/images/payment-methods/master-card.png b/src/assets/images/payment-methods/master-card.png new file mode 100644 index 0000000..c883cd1 Binary files /dev/null and b/src/assets/images/payment-methods/master-card.png differ diff --git a/src/assets/images/payment-methods/paypal.png b/src/assets/images/payment-methods/paypal.png new file mode 100644 index 0000000..f0ffe61 Binary files /dev/null and b/src/assets/images/payment-methods/paypal.png differ diff --git a/src/assets/images/payment-methods/shopify.png b/src/assets/images/payment-methods/shopify.png new file mode 100644 index 0000000..e7e61c9 Binary files /dev/null and b/src/assets/images/payment-methods/shopify.png differ diff --git a/src/assets/images/payment-methods/skrill.png b/src/assets/images/payment-methods/skrill.png new file mode 100644 index 0000000..0dda47c Binary files /dev/null and b/src/assets/images/payment-methods/skrill.png differ diff --git a/src/assets/images/payment-methods/visa-electron.png b/src/assets/images/payment-methods/visa-electron.png new file mode 100644 index 0000000..7b046b6 Binary files /dev/null and b/src/assets/images/payment-methods/visa-electron.png differ diff --git a/src/assets/images/payment-methods/visa.png b/src/assets/images/payment-methods/visa.png new file mode 100644 index 0000000..45986ae Binary files /dev/null and b/src/assets/images/payment-methods/visa.png differ diff --git a/src/assets/images/payment-methods/western-union.png b/src/assets/images/payment-methods/western-union.png new file mode 100644 index 0000000..3f46618 Binary files /dev/null and b/src/assets/images/payment-methods/western-union.png differ diff --git a/src/assets/images/photo-1.jpg b/src/assets/images/photo-1.jpg new file mode 100644 index 0000000..770153f Binary files /dev/null and b/src/assets/images/photo-1.jpg differ diff --git a/src/assets/images/photo-2.jpg b/src/assets/images/photo-2.jpg new file mode 100644 index 0000000..cb199f3 Binary files /dev/null and b/src/assets/images/photo-2.jpg differ diff --git a/src/assets/images/photo-3.jpg b/src/assets/images/photo-3.jpg new file mode 100644 index 0000000..9e16d21 Binary files /dev/null and b/src/assets/images/photo-3.jpg differ diff --git a/src/assets/images/photo-600_220.jpg b/src/assets/images/photo-600_220.jpg new file mode 100644 index 0000000..7d06c30 Binary files /dev/null and b/src/assets/images/photo-600_220.jpg differ diff --git a/src/assets/images/products/headphone-1.jpg b/src/assets/images/products/headphone-1.jpg new file mode 100644 index 0000000..550baf3 Binary files /dev/null and b/src/assets/images/products/headphone-1.jpg differ diff --git a/src/assets/images/products/headphone-2.jpg b/src/assets/images/products/headphone-2.jpg new file mode 100644 index 0000000..9e13229 Binary files /dev/null and b/src/assets/images/products/headphone-2.jpg differ diff --git a/src/assets/images/products/headphone-3.jpg b/src/assets/images/products/headphone-3.jpg new file mode 100644 index 0000000..19d5be4 Binary files /dev/null and b/src/assets/images/products/headphone-3.jpg differ diff --git a/src/assets/images/products/headphone-4.jpg b/src/assets/images/products/headphone-4.jpg new file mode 100644 index 0000000..6325f09 Binary files /dev/null and b/src/assets/images/products/headphone-4.jpg differ diff --git a/src/assets/images/products/iphone-1.jpg b/src/assets/images/products/iphone-1.jpg new file mode 100644 index 0000000..7bb6162 Binary files /dev/null and b/src/assets/images/products/iphone-1.jpg differ diff --git a/src/assets/images/products/iphone-2.jpg b/src/assets/images/products/iphone-2.jpg new file mode 100644 index 0000000..b395e69 Binary files /dev/null and b/src/assets/images/products/iphone-2.jpg differ diff --git a/src/assets/images/products/speaker-1.jpg b/src/assets/images/products/speaker-1.jpg new file mode 100644 index 0000000..6932396 Binary files /dev/null and b/src/assets/images/products/speaker-1.jpg differ diff --git a/src/assets/images/products/speaker-2.jpg b/src/assets/images/products/speaker-2.jpg new file mode 100644 index 0000000..b65c74f Binary files /dev/null and b/src/assets/images/products/speaker-2.jpg differ diff --git a/src/assets/images/products/watch-1.jpg b/src/assets/images/products/watch-1.jpg new file mode 100644 index 0000000..72eccfc Binary files /dev/null and b/src/assets/images/products/watch-1.jpg differ diff --git a/src/assets/images/products/watch-2.jpg b/src/assets/images/products/watch-2.jpg new file mode 100644 index 0000000..2acec5b Binary files /dev/null and b/src/assets/images/products/watch-2.jpg differ diff --git a/src/assets/images/screenshots/black_sidebar.png b/src/assets/images/screenshots/black_sidebar.png new file mode 100644 index 0000000..deeb412 Binary files /dev/null and b/src/assets/images/screenshots/black_sidebar.png differ diff --git a/src/assets/images/screenshots/calendar.jpg b/src/assets/images/screenshots/calendar.jpg new file mode 100644 index 0000000..e646a40 Binary files /dev/null and b/src/assets/images/screenshots/calendar.jpg differ diff --git a/src/assets/images/screenshots/dark-pink-title.png b/src/assets/images/screenshots/dark-pink-title.png new file mode 100755 index 0000000..c314f26 Binary files /dev/null and b/src/assets/images/screenshots/dark-pink-title.png differ diff --git a/src/assets/images/screenshots/dark-purple-title.png b/src/assets/images/screenshots/dark-purple-title.png new file mode 100755 index 0000000..2f64153 Binary files /dev/null and b/src/assets/images/screenshots/dark-purple-title.png differ diff --git a/src/assets/images/screenshots/dark_theme.png b/src/assets/images/screenshots/dark_theme.png new file mode 100644 index 0000000..acd753a Binary files /dev/null and b/src/assets/images/screenshots/dark_theme.png differ diff --git a/src/assets/images/screenshots/dashboard.jpg b/src/assets/images/screenshots/dashboard.jpg new file mode 100644 index 0000000..e092ab0 Binary files /dev/null and b/src/assets/images/screenshots/dashboard.jpg differ diff --git a/src/assets/images/screenshots/gull-dashboard.png b/src/assets/images/screenshots/gull-dashboard.png new file mode 100644 index 0000000..3410807 Binary files /dev/null and b/src/assets/images/screenshots/gull-dashboard.png differ diff --git a/src/assets/images/screenshots/landing-1.png b/src/assets/images/screenshots/landing-1.png new file mode 100644 index 0000000..d164c4f Binary files /dev/null and b/src/assets/images/screenshots/landing-1.png differ diff --git a/src/assets/images/screenshots/landing-2.png b/src/assets/images/screenshots/landing-2.png new file mode 100644 index 0000000..87b9342 Binary files /dev/null and b/src/assets/images/screenshots/landing-2.png differ diff --git a/src/assets/images/screenshots/landing-3.png b/src/assets/images/screenshots/landing-3.png new file mode 100644 index 0000000..b659b06 Binary files /dev/null and b/src/assets/images/screenshots/landing-3.png differ diff --git a/src/assets/images/screenshots/landing-intro.png b/src/assets/images/screenshots/landing-intro.png new file mode 100644 index 0000000..3ca4cb0 Binary files /dev/null and b/src/assets/images/screenshots/landing-intro.png differ diff --git a/src/assets/images/screenshots/layout1-blue-customizer.png b/src/assets/images/screenshots/layout1-blue-customizer.png new file mode 100755 index 0000000..077fc23 Binary files /dev/null and b/src/assets/images/screenshots/layout1-blue-customizer.png differ diff --git a/src/assets/images/screenshots/layout1-customizer-1.png b/src/assets/images/screenshots/layout1-customizer-1.png new file mode 100755 index 0000000..dd98f63 Binary files /dev/null and b/src/assets/images/screenshots/layout1-customizer-1.png differ diff --git a/src/assets/images/screenshots/layout1-customizer-old.png b/src/assets/images/screenshots/layout1-customizer-old.png new file mode 100644 index 0000000..d193015 Binary files /dev/null and b/src/assets/images/screenshots/layout1-customizer-old.png differ diff --git a/src/assets/images/screenshots/layout1-customizer.png b/src/assets/images/screenshots/layout1-customizer.png new file mode 100755 index 0000000..79729aa Binary files /dev/null and b/src/assets/images/screenshots/layout1-customizer.png differ diff --git a/src/assets/images/screenshots/layout2-customizer.png b/src/assets/images/screenshots/layout2-customizer.png new file mode 100755 index 0000000..e106bd4 Binary files /dev/null and b/src/assets/images/screenshots/layout2-customizer.png differ diff --git a/src/assets/images/screenshots/layout3-customizer.png b/src/assets/images/screenshots/layout3-customizer.png new file mode 100755 index 0000000..9fd1da4 Binary files /dev/null and b/src/assets/images/screenshots/layout3-customizer.png differ diff --git a/src/assets/images/screenshots/layout4-customizer.png b/src/assets/images/screenshots/layout4-customizer.png new file mode 100755 index 0000000..04d0c46 Binary files /dev/null and b/src/assets/images/screenshots/layout4-customizer.png differ diff --git a/src/assets/images/screenshots/light-blue-title.png b/src/assets/images/screenshots/light-blue-title.png new file mode 100755 index 0000000..19ce361 Binary files /dev/null and b/src/assets/images/screenshots/light-blue-title.png differ diff --git a/src/assets/images/screenshots/login.jpg b/src/assets/images/screenshots/login.jpg new file mode 100644 index 0000000..71cd93e Binary files /dev/null and b/src/assets/images/screenshots/login.jpg differ diff --git a/src/assets/images/screenshots/side-simple-ltr.png b/src/assets/images/screenshots/side-simple-ltr.png new file mode 100755 index 0000000..03a2192 Binary files /dev/null and b/src/assets/images/screenshots/side-simple-ltr.png differ diff --git a/src/assets/images/screenshots/side-simple-rtl.png b/src/assets/images/screenshots/side-simple-rtl.png new file mode 100755 index 0000000..fedcf42 Binary files /dev/null and b/src/assets/images/screenshots/side-simple-rtl.png differ diff --git a/src/assets/images/screenshots/side-title-ltr.png b/src/assets/images/screenshots/side-title-ltr.png new file mode 100755 index 0000000..107fb37 Binary files /dev/null and b/src/assets/images/screenshots/side-title-ltr.png differ diff --git a/src/assets/images/screenshots/top-simple-ltr.png b/src/assets/images/screenshots/top-simple-ltr.png new file mode 100755 index 0000000..f20438e Binary files /dev/null and b/src/assets/images/screenshots/top-simple-ltr.png differ diff --git a/src/assets/images/screenshots/top-simple-rtl.png b/src/assets/images/screenshots/top-simple-rtl.png new file mode 100755 index 0000000..f8a5029 Binary files /dev/null and b/src/assets/images/screenshots/top-simple-rtl.png differ diff --git a/src/assets/images/screenshots/white_sidebar.png b/src/assets/images/screenshots/white_sidebar.png new file mode 100644 index 0000000..e0c2e2d Binary files /dev/null and b/src/assets/images/screenshots/white_sidebar.png differ diff --git a/src/assets/images/sidebar-bg-dark.jpg b/src/assets/images/sidebar-bg-dark.jpg new file mode 100644 index 0000000..1423c81 Binary files /dev/null and b/src/assets/images/sidebar-bg-dark.jpg differ diff --git a/src/assets/images/sidebar-bg.jpg b/src/assets/images/sidebar-bg.jpg new file mode 100644 index 0000000..2992e54 Binary files /dev/null and b/src/assets/images/sidebar-bg.jpg differ diff --git a/src/assets/images/sidebar/sidebar-bg-dark.jpg b/src/assets/images/sidebar/sidebar-bg-dark.jpg new file mode 100644 index 0000000..1423c81 Binary files /dev/null and b/src/assets/images/sidebar/sidebar-bg-dark.jpg differ diff --git a/src/assets/images/sidebar/sidebar-bg-light.jpg b/src/assets/images/sidebar/sidebar-bg-light.jpg new file mode 100644 index 0000000..2992e54 Binary files /dev/null and b/src/assets/images/sidebar/sidebar-bg-light.jpg differ diff --git a/src/assets/images/social-dribble.png b/src/assets/images/social-dribble.png new file mode 100644 index 0000000..69af5f3 Binary files /dev/null and b/src/assets/images/social-dribble.png differ diff --git a/src/assets/images/social-facebook.png b/src/assets/images/social-facebook.png new file mode 100644 index 0000000..5d4c7e9 Binary files /dev/null and b/src/assets/images/social-facebook.png differ diff --git a/src/assets/images/social-linkedin.png b/src/assets/images/social-linkedin.png new file mode 100644 index 0000000..13db2d9 Binary files /dev/null and b/src/assets/images/social-linkedin.png differ diff --git a/src/assets/images/social-twitter.png b/src/assets/images/social-twitter.png new file mode 100644 index 0000000..04afbfd Binary files /dev/null and b/src/assets/images/social-twitter.png differ diff --git a/src/assets/images/sq-1.jpg b/src/assets/images/sq-1.jpg new file mode 100644 index 0000000..a09eb41 Binary files /dev/null and b/src/assets/images/sq-1.jpg differ diff --git a/src/assets/images/sq-10.jpg b/src/assets/images/sq-10.jpg new file mode 100644 index 0000000..b5955bb Binary files /dev/null and b/src/assets/images/sq-10.jpg differ diff --git a/src/assets/images/sq-11.jpg b/src/assets/images/sq-11.jpg new file mode 100644 index 0000000..30e65af Binary files /dev/null and b/src/assets/images/sq-11.jpg differ diff --git a/src/assets/images/sq-12.jpg b/src/assets/images/sq-12.jpg new file mode 100644 index 0000000..9e632c4 Binary files /dev/null and b/src/assets/images/sq-12.jpg differ diff --git a/src/assets/images/sq-13.jpg b/src/assets/images/sq-13.jpg new file mode 100644 index 0000000..dbfd281 Binary files /dev/null and b/src/assets/images/sq-13.jpg differ diff --git a/src/assets/images/sq-15.jpg b/src/assets/images/sq-15.jpg new file mode 100644 index 0000000..410a52c Binary files /dev/null and b/src/assets/images/sq-15.jpg differ diff --git a/src/assets/images/sq-16.jpg b/src/assets/images/sq-16.jpg new file mode 100644 index 0000000..07f2c0e Binary files /dev/null and b/src/assets/images/sq-16.jpg differ diff --git a/src/assets/images/sq-17.jpg b/src/assets/images/sq-17.jpg new file mode 100644 index 0000000..d2fb473 Binary files /dev/null and b/src/assets/images/sq-17.jpg differ diff --git a/src/assets/images/sq-2.jpg b/src/assets/images/sq-2.jpg new file mode 100644 index 0000000..727a02a Binary files /dev/null and b/src/assets/images/sq-2.jpg differ diff --git a/src/assets/images/sq-3.jpg b/src/assets/images/sq-3.jpg new file mode 100644 index 0000000..720c819 Binary files /dev/null and b/src/assets/images/sq-3.jpg differ diff --git a/src/assets/images/sq-4.jpg b/src/assets/images/sq-4.jpg new file mode 100644 index 0000000..666f225 Binary files /dev/null and b/src/assets/images/sq-4.jpg differ diff --git a/src/assets/images/sq-5.jpg b/src/assets/images/sq-5.jpg new file mode 100644 index 0000000..247d50c Binary files /dev/null and b/src/assets/images/sq-5.jpg differ diff --git a/src/assets/images/sq-6.jpg b/src/assets/images/sq-6.jpg new file mode 100644 index 0000000..d5faf9f Binary files /dev/null and b/src/assets/images/sq-6.jpg differ diff --git a/src/assets/images/sq-7.jpg b/src/assets/images/sq-7.jpg new file mode 100644 index 0000000..c68fc90 Binary files /dev/null and b/src/assets/images/sq-7.jpg differ diff --git a/src/assets/images/sq-8.jpg b/src/assets/images/sq-8.jpg new file mode 100644 index 0000000..83c7775 Binary files /dev/null and b/src/assets/images/sq-8.jpg differ diff --git a/src/assets/images/sq-9.jpg b/src/assets/images/sq-9.jpg new file mode 100644 index 0000000..365d128 Binary files /dev/null and b/src/assets/images/sq-9.jpg differ diff --git a/src/assets/images/sq-face-220.jpg b/src/assets/images/sq-face-220.jpg new file mode 100644 index 0000000..16a714f Binary files /dev/null and b/src/assets/images/sq-face-220.jpg differ diff --git a/src/assets/images/star-rating.icons.svg b/src/assets/images/star-rating.icons.svg new file mode 100644 index 0000000..d9f4754 --- /dev/null +++ b/src/assets/images/star-rating.icons.svg @@ -0,0 +1,24 @@ + + + + + star-empty + + + + + star-half + + + + + star-filled + + + + + \ No newline at end of file diff --git a/src/assets/images/svgIconExample.svg b/src/assets/images/svgIconExample.svg new file mode 100644 index 0000000..be1e57d --- /dev/null +++ b/src/assets/images/svgIconExample.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/tf.png b/src/assets/images/tf.png new file mode 100644 index 0000000..2b76874 Binary files /dev/null and b/src/assets/images/tf.png differ diff --git a/src/assets/images/wide-1.jpg b/src/assets/images/wide-1.jpg new file mode 100644 index 0000000..99ebfa2 Binary files /dev/null and b/src/assets/images/wide-1.jpg differ diff --git a/src/assets/styles/app.scss b/src/assets/styles/app.scss new file mode 100644 index 0000000..2cd10f2 --- /dev/null +++ b/src/assets/styles/app.scss @@ -0,0 +1,63 @@ +/* + * + * MatX - Angular Material Design Admin Template + * + * +*/ + +// // Third pirty style files + +// // Bootstrap Utility Classes +@import "bootstrap-utilities/bootstrap-utilities"; + +// // Sidebar Scroll +@import "~perfect-scrollbar/css/perfect-scrollbar.css"; +// // Flag icon +//@import "~flag-icon-css/css/flag-icon.min.css"; + +// // star-rating styles (Used in Shop app) +//@import "~css-star-rating/dist/css/star-rating.min.css"; +// // Data Table +@import "~@swimlane/ngx-datatable/index.css"; +@import "~@swimlane/ngx-datatable/themes/material.css"; +@import "~@swimlane/ngx-datatable/assets/icons.css"; +// // Rich Text Editor +//@import "~quill/dist/quill.core.css"; +//@import "~quill/dist/quill.snow.css"; +// // Drag and Drop +//@import "~dragula/dist/dragula.css"; +// // Calendar +//@import "~angular-calendar/css/angular-calendar.css"; + +// // User tour +//@import "~hopscotch/dist/css/hopscotch.min.css"; +// // Page loader Topbar +@import "../../vendor/pace/pace-theme-min.css"; + +// // Highlightjs theme +// // @import '~highlight.js/styles/darcula.css'; +// // @import '~highlight.js/styles/github.css'; +@import "~highlight.js/styles/github-gist.css"; + +// Main Variables File +@import "scss/variables"; +@import "scss/functions/functions"; +@import "scss/mixins/mixins"; +@import "scss/colors"; + +@import "scss/animations"; + +// Open _themes.scss and remove unnecessary theme files +@import "scss/themes/themes"; + +@import "scss/utilities/utilities"; +@import "scss/components/components"; +@import "scss/palette"; + +@import "scss/page-layouts"; + +// Open _main.scss and keep files which are required for your current layout. +@import "scss/main/main"; + +// Open _views.scss and remove unnecessary view related files +@import "scss/views/views"; diff --git a/src/assets/styles/bootstrap-utilities/_functions.scss b/src/assets/styles/bootstrap-utilities/_functions.scss new file mode 100644 index 0000000..433784f --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/_functions.scss @@ -0,0 +1,132 @@ +// Utility mixins and functions for evaluating source code across our variables, maps, and mixins. + +// Ascending +// Used to evaluate Sass maps like our grid breakpoints. +@mixin _assert-ascending($map, $map-name) { + $prev-key: null; + $prev-num: null; + @each $key, $num in $map { + @if $prev-num == null or unit($num) == "%" or unit($prev-num) == "%" { + // Do nothing + } @else if not comparable($prev-num, $num) { + @warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !"; + } @else if $prev-num >= $num { + @warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !"; + } + $prev-key: $key; + $prev-num: $num; + } +} + +// Starts at zero +// Used to ensure the min-width of the lowest breakpoint starts at 0. +@mixin _assert-starts-at-zero($map, $map-name: "$grid-breakpoints") { + $values: map-values($map); + $first-value: nth($values, 1); + @if $first-value != 0 { + @warn "First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}."; + } +} + +// Replace `$search` with `$replace` in `$string` +// Used on our SVG icon backgrounds for custom forms. +// +// @author Hugo Giraudel +// @param {String} $string - Initial string +// @param {String} $search - Substring to replace +// @param {String} $replace ('') - New value +// @return {String} - Updated string +@function str-replace($string, $search, $replace: "") { + $index: str-index($string, $search); + + @if $index { + @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace); + } + + @return $string; +} + +// See https://codepen.io/kevinweber/pen/dXWoRw +@function escape-svg($string) { + @if str-index($string, "data:image/svg+xml") { + @each $char, $encoded in $escaped-characters { + $string: str-replace($string, $char, $encoded); + } + } + + @return $string; +} + +// Color contrast +@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) { + $r: red($color); + $g: green($color); + $b: blue($color); + + $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000; + + @if ($yiq >= $yiq-contrasted-threshold) { + @return $dark; + } @else { + @return $light; + } +} + +// Retrieve color Sass maps +@function color($key: "blue") { + @return map-get($colors, $key); +} + +@function theme-color($key: "primary") { + @return map-get($theme-colors, $key); +} + +@function gray($key: "100") { + @return map-get($grays, $key); +} + +// Request a theme color level +@function theme-color-level($color-name: "primary", $level: 0) { + $color: theme-color($color-name); + $color-base: if($level > 0, $black, $white); + $level: abs($level); + + @return mix($color-base, $color, $level * $theme-color-interval); +} + +// Return valid calc +@function add($value1, $value2, $return-calc: true) { + @if $value1 == null { + @return $value2; + } + + @if $value2 == null { + @return $value1; + } + + @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) { + @return $value1 + $value2; + } + + @return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(" + ") + $value2); +} + +@function subtract($value1, $value2, $return-calc: true) { + @if $value1 == null and $value2 == null { + @return null; + } + + @if $value1 == null { + @return -$value2; + } + + @if $value2 == null { + @return $value1; + } + + @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) { + @return $value1 - $value2; + } + + @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(" - ") + $value2); +} diff --git a/src/assets/styles/bootstrap-utilities/_mixins.scss b/src/assets/styles/bootstrap-utilities/_mixins.scss new file mode 100644 index 0000000..cc40377 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/_mixins.scss @@ -0,0 +1,18 @@ +// // Deprecate +@import "mixins/deprecate"; + +// // Utilities +@import "mixins/breakpoints"; +@import "mixins/hover"; + +@import "mixins/resize"; +// @import "mixins/screen-reader"; +// @import "mixins/size"; +// @import "mixins/reset-text"; +@import "mixins/text-emphasis"; +@import "mixins/text-hide"; +@import "mixins/text-truncate"; +@import "mixins/visibility"; + +// // Layout +@import "mixins/clearfix"; diff --git a/src/assets/styles/bootstrap-utilities/_utilities.scss b/src/assets/styles/bootstrap-utilities/_utilities.scss new file mode 100644 index 0000000..14c6491 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/_utilities.scss @@ -0,0 +1,10 @@ +@import "utilities/align"; +@import "utilities/clearfix"; +@import "utilities/display"; +@import "utilities/float"; +@import "utilities/overflow"; +@import "utilities/position"; +@import "utilities/sizing"; +@import "utilities/spacing"; +@import "utilities/text"; +@import "utilities/visibility"; diff --git a/src/assets/styles/bootstrap-utilities/_variables.scss b/src/assets/styles/bootstrap-utilities/_variables.scss new file mode 100644 index 0000000..5d3135c --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/_variables.scss @@ -0,0 +1,1143 @@ +// Variables +// +// Variables should follow the `$component-state-property-size` formula for +// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs. + +// Color system + +$white: #fff !default; +$gray-100: #f8f9fa !default; +$gray-200: #e9ecef !default; +$gray-300: #dee2e6 !default; +$gray-400: #ced4da !default; +$gray-500: #adb5bd !default; +$gray-600: #6c757d !default; +$gray-700: #495057 !default; +$gray-800: #343a40 !default; +$gray-900: #212529 !default; +$black: #000 !default; + +$grays: () !default; +// stylelint-disable-next-line scss/dollar-variable-default +$grays: map-merge( + ( + "100": $gray-100, + "200": $gray-200, + "300": $gray-300, + "400": $gray-400, + "500": $gray-500, + "600": $gray-600, + "700": $gray-700, + "800": $gray-800, + "900": $gray-900 + ), + $grays +); + +$blue: #007bff !default; +$indigo: #6610f2 !default; +$purple: #6f42c1 !default; +$pink: #e83e8c !default; +$red: #dc3545 !default; +$orange: #fd7e14 !default; +$yellow: #ffc107 !default; +$green: #28a745 !default; +$teal: #20c997 !default; +$cyan: #17a2b8 !default; + +$colors: () !default; +// stylelint-disable-next-line scss/dollar-variable-default +$colors: map-merge( + ( + "blue": $blue, + "indigo": $indigo, + "purple": $purple, + "pink": $pink, + "red": $red, + "orange": $orange, + "yellow": $yellow, + "green": $green, + "teal": $teal, + "cyan": $cyan, + "white": $white, + "gray": $gray-600, + "gray-dark": $gray-800 + ), + $colors +); + +$primary: $blue !default; +$secondary: $gray-600 !default; +$success: $green !default; +$info: $cyan !default; +$warning: $yellow !default; +$danger: $red !default; +$light: $gray-100 !default; +$dark: $gray-800 !default; + +$theme-colors: () !default; +// stylelint-disable-next-line scss/dollar-variable-default +$theme-colors: map-merge( + ( + "primary": $primary, + "secondary": $secondary, + "success": $success, + "info": $info, + "warning": $warning, + "danger": $danger, + "light": $light, + "dark": $dark + ), + $theme-colors +); + +// Set a specific jump point for requesting color jumps +$theme-color-interval: 8% !default; + +// The yiq lightness value that determines when the lightness of color changes from "dark" to "light". Acceptable values are between 0 and 255. +$yiq-contrasted-threshold: 150 !default; + +// Customize the light and dark text colors for use in our YIQ color contrast function. +$yiq-text-dark: $gray-900 !default; +$yiq-text-light: $white !default; + +// Characters which are escaped by the escape-svg function +$escaped-characters: ( + ("<","%3c"), + (">","%3e"), + ("#","%23"), +) !default; + + +// Options +// +// Quickly modify global styling by enabling or disabling optional features. + +$enable-caret: true !default; +$enable-rounded: true !default; +$enable-shadows: false !default; +$enable-gradients: false !default; +$enable-transitions: true !default; +$enable-prefers-reduced-motion-media-query: true !default; +$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS +$enable-grid-classes: true !default; +$enable-pointer-cursor-for-buttons: true !default; +$enable-print-styles: true !default; +$enable-responsive-font-sizes: false !default; +$enable-validation-icons: true !default; +$enable-deprecation-messages: true !default; + + +// Spacing +// +// Control the default styling of most Bootstrap elements by modifying these +// variables. Mostly focused on spacing. +// You can add more entries to the $spacers map, should you need more variation. + +$spacer: 1rem !default; +$spacers: () !default; +// stylelint-disable-next-line scss/dollar-variable-default +$spacers: map-merge( + ( + 0: 0, + 1: ($spacer * .25), + 2: ($spacer * .5), + 3: $spacer, + 4: ($spacer * 1.5), + 5: ($spacer * 3) + ), + $spacers +); + +// This variable affects the `.h-*` and `.w-*` classes. +$sizes: () !default; +// stylelint-disable-next-line scss/dollar-variable-default +$sizes: map-merge( + ( + 25: 25%, + 50: 50%, + 75: 75%, + 100: 100%, + auto: auto + ), + $sizes +); + + +// Body +// +// Settings for the `` element. + +$body-bg: $white !default; +$body-color: $gray-900 !default; + + +// Links +// +// Style anchor elements. + +$link-color: theme-color("primary") !default; +$link-decoration: none !default; +$link-hover-color: darken($link-color, 15%) !default; +$link-hover-decoration: underline !default; +// Darken percentage for links with `.text-*` class (e.g. `.text-success`) +$emphasized-link-hover-darken-percentage: 15% !default; + +// Paragraphs +// +// Style p element. + +$paragraph-margin-bottom: 1rem !default; + + +// Grid breakpoints +// +// Define the minimum dimensions at which your layout will change, +// adapting to different screen sizes, for use in media queries. + +$grid-breakpoints: ( + xs: 0, + sm: 576px, + md: 768px, + lg: 992px, + xl: 1200px +) !default; + +@include _assert-ascending($grid-breakpoints, "$grid-breakpoints"); +@include _assert-starts-at-zero($grid-breakpoints, "$grid-breakpoints"); + + +// Grid containers +// +// Define the maximum width of `.container` for different screen sizes. + +$container-max-widths: ( + sm: 540px, + md: 720px, + lg: 960px, + xl: 1140px +) !default; + +@include _assert-ascending($container-max-widths, "$container-max-widths"); + + +// Grid columns +// +// Set the number of columns and specify the width of the gutters. + +$grid-columns: 12 !default; +$grid-gutter-width: 30px !default; +$grid-row-columns: 6 !default; + + +// Components +// +// Define common padding and border radius sizes and more. + +$line-height-lg: 1.5 !default; +$line-height-sm: 1.5 !default; + +$border-width: 1px !default; +$border-color: $gray-300 !default; + +$border-radius: .25rem !default; +$border-radius-lg: .3rem !default; +$border-radius-sm: .2rem !default; + +$rounded-pill: 50rem !default; + +$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default; +$box-shadow: 0 .5rem 1rem rgba($black, .15) !default; +$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default; + +$component-active-color: $white !default; +$component-active-bg: theme-color("primary") !default; + +$caret-width: .3em !default; +$caret-vertical-align: $caret-width * .85 !default; +$caret-spacing: $caret-width * .85 !default; + +$transition-base: all .2s ease-in-out !default; +$transition-fade: opacity .15s linear !default; +$transition-collapse: height .35s ease !default; + +$embed-responsive-aspect-ratios: () !default; +// stylelint-disable-next-line scss/dollar-variable-default +$embed-responsive-aspect-ratios: join( + ( + (21 9), + (16 9), + (4 3), + (1 1), + ), + $embed-responsive-aspect-ratios +); + +// Typography +// +// Font, line-height, and color for body text, headings, and more. + +// stylelint-disable value-keyword-case +$font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default; +$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default; +$font-family-base: $font-family-sans-serif !default; +// stylelint-enable value-keyword-case + +$font-size-base: 1rem !default; // Assumes the browser default, typically `16px` +$font-size-lg: $font-size-base * 1.25 !default; +$font-size-sm: $font-size-base * .875 !default; + +$font-weight-lighter: lighter !default; +$font-weight-light: 300 !default; +$font-weight-normal: 400 !default; +$font-weight-bold: 700 !default; +$font-weight-bolder: bolder !default; + +$font-weight-base: $font-weight-normal !default; +$line-height-base: 1.5 !default; + +$h1-font-size: $font-size-base * 2.5 !default; +$h2-font-size: $font-size-base * 2 !default; +$h3-font-size: $font-size-base * 1.75 !default; +$h4-font-size: $font-size-base * 1.5 !default; +$h5-font-size: $font-size-base * 1.25 !default; +$h6-font-size: $font-size-base !default; + +$headings-margin-bottom: $spacer / 2 !default; +$headings-font-family: null !default; +$headings-font-weight: 500 !default; +$headings-line-height: 1.2 !default; +$headings-color: null !default; + +$display1-size: 6rem !default; +$display2-size: 5.5rem !default; +$display3-size: 4.5rem !default; +$display4-size: 3.5rem !default; + +$display1-weight: 300 !default; +$display2-weight: 300 !default; +$display3-weight: 300 !default; +$display4-weight: 300 !default; +$display-line-height: $headings-line-height !default; + +$lead-font-size: $font-size-base * 1.25 !default; +$lead-font-weight: 300 !default; + +$small-font-size: 80% !default; + +$text-muted: $gray-600 !default; + +$blockquote-small-color: $gray-600 !default; +$blockquote-small-font-size: $small-font-size !default; +$blockquote-font-size: $font-size-base * 1.25 !default; + +$hr-border-color: rgba($black, .1) !default; +$hr-border-width: $border-width !default; + +$mark-padding: .2em !default; + +$dt-font-weight: $font-weight-bold !default; + +$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default; +$nested-kbd-font-weight: $font-weight-bold !default; + +$list-inline-padding: .5rem !default; + +$mark-bg: #fcf8e3 !default; + +$hr-margin-y: $spacer !default; + + +// Tables +// +// Customizes the `.table` component with basic values, each used across all table variations. + +$table-cell-padding: .75rem !default; +$table-cell-padding-sm: .3rem !default; + +$table-color: $body-color !default; +$table-bg: null !default; +$table-accent-bg: rgba($black, .05) !default; +$table-hover-color: $table-color !default; +$table-hover-bg: rgba($black, .075) !default; +$table-active-bg: $table-hover-bg !default; + +$table-border-width: $border-width !default; +$table-border-color: $border-color !default; + +$table-head-bg: $gray-200 !default; +$table-head-color: $gray-700 !default; + +$table-dark-color: $white !default; +$table-dark-bg: $gray-800 !default; +$table-dark-accent-bg: rgba($white, .05) !default; +$table-dark-hover-color: $table-dark-color !default; +$table-dark-hover-bg: rgba($white, .075) !default; +$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default; + +$table-striped-order: odd !default; + +$table-caption-color: $text-muted !default; + +$table-bg-level: -9 !default; +$table-border-level: -6 !default; + + +// Buttons + Forms +// +// Shared variables that are reassigned to `$input-` and `$btn-` specific variables. + +$input-btn-padding-y: .375rem !default; +$input-btn-padding-x: .75rem !default; +$input-btn-font-family: null !default; +$input-btn-font-size: $font-size-base !default; +$input-btn-line-height: $line-height-base !default; + +$input-btn-focus-width: .2rem !default; +$input-btn-focus-color: rgba($component-active-bg, .25) !default; +$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default; + +$input-btn-padding-y-sm: .25rem !default; +$input-btn-padding-x-sm: .5rem !default; +$input-btn-font-size-sm: $font-size-sm !default; +$input-btn-line-height-sm: $line-height-sm !default; + +$input-btn-padding-y-lg: .5rem !default; +$input-btn-padding-x-lg: 1rem !default; +$input-btn-font-size-lg: $font-size-lg !default; +$input-btn-line-height-lg: $line-height-lg !default; + +$input-btn-border-width: $border-width !default; + + +// Buttons +// +// For each of Bootstrap's buttons, define text, background, and border color. + +$btn-padding-y: $input-btn-padding-y !default; +$btn-padding-x: $input-btn-padding-x !default; +$btn-font-family: $input-btn-font-family !default; +$btn-font-size: $input-btn-font-size !default; +$btn-line-height: $input-btn-line-height !default; +$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping + +$btn-padding-y-sm: $input-btn-padding-y-sm !default; +$btn-padding-x-sm: $input-btn-padding-x-sm !default; +$btn-font-size-sm: $input-btn-font-size-sm !default; +$btn-line-height-sm: $input-btn-line-height-sm !default; + +$btn-padding-y-lg: $input-btn-padding-y-lg !default; +$btn-padding-x-lg: $input-btn-padding-x-lg !default; +$btn-font-size-lg: $input-btn-font-size-lg !default; +$btn-line-height-lg: $input-btn-line-height-lg !default; + +$btn-border-width: $input-btn-border-width !default; + +$btn-font-weight: $font-weight-normal !default; +$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default; +$btn-focus-width: $input-btn-focus-width !default; +$btn-focus-box-shadow: $input-btn-focus-box-shadow !default; +$btn-disabled-opacity: .65 !default; +$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default; + +$btn-link-disabled-color: $gray-600 !default; + +$btn-block-spacing-y: .5rem !default; + +// Allows for customizing button radius independently from global border radius +$btn-border-radius: $border-radius !default; +$btn-border-radius-lg: $border-radius-lg !default; +$btn-border-radius-sm: $border-radius-sm !default; + +$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; + + +// Forms + +$label-margin-bottom: .5rem !default; + +$input-padding-y: $input-btn-padding-y !default; +$input-padding-x: $input-btn-padding-x !default; +$input-font-family: $input-btn-font-family !default; +$input-font-size: $input-btn-font-size !default; +$input-font-weight: $font-weight-base !default; +$input-line-height: $input-btn-line-height !default; + +$input-padding-y-sm: $input-btn-padding-y-sm !default; +$input-padding-x-sm: $input-btn-padding-x-sm !default; +$input-font-size-sm: $input-btn-font-size-sm !default; +$input-line-height-sm: $input-btn-line-height-sm !default; + +$input-padding-y-lg: $input-btn-padding-y-lg !default; +$input-padding-x-lg: $input-btn-padding-x-lg !default; +$input-font-size-lg: $input-btn-font-size-lg !default; +$input-line-height-lg: $input-btn-line-height-lg !default; + +$input-bg: $white !default; +$input-disabled-bg: $gray-200 !default; + +$input-color: $gray-700 !default; +$input-border-color: $gray-400 !default; +$input-border-width: $input-btn-border-width !default; +$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default; + +$input-border-radius: $border-radius !default; +$input-border-radius-lg: $border-radius-lg !default; +$input-border-radius-sm: $border-radius-sm !default; + +$input-focus-bg: $input-bg !default; +$input-focus-border-color: lighten($component-active-bg, 25%) !default; +$input-focus-color: $input-color !default; +$input-focus-width: $input-btn-focus-width !default; +$input-focus-box-shadow: $input-btn-focus-box-shadow !default; + +$input-placeholder-color: $gray-600 !default; +$input-plaintext-color: $body-color !default; + +$input-height-border: $input-border-width * 2 !default; + +$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default; +$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default; +$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y / 2) !default; + +$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default; +$input-height-sm: add($input-line-height-sm * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default; +$input-height-lg: add($input-line-height-lg * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default; + +$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; + +$form-text-margin-top: .25rem !default; + +$form-check-input-gutter: 1.25rem !default; +$form-check-input-margin-y: .3rem !default; +$form-check-input-margin-x: .25rem !default; + +$form-check-inline-margin-x: .75rem !default; +$form-check-inline-input-margin-x: .3125rem !default; + +$form-grid-gutter-width: 10px !default; +$form-group-margin-bottom: 1rem !default; + +$input-group-addon-color: $input-color !default; +$input-group-addon-bg: $gray-200 !default; +$input-group-addon-border-color: $input-border-color !default; + +$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; + +$custom-control-gutter: .5rem !default; +$custom-control-spacer-x: 1rem !default; +$custom-control-cursor: null !default; + +$custom-control-indicator-size: 1rem !default; +$custom-control-indicator-bg: $input-bg !default; + +$custom-control-indicator-bg-size: 50% 50% !default; +$custom-control-indicator-box-shadow: $input-box-shadow !default; +$custom-control-indicator-border-color: $gray-500 !default; +$custom-control-indicator-border-width: $input-border-width !default; + +$custom-control-label-color: null !default; + +$custom-control-indicator-disabled-bg: $input-disabled-bg !default; +$custom-control-label-disabled-color: $gray-600 !default; + +$custom-control-indicator-checked-color: $component-active-color !default; +$custom-control-indicator-checked-bg: $component-active-bg !default; +$custom-control-indicator-checked-disabled-bg: rgba(theme-color("primary"), .5) !default; +$custom-control-indicator-checked-box-shadow: none !default; +$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default; + +$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default; +$custom-control-indicator-focus-border-color: $input-focus-border-color !default; + +$custom-control-indicator-active-color: $component-active-color !default; +$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default; +$custom-control-indicator-active-box-shadow: none !default; +$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default; + +$custom-checkbox-indicator-border-radius: $border-radius !default; +$custom-checkbox-indicator-icon-checked: url("data:image/svg+xml,") !default; + +$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default; +$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default; +$custom-checkbox-indicator-icon-indeterminate: url("data:image/svg+xml,") !default; +$custom-checkbox-indicator-indeterminate-box-shadow: none !default; +$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default; + +$custom-radio-indicator-border-radius: 50% !default; +$custom-radio-indicator-icon-checked: url("data:image/svg+xml,") !default; + +$custom-switch-width: $custom-control-indicator-size * 1.75 !default; +$custom-switch-indicator-border-radius: $custom-control-indicator-size / 2 !default; +$custom-switch-indicator-size: subtract($custom-control-indicator-size, $custom-control-indicator-border-width * 4) !default; + +$custom-select-padding-y: $input-padding-y !default; +$custom-select-padding-x: $input-padding-x !default; +$custom-select-font-family: $input-font-family !default; +$custom-select-font-size: $input-font-size !default; +$custom-select-height: $input-height !default; +$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator +$custom-select-font-weight: $input-font-weight !default; +$custom-select-line-height: $input-line-height !default; +$custom-select-color: $input-color !default; +$custom-select-disabled-color: $gray-600 !default; +$custom-select-bg: $input-bg !default; +$custom-select-disabled-bg: $gray-200 !default; +$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions +$custom-select-indicator-color: $gray-800 !default; +$custom-select-indicator: url("data:image/svg+xml,") !default; +$custom-select-background: escape-svg($custom-select-indicator) no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon) + +$custom-select-feedback-icon-padding-right: add(1em * .75, (2 * $custom-select-padding-y * .75) + $custom-select-padding-x + $custom-select-indicator-padding) !default; +$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default; +$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default; + +$custom-select-border-width: $input-border-width !default; +$custom-select-border-color: $input-border-color !default; +$custom-select-border-radius: $border-radius !default; +$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default; + +$custom-select-focus-border-color: $input-focus-border-color !default; +$custom-select-focus-width: $input-focus-width !default; +$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default; + +$custom-select-padding-y-sm: $input-padding-y-sm !default; +$custom-select-padding-x-sm: $input-padding-x-sm !default; +$custom-select-font-size-sm: $input-font-size-sm !default; +$custom-select-height-sm: $input-height-sm !default; + +$custom-select-padding-y-lg: $input-padding-y-lg !default; +$custom-select-padding-x-lg: $input-padding-x-lg !default; +$custom-select-font-size-lg: $input-font-size-lg !default; +$custom-select-height-lg: $input-height-lg !default; + +$custom-range-track-width: 100% !default; +$custom-range-track-height: .5rem !default; +$custom-range-track-cursor: pointer !default; +$custom-range-track-bg: $gray-300 !default; +$custom-range-track-border-radius: 1rem !default; +$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default; + +$custom-range-thumb-width: 1rem !default; +$custom-range-thumb-height: $custom-range-thumb-width !default; +$custom-range-thumb-bg: $component-active-bg !default; +$custom-range-thumb-border: 0 !default; +$custom-range-thumb-border-radius: 1rem !default; +$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default; +$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default; +$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge +$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default; +$custom-range-thumb-disabled-bg: $gray-500 !default; + +$custom-file-height: $input-height !default; +$custom-file-height-inner: $input-height-inner !default; +$custom-file-focus-border-color: $input-focus-border-color !default; +$custom-file-focus-box-shadow: $input-focus-box-shadow !default; +$custom-file-disabled-bg: $input-disabled-bg !default; + +$custom-file-padding-y: $input-padding-y !default; +$custom-file-padding-x: $input-padding-x !default; +$custom-file-line-height: $input-line-height !default; +$custom-file-font-family: $input-font-family !default; +$custom-file-font-weight: $input-font-weight !default; +$custom-file-color: $input-color !default; +$custom-file-bg: $input-bg !default; +$custom-file-border-width: $input-border-width !default; +$custom-file-border-color: $input-border-color !default; +$custom-file-border-radius: $input-border-radius !default; +$custom-file-box-shadow: $input-box-shadow !default; +$custom-file-button-color: $custom-file-color !default; +$custom-file-button-bg: $input-group-addon-bg !default; +$custom-file-text: ( + en: "Browse" +) !default; + + +// Form validation + +$form-feedback-margin-top: $form-text-margin-top !default; +$form-feedback-font-size: $small-font-size !default; +$form-feedback-valid-color: theme-color("success") !default; +$form-feedback-invalid-color: theme-color("danger") !default; + +$form-feedback-icon-valid-color: $form-feedback-valid-color !default; +$form-feedback-icon-valid: url("data:image/svg+xml,") !default; +$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default; +$form-feedback-icon-invalid: url("data:image/svg+xml,") !default; + +$form-validation-states: () !default; +// stylelint-disable-next-line scss/dollar-variable-default +$form-validation-states: map-merge( + ( + "valid": ( + "color": $form-feedback-valid-color, + "icon": $form-feedback-icon-valid + ), + "invalid": ( + "color": $form-feedback-invalid-color, + "icon": $form-feedback-icon-invalid + ), + ), + $form-validation-states +); + +// Z-index master list +// +// Warning: Avoid customizing these values. They're used for a bird's eye view +// of components dependent on the z-axis and are designed to all work together. + +$zindex-dropdown: 1000 !default; +$zindex-sticky: 1020 !default; +$zindex-fixed: 1030 !default; +$zindex-modal-backdrop: 1040 !default; +$zindex-modal: 1050 !default; +$zindex-popover: 1060 !default; +$zindex-tooltip: 1070 !default; + + +// Navs + +$nav-link-padding-y: .5rem !default; +$nav-link-padding-x: 1rem !default; +$nav-link-disabled-color: $gray-600 !default; + +$nav-tabs-border-color: $gray-300 !default; +$nav-tabs-border-width: $border-width !default; +$nav-tabs-border-radius: $border-radius !default; +$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default; +$nav-tabs-link-active-color: $gray-700 !default; +$nav-tabs-link-active-bg: $body-bg !default; +$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default; + +$nav-pills-border-radius: $border-radius !default; +$nav-pills-link-active-color: $component-active-color !default; +$nav-pills-link-active-bg: $component-active-bg !default; + +$nav-divider-color: $gray-200 !default; +$nav-divider-margin-y: $spacer / 2 !default; + + +// Navbar + +$navbar-padding-y: $spacer / 2 !default; +$navbar-padding-x: $spacer !default; + +$navbar-nav-link-padding-x: .5rem !default; + +$navbar-brand-font-size: $font-size-lg !default; +// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link +$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default; +$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default; +$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default; + +$navbar-toggler-padding-y: .25rem !default; +$navbar-toggler-padding-x: .75rem !default; +$navbar-toggler-font-size: $font-size-lg !default; +$navbar-toggler-border-radius: $btn-border-radius !default; + +$navbar-dark-color: rgba($white, .5) !default; +$navbar-dark-hover-color: rgba($white, .75) !default; +$navbar-dark-active-color: $white !default; +$navbar-dark-disabled-color: rgba($white, .25) !default; +$navbar-dark-toggler-icon-bg: url("data:image/svg+xml,") !default; +$navbar-dark-toggler-border-color: rgba($white, .1) !default; + +$navbar-light-color: rgba($black, .5) !default; +$navbar-light-hover-color: rgba($black, .7) !default; +$navbar-light-active-color: rgba($black, .9) !default; +$navbar-light-disabled-color: rgba($black, .3) !default; +$navbar-light-toggler-icon-bg: url("data:image/svg+xml,") !default; +$navbar-light-toggler-border-color: rgba($black, .1) !default; + +$navbar-light-brand-color: $navbar-light-active-color !default; +$navbar-light-brand-hover-color: $navbar-light-active-color !default; +$navbar-dark-brand-color: $navbar-dark-active-color !default; +$navbar-dark-brand-hover-color: $navbar-dark-active-color !default; + + +// Dropdowns +// +// Dropdown menu container and contents. + +$dropdown-min-width: 10rem !default; +$dropdown-padding-y: .5rem !default; +$dropdown-spacer: .125rem !default; +$dropdown-font-size: $font-size-base !default; +$dropdown-color: $body-color !default; +$dropdown-bg: $white !default; +$dropdown-border-color: rgba($black, .15) !default; +$dropdown-border-radius: $border-radius !default; +$dropdown-border-width: $border-width !default; +$dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default; +$dropdown-divider-bg: $gray-200 !default; +$dropdown-divider-margin-y: $nav-divider-margin-y !default; +$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default; + +$dropdown-link-color: $gray-900 !default; +$dropdown-link-hover-color: darken($gray-900, 5%) !default; +$dropdown-link-hover-bg: $gray-100 !default; + +$dropdown-link-active-color: $component-active-color !default; +$dropdown-link-active-bg: $component-active-bg !default; + +$dropdown-link-disabled-color: $gray-600 !default; + +$dropdown-item-padding-y: .25rem !default; +$dropdown-item-padding-x: 1.5rem !default; + +$dropdown-header-color: $gray-600 !default; + + +// Pagination + +$pagination-padding-y: .5rem !default; +$pagination-padding-x: .75rem !default; +$pagination-padding-y-sm: .25rem !default; +$pagination-padding-x-sm: .5rem !default; +$pagination-padding-y-lg: .75rem !default; +$pagination-padding-x-lg: 1.5rem !default; +$pagination-line-height: 1.25 !default; + +$pagination-color: $link-color !default; +$pagination-bg: $white !default; +$pagination-border-width: $border-width !default; +$pagination-border-color: $gray-300 !default; + +$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default; +$pagination-focus-outline: 0 !default; + +$pagination-hover-color: $link-hover-color !default; +$pagination-hover-bg: $gray-200 !default; +$pagination-hover-border-color: $gray-300 !default; + +$pagination-active-color: $component-active-color !default; +$pagination-active-bg: $component-active-bg !default; +$pagination-active-border-color: $pagination-active-bg !default; + +$pagination-disabled-color: $gray-600 !default; +$pagination-disabled-bg: $white !default; +$pagination-disabled-border-color: $gray-300 !default; + + +// Jumbotron + +$jumbotron-padding: 2rem !default; +$jumbotron-color: null !default; +$jumbotron-bg: $gray-200 !default; + + +// Cards + +$card-spacer-y: .75rem !default; +$card-spacer-x: 1.25rem !default; +$card-border-width: $border-width !default; +$card-border-radius: $border-radius !default; +$card-border-color: rgba($black, .125) !default; +$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default; +$card-cap-bg: rgba($black, .03) !default; +$card-cap-color: null !default; +$card-height: null !default; +$card-color: null !default; +$card-bg: $white !default; + +$card-img-overlay-padding: 1.25rem !default; + +$card-group-margin: $grid-gutter-width / 2 !default; +$card-deck-margin: $card-group-margin !default; + +$card-columns-count: 3 !default; +$card-columns-gap: 1.25rem !default; +$card-columns-margin: $card-spacer-y !default; + + +// Tooltips + +$tooltip-font-size: $font-size-sm !default; +$tooltip-max-width: 200px !default; +$tooltip-color: $white !default; +$tooltip-bg: $black !default; +$tooltip-border-radius: $border-radius !default; +$tooltip-opacity: .9 !default; +$tooltip-padding-y: .25rem !default; +$tooltip-padding-x: .5rem !default; +$tooltip-margin: 0 !default; + +$tooltip-arrow-width: .8rem !default; +$tooltip-arrow-height: .4rem !default; +$tooltip-arrow-color: $tooltip-bg !default; + +// Form tooltips must come after regular tooltips +$form-feedback-tooltip-padding-y: $tooltip-padding-y !default; +$form-feedback-tooltip-padding-x: $tooltip-padding-x !default; +$form-feedback-tooltip-font-size: $tooltip-font-size !default; +$form-feedback-tooltip-line-height: $line-height-base !default; +$form-feedback-tooltip-opacity: $tooltip-opacity !default; +$form-feedback-tooltip-border-radius: $tooltip-border-radius !default; + + +// Popovers + +$popover-font-size: $font-size-sm !default; +$popover-bg: $white !default; +$popover-max-width: 276px !default; +$popover-border-width: $border-width !default; +$popover-border-color: rgba($black, .2) !default; +$popover-border-radius: $border-radius-lg !default; +$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width) !default; +$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default; + +$popover-header-bg: darken($popover-bg, 3%) !default; +$popover-header-color: $headings-color !default; +$popover-header-padding-y: .5rem !default; +$popover-header-padding-x: .75rem !default; + +$popover-body-color: $body-color !default; +$popover-body-padding-y: $popover-header-padding-y !default; +$popover-body-padding-x: $popover-header-padding-x !default; + +$popover-arrow-width: 1rem !default; +$popover-arrow-height: .5rem !default; +$popover-arrow-color: $popover-bg !default; + +$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default; + + +// Toasts + +$toast-max-width: 350px !default; +$toast-padding-x: .75rem !default; +$toast-padding-y: .25rem !default; +$toast-font-size: .875rem !default; +$toast-color: null !default; +$toast-background-color: rgba($white, .85) !default; +$toast-border-width: 1px !default; +$toast-border-color: rgba(0, 0, 0, .1) !default; +$toast-border-radius: .25rem !default; +$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default; + +$toast-header-color: $gray-600 !default; +$toast-header-background-color: rgba($white, .85) !default; +$toast-header-border-color: rgba(0, 0, 0, .05) !default; + + +// Badges + +$badge-font-size: 75% !default; +$badge-font-weight: $font-weight-bold !default; +$badge-padding-y: .25em !default; +$badge-padding-x: .4em !default; +$badge-border-radius: $border-radius !default; + +$badge-transition: $btn-transition !default; +$badge-focus-width: $input-btn-focus-width !default; + +$badge-pill-padding-x: .6em !default; +// Use a higher than normal value to ensure completely rounded edges when +// customizing padding or font-size on labels. +$badge-pill-border-radius: 10rem !default; + + +// Modals + +// Padding applied to the modal body +$modal-inner-padding: 1rem !default; + +// Margin between elements in footer, must be lower than or equal to 2 * $modal-inner-padding +$modal-footer-margin-between: .5rem !default; + +$modal-dialog-margin: .5rem !default; +$modal-dialog-margin-y-sm-up: 1.75rem !default; + +$modal-title-line-height: $line-height-base !default; + +$modal-content-color: null !default; +$modal-content-bg: $white !default; +$modal-content-border-color: rgba($black, .2) !default; +$modal-content-border-width: $border-width !default; +$modal-content-border-radius: $border-radius-lg !default; +$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default; +$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default; +$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default; + +$modal-backdrop-bg: $black !default; +$modal-backdrop-opacity: .5 !default; +$modal-header-border-color: $border-color !default; +$modal-footer-border-color: $modal-header-border-color !default; +$modal-header-border-width: $modal-content-border-width !default; +$modal-footer-border-width: $modal-header-border-width !default; +$modal-header-padding-y: 1rem !default; +$modal-header-padding-x: 1rem !default; +$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility + +$modal-xl: 1140px !default; +$modal-lg: 800px !default; +$modal-md: 500px !default; +$modal-sm: 300px !default; + +$modal-fade-transform: translate(0, -50px) !default; +$modal-show-transform: none !default; +$modal-transition: transform .3s ease-out !default; +$modal-scale-transform: scale(1.02) !default; + + +// Alerts +// +// Define alert colors, border radius, and padding. + +$alert-padding-y: .75rem !default; +$alert-padding-x: 1.25rem !default; +$alert-margin-bottom: 1rem !default; +$alert-border-radius: $border-radius !default; +$alert-link-font-weight: $font-weight-bold !default; +$alert-border-width: $border-width !default; + +$alert-bg-level: -10 !default; +$alert-border-level: -9 !default; +$alert-color-level: 6 !default; + + +// Progress bars + +$progress-height: 1rem !default; +$progress-font-size: $font-size-base * .75 !default; +$progress-bg: $gray-200 !default; +$progress-border-radius: $border-radius !default; +$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default; +$progress-bar-color: $white !default; +$progress-bar-bg: theme-color("primary") !default; +$progress-bar-animation-timing: 1s linear infinite !default; +$progress-bar-transition: width .6s ease !default; + + +// List group + +$list-group-color: null !default; +$list-group-bg: $white !default; +$list-group-border-color: rgba($black, .125) !default; +$list-group-border-width: $border-width !default; +$list-group-border-radius: $border-radius !default; + +$list-group-item-padding-y: .75rem !default; +$list-group-item-padding-x: 1.25rem !default; + +$list-group-hover-bg: $gray-100 !default; +$list-group-active-color: $component-active-color !default; +$list-group-active-bg: $component-active-bg !default; +$list-group-active-border-color: $list-group-active-bg !default; + +$list-group-disabled-color: $gray-600 !default; +$list-group-disabled-bg: $list-group-bg !default; + +$list-group-action-color: $gray-700 !default; +$list-group-action-hover-color: $list-group-action-color !default; + +$list-group-action-active-color: $body-color !default; +$list-group-action-active-bg: $gray-200 !default; + + +// Image thumbnails + +$thumbnail-padding: .25rem !default; +$thumbnail-bg: $body-bg !default; +$thumbnail-border-width: $border-width !default; +$thumbnail-border-color: $gray-300 !default; +$thumbnail-border-radius: $border-radius !default; +$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default; + + +// Figures + +$figure-caption-font-size: 90% !default; +$figure-caption-color: $gray-600 !default; + + +// Breadcrumbs + +$breadcrumb-font-size: null !default; + +$breadcrumb-padding-y: .75rem !default; +$breadcrumb-padding-x: 1rem !default; +$breadcrumb-item-padding: .5rem !default; + +$breadcrumb-margin-bottom: 1rem !default; + +$breadcrumb-bg: $gray-200 !default; +$breadcrumb-divider-color: $gray-600 !default; +$breadcrumb-active-color: $gray-600 !default; +$breadcrumb-divider: quote("/") !default; + +$breadcrumb-border-radius: $border-radius !default; + + +// Carousel + +$carousel-control-color: $white !default; +$carousel-control-width: 15% !default; +$carousel-control-opacity: .5 !default; +$carousel-control-hover-opacity: .9 !default; +$carousel-control-transition: opacity .15s ease !default; + +$carousel-indicator-width: 30px !default; +$carousel-indicator-height: 3px !default; +$carousel-indicator-hit-area-height: 10px !default; +$carousel-indicator-spacer: 3px !default; +$carousel-indicator-active-bg: $white !default; +$carousel-indicator-transition: opacity .6s ease !default; + +$carousel-caption-width: 70% !default; +$carousel-caption-color: $white !default; + +$carousel-control-icon-width: 20px !default; + +$carousel-control-prev-icon-bg: url("data:image/svg+xml,") !default; +$carousel-control-next-icon-bg: url("data:image/svg+xml,") !default; + +$carousel-transition-duration: .6s !default; +$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`) + + +// Spinners + +$spinner-width: 2rem !default; +$spinner-height: $spinner-width !default; +$spinner-border-width: .25em !default; + +$spinner-width-sm: 1rem !default; +$spinner-height-sm: $spinner-width-sm !default; +$spinner-border-width-sm: .2em !default; + + +// Close + +$close-font-size: $font-size-base * 1.5 !default; +$close-font-weight: $font-weight-bold !default; +$close-color: $black !default; +$close-text-shadow: 0 1px 0 $white !default; + + +// Code + +$code-font-size: 87.5% !default; +$code-color: $pink !default; + +$kbd-padding-y: .2rem !default; +$kbd-padding-x: .4rem !default; +$kbd-font-size: $code-font-size !default; +$kbd-color: $white !default; +$kbd-bg: $gray-900 !default; + +$pre-color: $gray-900 !default; +$pre-scrollable-max-height: 340px !default; + + +// Utilities + +$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default; +$overflows: auto, hidden !default; +$positions: static, relative, absolute, fixed, sticky !default; + + +// Printing + +$print-page-size: a3 !default; +$print-body-min-width: map-get($grid-breakpoints, "lg") !default; diff --git a/src/assets/styles/bootstrap-utilities/bootstrap-utilities.scss b/src/assets/styles/bootstrap-utilities/bootstrap-utilities.scss new file mode 100644 index 0000000..5d028fc --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/bootstrap-utilities.scss @@ -0,0 +1,4 @@ +@import "functions"; +@import "mixins"; +@import "variables"; +@import "utilities"; \ No newline at end of file diff --git a/src/assets/styles/bootstrap-utilities/mixins/_alert.scss b/src/assets/styles/bootstrap-utilities/mixins/_alert.scss new file mode 100644 index 0000000..db5a7eb --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_alert.scss @@ -0,0 +1,13 @@ +@mixin alert-variant($background, $border, $color) { + color: $color; + @include gradient-bg($background); + border-color: $border; + + hr { + border-top-color: darken($border, 5%); + } + + .alert-link { + color: darken($color, 10%); + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_background-variant.scss b/src/assets/styles/bootstrap-utilities/mixins/_background-variant.scss new file mode 100644 index 0000000..3ceb5c5 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_background-variant.scss @@ -0,0 +1,22 @@ +// stylelint-disable declaration-no-important + +// Contextual backgrounds + +@mixin bg-variant($parent, $color, $ignore-warning: false) { + #{$parent} { + background-color: $color !important; + } + a#{$parent}, + button#{$parent} { + @include hover-focus() { + background-color: darken($color, 10%) !important; + } + } + @include deprecate("The `bg-variant` mixin", "v4.4.0", "v5", $ignore-warning); +} + +@mixin bg-gradient-variant($parent, $color) { + #{$parent} { + background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important; + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_badge.scss b/src/assets/styles/bootstrap-utilities/mixins/_badge.scss new file mode 100644 index 0000000..f1c4991 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_badge.scss @@ -0,0 +1,17 @@ +@mixin badge-variant($bg) { + color: color-yiq($bg); + background-color: $bg; + + @at-root a#{&} { + @include hover-focus() { + color: color-yiq($bg); + background-color: darken($bg, 10%); + } + + &:focus, + &.focus { + outline: 0; + box-shadow: 0 0 0 $badge-focus-width rgba($bg, .5); + } + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_border-radius.scss b/src/assets/styles/bootstrap-utilities/mixins/_border-radius.scss new file mode 100644 index 0000000..88aeb37 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_border-radius.scss @@ -0,0 +1,63 @@ +// stylelint-disable property-blacklist +// Single side border-radius + +@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) { + @if $enable-rounded { + border-radius: $radius; + } + @else if $fallback-border-radius != false { + border-radius: $fallback-border-radius; + } +} + +@mixin border-top-radius($radius) { + @if $enable-rounded { + border-top-left-radius: $radius; + border-top-right-radius: $radius; + } +} + +@mixin border-right-radius($radius) { + @if $enable-rounded { + border-top-right-radius: $radius; + border-bottom-right-radius: $radius; + } +} + +@mixin border-bottom-radius($radius) { + @if $enable-rounded { + border-bottom-right-radius: $radius; + border-bottom-left-radius: $radius; + } +} + +@mixin border-left-radius($radius) { + @if $enable-rounded { + border-top-left-radius: $radius; + border-bottom-left-radius: $radius; + } +} + +@mixin border-top-left-radius($radius) { + @if $enable-rounded { + border-top-left-radius: $radius; + } +} + +@mixin border-top-right-radius($radius) { + @if $enable-rounded { + border-top-right-radius: $radius; + } +} + +@mixin border-bottom-right-radius($radius) { + @if $enable-rounded { + border-bottom-right-radius: $radius; + } +} + +@mixin border-bottom-left-radius($radius) { + @if $enable-rounded { + border-bottom-left-radius: $radius; + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_box-shadow.scss b/src/assets/styles/bootstrap-utilities/mixins/_box-shadow.scss new file mode 100644 index 0000000..0726d43 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_box-shadow.scss @@ -0,0 +1,20 @@ +@mixin box-shadow($shadow...) { + @if $enable-shadows { + $result: (); + + @if (length($shadow) == 1) { + // We can pass `@include box-shadow(none);` + $result: $shadow; + } @else { + // Filter to avoid invalid properties for example `box-shadow: none, 1px 1px black;` + @for $i from 1 through length($shadow) { + @if nth($shadow, $i) != "none" { + $result: append($result, nth($shadow, $i), "comma"); + } + } + } + @if (length($result) > 0) { + box-shadow: $result; + } + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_breakpoints.scss b/src/assets/styles/bootstrap-utilities/mixins/_breakpoints.scss new file mode 100644 index 0000000..23a5de9 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_breakpoints.scss @@ -0,0 +1,123 @@ +// Breakpoint viewport sizes and media queries. +// +// Breakpoints are defined as a map of (name: minimum width), order from small to large: +// +// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px) +// +// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default. + +// Name of the next breakpoint, or null for the last breakpoint. +// +// >> breakpoint-next(sm) +// md +// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)) +// md +// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl)) +// md +@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) { + $n: index($breakpoint-names, $name); + @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null); +} + +// Minimum breakpoint width. Null for the smallest (first) breakpoint. +// +// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)) +// 576px +@function breakpoint-min($name, $breakpoints: $grid-breakpoints) { + $min: map-get($breakpoints, $name); + @return if($min != 0, $min, null); +} + +// Maximum breakpoint width. Null for the largest (last) breakpoint. +// The maximum value is calculated as the minimum of the next one less 0.02px +// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths. +// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max +// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari. +// See https://bugs.webkit.org/show_bug.cgi?id=178261 +// +// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)) +// 767.98px +@function breakpoint-max($name, $breakpoints: $grid-breakpoints) { + $next: breakpoint-next($name, $breakpoints); + @return if($next, breakpoint-min($next, $breakpoints) - .02, null); +} + +// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front. +// Useful for making responsive utilities. +// +// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)) +// "" (Returns a blank string) +// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)) +// "-sm" +@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) { + @return if(breakpoint-min($name, $breakpoints) == null, "", "-#{$name}"); +} + +// Media of at least the minimum breakpoint width. No query for the smallest breakpoint. +// Makes the @content apply to the given breakpoint and wider. +@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) { + $min: breakpoint-min($name, $breakpoints); + @if $min { + @media (min-width: $min) { + @content; + } + } @else { + @content; + } +} + +// Media of at most the maximum breakpoint width. No query for the largest breakpoint. +// Makes the @content apply to the given breakpoint and narrower. +@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) { + $max: breakpoint-max($name, $breakpoints); + @if $max { + @media (max-width: $max) { + @content; + } + } @else { + @content; + } +} + +// Media that spans multiple breakpoint widths. +// Makes the @content apply between the min and max breakpoints +@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) { + $min: breakpoint-min($lower, $breakpoints); + $max: breakpoint-max($upper, $breakpoints); + + @if $min != null and $max != null { + @media (min-width: $min) and (max-width: $max) { + @content; + } + } @else if $max == null { + @include media-breakpoint-up($lower, $breakpoints) { + @content; + } + } @else if $min == null { + @include media-breakpoint-down($upper, $breakpoints) { + @content; + } + } +} + +// Media between the breakpoint's minimum and maximum widths. +// No minimum for the smallest breakpoint, and no maximum for the largest one. +// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower. +@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) { + $min: breakpoint-min($name, $breakpoints); + $max: breakpoint-max($name, $breakpoints); + + @if $min != null and $max != null { + @media (min-width: $min) and (max-width: $max) { + @content; + } + } @else if $max == null { + @include media-breakpoint-up($name, $breakpoints) { + @content; + } + } @else if $min == null { + @include media-breakpoint-down($name, $breakpoints) { + @content; + } + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_buttons.scss b/src/assets/styles/bootstrap-utilities/mixins/_buttons.scss new file mode 100644 index 0000000..c82c4d6 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_buttons.scss @@ -0,0 +1,110 @@ +// Button variants +// +// Easily pump out default styles, as well as :hover, :focus, :active, +// and disabled options for all buttons + +@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%)) { + color: color-yiq($background); + @include gradient-bg($background); + border-color: $border; + @include box-shadow($btn-box-shadow); + + @include hover() { + color: color-yiq($hover-background); + @include gradient-bg($hover-background); + border-color: $hover-border; + } + + &:focus, + &.focus { + color: color-yiq($hover-background); + @include gradient-bg($hover-background); + border-color: $hover-border; + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5); + } @else { + box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5); + } + } + + // Disabled comes first so active can properly restyle + &.disabled, + &:disabled { + color: color-yiq($background); + background-color: $background; + border-color: $border; + // Remove CSS gradients if they're enabled + @if $enable-gradients { + background-image: none; + } + } + + &:not(:disabled):not(.disabled):active, + &:not(:disabled):not(.disabled).active, + .show > &.dropdown-toggle { + color: color-yiq($active-background); + background-color: $active-background; + @if $enable-gradients { + background-image: none; // Remove the gradient for the pressed/active state + } + border-color: $active-border; + + &:focus { + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows and $btn-active-box-shadow != none { + box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5); + } @else { + box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5); + } + } + } +} + +@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) { + color: $color; + border-color: $color; + + @include hover() { + color: $color-hover; + background-color: $active-background; + border-color: $active-border; + } + + &:focus, + &.focus { + box-shadow: 0 0 0 $btn-focus-width rgba($color, .5); + } + + &.disabled, + &:disabled { + color: $color; + background-color: transparent; + } + + &:not(:disabled):not(.disabled):active, + &:not(:disabled):not(.disabled).active, + .show > &.dropdown-toggle { + color: color-yiq($active-background); + background-color: $active-background; + border-color: $active-border; + + &:focus { + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows and $btn-active-box-shadow != none { + box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5); + } @else { + box-shadow: 0 0 0 $btn-focus-width rgba($color, .5); + } + } + } +} + +// Button sizes +@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) { + padding: $padding-y $padding-x; + @include font-size($font-size); + line-height: $line-height; + // Manually declare to provide an override to the browser default + @include border-radius($border-radius, 0); +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_caret.scss b/src/assets/styles/bootstrap-utilities/mixins/_caret.scss new file mode 100644 index 0000000..2746649 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_caret.scss @@ -0,0 +1,62 @@ +@mixin caret-down() { + border-top: $caret-width solid; + border-right: $caret-width solid transparent; + border-bottom: 0; + border-left: $caret-width solid transparent; +} + +@mixin caret-up() { + border-top: 0; + border-right: $caret-width solid transparent; + border-bottom: $caret-width solid; + border-left: $caret-width solid transparent; +} + +@mixin caret-right() { + border-top: $caret-width solid transparent; + border-right: 0; + border-bottom: $caret-width solid transparent; + border-left: $caret-width solid; +} + +@mixin caret-left() { + border-top: $caret-width solid transparent; + border-right: $caret-width solid; + border-bottom: $caret-width solid transparent; +} + +@mixin caret($direction: down) { + @if $enable-caret { + &::after { + display: inline-block; + margin-left: $caret-spacing; + vertical-align: $caret-vertical-align; + content: ""; + @if $direction == down { + @include caret-down(); + } @else if $direction == up { + @include caret-up(); + } @else if $direction == right { + @include caret-right(); + } + } + + @if $direction == left { + &::after { + display: none; + } + + &::before { + display: inline-block; + margin-right: $caret-spacing; + vertical-align: $caret-vertical-align; + content: ""; + @include caret-left(); + } + } + + &:empty::after { + margin-left: 0; + } + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_clearfix.scss b/src/assets/styles/bootstrap-utilities/mixins/_clearfix.scss new file mode 100644 index 0000000..11a977b --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_clearfix.scss @@ -0,0 +1,7 @@ +@mixin clearfix() { + &::after { + display: block; + clear: both; + content: ""; + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_deprecate.scss b/src/assets/styles/bootstrap-utilities/mixins/_deprecate.scss new file mode 100644 index 0000000..df070bc --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_deprecate.scss @@ -0,0 +1,10 @@ +// Deprecate mixin +// +// This mixin can be used to deprecate mixins or functions. +// `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to +// some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap) +@mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) { + @if ($enable-deprecation-messages != false and $ignore-warning != true) { + @warn "#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}."; + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_float.scss b/src/assets/styles/bootstrap-utilities/mixins/_float.scss new file mode 100644 index 0000000..6b376a2 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_float.scss @@ -0,0 +1,14 @@ +// stylelint-disable declaration-no-important + +@mixin float-left() { + float: left !important; + @include deprecate("The `float-left` mixin", "v4.3.0", "v5"); +} +@mixin float-right() { + float: right !important; + @include deprecate("The `float-right` mixin", "v4.3.0", "v5"); +} +@mixin float-none() { + float: none !important; + @include deprecate("The `float-none` mixin", "v4.3.0", "v5"); +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_forms.scss b/src/assets/styles/bootstrap-utilities/mixins/_forms.scss new file mode 100644 index 0000000..418470d --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_forms.scss @@ -0,0 +1,177 @@ +// Form control focus state +// +// Generate a customized focus state and for any input with the specified color, +// which defaults to the `$input-focus-border-color` variable. +// +// We highly encourage you to not customize the default value, but instead use +// this to tweak colors on an as-needed basis. This aesthetic change is based on +// WebKit's default styles, but applicable to a wider range of browsers. Its +// usability and accessibility should be taken into account with any change. +// +// Example usage: change the default blue border and shadow to white for better +// contrast against a dark gray background. +@mixin form-control-focus($ignore-warning: false) { + &:focus { + color: $input-focus-color; + background-color: $input-focus-bg; + border-color: $input-focus-border-color; + outline: 0; + // Avoid using mixin so we can pass custom focus shadow properly + @if $enable-shadows { + box-shadow: $input-box-shadow, $input-focus-box-shadow; + } @else { + box-shadow: $input-focus-box-shadow; + } + } + @include deprecate("The `form-control-focus()` mixin", "v4.4.0", "v5", $ignore-warning); +} + +// This mixin uses an `if()` technique to be compatible with Dart Sass +// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details +@mixin form-validation-state-selector($state) { + @if ($state == "valid" or $state == "invalid") { + .was-validated #{if(&, "&", "")}:#{$state}, + #{if(&, "&", "")}.is-#{$state} { + @content; + } + } @else { + #{if(&, "&", "")}.is-#{$state} { + @content; + } + } +} + +@mixin form-validation-state($state, $color, $icon) { + .#{$state}-feedback { + display: none; + width: 100%; + margin-top: $form-feedback-margin-top; + @include font-size($form-feedback-font-size); + color: $color; + } + + .#{$state}-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; // Contain to parent when possible + padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x; + margin-top: .1rem; + @include font-size($form-feedback-tooltip-font-size); + line-height: $form-feedback-tooltip-line-height; + color: color-yiq($color); + background-color: rgba($color, $form-feedback-tooltip-opacity); + @include border-radius($form-feedback-tooltip-border-radius); + } + + @include form-validation-state-selector($state) { + ~ .#{$state}-feedback, + ~ .#{$state}-tooltip { + display: block; + } + } + + .form-control { + @include form-validation-state-selector($state) { + border-color: $color; + + @if $enable-validation-icons { + padding-right: $input-height-inner; + background-image: escape-svg($icon); + background-repeat: no-repeat; + background-position: right $input-height-inner-quarter center; + background-size: $input-height-inner-half $input-height-inner-half; + } + + &:focus { + border-color: $color; + box-shadow: 0 0 0 $input-focus-width rgba($color, .25); + } + } + } + + // stylelint-disable-next-line selector-no-qualifying-type + textarea.form-control { + @include form-validation-state-selector($state) { + @if $enable-validation-icons { + padding-right: $input-height-inner; + background-position: top $input-height-inner-quarter right $input-height-inner-quarter; + } + } + } + + .custom-select { + @include form-validation-state-selector($state) { + border-color: $color; + + @if $enable-validation-icons { + padding-right: $custom-select-feedback-icon-padding-right; + background: $custom-select-background, escape-svg($icon) $custom-select-bg no-repeat $custom-select-feedback-icon-position / $custom-select-feedback-icon-size; + } + + &:focus { + border-color: $color; + box-shadow: 0 0 0 $input-focus-width rgba($color, .25); + } + } + } + + .form-check-input { + @include form-validation-state-selector($state) { + ~ .form-check-label { + color: $color; + } + + ~ .#{$state}-feedback, + ~ .#{$state}-tooltip { + display: block; + } + } + } + + .custom-control-input { + @include form-validation-state-selector($state) { + ~ .custom-control-label { + color: $color; + + &::before { + border-color: $color; + } + } + + &:checked { + ~ .custom-control-label::before { + border-color: lighten($color, 10%); + @include gradient-bg(lighten($color, 10%)); + } + } + + &:focus { + ~ .custom-control-label::before { + box-shadow: 0 0 0 $input-focus-width rgba($color, .25); + } + + &:not(:checked) ~ .custom-control-label::before { + border-color: $color; + } + } + } + } + + // custom file + .custom-file-input { + @include form-validation-state-selector($state) { + ~ .custom-file-label { + border-color: $color; + } + + &:focus { + ~ .custom-file-label { + border-color: $color; + box-shadow: 0 0 0 $input-focus-width rgba($color, .25); + } + } + } + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_gradients.scss b/src/assets/styles/bootstrap-utilities/mixins/_gradients.scss new file mode 100644 index 0000000..88c4d64 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_gradients.scss @@ -0,0 +1,45 @@ +// Gradients + +@mixin gradient-bg($color) { + @if $enable-gradients { + background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x; + } @else { + background-color: $color; + } +} + +// Horizontal gradient, from left to right +// +// Creates two color stops, start and end, by specifying a color and position for each color stop. +@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) { + background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); + background-repeat: repeat-x; +} + +// Vertical gradient, from top to bottom +// +// Creates two color stops, start and end, by specifying a color and position for each color stop. +@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) { + background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); + background-repeat: repeat-x; +} + +@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) { + background-image: linear-gradient($deg, $start-color, $end-color); + background-repeat: repeat-x; +} +@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) { + background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color); + background-repeat: no-repeat; +} +@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) { + background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color); + background-repeat: no-repeat; +} +@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) { + background-image: radial-gradient(circle, $inner-color, $outer-color); + background-repeat: no-repeat; +} +@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) { + background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent); +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_grid-framework.scss b/src/assets/styles/bootstrap-utilities/mixins/_grid-framework.scss new file mode 100644 index 0000000..8e291f7 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_grid-framework.scss @@ -0,0 +1,71 @@ +// Framework grid generation +// +// Used only by Bootstrap to generate the correct number of grid classes given +// any value of `$grid-columns`. + +@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) { + // Common properties for all breakpoints + %grid-column { + position: relative; + width: 100%; + padding-right: $gutter / 2; + padding-left: $gutter / 2; + } + + @each $breakpoint in map-keys($breakpoints) { + $infix: breakpoint-infix($breakpoint, $breakpoints); + + // Allow columns to stretch full width below their breakpoints + @for $i from 1 through $columns { + .col#{$infix}-#{$i} { + @extend %grid-column; + } + } + .col#{$infix}, + .col#{$infix}-auto { + @extend %grid-column; + } + + @include media-breakpoint-up($breakpoint, $breakpoints) { + // Provide basic `.col-{bp}` classes for equal-width flexbox columns + .col#{$infix} { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + + @for $i from 1 through $grid-row-columns { + .row-cols#{$infix}-#{$i} { + @include row-cols($i); + } + } + + .col#{$infix}-auto { + @include make-col-auto(); + } + + @for $i from 1 through $columns { + .col#{$infix}-#{$i} { + @include make-col($i, $columns); + } + } + + .order#{$infix}-first { order: -1; } + + .order#{$infix}-last { order: $columns + 1; } + + @for $i from 0 through $columns { + .order#{$infix}-#{$i} { order: $i; } + } + + // `$columns - 1` because offsetting by the width of an entire row isn't possible + @for $i from 0 through ($columns - 1) { + @if not ($infix == "" and $i == 0) { // Avoid emitting useless .offset-0 + .offset#{$infix}-#{$i} { + @include make-col-offset($i, $columns); + } + } + } + } + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_grid.scss b/src/assets/styles/bootstrap-utilities/mixins/_grid.scss new file mode 100644 index 0000000..b1240b0 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_grid.scss @@ -0,0 +1,69 @@ +/// Grid system +// +// Generate semantic grid columns with these mixins. + +@mixin make-container($gutter: $grid-gutter-width) { + width: 100%; + padding-right: $gutter / 2; + padding-left: $gutter / 2; + margin-right: auto; + margin-left: auto; +} + + +// For each breakpoint, define the maximum width of the container in a media query +@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) { + @each $breakpoint, $container-max-width in $max-widths { + @include media-breakpoint-up($breakpoint, $breakpoints) { + max-width: $container-max-width; + } + } +} + +@mixin make-row($gutter: $grid-gutter-width) { + display: flex; + flex-wrap: wrap; + margin-right: -$gutter / 2; + margin-left: -$gutter / 2; +} + +@mixin make-col-ready($gutter: $grid-gutter-width) { + position: relative; + // Prevent columns from becoming too narrow when at smaller grid tiers by + // always setting `width: 100%;`. This works because we use `flex` values + // later on to override this initial width. + width: 100%; + padding-right: $gutter / 2; + padding-left: $gutter / 2; +} + +@mixin make-col($size, $columns: $grid-columns) { + flex: 0 0 percentage($size / $columns); + // Add a `max-width` to ensure content within each column does not blow out + // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari + // do not appear to require this. + max-width: percentage($size / $columns); +} + +@mixin make-col-auto() { + flex: 0 0 auto; + width: auto; + max-width: 100%; // Reset earlier grid tiers +} + +@mixin make-col-offset($size, $columns: $grid-columns) { + $num: $size / $columns; + margin-left: if($num == 0, 0, percentage($num)); +} + +// Row columns +// +// Specify on a parent element(e.g., .row) to force immediate children into NN +// numberof columns. Supports wrapping to new lines, but does not do a Masonry +// style grid. +@mixin row-cols($count) { + & > * { + flex: 0 0 100% / $count; + max-width: 100% / $count; + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_hover.scss b/src/assets/styles/bootstrap-utilities/mixins/_hover.scss new file mode 100644 index 0000000..409f824 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_hover.scss @@ -0,0 +1,37 @@ +// Hover mixin and `$enable-hover-media-query` are deprecated. +// +// Originally added during our alphas and maintained during betas, this mixin was +// designed to prevent `:hover` stickiness on iOS-an issue where hover styles +// would persist after initial touch. +// +// For backward compatibility, we've kept these mixins and updated them to +// always return their regular pseudo-classes instead of a shimmed media query. +// +// Issue: https://github.com/twbs/bootstrap/issues/25195 + +@mixin hover() { + &:hover { @content; } +} + +@mixin hover-focus() { + &:hover, + &:focus { + @content; + } +} + +@mixin plain-hover-focus() { + &, + &:hover, + &:focus { + @content; + } +} + +@mixin hover-focus-active() { + &:hover, + &:focus, + &:active { + @content; + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_image.scss b/src/assets/styles/bootstrap-utilities/mixins/_image.scss new file mode 100644 index 0000000..c971e03 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_image.scss @@ -0,0 +1,36 @@ +// Image Mixins +// - Responsive image +// - Retina image + + +// Responsive image +// +// Keep images from scaling beyond the width of their parents. + +@mixin img-fluid() { + // Part 1: Set a maximum relative to the parent + max-width: 100%; + // Part 2: Override the height to auto, otherwise images will be stretched + // when setting a width and height attribute on the img element. + height: auto; +} + + +// Retina image +// +// Short retina mixin for setting background-image and -size. + +@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) { + background-image: url($file-1x); + + // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio, + // but doesn't convert dppx=>dpi. + // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard. + // Compatibility info: https://caniuse.com/#feat=css-media-resolution + @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx + only screen and (min-resolution: 2dppx) { // Standardized + background-image: url($file-2x); + background-size: $width-1x $height-1x; + } + @include deprecate("`img-retina()`", "v4.3.0", "v5"); +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_list-group.scss b/src/assets/styles/bootstrap-utilities/mixins/_list-group.scss new file mode 100644 index 0000000..0da3531 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_list-group.scss @@ -0,0 +1,21 @@ +// List Groups + +@mixin list-group-item-variant($state, $background, $color) { + .list-group-item-#{$state} { + color: $color; + background-color: $background; + + &.list-group-item-action { + @include hover-focus() { + color: $color; + background-color: darken($background, 5%); + } + + &.active { + color: $white; + background-color: $color; + border-color: $color; + } + } + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_lists.scss b/src/assets/styles/bootstrap-utilities/mixins/_lists.scss new file mode 100644 index 0000000..251cb07 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_lists.scss @@ -0,0 +1,7 @@ +// Lists + +// Unstyled keeps list items block level, just removes default browser padding and list-style +@mixin list-unstyled() { + padding-left: 0; + list-style: none; +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_nav-divider.scss b/src/assets/styles/bootstrap-utilities/mixins/_nav-divider.scss new file mode 100644 index 0000000..3e0ccea --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_nav-divider.scss @@ -0,0 +1,11 @@ +// Horizontal dividers +// +// Dividers (basically an hr) within dropdowns and nav lists + +@mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y, $ignore-warning: false) { + height: 0; + margin: $margin-y 0; + overflow: hidden; + border-top: 1px solid $color; + @include deprecate("The `nav-divider()` mixin", "v4.4.0", "v5", $ignore-warning); +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_pagination.scss b/src/assets/styles/bootstrap-utilities/mixins/_pagination.scss new file mode 100644 index 0000000..af8e16d --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_pagination.scss @@ -0,0 +1,22 @@ +// Pagination + +@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) { + .page-link { + padding: $padding-y $padding-x; + @include font-size($font-size); + line-height: $line-height; + } + + .page-item { + &:first-child { + .page-link { + @include border-left-radius($border-radius); + } + } + &:last-child { + .page-link { + @include border-right-radius($border-radius); + } + } + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_reset-text.scss b/src/assets/styles/bootstrap-utilities/mixins/_reset-text.scss new file mode 100644 index 0000000..15b4407 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_reset-text.scss @@ -0,0 +1,17 @@ +@mixin reset-text() { + font-family: $font-family-base; + // We deliberately do NOT reset font-size or word-wrap. + font-style: normal; + font-weight: $font-weight-normal; + line-height: $line-height-base; + text-align: left; // Fallback for where `start` is not supported + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_resize.scss b/src/assets/styles/bootstrap-utilities/mixins/_resize.scss new file mode 100644 index 0000000..66f233a --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_resize.scss @@ -0,0 +1,6 @@ +// Resize anything + +@mixin resizable($direction) { + overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` + resize: $direction; // Options: horizontal, vertical, both +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_screen-reader.scss b/src/assets/styles/bootstrap-utilities/mixins/_screen-reader.scss new file mode 100644 index 0000000..2123039 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_screen-reader.scss @@ -0,0 +1,34 @@ +// Only display content to screen readers +// +// See: https://a11yproject.com/posts/how-to-hide-content/ +// See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/ + +@mixin sr-only() { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; // Fix for https://github.com/twbs/bootstrap/issues/25686 + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +@mixin sr-only-focusable() { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_size.scss b/src/assets/styles/bootstrap-utilities/mixins/_size.scss new file mode 100644 index 0000000..69e056d --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_size.scss @@ -0,0 +1,7 @@ +// Sizing shortcuts + +@mixin size($width, $height: $width) { + width: $width; + height: $height; + @include deprecate("`size()`", "v4.3.0", "v5"); +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_table-row.scss b/src/assets/styles/bootstrap-utilities/mixins/_table-row.scss new file mode 100644 index 0000000..1ccde6b --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_table-row.scss @@ -0,0 +1,39 @@ +// Tables + +@mixin table-row-variant($state, $background, $border: null) { + // Exact selectors below required to override `.table-striped` and prevent + // inheritance to nested tables. + .table-#{$state} { + &, + > th, + > td { + background-color: $background; + } + + @if $border != null { + th, + td, + thead th, + tbody + tbody { + border-color: $border; + } + } + } + + // Hover states for `.table-hover` + // Note: this is not available for cells or rows within `thead` or `tfoot`. + .table-hover { + $hover-background: darken($background, 5%); + + .table-#{$state} { + @include hover() { + background-color: $hover-background; + + > td, + > th { + background-color: $hover-background; + } + } + } + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_text-emphasis.scss b/src/assets/styles/bootstrap-utilities/mixins/_text-emphasis.scss new file mode 100644 index 0000000..5eb8a55 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_text-emphasis.scss @@ -0,0 +1,17 @@ +// stylelint-disable declaration-no-important + +// Typography + +@mixin text-emphasis-variant($parent, $color, $ignore-warning: false) { + #{$parent} { + color: $color !important; + } + @if $emphasized-link-hover-darken-percentage != 0 { + a#{$parent} { + @include hover-focus() { + color: darken($color, $emphasized-link-hover-darken-percentage) !important; + } + } + } + @include deprecate("`text-emphasis-variant()`", "v4.4.0", "v5", $ignore-warning); +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_text-hide.scss b/src/assets/styles/bootstrap-utilities/mixins/_text-hide.scss new file mode 100644 index 0000000..3a92301 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_text-hide.scss @@ -0,0 +1,11 @@ +// CSS image replacement +@mixin text-hide($ignore-warning: false) { + // stylelint-disable-next-line font-family-no-missing-generic-family-keyword + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; + + @include deprecate("`text-hide()`", "v4.1.0", "v5", $ignore-warning); +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_text-truncate.scss b/src/assets/styles/bootstrap-utilities/mixins/_text-truncate.scss new file mode 100644 index 0000000..3504bb1 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_text-truncate.scss @@ -0,0 +1,8 @@ +// Text truncate +// Requires inline-block or block for proper styling + +@mixin text-truncate() { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_transition.scss b/src/assets/styles/bootstrap-utilities/mixins/_transition.scss new file mode 100644 index 0000000..8ce35a6 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_transition.scss @@ -0,0 +1,16 @@ +// stylelint-disable property-blacklist +@mixin transition($transition...) { + @if $enable-transitions { + @if length($transition) == 0 { + transition: $transition-base; + } @else { + transition: $transition; + } + } + + @if $enable-prefers-reduced-motion-media-query { + @media (prefers-reduced-motion: reduce) { + transition: none; + } + } +} diff --git a/src/assets/styles/bootstrap-utilities/mixins/_visibility.scss b/src/assets/styles/bootstrap-utilities/mixins/_visibility.scss new file mode 100644 index 0000000..f174673 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/mixins/_visibility.scss @@ -0,0 +1,8 @@ +// stylelint-disable declaration-no-important + +// Visibility + +@mixin invisible($visibility) { + visibility: $visibility !important; + @include deprecate("`invisible()`", "v4.3.0", "v5"); +} diff --git a/src/assets/styles/bootstrap-utilities/utilities/_align.scss b/src/assets/styles/bootstrap-utilities/utilities/_align.scss new file mode 100644 index 0000000..8b7df9f --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_align.scss @@ -0,0 +1,8 @@ +// stylelint-disable declaration-no-important + +.align-baseline { vertical-align: baseline !important; } // Browser default +.align-top { vertical-align: top !important; } +.align-middle { vertical-align: middle !important; } +.align-bottom { vertical-align: bottom !important; } +.align-text-bottom { vertical-align: text-bottom !important; } +.align-text-top { vertical-align: text-top !important; } diff --git a/src/assets/styles/bootstrap-utilities/utilities/_background.scss b/src/assets/styles/bootstrap-utilities/utilities/_background.scss new file mode 100644 index 0000000..a997b1b --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_background.scss @@ -0,0 +1,19 @@ +// stylelint-disable declaration-no-important + +@each $color, $value in $theme-colors { + @include bg-variant(".bg-#{$color}", $value, true); +} + +@if $enable-gradients { + @each $color, $value in $theme-colors { + @include bg-gradient-variant(".bg-gradient-#{$color}", $value); + } +} + +.bg-white { + background-color: $white !important; +} + +.bg-transparent { + background-color: transparent !important; +} diff --git a/src/assets/styles/bootstrap-utilities/utilities/_borders.scss b/src/assets/styles/bootstrap-utilities/utilities/_borders.scss new file mode 100644 index 0000000..302f6bf --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_borders.scss @@ -0,0 +1,75 @@ +// stylelint-disable property-blacklist, declaration-no-important + +// +// Border +// + +.border { border: $border-width solid $border-color !important; } +.border-top { border-top: $border-width solid $border-color !important; } +.border-right { border-right: $border-width solid $border-color !important; } +.border-bottom { border-bottom: $border-width solid $border-color !important; } +.border-left { border-left: $border-width solid $border-color !important; } + +.border-0 { border: 0 !important; } +.border-top-0 { border-top: 0 !important; } +.border-right-0 { border-right: 0 !important; } +.border-bottom-0 { border-bottom: 0 !important; } +.border-left-0 { border-left: 0 !important; } + +@each $color, $value in $theme-colors { + .border-#{$color} { + border-color: $value !important; + } +} + +.border-white { + border-color: $white !important; +} + +// +// Border-radius +// + +.rounded-sm { + border-radius: $border-radius-sm !important; +} + +.rounded { + border-radius: $border-radius !important; +} + +.rounded-top { + border-top-left-radius: $border-radius !important; + border-top-right-radius: $border-radius !important; +} + +.rounded-right { + border-top-right-radius: $border-radius !important; + border-bottom-right-radius: $border-radius !important; +} + +.rounded-bottom { + border-bottom-right-radius: $border-radius !important; + border-bottom-left-radius: $border-radius !important; +} + +.rounded-left { + border-top-left-radius: $border-radius !important; + border-bottom-left-radius: $border-radius !important; +} + +.rounded-lg { + border-radius: $border-radius-lg !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: $rounded-pill !important; +} + +.rounded-0 { + border-radius: 0 !important; +} diff --git a/src/assets/styles/bootstrap-utilities/utilities/_clearfix.scss b/src/assets/styles/bootstrap-utilities/utilities/_clearfix.scss new file mode 100644 index 0000000..e92522a --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_clearfix.scss @@ -0,0 +1,3 @@ +.clearfix { + @include clearfix(); +} diff --git a/src/assets/styles/bootstrap-utilities/utilities/_display.scss b/src/assets/styles/bootstrap-utilities/utilities/_display.scss new file mode 100644 index 0000000..1303679 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_display.scss @@ -0,0 +1,26 @@ +// stylelint-disable declaration-no-important + +// +// Utilities for common `display` values +// + +@each $breakpoint in map-keys($grid-breakpoints) { + @include media-breakpoint-up($breakpoint) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + + @each $value in $displays { + .d#{$infix}-#{$value} { display: $value !important; } + } + } +} + + +// +// Utilities for toggling `display` in print +// + +@media print { + @each $value in $displays { + .d-print-#{$value} { display: $value !important; } + } +} diff --git a/src/assets/styles/bootstrap-utilities/utilities/_embed.scss b/src/assets/styles/bootstrap-utilities/utilities/_embed.scss new file mode 100644 index 0000000..4497ac0 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_embed.scss @@ -0,0 +1,39 @@ +// Credit: Nicolas Gallagher and SUIT CSS. + +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; + + &::before { + display: block; + content: ""; + } + + .embed-responsive-item, + iframe, + embed, + object, + video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; + } +} + +@each $embed-responsive-aspect-ratio in $embed-responsive-aspect-ratios { + $embed-responsive-aspect-ratio-x: nth($embed-responsive-aspect-ratio, 1); + $embed-responsive-aspect-ratio-y: nth($embed-responsive-aspect-ratio, 2); + + .embed-responsive-#{$embed-responsive-aspect-ratio-x}by#{$embed-responsive-aspect-ratio-y} { + &::before { + padding-top: percentage($embed-responsive-aspect-ratio-y / $embed-responsive-aspect-ratio-x); + } + } +} diff --git a/src/assets/styles/bootstrap-utilities/utilities/_flex.scss b/src/assets/styles/bootstrap-utilities/utilities/_flex.scss new file mode 100644 index 0000000..3d4266e --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_flex.scss @@ -0,0 +1,51 @@ +// stylelint-disable declaration-no-important + +// Flex variation +// +// Custom styles for additional flex alignment options. + +@each $breakpoint in map-keys($grid-breakpoints) { + @include media-breakpoint-up($breakpoint) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + + .flex#{$infix}-row { flex-direction: row !important; } + .flex#{$infix}-column { flex-direction: column !important; } + .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; } + .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; } + + .flex#{$infix}-wrap { flex-wrap: wrap !important; } + .flex#{$infix}-nowrap { flex-wrap: nowrap !important; } + .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; } + .flex#{$infix}-fill { flex: 1 1 auto !important; } + .flex#{$infix}-grow-0 { flex-grow: 0 !important; } + .flex#{$infix}-grow-1 { flex-grow: 1 !important; } + .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; } + .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; } + + .justify-content#{$infix}-start { justify-content: flex-start !important; } + .justify-content#{$infix}-end { justify-content: flex-end !important; } + .justify-content#{$infix}-center { justify-content: center !important; } + .justify-content#{$infix}-between { justify-content: space-between !important; } + .justify-content#{$infix}-around { justify-content: space-around !important; } + + .align-items#{$infix}-start { align-items: flex-start !important; } + .align-items#{$infix}-end { align-items: flex-end !important; } + .align-items#{$infix}-center { align-items: center !important; } + .align-items#{$infix}-baseline { align-items: baseline !important; } + .align-items#{$infix}-stretch { align-items: stretch !important; } + + .align-content#{$infix}-start { align-content: flex-start !important; } + .align-content#{$infix}-end { align-content: flex-end !important; } + .align-content#{$infix}-center { align-content: center !important; } + .align-content#{$infix}-between { align-content: space-between !important; } + .align-content#{$infix}-around { align-content: space-around !important; } + .align-content#{$infix}-stretch { align-content: stretch !important; } + + .align-self#{$infix}-auto { align-self: auto !important; } + .align-self#{$infix}-start { align-self: flex-start !important; } + .align-self#{$infix}-end { align-self: flex-end !important; } + .align-self#{$infix}-center { align-self: center !important; } + .align-self#{$infix}-baseline { align-self: baseline !important; } + .align-self#{$infix}-stretch { align-self: stretch !important; } + } +} diff --git a/src/assets/styles/bootstrap-utilities/utilities/_float.scss b/src/assets/styles/bootstrap-utilities/utilities/_float.scss new file mode 100644 index 0000000..5425084 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_float.scss @@ -0,0 +1,11 @@ +// stylelint-disable declaration-no-important + +@each $breakpoint in map-keys($grid-breakpoints) { + @include media-breakpoint-up($breakpoint) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + + .float#{$infix}-left { float: left !important; } + .float#{$infix}-right { float: right !important; } + .float#{$infix}-none { float: none !important; } + } +} diff --git a/src/assets/styles/bootstrap-utilities/utilities/_overflow.scss b/src/assets/styles/bootstrap-utilities/utilities/_overflow.scss new file mode 100644 index 0000000..8326c30 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_overflow.scss @@ -0,0 +1,5 @@ +// stylelint-disable declaration-no-important + +@each $value in $overflows { + .overflow-#{$value} { overflow: $value !important; } +} diff --git a/src/assets/styles/bootstrap-utilities/utilities/_position.scss b/src/assets/styles/bootstrap-utilities/utilities/_position.scss new file mode 100644 index 0000000..cdf6c11 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_position.scss @@ -0,0 +1,32 @@ +// stylelint-disable declaration-no-important + +// Common values +@each $position in $positions { + .position-#{$position} { position: $position !important; } +} + +// Shorthand + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: $zindex-fixed; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: $zindex-fixed; +} + +.sticky-top { + @supports (position: sticky) { + position: sticky; + top: 0; + z-index: $zindex-sticky; + } +} diff --git a/src/assets/styles/bootstrap-utilities/utilities/_screenreaders.scss b/src/assets/styles/bootstrap-utilities/utilities/_screenreaders.scss new file mode 100644 index 0000000..9f26fde --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_screenreaders.scss @@ -0,0 +1,11 @@ +// +// Screenreaders +// + +.sr-only { + @include sr-only(); +} + +.sr-only-focusable { + @include sr-only-focusable(); +} diff --git a/src/assets/styles/bootstrap-utilities/utilities/_shadows.scss b/src/assets/styles/bootstrap-utilities/utilities/_shadows.scss new file mode 100644 index 0000000..f5d03fc --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_shadows.scss @@ -0,0 +1,6 @@ +// stylelint-disable declaration-no-important + +.shadow-sm { box-shadow: $box-shadow-sm !important; } +.shadow { box-shadow: $box-shadow !important; } +.shadow-lg { box-shadow: $box-shadow-lg !important; } +.shadow-none { box-shadow: none !important; } diff --git a/src/assets/styles/bootstrap-utilities/utilities/_sizing.scss b/src/assets/styles/bootstrap-utilities/utilities/_sizing.scss new file mode 100644 index 0000000..f376488 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_sizing.scss @@ -0,0 +1,20 @@ +// stylelint-disable declaration-no-important + +// Width and height + +@each $prop, $abbrev in (width: w, height: h) { + @each $size, $length in $sizes { + .#{$abbrev}-#{$size} { #{$prop}: $length !important; } + } +} + +.mw-100 { max-width: 100% !important; } +.mh-100 { max-height: 100% !important; } + +// Viewport additional helpers + +.min-vw-100 { min-width: 100vw !important; } +.min-vh-100 { min-height: 100vh !important; } + +.vw-100 { width: 100vw !important; } +.vh-100 { height: 100vh !important; } diff --git a/src/assets/styles/bootstrap-utilities/utilities/_spacing.scss b/src/assets/styles/bootstrap-utilities/utilities/_spacing.scss new file mode 100644 index 0000000..3511367 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_spacing.scss @@ -0,0 +1,73 @@ +// stylelint-disable declaration-no-important + +// Margin and Padding + +@each $breakpoint in map-keys($grid-breakpoints) { + @include media-breakpoint-up($breakpoint) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + + @each $prop, $abbrev in (margin: m, padding: p) { + @each $size, $length in $spacers { + .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; } + .#{$abbrev}t#{$infix}-#{$size}, + .#{$abbrev}y#{$infix}-#{$size} { + #{$prop}-top: $length !important; + } + .#{$abbrev}r#{$infix}-#{$size}, + .#{$abbrev}x#{$infix}-#{$size} { + #{$prop}-right: $length !important; + } + .#{$abbrev}b#{$infix}-#{$size}, + .#{$abbrev}y#{$infix}-#{$size} { + #{$prop}-bottom: $length !important; + } + .#{$abbrev}l#{$infix}-#{$size}, + .#{$abbrev}x#{$infix}-#{$size} { + #{$prop}-left: $length !important; + } + } + } + + // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`) + @each $size, $length in $spacers { + @if $size != 0 { + .m#{$infix}-n#{$size} { margin: -$length !important; } + .mt#{$infix}-n#{$size}, + .my#{$infix}-n#{$size} { + margin-top: -$length !important; + } + .mr#{$infix}-n#{$size}, + .mx#{$infix}-n#{$size} { + margin-right: -$length !important; + } + .mb#{$infix}-n#{$size}, + .my#{$infix}-n#{$size} { + margin-bottom: -$length !important; + } + .ml#{$infix}-n#{$size}, + .mx#{$infix}-n#{$size} { + margin-left: -$length !important; + } + } + } + + // Some special margin utils + .m#{$infix}-auto { margin: auto !important; } + .mt#{$infix}-auto, + .my#{$infix}-auto { + margin-top: auto !important; + } + .mr#{$infix}-auto, + .mx#{$infix}-auto { + margin-right: auto !important; + } + .mb#{$infix}-auto, + .my#{$infix}-auto { + margin-bottom: auto !important; + } + .ml#{$infix}-auto, + .mx#{$infix}-auto { + margin-left: auto !important; + } + } +} diff --git a/src/assets/styles/bootstrap-utilities/utilities/_stretched-link.scss b/src/assets/styles/bootstrap-utilities/utilities/_stretched-link.scss new file mode 100644 index 0000000..fb5066b --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_stretched-link.scss @@ -0,0 +1,19 @@ +// +// Stretched link +// + +.stretched-link { + &::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + // Just in case `pointer-events: none` is set on a parent + pointer-events: auto; + content: ""; + // IE10 bugfix, see https://stackoverflow.com/questions/16947967/ie10-hover-pseudo-class-doesnt-work-without-background-color + background-color: rgba(0, 0, 0, 0); + } +} diff --git a/src/assets/styles/bootstrap-utilities/utilities/_text.scss b/src/assets/styles/bootstrap-utilities/utilities/_text.scss new file mode 100644 index 0000000..5d0f1c8 --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_text.scss @@ -0,0 +1,72 @@ +// stylelint-disable declaration-no-important + +// +// Text +// + +.text-monospace { font-family: $font-family-monospace !important; } + +// Alignment + +.text-justify { text-align: justify !important; } +.text-wrap { white-space: normal !important; } +.text-nowrap { white-space: nowrap !important; } +.text-truncate { @include text-truncate(); } + +// Responsive alignment + +@each $breakpoint in map-keys($grid-breakpoints) { + @include media-breakpoint-up($breakpoint) { + $infix: breakpoint-infix($breakpoint, $grid-breakpoints); + + .text#{$infix}-left { text-align: left !important; } + .text#{$infix}-right { text-align: right !important; } + .text#{$infix}-center { text-align: center !important; } + } +} + +// Transformation + +.text-lowercase { text-transform: lowercase !important; } +.text-uppercase { text-transform: uppercase !important; } +.text-capitalize { text-transform: capitalize !important; } + +// Weight and italics + +.font-weight-light { font-weight: $font-weight-light !important; } +.font-weight-lighter { font-weight: $font-weight-lighter !important; } +.font-weight-normal { font-weight: $font-weight-normal !important; } +.font-weight-bold { font-weight: $font-weight-bold !important; } +.font-weight-bolder { font-weight: $font-weight-bolder !important; } +.font-italic { font-style: italic !important; } + +// Contextual colors + +.text-white { color: $white !important; } + +@each $color, $value in $theme-colors { + @include text-emphasis-variant(".text-#{$color}", $value, true); +} + +.text-body { color: $body-color !important; } +.text-muted { color: $text-muted !important; } + +.text-black-50 { color: rgba($black, .5) !important; } +.text-white-50 { color: rgba($white, .5) !important; } + +// Misc + +.text-hide { + @include text-hide($ignore-warning: true); +} + +.text-decoration-none { text-decoration: none !important; } + +.text-break { + word-break: break-word !important; // IE & < Edge 18 + overflow-wrap: break-word !important; +} + +// Reset + +.text-reset { color: inherit !important; } diff --git a/src/assets/styles/bootstrap-utilities/utilities/_visibility.scss b/src/assets/styles/bootstrap-utilities/utilities/_visibility.scss new file mode 100644 index 0000000..7756c3b --- /dev/null +++ b/src/assets/styles/bootstrap-utilities/utilities/_visibility.scss @@ -0,0 +1,13 @@ +// stylelint-disable declaration-no-important + +// +// Visibility utilities +// + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} diff --git a/src/assets/styles/scss/_animations.scss b/src/assets/styles/scss/_animations.scss new file mode 100644 index 0000000..cf9d454 --- /dev/null +++ b/src/assets/styles/scss/_animations.scss @@ -0,0 +1,8 @@ +@keyframes spin { + 0% {transform: rotate(0)} + 100% {transform: rotate(360deg)} +} + +.spin { + animation: spin 2s infinite linear; +} \ No newline at end of file diff --git a/src/assets/styles/scss/_colors.scss b/src/assets/styles/scss/_colors.scss new file mode 100644 index 0000000..5bc12e1 --- /dev/null +++ b/src/assets/styles/scss/_colors.scss @@ -0,0 +1,879 @@ +$black: rgba(0, 0, 0, 0.87); +$white: rgba(255, 255, 255, 0.87); + +$solid-colors: ( + white: ( + color: #fff, + alt: #eee, + foreground: rgba(0, 0, 0, 0.76), + ), + black: ( + color: #1e2129, + alt: #2d323d, + foreground: #ffffff, + ), + gray: ( + color: #9e9e9e, + alt: #9e9e9e, + foreground: #ffffff, + ), + dark-gray: ( + color: #424242, + alt: #303030, + foreground: #ffffff, + ), + light-gray: ( + color: #eeeeee, + alt: #e6e6e6, + foreground: #ffffff, + ), + slate-gray: ( + color: #607d8b, + alt: #37474f, + foreground: #ffffff, + ), + dark-purple: ( + color: #322740, + alt: #322740, + foreground: #ffffff, + ), + dark-blue: ( + color: #10174c, + alt: #151c4e, + foreground: #ffffff, + ), + blue: ( + color: #03a9f4, + alt: #039be5, + foreground: #ffffff, + ), + indigo: ( + color: #3f51b5, + alt: #5c6bc0, + foreground: #ffffff, + ), + yellow: ( + color: #fcc02e, + alt: #f9c23b, + foreground: rgba(0, 0, 0, 0.87), + ), + green: ( + color: #4caf50, + alt: #66bb6a, + foreground: rgba(0, 0, 0, 0.87), + ), + red: ( + color: #f44336, + alt: #ff5252, + foreground: #ffffff, + ), + orange: ( + color: #ff5722, + alt: #ff6e40, + foreground: #ffffff, + ), + pink: ( + color: #e91f63, + alt: #e82c6c, + foreground: #ffffff, + ), +); + +// Gradient colors +$gradient-colors: ( + gradient-purple-indigo: ( + "start-color": #663399, + "end-color": #33214b, + "foreground": #ffffff, + ), + gradient-black-blue: ( + "start-color": #004e92, + "end-color": #000428, + "foreground": #ffffff, + ), + gradient-black-gray: ( + "start-color": #404040, + "end-color": #000000, + "foreground": #ffffff, + ), + gradient-steel-gray: ( + "start-color": #616d86, + "end-color": #1f1c2c, + "foreground": #ffffff, + ), +); + +$material-colors: ( + red: ( + 50: #fee8e7, + 100: #fcc7c3, + 200: #faa19b, + 300: #f77b72, + 400: #f65f54, + 500: #f44336, + 600: #f33d30, + 700: #f13429, + 800: #ef2c22, + 900: #ec1e16, + A100: #ffffff, + A200: #ffe9e9, + A400: #ffb8b6, + A700: #ff9f9c, + contrast: ( + 50: #000000, + 100: #000000, + 200: #000000, + 300: #000000, + 400: #000000, + 500: #ffffff, + 600: #ffffff, + 700: #ffffff, + 800: #ffffff, + 900: #ffffff, + A100: #000000, + A200: #000000, + A400: #000000, + A700: #000000, + ), + ), + pink: ( + 50: #fce4ec, + 100: #f8bbd0, + 200: #f48fb1, + 300: #f06292, + 400: #ec407a, + 500: #e91e63, + 600: #d81b60, + 700: #c2185b, + 800: #ad1457, + 900: #880e4f, + A100: #ff80ab, + A200: #ff4081, + A400: #f50057, + A700: #c51162, + contrast: ( + 50: $black, + 100: $black, + 200: $black, + 300: $black, + 400: $black, + 500: white, + 600: white, + 700: $white, + 800: $white, + 900: $white, + A100: $black, + A200: white, + A400: white, + A700: white, + ), + ), + light-purple: ( + 50: #eeedfd, + 100: #d5d1fb, + 200: #b9b3f8, + 300: #9d95f5, + 400: #887ef2, + 500: #7367f0, + 600: #6b5fee, + 700: #6054ec, + 800: #564ae9, + 900: #4339e5, + A100: #ffffff, + A200: #fcfcff, + A400: #ccc9ff, + A700: #b3afff, + contrast: ( + 50: #000000, + 100: #000000, + 200: #000000, + 300: #000000, + 400: #000000, + 500: #ffffff, + 600: #ffffff, + 700: #ffffff, + 800: #ffffff, + 900: #ffffff, + A100: #000000, + A200: #000000, + A400: #000000, + A700: #000000, + ), + ), + purple: ( + 50: #eeedfd, + 100: #d5d1fa, + 200: #bab3f7, + 300: #9e95f4, + 400: #897ef1, + 500: #7467ef, + 600: #6c5fed, + 700: #6154eb, + 800: #574ae8, + 900: #4439e4, + A100: #ffffff, + A200: #fbfbff, + A400: #cbc8ff, + A700: #b3aeff, + contrast: ( + 50: #000000, + 100: #000000, + 200: #000000, + 300: #000000, + 400: #000000, + 500: #ffffff, + 600: #ffffff, + 700: #ffffff, + 800: #ffffff, + 900: #ffffff, + A100: #000000, + A200: #000000, + A400: #000000, + A700: #000000, + ), + ), + deep-purple: ( + 50: #ede7f6, + 100: #d1c4e9, + 200: #b39ddb, + 300: #9575cd, + 400: #7e57c2, + 500: #673ab7, + 600: #5e35b1, + 700: #512da8, + 800: #4527a0, + 900: #311b92, + A100: #b388ff, + A200: #7c4dff, + A400: #651fff, + A700: #6200ea, + contrast: ( + 50: $black, + 100: $black, + 200: $black, + 300: white, + 400: white, + 500: $white, + 600: $white, + 700: $white, + 800: $white, + 900: $white, + A100: $black, + A200: white, + A400: $white, + A700: $white, + ), + ), + indigo: ( + 50: #e8eaf6, + 100: #c5cae9, + 200: #9fa8da, + 300: #7986cb, + 400: #5c6bc0, + 500: #3f51b5, + 600: #3949ab, + 700: #303f9f, + 800: #283593, + 900: #1a237e, + A100: #8c9eff, + A200: #536dfe, + A400: #3d5afe, + A700: #304ffe, + contrast: ( + 50: $black, + 100: $black, + 200: $black, + 300: white, + 400: white, + 500: $white, + 600: $white, + 700: $white, + 800: $white, + 900: $white, + A100: $black, + A200: white, + A400: white, + A700: $white, + ), + ), + blue: ( + 50: #e3effa, + 100: #bad6f2, + 200: #8cbbe9, + 300: #5e9fe0, + 400: #3c8bd9, + 500: #1976d2, + 600: #166ecd, + 700: #1263c7, + 800: #0e59c1, + 900: #0846b6, + A100: #e0eaff, + A200: #adc6ff, + A400: #7aa3ff, + A700: #6191ff, + contrast: ( + 50: #000000, + 100: #000000, + 200: #000000, + 300: #000000, + 400: #ffffff, + 500: #ffffff, + 600: #ffffff, + 700: #ffffff, + 800: #ffffff, + 900: #ffffff, + A100: #000000, + A200: #000000, + A400: #000000, + A700: #000000, + ), + ), + light-blue: ( + 50: #e1f5fe, + 100: #b3e5fc, + 200: #81d4fa, + 300: #4fc3f7, + 400: #29b6f6, + 500: #03a9f4, + 600: #039be5, + 700: #0288d1, + 800: #0277bd, + 900: #01579b, + A100: #80d8ff, + A200: #40c4ff, + A400: #00b0ff, + A700: #0091ea, + contrast: ( + 50: $black, + 100: $black, + 200: $black, + 300: $black, + 400: $black, + 500: white, + 600: white, + 700: white, + 800: white, + 900: $white, + A100: $black, + A200: $black, + A400: $black, + A700: white, + ), + ), + dark-blue: ( + 50: #e2e3ea, + 100: #b7b9c9, + 200: #888ba6, + 300: #585d82, + 400: #343a67, + 500: #10174c, + 600: #0e1445, + 700: #0c113c, + 800: #090d33, + 900: #050724, + A100: #6068ff, + A200: #2d38ff, + A400: #000df9, + A700: #000be0, + contrast: ( + 50: $black, + 100: $black, + 200: $black, + 300: white, + 400: white, + 500: $white, + 600: $white, + 700: $white, + 800: $white, + 900: $white, + A100: $black, + A200: white, + A400: white, + A700: $white, + ), + ), + cyan: ( + 50: #e0f7fa, + 100: #b2ebf2, + 200: #80deea, + 300: #4dd0e1, + 400: #26c6da, + 500: #00bcd4, + 600: #00acc1, + 700: #0097a7, + 800: #00838f, + 900: #006064, + A100: #84ffff, + A200: #18ffff, + A400: #00e5ff, + A700: #00b8d4, + contrast: ( + 50: $black, + 100: $black, + 200: $black, + 300: $black, + 400: $black, + 500: white, + 600: white, + 700: white, + 800: white, + 900: $white, + A100: $black, + A200: $black, + A400: $black, + A700: $black, + ), + ), + teal: ( + 50: #e0f2f1, + 100: #b2dfdb, + 200: #80cbc4, + 300: #4db6ac, + 400: #26a69a, + 500: #009688, + 600: #00897b, + 700: #00796b, + 800: #00695c, + 900: #004d40, + A100: #a7ffeb, + A200: #64ffda, + A400: #1de9b6, + A700: #00bfa5, + contrast: ( + 50: $black, + 100: $black, + 200: $black, + 300: $black, + 400: $black, + 500: white, + 600: white, + 700: white, + 800: $white, + 900: $white, + A100: $black, + A200: $black, + A400: $black, + A700: $black, + ), + ), + green: ( + 50: #e8f5e9, + 100: #c8e6c9, + 200: #a5d6a7, + 300: #81c784, + 400: #66bb6a, + 500: #4caf50, + 600: #43a047, + 700: #388e3c, + 800: #2e7d32, + 900: #1b5e20, + A100: #b9f6ca, + A200: #69f0ae, + A400: #00e676, + A700: #00c853, + contrast: ( + 50: $black, + 100: $black, + 200: $black, + 300: $black, + 400: $black, + 500: white, + 600: white, + 700: white, + 800: $white, + 900: $white, + A100: $black, + A200: $black, + A400: $black, + A700: $black, + ), + ), + light-green: ( + 50: #f1f8e9, + 100: #dcedc8, + 200: #c5e1a5, + 300: #aed581, + 400: #9ccc65, + 500: #8bc34a, + 600: #7cb342, + 700: #689f38, + 800: #558b2f, + 900: #33691e, + A100: #ccff90, + A200: #b2ff59, + A400: #76ff03, + A700: #64dd17, + contrast: ( + 50: $black, + 100: $black, + 200: $black, + 300: $black, + 400: $black, + 500: $black, + 600: $black, + 700: $black, + 800: white, + 900: white, + A100: $black, + A200: $black, + A400: $black, + A700: $black, + ), + ), + lime: ( + 50: #f9fbe7, + 100: #f0f4c3, + 200: #e6ee9c, + 300: #dce775, + 400: #d4e157, + 500: #cddc39, + 600: #c0ca33, + 700: #afb42b, + 800: #9e9d24, + 900: #827717, + A100: #f4ff81, + A200: #eeff41, + A400: #c6ff00, + A700: #aeea00, + contrast: ( + 50: $black, + 100: $black, + 200: $black, + 300: $black, + 400: $black, + 500: $black, + 600: $black, + 700: $black, + 800: $black, + 900: white, + A100: $black, + A200: $black, + A400: $black, + A700: $black, + ), + ), + yellow: ( + 50: #fffde7, + 100: #fff9c4, + 200: #fff59d, + 300: #fff176, + 400: #ffee58, + 500: #ffeb3b, + 600: #fdd835, + 700: #fbc02d, + 800: #f9a825, + 900: #f57f17, + A100: #ffff8d, + A200: #ffff00, + A400: #ffea00, + A700: #ffd600, + contrast: ( + 50: $black, + 100: $black, + 200: $black, + 300: $black, + 400: $black, + 500: $black, + 600: $black, + 700: $black, + 800: $black, + 900: $black, + A100: $black, + A200: $black, + A400: $black, + A700: $black, + ), + ), + amber: ( + 50: #fff8e1, + 100: #ffecb3, + 200: #ffe082, + 300: #ffd54f, + 400: #ffca28, + 500: #ffc107, + 600: #ffb300, + 700: #ffa000, + 800: #ff8f00, + 900: #ff6f00, + A100: #ffe57f, + A200: #ffd740, + A400: #ffc400, + A700: #ffab00, + contrast: ( + 50: $black, + 100: $black, + 200: $black, + 300: $black, + 400: $black, + 500: $black, + 600: $black, + 700: $black, + 800: $black, + 900: $black, + A100: $black, + A200: $black, + A400: $black, + A700: $black, + ), + ), + orange: ( + 50: #fff3e8, + 100: #ffe2c7, + 200: #ffcfa1, + 300: #ffbb7b, + 400: #ffad5f, + 500: #ff9e43, + 600: #ff963d, + 700: #ff8c34, + 800: #ff822c, + 900: #ff701e, + A100: #ffffff, + A200: #ffffff, + A400: #ffdece, + A700: #ffcdb4, + contrast: ( + 50: #000000, + 100: #000000, + 200: #000000, + 300: #000000, + 400: #000000, + 500: #000000, + 600: #000000, + 700: #000000, + 800: #000000, + 900: #000000, + A100: #000000, + A200: #000000, + A400: #000000, + A700: #000000, + ), + ), + deep-orange: ( + 50: #fbe9e7, + 100: #ffccbc, + 200: #ffab91, + 300: #ff8a65, + 400: #ff7043, + 500: #ff5722, + 600: #f4511e, + 700: #e64a19, + 800: #d84315, + 900: #bf360c, + A100: #ff9e80, + A200: #ff6e40, + A400: #ff3d00, + A700: #dd2c00, + contrast: ( + 50: $black, + 100: $black, + 200: $black, + 300: $black, + 400: $black, + 500: white, + 600: white, + 700: white, + 800: white, + 900: white, + A100: $black, + A200: $black, + A400: white, + A700: white, + ), + ), + brown: ( + 50: #efebe9, + 100: #d7ccc8, + 200: #bcaaa4, + 300: #a1887f, + 400: #8d6e63, + 500: #795548, + 600: #6d4c41, + 700: #5d4037, + 800: #4e342e, + 900: #3e2723, + A100: #d7ccc8, + A200: #bcaaa4, + A400: #8d6e63, + A700: #5d4037, + contrast: ( + 50: $black, + 100: $black, + 200: $black, + 300: white, + 400: white, + 500: $white, + 600: $white, + 700: $white, + 800: $white, + 900: $white, + A100: $black, + A200: $black, + A400: white, + A700: $white, + ), + ), + grey: ( + 0: #ffffff, + 50: #fafafa, + 100: #f5f5f5, + 200: #eeeeee, + 300: #e0e0e0, + 400: #bdbdbd, + 500: #9e9e9e, + 600: #757575, + 700: #616161, + 800: #424242, + 900: #212121, + 1000: #000000, + A100: #ffffff, + A200: #eeeeee, + A400: #bdbdbd, + A700: #616161, + contrast: ( + 0: $black, + 50: $black, + 100: $black, + 200: $black, + 300: $black, + 400: $black, + 500: $black, + 600: $white, + 700: $white, + 800: $white, + 900: $white, + 1000: $white, + A100: $black, + A200: $black, + A400: $black, + A700: $white, + ), + ), + black: ( + 50: #e4e4e5, + 100: #bcbcbf, + 200: #8f9094, + 300: #626469, + 400: #404249, + 500: #1e2129, + 600: #1a1d24, + 700: #16181f, + 800: #121419, + 900: #0a0b0f, + A100: #548dff, + A200: #216bff, + A400: #004fed, + A700: #0047d4, + contrast: ( + 50: #000000, + 100: #000000, + 200: #000000, + 300: #ffffff, + 400: #ffffff, + 500: #ffffff, + 600: #ffffff, + 700: #ffffff, + 800: #ffffff, + 900: #ffffff, + A100: #000000, + A200: #ffffff, + A400: #ffffff, + A700: #ffffff, + ), + ), + blue-grey: ( + 50: #eceff1, + 100: #cfd8dc, + 200: #b0bec5, + 300: #90a4ae, + 400: #78909c, + 500: #607d8b, + 600: #546e7a, + 700: #455a64, + 800: #37474f, + 900: #263238, + A100: #cfd8dc, + A200: #b0bec5, + A400: #78909c, + A700: #455a64, + contrast: ( + 50: $black, + 100: $black, + 200: $black, + 300: $black, + 400: white, + 500: white, + 600: $white, + 700: $white, + 800: $white, + 900: $white, + A100: $black, + A200: $black, + A400: white, + A700: $white, + ), + ), + white: ( + 50: #ffffff, + 100: #ffffff, + 200: #ffffff, + 300: #ffffff, + 400: #ffffff, + 500: #ffffff, + 600: #ffffff, + 700: #ffffff, + 800: #ffffff, + 900: #ffffff, + A100: #ffffff, + A200: #ffffff, + A400: #ffffff, + A700: #ffffff, + contrast: ( + 50: $black, + 100: $black, + 200: $black, + 300: $black, + 400: $black, + 500: $black, + 600: $black, + 700: $black, + 800: $black, + 900: $black, + A100: $black, + A200: $black, + A400: $black, + A700: $black, + ), + ), + slate: ( + 50: #222a45, + 100: #222a45, + 200: #222a45, + 300: #222a45, + 400: #222a45, + 500: #222a45, + 600: #222a45, + 700: #222a45, + 800: #222a45, + 900: #222a45, + A100: #222a45, + A200: #222a45, + A400: #222a45, + A700: #222a45, + contrast: ( + 50: #ffffff, + 100: #ffffff, + 200: #ffffff, + 300: #ffffff, + 400: #ffffff, + 500: #ffffff, + 600: #ffffff, + 700: #ffffff, + 800: #ffffff, + 900: #ffffff, + A100: #ffffff, + A200: #ffffff, + A400: #ffffff, + A700: #ffffff, + ), + ), +); diff --git a/src/assets/styles/scss/_page-layouts.scss b/src/assets/styles/scss/_page-layouts.scss new file mode 100644 index 0000000..6d5eee8 --- /dev/null +++ b/src/assets/styles/scss/_page-layouts.scss @@ -0,0 +1,63 @@ +.page-layout { + position: relative; + padding: 0 1.5rem; + margin: -.333rem -.333rem 0; + + .header-bg { + position: absolute; + top: 0; + left: 0; + right: 0; + height: 200px; + // background: #03a9f4; + z-index: -1; + } + + .content { + display: flex; + flex-direction: column; + } + .content-header { + height: 136px; + } + .content-body { + } + + .content-card { + display: flex; + flex-direction: column; + border-radius: 4px; + box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); + + &>.mat-tab-group .mat-tab-header .mat-tab-label, + &>.card-header { + height: 64px; + } + .card-header { + display: flex; + align-items: center; + } + .card-body { + + } + } + + .sidebar-header { + height: 200px; + } + + + + &.plain { + padding-left: 0; + padding-right: 0; + + .sidebar-header { + height: auto; + } + .content-card { + box-shadow: none; + border-radius: 0; + } + } +} \ No newline at end of file diff --git a/src/assets/styles/scss/_palette.scss b/src/assets/styles/scss/_palette.scss new file mode 100644 index 0000000..4301e50 --- /dev/null +++ b/src/assets/styles/scss/_palette.scss @@ -0,0 +1,102 @@ +@each $colorName, $matColor in $material-colors { + $color500: map-get($matColor, 500); + $foreground500: map-get(map-get($matColor, contrast), 500); + .#{"" + $colorName + ""} { + background-color: $color500 !important; + + // Material CDK Table + .mat-table { + background: transparent !important; + } + .ngx-datatable.material *, + .mat-table, + .mat-cell, + .mat-header-cell { + color: $foreground500 !important; + } + .ngx-datatable.material:not(.cell-selection) .datatable-body-row:hover, + .ngx-datatable.material:not(.cell-selection) + .datatable-body-row:hover + .datatable-row-group { + background: $color500, 5; + } + } + // Text color + .text-#{"" + $colorName + ""} { + color: $color500; + } + // Sidebar backgrounds + .sidebar-#{"" + $colorName + ""} { + .navigation-hold { + background: rgba($color500, 0.96) !important; + + a, + .sidenav-hold .sidenav li.open a .mat-icon:not(.menu-caret), + .sidenav li.open > div > a > span:not(.menuitem-badge), + .sidenav li.open > a > span, + .icon-menu .mat-raised-button, + .app-user .app-user-name, + .branding .app-logo-text { + color: $foreground500 !important; + } + a:hover { + // background: rgba(darken($color500, 20), 0.2) !important; + } + .app-user .app-user-photo, + .sidenav-hold .sidenav li.open a .mat-icon:not(.menu-caret) { + border-color: $foreground500 !important; + } + .icon-menu .mat-raised-button, + .branding { + background: rgba($color500, 0.96) !important; + } + .app-user { + // background: darken($color500, 5) !important; + } + li.open { + // background: rgba($color500, .3) !important; + > a { + // background: rgba(darken($color500, 20), .2) !important; + } + } + .text-muted { + color: get-contrast-muted-color($color500) !important; + } + } + } + // Header backgrounds + .topbar-#{"" + $colorName + ""} { + .topbar.mat-toolbar { + background: $color500 !important; + color: $foreground500 !important; + } + } + + // Footer background + .footer-#{"" + $colorName + ""} { + .main-footer { + background: $color500 !important; + color: $foreground500 !important; + } + } + + // Generate classes for each color shades + $contrastMap: map-get($matColor, contrast); + @each $shade, $value in $matColor { + @if $shade == contrast { + } @else { + .#{"" + $colorName + ""}-#{$shade} { + background-color: $value !important; + } + // Foreground text color + .#{"" + $colorName + ""}-#{$shade}-fg { + color: map-get($contrastMap, $shade) !important; + } + + // Text color + .text-#{"" + $colorName + ""}-#{$shade} { + color: $value !important; + } + } + } +} diff --git a/src/assets/styles/scss/_variables.scss b/src/assets/styles/scss/_variables.scss new file mode 100644 index 0000000..2969113 --- /dev/null +++ b/src/assets/styles/scss/_variables.scss @@ -0,0 +1,32 @@ +// General +$transitionDuration: 300ms !default; +$gutter: 1rem !default; +$transitionTiming: cubic-bezier(0.35, 0, 0.25, 1); +$sidebarTrnTime: 0.3s; + +// Widths +$sidebar-width: 16.25rem !default; +$compact-sidebar-width: 64px !default; +$compact-big-sidebar-width: 150px !default; + +$sidebar-navigation-icon-size: 18px; + +// Typography +$font-family-base: Roboto, "Helvetica Neue", sans-serif !default; +$font-size-base: 0.875rem; +$font-weight-base: 400 !default; +$font-weight-medium: 500 !default; +$font-weight-bold: 600 !default; + +$font-size-h1: 24px !default; +$font-size-h2: 20px !default; +$font-size-h3: 16px !default; +$font-size-h4: 15px !default; +$font-size-h5: 13px !default; +$font-size-h6: 12px !default; + +$headings-margin-bottom: (1rem / 2) !default; +$headings-font-family: inherit !default; +$headings-font-weight: 400 !default; +$headings-line-height: 1.1 !default; +$headings-color: inherit !default; diff --git a/src/assets/styles/scss/components/_button.scss b/src/assets/styles/scss/components/_button.scss new file mode 100644 index 0000000..686eb79 --- /dev/null +++ b/src/assets/styles/scss/components/_button.scss @@ -0,0 +1,22 @@ +/*-------------- Loading buttons --------------*/ +.button-loading { + .mat-button-wrapper { + display: flex; + align-items: center; + } +} +.btn-spinner { + width: 1em; + height: 1em; + background: transparent; + border-radius: 50%; + margin: 0 16px 0 0; + border: 2px solid transparent; + animation: btn-glow 1s ease infinite;; +} + +@keyframes btn-glow { + 0% { box-shadow: 0 0 0 .4em darken(#777676, 10%), 0 0 0 .1em darken(#777676, 10%); transform:rotate(360deg); } + 50% { border-top-color: #777676;} + 100% { box-shadow: 0 0 0 .4em darken(#777676, 10%), 0 0 0 3.6em transparent; } +} diff --git a/src/assets/styles/scss/components/_card.scss b/src/assets/styles/scss/components/_card.scss new file mode 100644 index 0000000..d7af04c --- /dev/null +++ b/src/assets/styles/scss/components/_card.scss @@ -0,0 +1,70 @@ +.mat-card { + margin: .5rem; + overflow: hidden; + + &.rounded-circle { + border-radius: 200px !important; + } +} +.mat-card.default { + padding: 0; +} +.mat-card.default .mat-card-title { + padding-top: 1rem; + padding-left: 1rem; + padding-right: 1rem; + line-height: 1; + font-weight: 400; +} +.mat-card.default>:first-child { + border-radius: 2px 2px 0 0; +} +.mat-card.default .mat-card-subtitle:first-child { + padding-top: 1rem; +} +.mat-card.default .mat-card-subtitle { + padding-left: 1rem; + padding-right: 1rem; + line-height: 1; +} +.mat-card.default .mat-card-content { + padding: 1rem; + margin-bottom: 0; + position: relative; +} +.mat-card.default .mat-card-actions, +.mat-card.default .mat-card-actions:last-child { + padding: .5rem; + margin: 0; +} +.mat-card.default>:last-child { + border-radius: 0 0 2px 2px; +} + +.mat-card .mat-card-title .mat-divider, .mat-divider.full-width { + margin-left: -24px; + margin-right: -24px; +} + +.mat-card.p-0 .mat-card-title .card-title-text { + padding: 1rem 1.5rem; +} +.mat-card.p-0 .mat-card-title .card-title-text .card-control { + height: 24px; + width: 24px; + line-height: 24px; +} +.mat-card.p-0 .mat-card-title .card-title-text .mat-card-subtitle { + margin: 0; +} +.mat-card.p-0 .mat-card-title .mat-divider { + margin-left: 0; + margin-right: 0; + border-top-color: rgba(0, 0, 0, 0.04); +} +.mat-card.p-0 .mat-card-image { + margin: 0 0 1rem !important; +} +.mat-card.p-0 .mat-card-content { + padding: 0 1.5rem 1.5rem; +} \ No newline at end of file diff --git a/src/assets/styles/scss/components/_components.scss b/src/assets/styles/scss/components/_components.scss new file mode 100644 index 0000000..075847d --- /dev/null +++ b/src/assets/styles/scss/components/_components.scss @@ -0,0 +1,3 @@ +@import "button"; +@import "card"; +@import "matx-sidebar"; \ No newline at end of file diff --git a/src/assets/styles/scss/components/_matx-sidebar.scss b/src/assets/styles/scss/components/_matx-sidebar.scss new file mode 100644 index 0000000..4417e5c --- /dev/null +++ b/src/assets/styles/scss/components/_matx-sidebar.scss @@ -0,0 +1,48 @@ +matx-sidebar { + position: absolute; + display: flex; + flex: 1 0 auto; + flex-direction: column; + top: 0; + bottom: 0; + overflow-x: hidden; + overflow-y: auto; + width: 280px; + z-index: 1000; + + // position left (default) + float: left; + left: 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + + transition-property: transform, width, min-width, max-width, -webkit-transform; + transition-duration: 150ms; + transition-timing-function: ease-in-out; + + &.sidebar-locked-open { + position: relative !important; + -webkit-transform: translateX(0) !important; + transform: translateX(0) !important; + } + &.open { + -webkit-transform: translateX(0) !important; + transform: translateX(0) !important; + } + &.position-right { + left: auto !important; + right: 0 !important; + float: right; + -webkit-transform: translateX(100%); + transform: translateX(100%); + } +} +.matx-sidebar-overlay { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 999; + background-color: rgba(0,0,0,.6); +} \ No newline at end of file diff --git a/src/assets/styles/scss/components/_ngx-table.scss b/src/assets/styles/scss/components/_ngx-table.scss new file mode 100644 index 0000000..3de4acb --- /dev/null +++ b/src/assets/styles/scss/components/_ngx-table.scss @@ -0,0 +1,7 @@ +.ngx-datatable.material { + .datatable-header { + .datatable-header-cell { + background: transparent; + } + } +} \ No newline at end of file diff --git a/src/assets/styles/scss/functions/_color.function.scss b/src/assets/styles/scss/functions/_color.function.scss new file mode 100644 index 0000000..9b83588 --- /dev/null +++ b/src/assets/styles/scss/functions/_color.function.scss @@ -0,0 +1,304 @@ +$linear-channel-values: + 0 + .0003035269835488375 + .000607053967097675 + .0009105809506465125 + .00121410793419535 + .0015176349177441874 + .001821161901293025 + .0021246888848418626 + .0024282158683907 + .0027317428519395373 + .003035269835488375 + .003346535763899161 + .003676507324047436 + .004024717018496307 + .004391442037410293 + .004776953480693729 + .005181516702338386 + .005605391624202723 + .006048833022857054 + .006512090792594475 + .006995410187265387 + .007499032043226175 + .008023192985384994 + .008568125618069307 + .009134058702220787 + .00972121732023785 + .010329823029626936 + .010960094006488246 + .011612245179743885 + .012286488356915872 + .012983032342173012 + .013702083047289686 + .014443843596092545 + .01520851442291271 + .01599629336550963 + .016807375752887384 + .017641954488384078 + .018500220128379697 + .019382360956935723 + .0202885630566524 + .021219010376003555 + .022173884793387385 + .02315336617811041 + .024157632448504756 + .02518685962736163 + .026241221894849898 + .027320891639074894 + .028426039504420793 + .0295568344378088 + .030713443732993635 + .03189603307301153 + .033104766570885055 + .03433980680868217 + .03560131487502034 + .03688945040110004 + .0382043715953465 + .03954623527673284 + .04091519690685319 + .042311410620809675 + .043735029256973465 + .04518620438567554 + .046665086336880095 + .04817182422688942 + .04970656598412723 + .05126945837404324 + .052860647023180246 + .05448027644244237 + .05612849004960009 + .05780543019106723 + .0595112381629812 + .06124605423161761 + .06301001765316767 + .06480326669290577 + .06662593864377289 + .06847816984440017 + .07036009569659588 + .07227185068231748 + .07421356838014963 + .07618538148130785 + .07818742180518633 + .08021982031446832 + .0822827071298148 + .08437621154414882 + .08650046203654976 + .08865558628577294 + .09084171118340768 + .09305896284668745 + .0953074666309647 + .09758734714186246 + .09989872824711389 + .10224173308810132 + .10461648409110419 + .10702310297826761 + .10946171077829933 + .1119324278369056 + .11443537382697373 + .11697066775851084 + .11953842798834562 + .12213877222960187 + .12477181756095049 + .12743768043564743 + .1301364766903643 + .13286832155381798 + .13563332965520566 + .13843161503245183 + .14126329114027164 + .14412847085805777 + .14702726649759498 + .14995978981060856 + .15292615199615017 + .1559264637078274 + .1589608350608804 + .162029375639111 + .1651321945016676 + .16826940018969075 + .1714411007328226 + .17464740365558504 + .17788841598362912 + .18116424424986022 + .184474994500441 + .18782077230067787 + .19120168274079138 + .1946178304415758 + .19806931955994886 + .20155625379439707 + .20507873639031693 + .20863687014525575 + .21223075741405523 + .21586050011389926 + .2195261997292692 + .2232279573168085 + .22696587351009836 + .23074004852434915 + .23455058216100522 + .238397573812271 + .24228112246555486 + .24620132670783548 + .25015828472995344 + .25415209433082675 + .2581828529215958 + .26225065752969623 + .26635560480286247 + .2704977910130658 + .27467731206038465 + .2788942634768104 + .2831487404299921 + .2874408377269175 + .29177064981753587 + .2961382707983211 + .3005437944157765 + .3049873140698863 + .30946892281750854 + .31398871337571754 + .31854677812509186 + .32314320911295075 + .3277780980565422 + .33245153634617935 + .33716361504833037 + .3419144249086609 + .3467040563550296 + .35153259950043936 + .3564001441459435 + .3613067797835095 + .3662525955988395 + .3712376804741491 + .3762621229909065 + .38132601143253014 + .386429433787049 + .39157247774972326 + .39675523072562685 + .4019777798321958 + .4072402119017367 + .41254261348390375 + .4178850708481375 + .4232676699860717 + .4286904966139066 + .43415363617474895 + .4396571738409188 + .44520119451622786 + .45078578283822346 + .45641102318040466 + .4620769996544071 + .467783796112159 + .47353149614800955 + .4793201831008268 + .4851499400560704 + .4910208498478356 + .4969329950608704 + .5028864580325687 + .5088813208549338 + .5149176653765214 + .5209955732043543 + .5271151257058131 + .5332764040105052 + .5394794890121072 + .5457244613701866 + .5520114015120001 + .5583403896342679 + .5647115057049292 + .5711248294648731 + .5775804404296506 + .5840784178911641 + .5906188409193369 + .5972017883637634 + .6038273388553378 + .6104955708078648 + .6172065624196511 + .6239603916750761 + .6307571363461468 + .6375968739940326 + .6444796819705821 + .6514056374198242 + .6583748172794485 + .665387298282272 + .6724431569576875 + .6795424696330938 + .6866853124353135 + .6938717612919899 + .7011018919329731 + .7083757798916868 + .7156935005064807 + .7230551289219693 + .7304607400903537 + .7379104087727308 + .7454042095403874 + .7529422167760779 + .7605245046752924 + .768151147247507 + .7758222183174236 + .7835377915261935 + .7912979403326302 + .799102738014409 + .8069522576692516 + .8148465722161012 + .8227857543962835 + .8307698767746546 + .83879901174074 + .846873231509858 + .8549926081242338 + .8631572134541023 + .8713671191987972 + .8796223968878317 + .8879231178819663 + .8962693533742664 + .9046611743911496 + .9130986517934192 + .9215818562772946 + .9301108583754237 + .938685728457888 + .9473065367331999 + .9559733532492861 + .9646862478944651 + .9734452903984125 + .9822505503331171 + .9911020971138298 + 1; +/** + * Calculate the luminance for a color. + * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests + */ +@function luminance($color) { + $red: nth($linear-channel-values, red($color) + 1); + $green: nth($linear-channel-values, green($color) + 1); + $blue: nth($linear-channel-values, blue($color) + 1); + + @return 0.2126 * $red + 0.7152 * $green + 0.0722 * $blue; +} + +/** + * Calculate the contrast ratio between two colors. + * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests + */ +@function contrast($back, $front) { + $backLum: luminance($back) + 0.05; + $foreLum: luminance($front) + 0.05; + + @return max($backLum, $foreLum) / min($backLum, $foreLum); +} + +/** + * Determine whether to use dark or light text on top of given color. + * Returns black for dark text and white for light text. + */ +@function get-contrast-color($color) { + $lightContrast: contrast($color, white); + $darkContrast: contrast($color, black); + + @if ($lightContrast > $darkContrast) { + @return white; + } @else { + @return black; + } +} +@function get-contrast-muted-color($color) { + $lightContrast: contrast($color, white); + $darkContrast: contrast($color, black); + + @if ($lightContrast > $darkContrast) { + @return rgba(255, 255, 255, .54); + } @else { + @return rgba(0,0,0, .54); + } +} diff --git a/src/assets/styles/scss/functions/_functions.scss b/src/assets/styles/scss/functions/_functions.scss new file mode 100644 index 0000000..3033eac --- /dev/null +++ b/src/assets/styles/scss/functions/_functions.scss @@ -0,0 +1 @@ +@import "color.function" \ No newline at end of file diff --git a/src/assets/styles/scss/main/_breadcrumb.scss b/src/assets/styles/scss/main/_breadcrumb.scss new file mode 100644 index 0000000..8ea99c0 --- /dev/null +++ b/src/assets/styles/scss/main/_breadcrumb.scss @@ -0,0 +1,75 @@ +.breadcrumb { + display: block; + margin: 0; + padding: 0; + li { + list-style: none; + float: left; + &:not(:first-child):before { + content: "/\A0"; + padding: 0 8px; + } + } +} + +.breadcrumb-bar { + position: relative; + width: 100%; + .breadcrumb { + padding: 0 .333rem; + overflow: hidden; + li { + line-height: 40px; + &:not(:first-child):before { + padding: 0 8px; + } + a { + font-weight: 400; + font-size: 1rem; + } + } + } +} +.breadcrumb-title { + display: flex; + align-items: center; + padding: 0.5rem .333rem; + line-height: 40px; + .bc-title { + font-size: $font-size-h5; + margin: 0; + line-height: 40px; + } + .breadcrumb { + position: relative; + margin-left: 24px; + &::before { + position: absolute; + content: ""; + height: 24px; + width: 2px; + background: #6a6a6a; + left: -12px; + top: 8px; + } + } +} + +[dir=rtl] { + .breadcrumb-bar, + .breadcrumb-title { + .breadcrumb li { + float: right; + } + } + .breadcrumb-title { + .breadcrumb { + margin-left: 0; + margin-right: 24px; + &::before { + left: auto; + right: -12px; + } + } + } +} \ No newline at end of file diff --git a/src/assets/styles/scss/main/_footer.scss b/src/assets/styles/scss/main/_footer.scss new file mode 100644 index 0000000..a5cf427 --- /dev/null +++ b/src/assets/styles/scss/main/_footer.scss @@ -0,0 +1,7 @@ +.main-footer { + padding: 0 .667rem; + min-height: 64px; + display: flex; + flex-direction: row; + align-items: center; +} \ No newline at end of file diff --git a/src/assets/styles/scss/main/_header-side.scss b/src/assets/styles/scss/main/_header-side.scss new file mode 100644 index 0000000..55bc6d2 --- /dev/null +++ b/src/assets/styles/scss/main/_header-side.scss @@ -0,0 +1,54 @@ +.topbar { + &.mat-toolbar { + position: relative; + box-shadow: 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12); + z-index: 1001; + } + .mat-select-value { + font-weight: 400; + color: #ffffff; + } +} + +.toggle-collapsed { + transform: rotate(0deg); + -webkit-transition: transform .3s cubic-bezier(.35,0,.25,1); + transition: transform .3s cubic-bezier(.35,0,.25,1); +} +.sidebar-compact .toggle-collapsed { + transform: rotate(180deg); +} + +.search-bar { + .top-search-form { + position: relative; + background: #fff; + border-radius: 40px; + margin-right: 1rem; + display: block; + max-width: 220px; + margin-left: 20px; + box-shadow: inset 0 0 2px 2px rgba(136, 136, 136, 0.2); + + .material-icons { + position: absolute; + top: 50%; + left: 10px; + margin-top: -12px; + color: rgba(0,0,0,.87); + } + input { + font-size: 1rem; + padding: .6rem .75rem; + z-index: 2; + cursor: text; + text-indent: 30px; + border: none; + background: transparent; + width: 100%; + outline: 0; + } + } + +} + diff --git a/src/assets/styles/scss/main/_header-top.scss b/src/assets/styles/scss/main/_header-top.scss new file mode 100644 index 0000000..ee18d8b --- /dev/null +++ b/src/assets/styles/scss/main/_header-top.scss @@ -0,0 +1,50 @@ +.header-topnav { + position: fixed; + margin: 0; + padding: 0; + background-color: #ffffff; + width: 100%; + top: 0; + z-index: 999; + .container { + padding: 0; + } + .topbar-branding { + float: left; + height: 48px; + padding: 8px; + margin: 0 8px; + img { + height: 100%; + width: auto; + } + } + .topnav { + // margin-left: -19px; + display: flex; + align-items: center; + } + .header-topnav-right { + float: right; + height: 48px; + display: flex; + align-items: center; + padding-right: 0.67rem; + } +} + +@media (max-width: 959px) { + .header-topnav-right { + position: absolute; + right: 6px; + top: 0; + } +} + +[dir="rtl"] { + .header-topnav { + .topnav { + flex-direction: row-reverse; + } + } +} diff --git a/src/assets/styles/scss/main/_header.scss b/src/assets/styles/scss/main/_header.scss new file mode 100644 index 0000000..c262e82 --- /dev/null +++ b/src/assets/styles/scss/main/_header.scss @@ -0,0 +1,50 @@ +.notification-number { + position: absolute; + top: 0; + left: 50%; + width: 20px; + height: 20px; + font-size: 12px; + font-weight: 700; + line-height: 20px; + color: #fff; + text-align: center; + border-radius: 50%; +} + +#langToggle .mat-select-trigger { + width: 80px; + min-width: 80px; +} +.theme-list { + .mat-menu-item { + width: 48px; + height: 48px; + padding: 5px; + .matx-swatch { + height: 100%; + width: 100%; + border-radius: 50%; + } + .active-icon { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: auto !important; + color: #ffffff; + } + } +} + +.topbar-button-right { + margin: 0 .5rem !important; +} + +[dir=rtl] { +// .topbar-button-right { +// margin-right: 1rem; +// margin-left: 0 !important; +// } +} \ No newline at end of file diff --git a/src/assets/styles/scss/main/_layout.scss b/src/assets/styles/scss/main/_layout.scss new file mode 100644 index 0000000..81e17f9 --- /dev/null +++ b/src/assets/styles/scss/main/_layout.scss @@ -0,0 +1,211 @@ +.app-admin-wrap { + height: 100vh; + overflow: hidden; +} +.app-admin-container { + max-width: 100%; + height: 100vh; + + .rightside-content-hold { + display: flex; + flex-direction: column; + flex-grow: 1; + padding: 0.333333rem; + overflow-x: hidden; + position: relative; + min-height: 450px; + } +} + +.sidebar-panel { + position: fixed; + top: 0; + left: 0; + min-height: 100vh; + z-index: 10001; + width: $sidebar-width; + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), + 0 1px 5px 0 rgba(0, 0, 0, 0.12); + -webkit-transition: all $sidebarTrnTime $transitionTiming; + transition: all $sidebarTrnTime $transitionTiming; + overflow: hidden; + .sidebar-hold { + width: $sidebar-width; + } + .navigation-hold { + position: absolute; + height: calc(100% - 64px); + width: 100%; + margin-top: 64px; + background: rgba(255, 255, 255, 0.95); + left: 0; + } + ul { + margin: 0; + padding: 0; + list-style: none; + } +} + +.main-content-wrap { + display: flex; + flex-direction: column; + position: relative; + float: right; + height: 100vh; + transition: width $sidebarTrnTime $transitionTiming; + &.ps > .ps__rail-y { + z-index: 9999; + } +} + +.sidebar-backdrop { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: fixed; + display: block; + z-index: 10000; + visibility: hidden; + opacity: 0; + background-color: rgba(0, 0, 0, 0.6); + transition: all $sidebarTrnTime $transitionTiming; + &.visible { + visibility: visible; + opacity: 1; + } +} + +// -------- +.app-admin-container.sidebar-full:not(.compact-toggle-active) { + .main-content-wrap { + width: calc(100% - #{$sidebar-width}); + } + .sidebar-panel { + width: $sidebar-width; + overflow: hidden; + } +} +.app-admin-container.compact-toggle-active { + .main-content-wrap { + width: calc(100% - #{$compact-sidebar-width}); + } +} + +.app-admin-container.sidebar-compact { + .sidebar-panel, + .sidebar-hold { + width: $compact-sidebar-width; + } +} + +.app-admin-container.sidebar-compact-big { + .main-content-wrap { + width: calc(100% - #{$compact-big-sidebar-width}); + } + .sidebar-panel { + width: $compact-big-sidebar-width; + .branding { + width: $compact-big-sidebar-width; + .app-logo { + margin: auto; + } + } + .navigation-hold { + overflow: visible !important; + } + } +} + +.app-admin-container.sidebar-closed { + .sidebar-panel { + overflow: hidden; + left: -$sidebar-width; + .branding { + left: -$sidebar-width; + + } + } + .main-content-wrap { + width: 100%; + } +} + +.fixed-topbar { + .rightside-content-hold { + overflow: auto; + position: absolute; + bottom: 0; + left: 0; + right: 0; + top: 64px; + } +} + +.layout-intransition { + .branding { + display: none !important; + } + + .app-user-controls, + .app-user-name { + opacity: 0 !important; + } +} + +.app-admin-container.sidebar-full.navigation-top { + .sidebar-panel { + left: 0; + } +} +.app-admin-container.navigation-top { + .main-content-wrap { + float: none; + width: 100% !important; + } + .rightside-content-hold { + max-width: 1400px; + min-width: 70%; + margin: 0 auto; + padding-left: 15px; + padding-right: 15px; + padding-top: 48px; + } + .sidebar-panel { + overflow: hidden; + left: -$sidebar-width; + .navigation-hold { + margin-top: 48px; + height: calc(100% - 48px); + } + } +} + + +[dir="rtl"] { + &.app-admin-container.sidebar-closed { + .sidebar-panel { + right: -$sidebar-width; + } + .branding { + left: auto !important; + right: -$sidebar-width; + } + } + .main-content-wrap { + float: left; + } + .sidebar-panel { + right: 0; + left: auto !important; + } +} + +@media (max-width: 959px) { + .app-admin-container.sidebar-full { + .main-content-wrap { + width: 100% !important; + } + } +} diff --git a/src/assets/styles/scss/main/_main.scss b/src/assets/styles/scss/main/_main.scss new file mode 100644 index 0000000..83a2b94 --- /dev/null +++ b/src/assets/styles/scss/main/_main.scss @@ -0,0 +1,22 @@ +/* +* REQUIRED STYLES +*/ +@import "scaffolding"; +@import "typography"; +@import "layout"; +@import "header"; +@import "sidenav"; +@import "footer"; +/* +* ALTERNATIVE STYLES +*/ +@import "breadcrumb"; // REQUIRED ONLY FOR BREADCRUMBS +@import "notifications"; // REQUIRED ONLY FOR NOTIFICATIONS + +@import "sidebar"; // REQUIRED ONLY FOR SIDE NAVIGATION LAYOUT +@import "header-side"; // REQUIRED ONLY FOR SIDE NAVIGATION LAYOUT + +@import "topnav"; // REQUIRED ONLY FOR TOP NAVIGATION LAYOUT +@import "header-top"; // REQUIRED ONLY FOR TOP NAVIGATION LAYOUT + + diff --git a/src/assets/styles/scss/main/_notifications.scss b/src/assets/styles/scss/main/_notifications.scss new file mode 100644 index 0000000..6bfe07d --- /dev/null +++ b/src/assets/styles/scss/main/_notifications.scss @@ -0,0 +1,21 @@ +.navigation-top { + .nofication-panel { + padding-top: 48px; + } +} + +.notification-list { + min-width: 240px; +} +.notification-list .notific-item a { + outline: 0; + width: 100%; + display: flex; + flex-direction: column; +} +.notification-list .notific-item .message { + font-size: .875rem !important; +} +.notification-list .notific-item .time { + font-size: .75rem !important; +} \ No newline at end of file diff --git a/src/assets/styles/scss/main/_scaffolding.scss b/src/assets/styles/scss/main/_scaffolding.scss new file mode 100644 index 0000000..16bc067 --- /dev/null +++ b/src/assets/styles/scss/main/_scaffolding.scss @@ -0,0 +1,736 @@ +html { + font-size: 16px; +} + +html, +body { + width: 100%; + // height: 100%; + position: relative; + // overflow: hidden; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-touch-callout: none; + // min-height: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + text-size-adjust: 100%; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +body { + margin: 0; + padding: 0; + font-weight: $font-weight-base; + font-size: $font-size-base; + color: rgba(0, 0, 0, 0.87); + line-height: 1.5; + font-family: $font-family-base; +} +code { + color: rgba(255, 0, 221, 0.863); + padding: 0px !important; + background: none !important; +} + +[tabindex="-1"]:focus { + outline: none; +} + +select, +button, +textarea, +input { + vertical-align: baseline; +} +div { + box-sizing: border-box; +} +html, +body { + &[dir="rtl"], + &[dir="ltr"] { + unicode-bidi: embed; + } +} +bdo[dir="rtl"] { + direction: rtl; + unicode-bidi: bidi-override; +} +bdo[dir="ltr"] { + direction: ltr; + unicode-bidi: bidi-override; +} + +.mat-card { + font-size: 0.875rem; +} +img:not(.mat-card-image) { + max-width: 100%; +} +a, +a:focus, +a:hover { + text-decoration: none; +} +a { + color: inherit; +} +p { + margin: 0 0 16px; +} +.h1, +.h2, +.h3, +.h4, +.h5, +.h6, +h1, +h2, +h3, +h4, +h5, +h6 { + margin-bottom: 0.5rem; + font-weight: 400; + line-height: 1.1; + color: inherit; +} +.h1, +h1 { + font-size: 2rem; +} +.h2, +h2 { + font-size: 1.75rem; +} +.h3, +h3 { + font-size: 1.5rem; +} +.h4, +h4 { + font-size: 1.25rem; +} +.h5, +h5 { + font-size: 1rem; +} +.h6, +h6 { + font-size: 0.875rem; +} +code { + padding: 8px; + background: rgba(0, 0, 0, 0.08); +} +/*---- Common -----*/ +.container { + max-width: 1400px; + margin: 0 auto; + padding: 0 15px; +} +.bg-none { + background: transparent !important; +} +.bg-white { + background: #ffffff !important; +} + +.height-100 { + min-height: 100vh; +} +.fix { + position: relative; + overflow: hidden; +} +.fix-elm::after { + display: table; + width: 100%; + content: ""; +} +.mat-box-shadow { + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), + 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} + +.light-gray { + background: rgba(0, 0, 0, 0.024); +} +.light-mat-gray { + background: rgba(0, 0, 0, 0.08); +} +.mat-blue { + background: #247ba0; + color: #fefefe; +} +.mat-red { + background-color: #f44336 !important; + color: #fff !important; +} +.mat-indigo { + background-color: #3f51b5 !important; + color: #fff !important; +} +.mat-brown { + background-color: #785548 !important; + color: #fefefe; +} +.mat-teal { + background-color: #009688 !important; + color: #fff !important; +} +.mat-purple { + background-color: #9c27b0 !important; + color: hsla(0, 0%, 100%, 0.87) !important; +} +.fz-1 { + font-size: 1rem !important; +} +.fz-2 { + font-size: 2rem !important; +} +.text-center { + text-align: center; +} +.text-right { + text-align: right; +} +.font-light { + font-weight: 300 !important; +} +.font-normal { + font-weight: normal !important; +} +.fw-300 { + font-weight: 300 !important; +} +.fw-400 { + font-weight: 400 !important; +} +.fw-500 { + font-weight: 500 !important; +} +.fw-600 { + font-weight: 600 !important; +} +.fw-700 { + font-weight: 700 !important; +} +.fw-800 { + font-weight: 800 !important; +} +.fw-900 { + font-weight: 900 !important; +} + +.text-muted { + color: rgba(0, 0, 0, 0.54) !important; +} +.text-muted-white { + color: rgba(255, 255, 255, 0.54) !important; +} +.text-gray { + color: rgba(0, 0, 0, 0.7) !important; +} +.text-sm { + font-size: 0.813rem; +} +.list-item-active { + border-left: 3px solid; +} +.material-icons.icon-sm { + font-size: 18px !important; + line-height: 18px !important; + height: 18px; + width: 18px; +} +.material-icons.icon-xs { + font-size: 13px !important; + line-height: 13px; + height: 13px; + width: 13px; +} + +.mat-button, +.mat-raised-button { + font-weight: 400 !important; +} +[mat-lg-button] { + padding: 0 32px !important; + font-size: 18px; + line-height: 56px !important; +} +.mat-icon-button[mat-sm-button] { + height: 24px; + width: 24px; + line-height: 24px; +} + +.mat-icon-button[mat-xs-button] { + height: 20px; + width: 20px; + line-height: 20px; +} +.mat-icon-button[mat-xs-button] .mat-icon { + font-size: 16px; + line-height: 20px !important; + height: 20px; + width: 20px; +} +.mat-chip[mat-sm-chip] { + padding: 4px 6px 4px 6px !important; + border-radius: 4px !important; + font-size: 12px !important; + line-height: 12px !important; + max-height: 20px; + box-sizing: border-box; +} +.mat-icon-button.img-button img { + width: 32px; + height: 32px; + border-radius: 50%; +} +.compact-list .mat-list-item { + line-height: 1.1; + transition: all 0.3s cubic-bezier(0.075, 0.82, 0.165, 1); +} +.compact-list .mat-list-item:hover { + background: rgba(0, 0, 0, 0.08); + cursor: pointer; +} +.list-tasktype .tasktype-item { + padding: 12px; +} +.list-tasktype .tasktype-item:hover { + background: rgba(0, 0, 0, 0.08); +} +.list-tasktype .tasktype-item .tasktype-action { + visibility: hidden; +} +.list-tasktype .tasktype-item:hover .tasktype-action { + visibility: visible; +} +.doughnut-grid { + border-radius: 2px; + overflow: hidden; +} +.doughnut-grid .doughnut-grid-item { + padding: 1rem; +} +.doughnut-grid .doughnut-grid-item p { + margin: 0; +} +.doughnut-grid .doughnut-grid-item .chart { + margin: 0 0 8px; +} + +.logo-group { + display: flex; + align-items: center; + justify-content: center; + text-align: center; +} +.toolbar-avatar { + display: inline-block; + position: relative; + width: 40px; + height: 40px; + line-height: 24px; +} +.toolbar-avatar > img { + width: 40px !important; + border-radius: 50%; +} +.toolbar-avatar.md, +.toolbar-avatar.md > img { + width: 48px !important; + height: 48px; +} +.toolbar-avatar > .status-dot { + position: absolute; + width: 10px; + height: 10px; + border-radius: 50%; + top: 25px; + right: -2px; + border: 2px solid #ffffff; + background: #ccc; +} +.full-width { + width: 100% !important; +} +.dnd-item { + cursor: move; + cursor: grab; + cursor: -webkit-grab; +} +.icon-circle { + color: rgb(255, 255, 255); + font-size: 1.2rem; + text-align: center; + line-height: 1.6rem; + border-radius: 50%; +} +.mat-sidenav .mat-list-item:hover { + background: rgba(0, 0, 0, 0.035) !important; +} +.mat-chip { + position: relative; + overflow: hidden; +} +.text-small { + font-size: 0.813rem; +} +.text-small .mat-icon { + font-size: 1rem; + vertical-align: sub; + margin: 0 2px; +} +.mat-card-title { + font-size: 1rem !important; +} +.icon-chip { + font-size: 11px !important; + padding: 4px 8px !important; + display: flex !important; + flex-direction: row; + align-items: center; + justify-content: center; +} +.icon-chip .mat-icon { + font-size: 16px; + height: 16px; + width: 16px; + margin-right: 4px; +} +.mat-chip:not(.mat-basic-chip) { + display: inline-block; + padding: 8px 12px 8px 12px; + border-radius: 24px; + font-size: 13px; + line-height: 16px; +} +.ql-container .ql-editor { + min-height: 200px; +} +.chart { + display: block; + width: 100%; +} +.form-error-msg { + color: #f44336; + display: block; + padding: 5px 0; +} +.accordion-handle { + cursor: pointer; +} +.app-accordion { + max-height: 200px; + transition: max-height 0.3s ease; +} +.app-accordion.open { + max-height: 1000px; +} +.app-accordion .accordion-content { + max-height: 0; + overflow: hidden; + transition: max-height 0.3s ease; +} +.app-accordion.open .accordion-content { + max-height: 800px; +} +.app-accordion.open .hidden-on-open { + display: none !important; +} +.app-accordion:not(.open) .show-on-open { + display: none !important; +} +mat-list a[mat-list-item] .mat-list-item-content, +mat-list mat-list-item .mat-list-item-content, +mat-nav-list a[mat-list-item] .mat-list-item-content, +mat-nav-list mat-list-item .mat-list-item-content, +[mat-menu-item], +.mat-option, +body .mat-select-trigger { + font-size: 0.875rem !important; +} +.mat-ripple { + position: relative; +} +.fileupload-drop-zone { + text-align: center; + border: 1px dashed rgba(0, 0, 0, 0.15); + padding: 48px; + height: 120px; +} +.default-table { + text-align: left; +} +.default-table > thead tr th { + font-weight: 400; + padding: 0.9rem 1.2rem; + border-bottom: 1px solid rgba(0, 0, 0, 0.12); +} +.default-table tbody tr td { + padding: 0.9rem 1.2rem; +} +.app-error { + text-align: center; + width: 320px; + max-width: 320px; + margin: 0 auto; +} +.app-error .error-icon { + height: 120px; + width: 120px; + font-size: 120px; + float: left; +} +.app-error .error-text { + float: right; + width: 200px; + max-width: 200px; +} +.app-error .error-title { + font-size: 5rem; + font-weight: 900; + margin: 0; +} +.app-error .error-subtitle { + font-size: 1.5rem; + font-weight: 300; +} +.app-error .error-actions { + width: 100%; + overflow: hidden; + min-height: 54px; + margin-top: 100px; +} + +/*---- Loader ----*/ +.app-loader, +.view-loader { + height: 100%; + width: 100%; + position: absolute; + top: 0; + left: 0; + display: flex; + align-items: center; +} +.spinner { + width: 40px; + height: 40px; + position: relative; + margin: auto; +} +.double-bounce1, +.double-bounce2 { + width: 100%; + height: 100%; + border-radius: 50%; + opacity: 0.6; + position: absolute; + top: 0; + left: 0; + -webkit-animation: sk-bounce 2s infinite ease-in-out; + animation: sk-bounce 2s infinite ease-in-out; +} +.double-bounce2 { + -webkit-animation-delay: -1s; + animation-delay: -1s; +} +.view-loader { + display: block; + padding-top: 160px; + background: rgba(255, 255, 255, 0.3); + z-index: 9999; +} +.view-loader * { + margin: auto; +} +@-webkit-keyframes sk-bounce { + 0%, + 100% { + -webkit-transform: scale(0); + } + 50% { + -webkit-transform: scale(1); + } +} +@keyframes sk-bounce { + 0%, + 100% { + transform: scale(0); + -webkit-transform: scale(0); + } + 50% { + transform: scale(1); + -webkit-transform: scale(1); + } +} + +/*---- Third pirty adjust -----*/ + +/*------- quill rich text editor ----------*/ +.p-0.mat-card-content .ql-container { + border: 0 !important; +} +.p-0.mat-card-content .ql-toolbar.ql-snow { + border: 0; + border-bottom: 1px solid rgba(0, 0, 0, 0.12); +} +/*--- Scroll Bar ---*/ +.ps__scrollbar-y-rail { + z-index: 999; +} +.collapsed-menu .ps__scrollbar-y-rail { + z-index: auto; +} + +/*--- Data table ---*/ +.ngx-datatable.material { + box-shadow: none !important; +} +// .datatable-body, .datatable-body-row { +// min-width: 100% !important; +// } +// datatable-scroller { +// width: 100% !important; +// } +/*------ Map ------*/ +.agm-info-window-content { + color: rgba(0, 0, 0, 0.87); +} +/*-------- Chart js ---------*/ +.chart { + margin-left: -10px; +} + +/*-------- Hopscotch Tour ---------*/ +div.hopscotch-bubble, +div.hopscotch-bubble .hopscotch-title, +div.hopscotch-bubble .hopscotch-content, +div.hopscotch-bubble .hopscotch-nav-button { + font-family: "Roboto", Helvetica Neue, sans-serif !important; +} +div.hopscotch-bubble { + border: 1px solid; + border-radius: 2px; +} +div.hopscotch-bubble .hopscotch-bubble-number { + border-radius: 50%; + box-sizing: border-box; + padding: 0; + font-weight: 500; + height: 32px; + width: 32px; + line-height: 32px; + background: transparent; + color: rgba(0, 0, 0, 0.87); +} +div.hopscotch-bubble .hopscotch-title { + font-size: 17px; + font-weight: 400; + color: #ffffff; + letter-spacing: 0.1px; +} +div.hopscotch-bubble .hopscotch-content { + margin: -5px 0 16px; +} +div.hopscotch-bubble .hopscotch-bubble-close { + background: url("../../../images/cancel.png"); + background-size: 8px; + background-position: 8px 8px; + background-repeat: no-repeat; + cursor: pointer; +} +div.hopscotch-bubble .hopscotch-bubble-close:active { + outline: 0; +} +/* up arrow */ +div.hopscotch-bubble .hopscotch-bubble-arrow-container.up { + top: -17px; +} +/* right arrow */ +div.hopscotch-bubble .hopscotch-bubble-arrow-container.right { + right: -34px; +} +/* bottom arrow */ +div.hopscotch-bubble .hopscotch-bubble-arrow-container.down { + bottom: -34px; +} +/* Left Arrow */ +div.hopscotch-bubble .hopscotch-bubble-arrow-container.left { + left: -17px; +} + +div.hopscotch-bubble .hopscotch-nav-button { + border: 0; + border-radius: 2px; + font-weight: normal; + text-shadow: none !important; + padding: 0 18px; + height: 30px; + line-height: 30px; + font-size: 13px; + background-image: none !important; + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), + 0 1px 5px 0 rgba(0, 0, 0, 0.12); + transform: translate3d(0, 0, 0); + transition: background 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), + box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1); +} + +div.hopscotch-bubble .hopscotch-nav-button:hover, +div.hopscotch-bubble .hopscotch-nav-button:active, +div.hopscotch-bubble .hopscotch-nav-button:focus { + box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), + 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12); + outline: none; +} +div.hopscotch-bubble .hopscotch-nav-button.prev, +div.hopscotch-bubble .hopscotch-nav-button.prev:hover { + background-color: #ffffff; + color: rgba(0, 0, 0, 0.87); +} + +.ps__rail-y { + right: 0 !important; + left: auto !important; +} + +[dir="rtl"] { + .ps__rail-y { + right: auto !important; + left: 0 !important; + } + .ps__thumb-y { + right: auto !important; + left: 1px !important; + } + .ngx-datatable .datatable-footer .datatable-pager .pager { + float: left; + } + .user-card .user-details .mat-icon { + margin-right: 0; + margin-left: 0.5rem; + } +} + +@media (max-width: 767px) { + .mat-card-title .mat-divider { + margin-left: 0; + margin-right: 0; + } + .accordion-handle { + flex-direction: column !important; + } + .app-error .error-icon { + height: 100px; + width: 100px; + font-size: 100px; + } +} diff --git a/src/assets/styles/scss/main/_sidebar.scss b/src/assets/styles/scss/main/_sidebar.scss new file mode 100644 index 0000000..6c8979f --- /dev/null +++ b/src/assets/styles/scss/main/_sidebar.scss @@ -0,0 +1,135 @@ +.sidebar-compact-switch { + position: relative; + width: 24px; + height: 12px; + border-radius: 10px; + border: 1px solid #666; + cursor: pointer; + z-index: 999999; + opacity: 1; + transition: left 0.3s, opacity 0.1s; + span { + position: absolute; + left: 1px; + top: 1px; + display: inline-block; + width: 8px; + height: 8px; + border-radius: 50%; + background: #666; + transition: all $sidebarTrnTime $transitionTiming; + } + &.active { + background: #444; + span { + left: 13px; + background: #ffffff; + } + } +} + +.branding { + display: flex; + align-items: center; + position: fixed; + padding: 0 16px; + width: $sidebar-width; + height: 64px; + line-height: 64px; + top: 0; + left: 0; + z-index: 999; + color: #444; + background: #ffffff; + transition: all $sidebarTrnTime $transitionTiming; + overflow: hidden; + .app-logo { + width: auto; + height: 20px; + margin-right: 8px; + } + .app-logo-text { + width: auto; + font-size: 20px; + font-weight: 400; + } +} + +.app-user { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + width: 100%; + padding: 0px 20px; + margin: 2rem 0px; + + .app-user-photo { + width: 2.5rem; + height: 2.5rem; + min-width: 2.5rem; + min-height: 2.5rem; + box-sizing: border-box; + border-radius: 50%; + margin-left: 16px; + } + .app-user-controls { + .mat-icon-button:not(:first-child) { + margin: 0 2px; + } + } + img { + width: 100%; + height: 100%; + border-radius: 50%; + } + .app-user-name { + display: block; + font-size: 0.875rem; + font-weight: 300; + color: rgba(0, 0, 0, 0.96); + } +} + +.app-admin-container.sidebar-compact { + .sidebar-compact-switch { + opacity: 0; + left: -2rem; + } + .branding { + width: $compact-sidebar-width; + padding: 0; + .app-logo { + margin: auto; + } + } + .app-user { + padding: 0.5rem 0; + .app-user-photo { + width: 40px; + height: 40px; + margin-bottom: 0; + } + } + .app-user-name, + .app-user-controls, + .app-logo-text { + display: none !important; + } +} + +[dir="rtl"] { + .sidebar-compact-switch { + left: auto; + right: 12rem; + } + .branding { + top: 0; + left: auto !important; + right: 0; + .app-logo { + margin-right: 0; + margin-left: 8px; + } + } +} diff --git a/src/assets/styles/scss/main/_sidenav.scss b/src/assets/styles/scss/main/_sidenav.scss new file mode 100644 index 0000000..bc185ce --- /dev/null +++ b/src/assets/styles/scss/main/_sidenav.scss @@ -0,0 +1,284 @@ +.sidenav-hold { + padding: 0px 20px !important; + .menuitem-badge { + padding: 3px 10px; + line-height: 12px; + color: #ffffff !important; + font-weight: 400; + border-radius: 4px; + font-size: 12px; + margin-right: 8px; + } + .icon-menu { + padding: 0 24px; + opacity: 1; + transition: all $sidebarTrnTime ease-in; + } + .icon-menu .icon-menu-item { + display: inline-block; + } + .icon-menu .icon-menu-item button { + min-width: auto; + margin: 4px; + } + .icon-menu > .mat-divider { + margin: 1rem 0; + } + .nav-item-sep { + padding: 0; + margin: 1.5rem 0 .5rem; + .icon-menu-title { + padding-left: 0px; + margin-left: -8px; + } + span { + padding: 0 0 0 16px; + display: block; + font-size: 12px; + font-weight: 500; + } + } + .sidenav { + li { + cursor: pointer; + ul.submenu { + max-height: 0; + overflow: hidden; + // transition: all $sidebarTrnTime $transitionTiming; + opacity: 1; + &.lvl2 a, + &.lvl3 a { + height: 44px; + } + &.lvl2 a { + padding: 0 16px 0 55px; + } + &.lvl3 a { + padding: 0 16px 0 64px; + } + } + } + a { + position: relative; + width: 100%; + padding: 0 16px 0 0; + display: flex; + box-sizing: border-box; + align-items: center; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + text-decoration: none; + .mat-icon:not(.menu-caret) { + text-align: center; + margin-right: 3px; + height: 48px; + width: 48px; + font-size: $sidebar-navigation-icon-size; + line-height: 48px; + // border-left: 3px solid; + // border-color: transparent; + } + .menu-caret { + font-size: 1rem; + line-height: 1; + height: 16px; + width: 16px; + transition: transform 0.3s cubic-bezier(0.35, 0, 0.25, 1); + } + } + } +} + +.sidebar-full .sidenav-hold { + li { + ul { + position: relative; + max-height: 0; + overflow: hidden; + transition: max-height 0.4s cubic-bezier(0.35, 0, 0.25, 1); + } + &.open > div > ul, + &.open > ul { + max-height: 1000px; + background: rgba(0, 0, 0, 0.005); + } + &.open > div > a .menu-caret, + &.open > a .menu-caret { + transform: rotate(90deg); + } + } + a { + height: 48px; + border-radius: 4px; + overflow: hidden; + // padding: 0 16px 0 0; + } +} + +.sidebar-compact .sidenav-hold, +.sidebar-compact-big .sidenav-hold { + padding: 0 8px !important; + .icon-menu { + padding: 8px 0 0; + .nav-item-sep { + display: none; + } + } + .nav-item-sep { + margin: 1rem 0; + span { + display: none; + } + } + a { + padding: 0 !important; + border-radius: 4px; + } + li { + position: relative; + z-index: 10001; + .lvl1 > a > .mat-icon.menu-caret, + .menuitem-badge { + display: none; + } + &:hover > div > ul.submenu, + &:hover > ul.submenu { + max-height: 1000px; + visibility: visible; + opacity: 1; + transform: translateY(0); + transition: all 0.4s cubic-bezier(0.35, 0, 0.25, 1); + } + ul.submenu { + overflow: visible; + position: absolute; + left: 100%; + top: 0; + width: 200px; + z-index: 9999; + visibility: hidden; + opacity: 0; + transform: translateY(10px); + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), + 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); + // a { + + // } + &.lvl2 > li > a, + &.lvl3 > li > a { + height: 36px; + line-height: 36px; + padding: 0 16px !important; + } + } + } +} + +.sidebar-compact { + .icon-menu { + display: flex; + flex-direction: column; + align-items: center; + width: $compact-sidebar-width; + .icon-menu-item { + button { + margin: 0 0 8px 0; + padding: 0 12px; + box-shadow: none; + } + } + } + + .sidenav-hold { + .sidenav .mat-icon:not(.menu-caret) { + margin: 0 !important; + width: $compact-sidebar-width !important; + } + .item-name.lvl1 { + display: none; + } + } +} + +.sidebar-compact-big { + .sidenav { + > li > div > a { + text-align: center; + display: block !important; + padding: 16px 0; + .item-name.lvl1 { + // font-size: 1rem; + } + } + .mat-icon:not(.menu-caret) { + height: 36px; + width: 150px; + font-size: 24px; + line-height: 36px; + margin: 0; + } + } +} + +.layout-intransition { + // display: none; + .sidenav ul.submenu { + opacity: 0 !important; + } +} + +[dir="rtl"] { + &.sidebar-full { + .sidenav-hold { + a { + padding: 0 0 0 16px; + } + } + } + &.sidebar-compact .sidenav-hold, + &.sidebar-compact-big .sidenav-hold { + a { + padding: 0 !important; + } + li ul.submenu { + left: auto !important; + right: 100%; + &.lvl2 > li > a, + &.lvl3 > li > a { + padding: 0 16px !important; + } + } + } + .sidenav-hold { + .sidenav { + a { + padding: 0 0 0 16px; + .mat-icon:not(.menu-caret) { + border-left: none; + border-right: 3px solid; + margin-right: 1px; + border-color: transparent; + } + } + li ul.submenu { + &.lvl2 > li > a { + padding: 0 55px 0 16px; + } + &.lvl3 > li > a { + padding: 0 64px 0 16px; + } + } + } + .nav-item-sep { + .icon-menu-title { + padding-right: 0 !important; + margin: 0 -6px 0 0 !important; + } + span { + padding: 16px 20px 0 0; + } + } + } +} diff --git a/src/assets/styles/scss/main/_topnav.scss b/src/assets/styles/scss/main/_topnav.scss new file mode 100644 index 0000000..0106ee5 --- /dev/null +++ b/src/assets/styles/scss/main/_topnav.scss @@ -0,0 +1,232 @@ +.topnav { + &:after { + content:""; + display:table; + clear:both; + } + label.menu-toggle { + height: 48px; + width: 48px; + box-sizing: border-box; + padding: 12px; + border-radius: 50%; + .mat-icon { + font-size: 24px; + } + } + .toggle, + [id^=drop] { + display: none; + } + ul { + padding:0; + margin:0; + list-style: none; + position: relative; + } + ul:not(.menu) { + box-shadow: 0 0 4px rgba(0,0,0,0), 0 4px 8px rgba(0,0,0,.28); + } + ul.menu { + float: left; + height: 48px; + padding-right: 45px; + > li { + float: left; + > div { + > a, + > div { + border-bottom: 2px solid; + height: 48px; + box-sizing: border-box; + border-color: transparent; + margin: 0 6px; + } + } + } + } + ul li { + margin: 0px; + display: inline-block; + } + + a, label { + display: flex; + flex-direction: row; + align-items: center; + padding: 13px 20px; + height: 44px; + font-size: .875rem; + text-decoration: none; + box-sizing: border-box; + .mat-icon { + font-size: 16px; + height: 20px; + line-height: 20px; + width: 20px; + margin-right: 2px; + } + } + ul li ul li:hover, + ul li ul li.open { + background: #eeeeee; + } + + ul ul { + opacity: 0; + visibility: hidden; + position: absolute; + background: #ffffff; + color: rgba(0,0,0,.87); + /* has to be the same number as the "line-height" of "nav a" */ + top: 48px; + transform: translateY(-100px); + transition: all 0.3s ease-in-out; + z-index: -1; + } + + ul li:hover > div > div > ul, + ul li:hover > div > ul { + opacity: 1; + visibility: visible; + transform: translateY(0); + } + + ul ul li { + width:170px; + float:none; + display:list-item; + position: relative; + } + ul ul ul { + top: 0; + left:170px; + } + ul ul ul li { + position: relative; + top: 0; + } + + li > a:after { content: ' +'; } + li > a:only-child:after { content: ''; } +} + + +/* Media Queries +--------------------------------------------- */ + +@media all and (max-width : 768px) { + .topnav { + margin: 0; + .toggle + a { + display: none; + } + .menu { + opacity: 0; + visibility: hidden; + height: auto !important; + width: 100%; + li { + a { + border: none !important; + } + } + } + + .toggle { + display: flex; + text-decoration:none; + border:none; + } + + .toggle:hover { + // background-color: #eeeeee; + } + ul { + overflow: hidden; + max-height: 0px; + transform: translateY(0px) !important; + transition: max-height 0.3s ease-in-out; + } + + [id^=drop]:checked + ul { + opacity: 1; + visibility: visible; + max-height: 2000px; + } + [id^=drop]:checked + ul.menu { + max-height: 300px; + overflow-y: scroll; + } + + ul li { + position: relative; + opacity: 1; + visibility: visible; + width: 100%; + z-index: 1; + } + + ul ul .toggle, + ul ul a { + padding: 0 40px; + } + + ul ul ul a { + padding: 0 80px; + } + + ul li ul li .toggle, + ul ul a, + ul ul ul a{ + padding:14px 20px; + } + + /* Hide Dropdowns by Default */ + ul ul { + float: none; + position: relative; + top: 0; + left: 0; + box-shadow: none !important; + z-index: 1; + } + + /* Hide menus on hover */ + ul li:hover > div > div > ul, + ul li:hover > div > ul { + opacity: 0; + visibility: hidden; + } + + ul ul li { + opacity: 1; + visibility: visible; + width: 100%; + } + ul ul ul { + left: 0; + } + ul ul ul li { + position: static; + } + } +} + +@media all and (max-width : 330px) { + .topnav ul li { + display:block; + width: 94%; + } +} + +[dir=rtl] { + .topnav { + a, label { + .mat-icon { + margin-right: 0; + margin-left: 2px; + } + } + } +} \ No newline at end of file diff --git a/src/assets/styles/scss/main/_typography.scss b/src/assets/styles/scss/main/_typography.scss new file mode 100644 index 0000000..da055da --- /dev/null +++ b/src/assets/styles/scss/main/_typography.scss @@ -0,0 +1,115 @@ +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + margin-bottom: $headings-margin-bottom; + margin-top: 0; + font-weight: $headings-font-weight; + line-height: $headings-line-height; + color: $headings-color; +} + +h1, +.h1 { + font-size: $font-size-h1; +} +h2, +.h2 { + font-size: $font-size-h2; +} +h3, +.h3 { + font-size: $font-size-h3; +} +h4, +.h4 { + font-size: $font-size-h4; +} +h5, +.h5 { + font-size: $font-size-h5; +} +h6, +.h6 { + font-size: $font-size-h6; +} + +a, +a:focus, +a:hover { + cursor: pointer; + text-decoration: none; + color: inherit; + outline: 0; +} + +button { + outline: 0; +} + +figure { + margin: 0; +} + +strong, +b { + font-weight: 700; +} + +.strikethrough { + text-decoration: line-through; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} + +@for $i from 10 through 78 { + .text-#{$i} { + font-size: #{$i}px; + &.mat-icon { + width: #{$i}px !important; + height: #{$i}px !important; + line-height: #{$i}px !important; + } + } +} + +.font-weight-light { + font-weight: 300; +} +.font-weight-normal { + font-weight: 400; +} +.font-weight-medium { + font-weight: 500; +} +.font-weight-semi-bold { + font-weight: 600; +} +.font-weight-bold { + font-weight: bold; +} +.font-weight-inherit { + font-weight: inherit; +} +.line-height-1 { + line-height: 1 !important; +} + +.whitespace-pre-line { + white-space: pre-wrap; +} +.word-wrap-break-word { + word-wrap: break-word; +} diff --git a/src/assets/styles/scss/mixins/_gradients.scss b/src/assets/styles/scss/mixins/_gradients.scss new file mode 100644 index 0000000..5f3cb37 --- /dev/null +++ b/src/assets/styles/scss/mixins/_gradients.scss @@ -0,0 +1,24 @@ +@mixin directional-gradient($dir, $from, $to, $stop: 100%) { + background-color: $from !important; + background-image: -moz-linear-gradient($dir, $from 0%, $to $stop) !important; + + background-image: -webkit-gradient( + linear, + $dir, + right top, + color-stop(0%, $from), + color-stop($stop, $to) + ) !important; + + background-image: -webkit-linear-gradient($dir, $from 0%, $to $stop) !important; + + background-image: -o-linear-gradient($dir, $from 0%, $to $stop) !important; + + background: -ms-linear-gradient($dir, $from 0%, $to $stop) !important; + + /* Standard */ + background: linear-gradient($dir, $from 0%, $to $stop) !important; + + /* IE6-9 */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='$from', endColorstr='$to',GradientType=1 ); + } \ No newline at end of file diff --git a/src/assets/styles/scss/mixins/_mixins.scss b/src/assets/styles/scss/mixins/_mixins.scss new file mode 100644 index 0000000..c539143 --- /dev/null +++ b/src/assets/styles/scss/mixins/_mixins.scss @@ -0,0 +1,8 @@ +@import "gradients"; + +// media +@mixin media($width) { + @media screen and (max-width: $width) { + @content; + } +} diff --git a/src/assets/styles/scss/themes/_matx-blue.scss b/src/assets/styles/scss/themes/_matx-blue.scss new file mode 100644 index 0000000..c84b209 --- /dev/null +++ b/src/assets/styles/scss/themes/_matx-blue.scss @@ -0,0 +1,123 @@ +$mat-primary: map-get($material-colors, blue); +$mat-accent: map-get($material-colors, orange); + + +$matx-primary: mat-palette($mat-primary); +$matx-accent: mat-palette($mat-accent); + +// custom theme palettes are passed into a theme function +$matx-theme: mat-light-theme($matx-primary, $matx-accent); + +$primary-dark: darken( map-get($mat-primary, 500), 8% ); + +// Material theme is wrapped by a parent class +.matx-blue { + @include angular-material-theme($matx-theme); + + .mat-bg-primary, + .topbar, + .chats-wrap .conversations-hold .single-conversation.me .conversation-msg, + .ngx-datatable .datatable-footer .datatable-pager .pager .pages.active a, + .fileupload-drop-zone.dz-file-over, + .toolbar-avatar.online > .status-dot, + .cal-open-day-events, + div.hopscotch-bubble { + background: map-get($mat-primary, 500) !important; + color: #ffffff !important; + } + .mat-color-primary, + .list-item-active, + .sidenav-hold .sidenav li.open a .mat-icon:not(.menu-caret), + .sidenav-hold .sidenav li.open > div > a > span:not(.menuitem-badge), + .sidenav-hold .sidenav li.open > a > span { + color: map-get($mat-primary, 500) !important; + } + .topnav ul.menu > li > div.open > a, + .topnav ul.menu > li > div.open > div, + .sidebar-panel .sidebar-list-item.open > .mat-list-item-content > .sub-menu, + .sidenav-hold .sidenav li.open a .mat-icon:not(.menu-caret), + .list-item-active { + border-color: map-get($mat-primary, 500) !important; + } + .sidebar-panel { + background: url('../../../images/sidebar-bg.jpg') no-repeat; + } + .sidebar-compact ul.submenu, + .default-bg { + background: #ffffff !important; + } + .default-light-bg { + background: #fafafa !important; + } + /* Hopscotch Tour */ + div.hopscotch-bubble { + border-color: $primary-dark; + } + /* up arrow */ + div.hopscotch-bubble .hopscotch-bubble-arrow-container.up .hopscotch-bubble-arrow-border { + border-bottom: 17px solid $primary-dark; + } + div.hopscotch-bubble .hopscotch-bubble-arrow-container.up .hopscotch-bubble-arrow { + border-bottom: 17px solid map-get($mat-primary, 500); + top: -16px; + } + /* right arrow */ + div.hopscotch-bubble .hopscotch-bubble-arrow-container.right .hopscotch-bubble-arrow-border { + border-left: 17px solid $primary-dark; + } + div.hopscotch-bubble .hopscotch-bubble-arrow-container.right .hopscotch-bubble-arrow { + border-left: 17px solid map-get($mat-primary, 500); + left: -1px; + } + /* bottom arrow */ + div.hopscotch-bubble .hopscotch-bubble-arrow-container.down .hopscotch-bubble-arrow-border { + border-top: 17px solid $primary-dark; + } + div.hopscotch-bubble .hopscotch-bubble-arrow-container.down .hopscotch-bubble-arrow { + border-top: 17px solid map-get($mat-primary, 500); + top: -18px; + } + /* Left Arrow */ + div.hopscotch-bubble .hopscotch-bubble-arrow-container.left .hopscotch-bubble-arrow-border { + border-right: 17px solid $primary-dark; + } + div.hopscotch-bubble .hopscotch-bubble-arrow-container.left .hopscotch-bubble-arrow { + left: 1px; + border-right: 17px solid map-get($mat-primary, 500); + } + + .mat-bg-accent, + div.hopscotch-bubble .hopscotch-bubble-number, + div.hopscotch-bubble .hopscotch-nav-button.next:hover, + div.hopscotch-bubble .hopscotch-nav-button.next { + background-color: map-get($mat-accent, 500); + color: black; + } + .mat-bg-warn { + background-color: #f44336; + color: white; + } + .mat-color-accent { + color: map-get($mat-accent, 500); + } + .mat-color-warn { + color: #f44336; + } + .mat-color-default { + color: rgba(0, 0, 0, 0.87); + } + + .fill-color-accent { + color: map-get($mat-accent, 500); + } + + .fill-color-warn { + color: #f44336; + + } + @media (max-width: 959px) { + .default-bg-mobile { + background: #ffffff; + } + } +} \ No newline at end of file diff --git a/src/assets/styles/scss/themes/_matx-dark-pink.scss b/src/assets/styles/scss/themes/_matx-dark-pink.scss new file mode 100644 index 0000000..3746014 --- /dev/null +++ b/src/assets/styles/scss/themes/_matx-dark-pink.scss @@ -0,0 +1,189 @@ +$mat-primary: map-get($material-colors, pink); +$mat-accent: map-get($material-colors, blue-grey); + +$matx-primary: mat-palette($mat-primary); +$matx-accent: mat-palette($mat-accent); + +// custom theme palettes are passed into a theme function +$matx-theme: mat-dark-theme($matx-primary, $matx-accent); + +$primary-dark: darken( map-get($mat-primary, 500), 8% ); + +// Material theme is wrapped by a parent class +.matx-dark-pink { + @include angular-material-theme($matx-theme); + + .mat-bg-primary, + .topbar, + .chats-wrap .conversations-hold .single-conversation.me .conversation-msg, + .ngx-datatable .datatable-footer .datatable-pager .pager .pages.active a, + .fileupload-drop-zone.dz-file-over, + .toolbar-avatar.online > .status-dot, + .cal-open-day-events, + div.hopscotch-bubble { + background: map-get($mat-primary, 500) !important; + color: #ffffff !important; + } + .mat-color-primary, + .list-item-active, + .sidenav-hold .sidenav li.open a .mat-icon:not(.menu-caret), + .sidenav-hold .sidenav li.open > div > a > span:not(.menuitem-badge), + .sidenav-hold .sidenav li.open > a > span { + color: map-get($mat-primary, 500) !important; + } + .sidebar-panel .sidebar-list-item.open > .mat-list-item-content > a > span, + .sidebar-panel .sidebar-list-item.open .sub-menu .mat-list-item.selected a { + font-weight: 500; + } + .topnav ul.menu > li > div.open > a, + .sidebar-panel .sidebar-list-item.open > .mat-list-item-content > .sub-menu, + .sidenav-hold .sidenav li.open a .mat-icon:not(.menu-caret), + .list-item-active { + border-color: map-get($mat-primary, 500) !important; + } + .ngx-datatable.material, + .messages-wrap .inbox-hold { + background: transparent !important; + } + // .sidebar-panel { + // background: url('../../assets/images/sidebar-bg-dark.jpg') no-repeat; + // } + .header-topnav, + .topnav ul ul, + .app-user .app-user-name, + .sidebar-panel .sidebar-list-item mat-icon:not(.menu-caret), + .ngx-datatable.material *, + .ql-snow .ql-picker, + .ngx-pagination a, .ngx-pagination button { + color: white !important; + } + .text-muted { + color: rgba(255, 255, 255, .54) !important; + } + + .ql-snow .ql-stroke { + stroke: #ffffff; + } + .ql-snow .ql-fill { + fill: #ffffff; + } + .ql-toolbar.ql-snow, + .ql-toolbar.ql-snow + .ql-container.ql-snow { + border-color: rgba(255, 255, 255, 0.12) !important; + } + + // .sidebar-panel .navigation-hold, + .message-item.open .message-head, + .ngx-datatable.material .datatable-header, + .bg-white, + .cal-month-view .cal-cell-row:hover, + .chats-wrap .conversations-hold .single-conversation.sender .conversation-msg, + .cal-day-view .cal-hour:nth-child(odd), + &.collapsed-menu .sidebar-panel .sidebar-list-item.open .sub-menu, + .ngx-pagination a:hover, .ngx-pagination button:hover, + .product-container .products-pagination .ngx-pagination .current { + background: rgba(66, 66, 66, 0.92) !important; + } + .sidebar-compact ul.submenu, + .topnav ul li ul li:hover, + .topnav ul li ul li.open, + .default-bg, + .default-light-bg { + background: #424242; + color: #ffffff; + } + + .header-topnav, + .topnav ul ul, + .ngx-datatable.material:not(.cell-selection) .datatable-body-row:hover, + .ngx-datatable.material:not(.cell-selection) .datatable-body-row:hover .datatable-row-group, + .cal-month-view .cal-cell-row .cal-cell:hover, + .cal-month-view .cal-cell.cal-has-events.cal-open, + .cal-week-view .cal-day-headers .cal-header:hover, + .cal-week-view .cal-day-headers .cal-drag-over, + .cal-day-view .cal-hour-segment:hover, + .cal-day-view .cal-drag-over .cal-hour-segment { + background: #333 !important; + } + .cal-month-view .cal-day-cell:not(:last-child), + .cal-month-view .cal-days, + .cal-week-view .cal-day-headers .cal-header:not(:last-child), + .cal-week-view .cal-day-headers, + .cal-month-view .cal-days .cal-cell-row, + .cal-day-view .cal-hour:not(:last-child) .cal-hour-segment, + .cal-day-view .cal-hour:last-child :not(:last-child) .cal-hour-segment { + border-color: #000 !important; + } + + /* Hopscotch Tour */ + div.hopscotch-bubble { + border-color: $primary-dark; + } + /* up arrow */ + div.hopscotch-bubble .hopscotch-bubble-arrow-container.up .hopscotch-bubble-arrow-border { + border-bottom: 17px solid $primary-dark; + } + div.hopscotch-bubble .hopscotch-bubble-arrow-container.up .hopscotch-bubble-arrow { + border-bottom: 17px solid map-get($mat-primary, 500); + top: -16px; + } + /* right arrow */ + div.hopscotch-bubble .hopscotch-bubble-arrow-container.right .hopscotch-bubble-arrow-border { + border-left: 17px solid $primary-dark; + } + div.hopscotch-bubble .hopscotch-bubble-arrow-container.right .hopscotch-bubble-arrow { + border-left: 17px solid map-get($mat-primary, 500); + left: -1px; + } + /* bottom arrow */ + div.hopscotch-bubble .hopscotch-bubble-arrow-container.down .hopscotch-bubble-arrow-border { + border-top: 17px solid $primary-dark; + } + div.hopscotch-bubble .hopscotch-bubble-arrow-container.down .hopscotch-bubble-arrow { + border-top: 17px solid map-get($mat-primary, 500); + top: -18px; + } + /* Left Arrow */ + div.hopscotch-bubble .hopscotch-bubble-arrow-container.left .hopscotch-bubble-arrow-border { + border-right: 17px solid $primary-dark; + } + div.hopscotch-bubble .hopscotch-bubble-arrow-container.left .hopscotch-bubble-arrow { + left: 1px; + border-right: 17px solid map-get($mat-primary, 500); + } + + .mat-bg-accent, + div.hopscotch-bubble .hopscotch-bubble-number, + div.hopscotch-bubble .hopscotch-nav-button.next:hover, + div.hopscotch-bubble .hopscotch-nav-button.next { + background-color: map-get($mat-accent, 500); + color: black; + } + .mat-bg-warn { + background-color: #f44336; + color: white; + } + .mat-color-accent { + color: map-get($mat-accent, 500); + } + .mat-color-warn { + color: #f44336; + } + .mat-color-default { + color: #ffffff; + } + + .fill-color-accent { + color: map-get($mat-accent, 500); + } + + .fill-color-warn { + color: #f44336; + } + @media (max-width: 959px) { + .default-bg-mobile { + background: #424242; + color: #ffffff; + } + } +} \ No newline at end of file diff --git a/src/assets/styles/scss/themes/_matx-dark-purple.scss b/src/assets/styles/scss/themes/_matx-dark-purple.scss new file mode 100644 index 0000000..a2b6b18 --- /dev/null +++ b/src/assets/styles/scss/themes/_matx-dark-purple.scss @@ -0,0 +1,244 @@ +$mat-primary: map-get($material-colors, purple); +$mat-accent: map-get($material-colors, amber); + +$matx-primary: mat-palette($mat-primary); +$matx-accent: mat-palette($mat-accent); + +// custom theme palettes are passed into a theme function +$matx-theme: mat-dark-theme($matx-primary, $matx-accent); + +// Insert custom background color +$background: map-get($matx-theme, background); +$background: map_merge( + $background, + ( + background: #1a2038, + card: #222a45, + raised-button: #222a45, + dialog: #222a45 + ) +); +// @debug $background; + + +// (status-bar: black, +// app-bar: #212121, +// background: #000, +// hover: rgba(255, 255, 255, 0.04), +// card: #424242, dialog: #424242, +// disabled-button: rgba(255, 255, 255, 0.12), +// raised-button: #424242, +// focused-button: rgba(255, 255, 255, 0.12), +// selected-button: #212121, +// selected-disabled-button: #424242, +// disabled-button-toggle: black, +// unselected-chip: #616161, +// disabled-list-option: black) + +$matx-theme: map_merge( + $matx-theme, + ( + background: $background + ) +); + +$primary-dark: darken(map-get($mat-primary, 500), 8%); + +// Material theme is wrapped by a parent class +.matx-dark-purple { + @include angular-material-theme($matx-theme); + + .mat-bg-primary, + .topbar, + .chats-wrap .conversations-hold .single-conversation.me .conversation-msg, + .ngx-datatable .datatable-footer .datatable-pager .pager .pages.active a, + .fileupload-drop-zone.dz-file-over, + .toolbar-avatar.online > .status-dot, + .cal-open-day-events, + div.hopscotch-bubble { + background: map-get($mat-primary, 500) !important; + color: #ffffff !important; + } + .mat-color-primary, + .list-item-active, + .sidenav-hold .sidenav li.open a .mat-icon:not(.menu-caret), + .sidenav-hold .sidenav li.open > div > a > span:not(.menuitem-badge), + .sidenav-hold .sidenav li.open > a > span { + color: map-get($mat-primary, 500) !important; + } + .sidebar-panel .sidebar-list-item.open > .mat-list-item-content > a > span, + .sidebar-panel .sidebar-list-item.open .sub-menu .mat-list-item.selected a { + font-weight: 500; + } + .topnav ul.menu > li > div.open > a, + .sidebar-panel .sidebar-list-item.open > .mat-list-item-content > .sub-menu, + .sidenav-hold .sidenav li.open a .mat-icon:not(.menu-caret), + .list-item-active { + border-color: map-get($mat-primary, 500) !important; + } + .ngx-datatable.material, + .messages-wrap .inbox-hold { + background: transparent !important; + } + + .header-topnav, + .topnav ul ul, + .app-user .app-user-name, + .sidebar-panel .sidebar-list-item mat-icon:not(.menu-caret), + .ngx-datatable.material *, + .ql-snow .ql-picker, + .mat-option, + .mat-dialog-container, + .ngx-pagination a, + .ngx-pagination button { + color: white !important; + } + .text-muted { + color: rgba(255, 255, 255, 0.54) !important; + } + + .ql-snow .ql-stroke { + stroke: #ffffff; + } + .ql-snow .ql-fill { + fill: #ffffff; + } + .ql-toolbar.ql-snow, + .ql-toolbar.ql-snow + .ql-container.ql-snow { + border-color: rgba(255, 255, 255, 0.12) !important; + } + + // .sidebar-panel .navigation-hold, + .message-item.open .message-head, + .ngx-datatable.material .datatable-header, + .bg-white, + .cal-month-view .cal-cell-row:hover, + .chats-wrap .conversations-hold .single-conversation.sender .conversation-msg, + .cal-day-view .cal-hour:nth-child(odd), + &.collapsed-menu .sidebar-panel .sidebar-list-item.open .sub-menu, + .ngx-pagination a:hover, + .ngx-pagination button:hover, + .product-container .products-pagination .ngx-pagination .current { + background: rgb(34, 42, 69) !important; + } + .sidebar-compact ul.submenu, + .topnav ul li ul li:hover, + .topnav ul li ul li.open, + .default-bg, + .default-light-bg { + background: rgb(34, 42, 69); + color: #ffffff; + } + .header-topnav, + .topnav ul ul, + .ngx-datatable.material:not(.cell-selection) .datatable-body-row:hover, + .ngx-datatable.material:not(.cell-selection) + .datatable-body-row:hover + .datatable-row-group, + .cal-month-view .cal-cell-row .cal-cell:hover, + .cal-month-view .cal-cell.cal-has-events.cal-open, + .cal-week-view .cal-day-headers .cal-header:hover, + .cal-week-view .cal-day-headers .cal-drag-over, + .cal-day-view .cal-hour-segment:hover, + .cal-day-view .cal-drag-over .cal-hour-segment { + background: rgb(34, 42, 69) !important; + } + .cal-month-view .cal-day-cell:not(:last-child), + .cal-month-view .cal-days, + .cal-week-view .cal-day-headers .cal-header:not(:last-child), + .cal-week-view .cal-day-headers, + .cal-month-view .cal-days .cal-cell-row, + .cal-day-view .cal-hour:not(:last-child) .cal-hour-segment, + .cal-day-view .cal-hour:last-child :not(:last-child) .cal-hour-segment { + border-color: #000 !important; + } + + /* Hopscotch Tour */ + div.hopscotch-bubble { + border-color: $primary-dark; + } + /* up arrow */ + div.hopscotch-bubble + .hopscotch-bubble-arrow-container.up + .hopscotch-bubble-arrow-border { + border-bottom: 17px solid $primary-dark; + } + div.hopscotch-bubble + .hopscotch-bubble-arrow-container.up + .hopscotch-bubble-arrow { + border-bottom: 17px solid map-get($mat-primary, 500); + top: -16px; + } + /* right arrow */ + div.hopscotch-bubble + .hopscotch-bubble-arrow-container.right + .hopscotch-bubble-arrow-border { + border-left: 17px solid $primary-dark; + } + div.hopscotch-bubble + .hopscotch-bubble-arrow-container.right + .hopscotch-bubble-arrow { + border-left: 17px solid map-get($mat-primary, 500); + left: -1px; + } + /* bottom arrow */ + div.hopscotch-bubble + .hopscotch-bubble-arrow-container.down + .hopscotch-bubble-arrow-border { + border-top: 17px solid $primary-dark; + } + div.hopscotch-bubble + .hopscotch-bubble-arrow-container.down + .hopscotch-bubble-arrow { + border-top: 17px solid map-get($mat-primary, 500); + top: -18px; + } + /* Left Arrow */ + div.hopscotch-bubble + .hopscotch-bubble-arrow-container.left + .hopscotch-bubble-arrow-border { + border-right: 17px solid $primary-dark; + } + div.hopscotch-bubble + .hopscotch-bubble-arrow-container.left + .hopscotch-bubble-arrow { + left: 1px; + border-right: 17px solid map-get($mat-primary, 500); + } + + .mat-bg-accent, + div.hopscotch-bubble .hopscotch-bubble-number, + div.hopscotch-bubble .hopscotch-nav-button.next:hover, + div.hopscotch-bubble .hopscotch-nav-button.next { + background-color: map-get($mat-accent, 500); + color: black; + } + .mat-bg-warn { + background-color: #f44336; + color: white; + } + .mat-color-accent { + color: map-get($mat-accent, 500); + } + .mat-color-warn { + color: #f44336; + } + .mat-color-default { + color: #ffffff; + } + + .fill-color-accent { + color: map-get($mat-accent, 500); + } + + .fill-color-warn { + color: #f44336; + } + + @media (max-width: 959px) { + .default-bg-mobile { + background: #424242; + color: #ffffff; + } + } +} diff --git a/src/assets/styles/scss/themes/_matx-light-purple.scss b/src/assets/styles/scss/themes/_matx-light-purple.scss new file mode 100644 index 0000000..498d0d3 --- /dev/null +++ b/src/assets/styles/scss/themes/_matx-light-purple.scss @@ -0,0 +1,123 @@ +$mat-primary: map-get($material-colors, light-purple); +$mat-accent: map-get($material-colors, orange); + + +$matx-primary: mat-palette($mat-primary); +$matx-accent: mat-palette($mat-accent); + +// custom theme palettes are passed into a theme function +$matx-theme: mat-light-theme($matx-primary, $matx-accent); + +$primary-dark: darken( map-get($mat-primary, 500), 8% ); + +// Material theme is wrapped by a parent class +.matx-light-purple { + @include angular-material-theme($matx-theme); + + .mat-bg-primary, + .topbar, + .chats-wrap .conversations-hold .single-conversation.me .conversation-msg, + .ngx-datatable .datatable-footer .datatable-pager .pager .pages.active a, + .fileupload-drop-zone.dz-file-over, + .toolbar-avatar.online > .status-dot, + .cal-open-day-events, + div.hopscotch-bubble { + background: map-get($mat-primary, 500) !important; + color: #ffffff !important; + } + .mat-color-primary, + .list-item-active, + .sidenav-hold .sidenav li.open a .mat-icon:not(.menu-caret), + .sidenav-hold .sidenav li.open > div > a > span:not(.menuitem-badge), + .sidenav-hold .sidenav li.open > a > span { + color: map-get($mat-primary, 500) !important; + } + .topnav ul.menu > li > div.open > a, + .topnav ul.menu > li > div.open > div, + .sidebar-panel .sidebar-list-item.open > .mat-list-item-content > .sub-menu, + .sidenav-hold .sidenav li.open a .mat-icon:not(.menu-caret), + .list-item-active { + border-color: map-get($mat-primary, 500) !important; + } + .sidebar-panel { + background: url('../../../images/sidebar-bg.jpg') no-repeat; + } + .sidebar-compact ul.submenu, + .default-bg { + background: #ffffff !important; + } + .default-light-bg { + background: #fafafa !important; + } + /* Hopscotch Tour */ + div.hopscotch-bubble { + border-color: $primary-dark; + } + /* up arrow */ + div.hopscotch-bubble .hopscotch-bubble-arrow-container.up .hopscotch-bubble-arrow-border { + border-bottom: 17px solid $primary-dark; + } + div.hopscotch-bubble .hopscotch-bubble-arrow-container.up .hopscotch-bubble-arrow { + border-bottom: 17px solid map-get($mat-primary, 500); + top: -16px; + } + /* right arrow */ + div.hopscotch-bubble .hopscotch-bubble-arrow-container.right .hopscotch-bubble-arrow-border { + border-left: 17px solid $primary-dark; + } + div.hopscotch-bubble .hopscotch-bubble-arrow-container.right .hopscotch-bubble-arrow { + border-left: 17px solid map-get($mat-primary, 500); + left: -1px; + } + /* bottom arrow */ + div.hopscotch-bubble .hopscotch-bubble-arrow-container.down .hopscotch-bubble-arrow-border { + border-top: 17px solid $primary-dark; + } + div.hopscotch-bubble .hopscotch-bubble-arrow-container.down .hopscotch-bubble-arrow { + border-top: 17px solid map-get($mat-primary, 500); + top: -18px; + } + /* Left Arrow */ + div.hopscotch-bubble .hopscotch-bubble-arrow-container.left .hopscotch-bubble-arrow-border { + border-right: 17px solid $primary-dark; + } + div.hopscotch-bubble .hopscotch-bubble-arrow-container.left .hopscotch-bubble-arrow { + left: 1px; + border-right: 17px solid map-get($mat-primary, 500); + } + + .mat-bg-accent, + div.hopscotch-bubble .hopscotch-bubble-number, + div.hopscotch-bubble .hopscotch-nav-button.next:hover, + div.hopscotch-bubble .hopscotch-nav-button.next { + background-color: map-get($mat-accent, 500); + color: black; + } + .mat-bg-warn { + background-color: #f44336; + color: white; + } + .mat-color-accent { + color: map-get($mat-accent, 500); + } + .mat-color-warn { + color: #f44336; + } + .mat-color-default { + color: rgba(0, 0, 0, 0.87); + } + + .fill-color-accent { + color: map-get($mat-accent, 500); + } + + .fill-color-warn { + color: #f44336; + + } + @media (max-width: 959px) { + .default-bg-mobile { + background: #ffffff; + } + } +} \ No newline at end of file diff --git a/src/assets/styles/scss/themes/_matx-navy.scss b/src/assets/styles/scss/themes/_matx-navy.scss new file mode 100644 index 0000000..4191cbf --- /dev/null +++ b/src/assets/styles/scss/themes/_matx-navy.scss @@ -0,0 +1,150 @@ +$mat-primary: map-get($material-colors, dark-blue); +$mat-accent: map-get($material-colors, amber); + +$matx-primary: mat-palette($mat-primary); +$matx-accent: mat-palette($mat-accent); + +// custom theme palettes are passed into a theme function +$matx-theme: mat-light-theme($matx-primary, $matx-accent); + +$primary-dark: darken(map-get($mat-primary, 500), 8%); + +// Material theme is wrapped by a parent class +.matx-navy { + @include angular-material-theme($matx-theme); + .mat-bg-primary, + .topbar:not(.topbar-white), + .chats-wrap .conversations-hold .single-conversation.me .conversation-msg, + .ngx-datatable .datatable-footer .datatable-pager .pager .pages.active a, + .fileupload-drop-zone.dz-file-over, + .toolbar-avatar.online > .status-dot, + .cal-open-day-events, + div.hopscotch-bubble { + background: map-get($mat-primary, 500) !important; + color: #ffffff !important; + } + .mat-color-primary, + .list-item-active, + .sidenav-hold .sidenav li.open a .mat-icon:not(.menu-caret), + .sidenav-hold .sidenav li.open > div > a > span:not(.menuitem-badge), + .sidenav-hold .sidenav li.open > a > span { + color: map-get($mat-primary, 500) !important; + } + .sidebar-panel .mat-nav-list .mat-list-item { + color: rgba(0, 0, 0, 0.94); + } + .topnav ul.menu > li > div.open > a, + .topnav ul.menu > li > div.open > div, + .sidebar-panel .sidebar-list-item.open > .mat-list-item-content > .sub-menu, + .sidenav-hold .sidenav li.open a .mat-icon:not(.menu-caret), + .list-item-active { + border-color: map-get($mat-primary, 500) !important; + } + .sidebar-panel { + background: url("../../..//images/sidebar-bg.jpg") no-repeat; + } + .sidebar-compact ul.submenu, + .default-bg { + background: #ffffff !important; + } + .default-light-bg { + background: #fafafa !important; + } + /* White Background */ + .topbar-white { + background: #ffffff; + // .mat-icon { + // color: rgba(0, 0, 0, 0.87); + // } + .search-bar .top-search-form { + box-shadow: inset 0 0 2px 2px rgba(136, 136, 136, 0.2); + } + } + + /* Hopscotch Tour */ + div.hopscotch-bubble { + border-color: $primary-dark; + } + /* up arrow */ + div.hopscotch-bubble + .hopscotch-bubble-arrow-container.up + .hopscotch-bubble-arrow-border { + border-bottom: 17px solid $primary-dark; + } + div.hopscotch-bubble + .hopscotch-bubble-arrow-container.up + .hopscotch-bubble-arrow { + border-bottom: 17px solid map-get($mat-primary, 500); + top: -16px; + } + /* right arrow */ + div.hopscotch-bubble + .hopscotch-bubble-arrow-container.right + .hopscotch-bubble-arrow-border { + border-left: 17px solid $primary-dark; + } + div.hopscotch-bubble + .hopscotch-bubble-arrow-container.right + .hopscotch-bubble-arrow { + border-left: 17px solid map-get($mat-primary, 500); + left: -1px; + } + /* bottom arrow */ + div.hopscotch-bubble + .hopscotch-bubble-arrow-container.down + .hopscotch-bubble-arrow-border { + border-top: 17px solid $primary-dark; + } + div.hopscotch-bubble + .hopscotch-bubble-arrow-container.down + .hopscotch-bubble-arrow { + border-top: 17px solid map-get($mat-primary, 500); + top: -18px; + } + /* Left Arrow */ + div.hopscotch-bubble + .hopscotch-bubble-arrow-container.left + .hopscotch-bubble-arrow-border { + border-right: 17px solid $primary-dark; + } + div.hopscotch-bubble + .hopscotch-bubble-arrow-container.left + .hopscotch-bubble-arrow { + left: 1px; + border-right: 17px solid map-get($mat-primary, 500); + } + + .mat-bg-accent, + div.hopscotch-bubble .hopscotch-bubble-number, + div.hopscotch-bubble .hopscotch-nav-button.next:hover, + div.hopscotch-bubble .hopscotch-nav-button.next { + background-color: map-get($mat-accent, 500); + color: black; + } + .mat-bg-warn { + background-color: #f44336; + color: white; + } + .mat-color-accent { + color: map-get($mat-accent, 500); + } + .mat-color-warn { + color: #f44336; + } + .mat-color-default { + color: rgba(0, 0, 0, 0.87); + } + + .fill-color-accent { + color: map-get($mat-accent, 500); + } + + .fill-color-warn { + color: #f44336; + } + @media (max-width: 959px) { + .default-bg-mobile { + background: #ffffff; + } + } +} diff --git a/src/assets/styles/scss/themes/_themes.scss b/src/assets/styles/scss/themes/_themes.scss new file mode 100644 index 0000000..0f1f13a --- /dev/null +++ b/src/assets/styles/scss/themes/_themes.scss @@ -0,0 +1,12 @@ +@import '~@angular/material/theming'; +@include mat-core(); + +// Keep atleast one file +@import "matx-navy"; +@import "matx-blue"; +@import "matx-light-purple"; +@import "matx-dark-purple"; +@import "matx-dark-pink"; + +$background: map-get($matx-theme, background); +$foreground: map-get($matx-theme, foreground); \ No newline at end of file diff --git a/src/assets/styles/scss/utilities/_alignment.scss b/src/assets/styles/scss/utilities/_alignment.scss new file mode 100644 index 0000000..5b3efb0 --- /dev/null +++ b/src/assets/styles/scss/utilities/_alignment.scss @@ -0,0 +1,9 @@ +// Alignment +[dir="rtl"] { + .float-left { + float: right; + } + .float-right { + float: left; + } +} diff --git a/src/assets/styles/scss/utilities/_avatar.scss b/src/assets/styles/scss/utilities/_avatar.scss new file mode 100644 index 0000000..fe579ed --- /dev/null +++ b/src/assets/styles/scss/utilities/_avatar.scss @@ -0,0 +1,36 @@ +.avatar-xs { + width: 24px; + height: 24px; +} +.avatar-sm { + width: 36px; + height: 36px; +} +.avatar-md { + width: 54px; + height: 54px; +} + +.avatar-lg { + width: 80px; + height: 80px; +} + +.face-group { + display: flex; + flex-direction: row; + + [class*="avatar"] { + border: 2px solid white; + border-radius: 50%; + overflow: hidden; + &:not(:first-child) { + margin-left: -14px !important; + } + } + .number-avatar { + display: flex; + justify-content: center; + align-items: center; + } +} diff --git a/src/assets/styles/scss/utilities/_border.scss b/src/assets/styles/scss/utilities/_border.scss new file mode 100644 index 0000000..414c7d4 --- /dev/null +++ b/src/assets/styles/scss/utilities/_border.scss @@ -0,0 +1,62 @@ +.border-0 { + border: 0 !important; +} +.border-top-0 { + border-top: 0 !important; +} +.border-right-0 { + border-right: 0 !important; +} +.border-bottom-0 { + border-bottom: 0 !important; +} +.border-left-0 { + border-left: 0 !important; +} +.border { + border: 1px solid rgba(0, 0, 0, 0.1); +} +.border-top { + border-top: 1px solid rgba(0, 0, 0, 0.1) !important; +} +.border-right { + border-right: 1px solid rgba(0, 0, 0, 0.1) !important; +} +.border-bottom { + border-bottom: 1px solid rgba(0, 0, 0, 0.1) !important; +} +.border-left { + border-left: 1px solid rgba(0, 0, 0, 0.1) !important; +} + +.border-light { + border: 1px solid rgba(255, 255, 255, 0.1); +} +.border-top-light { + border-top: 1px solid rgba(255, 255, 255, 0.1) !important; +} +.border-right-light { + border-right: 1px solid rgba(255, 255, 255, 0.1) !important; +} +.border-bottom-light { + border-bottom: 1px solid rgba(255, 255, 255, 0.1) !important; +} +.border-left-light { + border-left: 1px solid rgba(255, 255, 255, 0.1) !important; +} + +.border-radius-4 { + border-radius: 4px; +} + +.rounded { + border-radius: 8px; + &-circle { + border-radius: 50%; + } + &.mat-progress-bar, + .mat-progress-bar-fill { + border-radius: 10px; + overflow: hidden; + } +} diff --git a/src/assets/styles/scss/utilities/_display.scss b/src/assets/styles/scss/utilities/_display.scss new file mode 100644 index 0000000..95146ff --- /dev/null +++ b/src/assets/styles/scss/utilities/_display.scss @@ -0,0 +1,7 @@ +// OVERFLOW +.overflow-x-auto { + overflow-x: auto !important; +} +.overflow-hidden { + overflow: hidden !important; +} diff --git a/src/assets/styles/scss/utilities/_height-width.scss b/src/assets/styles/scss/utilities/_height-width.scss new file mode 100644 index 0000000..2c2e19f --- /dev/null +++ b/src/assets/styles/scss/utilities/_height-width.scss @@ -0,0 +1,66 @@ +$lenghts: ( + 0: 0px, + // 10: 10px, + // 20: 20px, + // 30: 30px, + 40: 40px, + // 50: 50px, + // 60: 60px, + // 70: 70px, + 80: 80px, + // 90: 90px, + // 100: 100px, + // 110: 110px, + 120: 120px, + // 130: 130px, + 160: 160px, + 200: 200px, + 240: 240px, + 260: 260px, + 300: 300px +); + +@each $name, $value in $lenghts { + .height-#{$name}px { + height: $value; + } + .width-#{$name}px { + width: $value; + } +} + +.h-100 { + height: 100%; +} +.height-100 { + height: 100%; +} +.width-100 { + width: 100%; +} +.min-w-600 { + min-width: 600px !important; +} + +// View height classes +.height-100vh { + height: 100vh; +} +.height-100vh-70px { + height: calc(100vh - 70px); +} +.height-100vh-80px { + height: calc(100vh - 80px); +} +.height-100vh-280px { + height: calc(100vh - 280px); +} + +.small-circle { + display: flex; + justify-content: center; + align-items: center; + height: 16px !important; + width: 16px !important; + border-radius: 50%; +} diff --git a/src/assets/styles/scss/utilities/_others.scss b/src/assets/styles/scss/utilities/_others.scss new file mode 100644 index 0000000..07caf99 --- /dev/null +++ b/src/assets/styles/scss/utilities/_others.scss @@ -0,0 +1,10 @@ +// BACKGROUND SIZES +.background-size-cover { + background-size: cover; +} +.background-size-contain { + background-size: contain; +} +.background-size-100 { + background-size: 100%; +} diff --git a/src/assets/styles/scss/utilities/_spacing.scss b/src/assets/styles/scss/utilities/_spacing.scss new file mode 100644 index 0000000..a427c67 --- /dev/null +++ b/src/assets/styles/scss/utilities/_spacing.scss @@ -0,0 +1,258 @@ +$spaces: ( + 0: 0px, + 4: 4px, + 8: 8px, + 12: 12px, + 16: 16px, + 20: 20px, + 24: 24px, + 28: 28px, + 32: 32px, + 36: 36px, + 40: 40px, + 44: 44px, + 48: 48px, + 96: 96px +); + +@each $name, $value in $spaces { + .m-#{$name} { + margin: $value !important; + } + .mt-#{$name} { + margin-top: $value !important; + } + .mr-#{$name} { + margin-right: $value !important; + } + .mb-#{$name} { + margin-bottom: $value !important; + } + .ml-#{$name} { + margin-left: $value !important; + } + .mx-#{$name} { + margin-left: $value !important; + margin-right: $value !important; + } + .my-#{$name} { + margin-top: $value !important; + margin-bottom: $value !important; + } + + .p-#{$name} { + padding: $value !important; + } + .pt-#{$name} { + padding-top: $value !important; + } + .pr-#{$name} { + padding-right: $value !important; + } + .pb-#{$name} { + padding-bottom: $value !important; + } + .pl-#{$name} { + padding-left: $value !important; + } + .px-#{$name} { + padding-left: $value !important; + padding-right: $value !important; + } + .py-#{$name} { + padding-top: $value !important; + padding-bottom: $value !important; + } +} + +.m-auto { + margin: auto !important; +} +.mx-auto { + margin-left: auto !important; + margin-right: auto !important; +} +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +// Old Spacing classes + +.m-1 { + margin: 1rem !important; +} +.mt-1 { + margin-top: 1rem !important; +} +.mt-05 { + margin-top: 0.5rem !important; +} +.mt-0 { + margin-top: 0 !important; +} +.mr-1 { + margin-right: 1rem !important; +} +.mr-05 { + margin-right: 0.5rem !important; +} +.mr-0 { + margin-right: 0 !important; +} +.mb-1 { + margin-bottom: 1rem !important; +} +.mb-0 { + margin-bottom: 0 !important; +} +.mb-05 { + margin-bottom: 0.5rem !important; +} +.ml-1 { + margin-left: 1rem !important; +} +.ml-05 { + margin-left: 0.5rem !important; +} +.ml-0 { + margin-left: 0 !important; +} + +.m-033 { + margin: 0.333333rem !important; +} + +.pt-1 { + padding-top: 1rem !important; +} +.pt-0 { + padding-top: 0 !important; +} +.pt-05 { + padding-top: 0.5rem !important; +} +.pr-1 { + padding-right: 1rem !important; +} +.pr-0 { + padding-right: 0 !important; +} +.pr-05 { + padding-right: 0.5rem !important; +} +.pb-1 { + padding-bottom: 1rem !important; +} +.pb-0 { + padding-bottom: 0 !important; +} +.pb-05 { + padding-bottom: 0.5rem !important; +} +.pl-1 { + padding-left: 1rem !important; +} +.pl-0 { + padding-left: 0 !important; +} +.pl-05 { + padding-left: 0.5rem !important; +} +.p-0 { + padding: 0 !important; +} +.p-1 { + padding: 1rem !important; +} +.p-05 { + padding: 0.5rem !important; +} + +[dir="rtl"] { + .pr-1 { + padding-left: 1rem; + padding-right: 0 !important; + } + .mr-1 { + margin-right: 0 !important; + margin-left: 1rem; + } +} + +// negative margin classes +.mx--033 { + margin-left: -0.333333rem !important; + margin-right: -0.333333rem !important; +} +.mt--033 { + margin-top: -0.333333rem !important; +} +.mt--72 { + margin-top: -72px !important; +} + +.px-80 { + padding-right: 80px; + padding-left: 80px; + @media screen and (max-width: 460px) { + padding-right: 16px; + padding-left: 16px; + } +} + +.px-sm-30 { + padding: 0px 30px; + @include media(767px) { + padding: 0px 16px; + } +} +.p-sm-24 { + padding: 24px !important; + @include media(767px) { + padding: 16px !important; + } +} +.px-sm-24 { + padding: 0px 24px !important; + @include media(767px) { + padding: 0px 16px !important; + } +} +.pt-sm-24 { + padding-top: 24px !important; + @include media(767px) { + padding-top: 16px !important; + } +} +.pl-sm-24 { + padding-left: 24px !important; + @include media(767px) { + padding: 12px !important; + } +} + +.m-auto { + margin: auto !important; +} +.mx-auto { + margin-left: auto !important; + margin-right: auto !important; +} +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +.m-sm-30 { + margin: 30px; + @include media(767px) { + margin: 16px; + } +} +.mb-sm-30 { + margin-bottom: 30px; + @include media(767px) { + margin-bottom: 16px; + } +} diff --git a/src/assets/styles/scss/utilities/_utilities.scss b/src/assets/styles/scss/utilities/_utilities.scss new file mode 100644 index 0000000..1ab79af --- /dev/null +++ b/src/assets/styles/scss/utilities/_utilities.scss @@ -0,0 +1,7 @@ +@import "avatar"; +// @import "border"; +@import "height-width"; +@import "spacing"; +@import "others"; +@import "display"; +@import "alignment"; diff --git a/src/assets/styles/scss/views/_views.scss b/src/assets/styles/scss/views/_views.scss new file mode 100644 index 0000000..3832317 --- /dev/null +++ b/src/assets/styles/scss/views/_views.scss @@ -0,0 +1 @@ +@import "sessions/sessions"; diff --git a/src/assets/styles/scss/views/sessions/_sessions.scss b/src/assets/styles/scss/views/sessions/_sessions.scss new file mode 100644 index 0000000..395a3d0 --- /dev/null +++ b/src/assets/styles/scss/views/sessions/_sessions.scss @@ -0,0 +1,40 @@ +@import "signup"; + +// COMMON CSS +/*---- Session (Sign in, sign up, forgot, lockscreen) -----*/ +.page-wrap { + display: flex; + align-items: center; + padding: 40px 1rem; + height: 100%; +} +.session-progress { + position: relative; + bottom: -4px; + z-index: 9999; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.session-form-hold { + width: 100%; + max-width: 400px; + margin: 0 auto; +} +.session-form-hold > .mat-card { + margin: 0; +} +.session-lockscreen { + max-width: 320px; +} +.lockscreen-user { + text-align: center; + margin-bottom: 1rem; + display: flow-root; + overflow: hidden; +} +.lockscreen-face { + max-width: 72px; + max-height: 72px; + border-radius: 50%; + margin-bottom: .5rem; +} \ No newline at end of file diff --git a/src/assets/styles/scss/views/sessions/_signup.scss b/src/assets/styles/scss/views/sessions/_signup.scss new file mode 100644 index 0000000..d119a00 --- /dev/null +++ b/src/assets/styles/scss/views/sessions/_signup.scss @@ -0,0 +1,43 @@ +.signup4-wrap { + background: url('../../../../images/backgrounds/waterfall.jpg'); +} +.signup4-container { + border-radius: 12px; + position: relative; + overflow: hidden; +} + +.signup4-header { + position: relative; + color: white; + padding: 35px; + + & > div { + z-index: 2; + } +} + +.signup4-header::before{ + // background-color: rgba(3, 143, 222, 0.7); + content: ''; + top: 0; + left: 0; + display: block; + height: 100%; + position: absolute; + width: 100%; + } + +.signup4-small-image { + height: 24px; +} +.signup4-form { + padding: 35px; +} + +.signup4-button { + text-align: center; + .mat-raised-button { + border-radius: 18px; + } +} \ No newline at end of file diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..ae31aa0 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,10 @@ +export const config = { + apiUrl: '', + authRoles: { + sa: ['SA'], // Only Super Admin has access + admin: ['SA', 'Admin'], // Only SA & Admin has access + editor: ['SA', 'Admin', 'Editor'], // Only SA & Admin & Editor has access + user: ['SA', 'Admin', 'Editor', 'User'], // Only SA & Admin & Editor & User has access + guest: ['SA', 'Admin', 'Editor', 'User', 'Guest'] // Everyone has access + } +}; diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts new file mode 100644 index 0000000..3612073 --- /dev/null +++ b/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/src/environments/environment.ts b/src/environments/environment.ts new file mode 100644 index 0000000..b7f639a --- /dev/null +++ b/src/environments/environment.ts @@ -0,0 +1,8 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +export const environment = { + production: false +}; diff --git a/src/favicon.ico b/src/favicon.ico new file mode 100644 index 0000000..8081c7c Binary files /dev/null and b/src/favicon.ico differ diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..91bbd81 --- /dev/null +++ b/src/index.html @@ -0,0 +1,22 @@ + + + + + + + NgRx - The Complete Guide + + + + + + + + + + + + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..f1344be --- /dev/null +++ b/src/main.ts @@ -0,0 +1,14 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + + + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.log(err)); diff --git a/src/polyfills.ts b/src/polyfills.ts new file mode 100644 index 0000000..bff14bc --- /dev/null +++ b/src/polyfills.ts @@ -0,0 +1,76 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE9, IE10 and IE11 requires all of the following polyfills. **/ +// import 'core-js/es6/symbol'; +// import 'core-js/es6/object'; +// import 'core-js/es6/function'; +// import 'core-js/es6/parse-int'; +// import 'core-js/es6/parse-float'; +// import 'core-js/es6/number'; +// import 'core-js/es6/math'; +// import 'core-js/es6/string'; +// import 'core-js/es6/date'; +// import 'core-js/es6/array'; +// import 'core-js/es6/regexp'; +// import 'core-js/es6/map'; +// import 'core-js/es6/weak-map'; +// import 'core-js/es6/set'; + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** IE10 and IE11 requires the following for the Reflect API. */ +// import 'core-js/es6/reflect'; + + +/** Evergreen browsers require these. **/ +// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove. + + + +/** + * Required to support Web Animations `@angular/platform-browser/animations`. + * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation + **/ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + + + +/*************************************************************************************************** + * Zone JS is required by Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ + +/** + * Date, currency, decimal and percent pipes. + * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 + */ +// import 'intl'; // Run `npm install --save intl`. +/** + * Need to import at least one locale-data with intl. + */ +// import 'intl/locale-data/jsonp/en'; diff --git a/src/styles.scss b/src/styles.scss new file mode 100644 index 0000000..045fcab --- /dev/null +++ b/src/styles.scss @@ -0,0 +1,64 @@ +/* You can add global styles to this file, and also import other style files */ + + + +@import "~@angular/material/theming"; + +// Include non-theme styles for core. +@include mat-core(); + +$mat-custom-theme: ( + 50: #fff3e0, + 100: #ffe0b2, + 200: #ffcc80, + 300: #ffb74d, + 400: #ffa726, + 500: rgba(255, 152, 0, 0.8), + 600: #fb8c00, + 700: #f57c00, + 800: #ef6c00, + 900: #e65100, + A100: #ffd180, + A200: #ffab40, + A400: #ff9100, + A700: #ff6d00, + contrast: ( + 50: $dark-primary-text, + 100: $dark-primary-text, + 200: $dark-primary-text, + 300: $dark-primary-text, + 400: $dark-primary-text, + 500: $light-primary-text, + 600: $light-primary-text, + 700: $light-primary-text, + 800: $light-primary-text, + 900: $light-primary-text, + A100: $dark-primary-text, + A200: $light-primary-text, + A400: $light-primary-text, + A700: $light-primary-text + ) +); + + +// Define a theme. +$primary: mat-palette($mat-custom-theme); +$accent: mat-palette($mat-pink, A200, A100, A400); + +$theme: mat-light-theme($primary, $accent); + +// Include all theme styles for the components. +@include angular-material-theme($theme); + + +.spinner-container { + position: fixed; + height: 300px; + width: 345px; + display: flex; + background: white; + margin-top: 70px; + z-index: 1; + opacity: 0.5; + justify-content: center; +} diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 0000000..cd612ee --- /dev/null +++ b/src/test.ts @@ -0,0 +1,32 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/long-stack-trace-zone'; +import 'zone.js/dist/proxy.js'; +import 'zone.js/dist/sync-test'; +import 'zone.js/dist/jasmine-patch'; +import 'zone.js/dist/async-test'; +import 'zone.js/dist/fake-async-test'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. +declare const __karma__: any; +declare const require: any; + +// Prevent Karma from running prematurely. +__karma__.loaded = function () {}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); +// Finally, start Karma to run the tests. +__karma__.start(); diff --git a/src/tsconfig.app.json b/src/tsconfig.app.json new file mode 100644 index 0000000..1d5af50 --- /dev/null +++ b/src/tsconfig.app.json @@ -0,0 +1,15 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "baseUrl": "./", + "types": [] + }, + "files": [ + "main.ts", + "polyfills.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json new file mode 100644 index 0000000..b019e30 --- /dev/null +++ b/src/tsconfig.spec.json @@ -0,0 +1,19 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "baseUrl": "./", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts", + "polyfills.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/src/typings.d.ts b/src/typings.d.ts new file mode 100644 index 0000000..ef5c7bd --- /dev/null +++ b/src/typings.d.ts @@ -0,0 +1,5 @@ +/* SystemJS module definition */ +declare var module: NodeModule; +interface NodeModule { + id: string; +} diff --git a/src/vendor/Chart.min.js b/src/vendor/Chart.min.js new file mode 100644 index 0000000..0bdd5e5 --- /dev/null +++ b/src/vendor/Chart.min.js @@ -0,0 +1,14 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 2.1.6 + * + * Copyright 2016 Nick Downie + * Released under the MIT license + * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Chart=t()}}(function(){return function t(e,a,i){function n(r,l){if(!a[r]){if(!e[r]){var s="function"==typeof require&&require;if(!l&&s)return s(r,!0);if(o)return o(r,!0);var d=new Error("Cannot find module '"+r+"'");throw d.code="MODULE_NOT_FOUND",d}var u=a[r]={exports:{}};e[r][0].call(u.exports,function(t){var a=e[r][1][t];return n(a?a:t)},u,u.exports,t,e,a,i)}return a[r].exports}for(var o="function"==typeof require&&require,r=0;re||t[3]&&t[3]<1?c(t,e):"rgb("+t[0]+", "+t[1]+", "+t[2]+")"}function c(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function h(t,e){if(1>e||t[3]&&t[3]<1)return f(t,e);var a=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),n=Math.round(t[2]/255*100);return"rgb("+a+"%, "+i+"%, "+n+"%)"}function f(t,e){var a=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),n=Math.round(t[2]/255*100);return"rgba("+a+"%, "+i+"%, "+n+"%, "+(e||t[3]||1)+")"}function g(t,e){return 1>e||t[3]&&t[3]<1?p(t,e):"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"}function p(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function m(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"}function b(t){return k[t.slice(0,3)]}function v(t,e,a){return Math.min(Math.max(e,t),a)}function x(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var y=t(6);e.exports={getRgba:i,getHsla:n,getRgb:r,getHsl:l,getHwb:o,getAlpha:s,hexString:d,rgbString:u,rgbaString:c,percentString:h,percentaString:f,hslString:g,hslaString:p,hwbString:m,keyword:b};var k={};for(var S in y)k[y[S]]=S},{6:6}],3:[function(t,e,a){var i=t(5),n=t(2),o=function(t){if(t instanceof o)return t;if(!(this instanceof o))return new o(t);this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1};var e;if("string"==typeof t)if(e=n.getRgba(t))this.setValues("rgb",e);else if(e=n.getHsla(t))this.setValues("hsl",e);else{if(!(e=n.getHwb(t)))throw new Error('Unable to parse color from string "'+t+'"');this.setValues("hwb",e)}else if("object"==typeof t)if(e=t,void 0!==e.r||void 0!==e.red)this.setValues("rgb",e);else if(void 0!==e.l||void 0!==e.lightness)this.setValues("hsl",e);else if(void 0!==e.v||void 0!==e.value)this.setValues("hsv",e);else if(void 0!==e.w||void 0!==e.whiteness)this.setValues("hwb",e);else{if(void 0===e.c&&void 0===e.cyan)throw new Error("Unable to parse color from object "+JSON.stringify(t));this.setValues("cmyk",e)}};o.prototype={rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t%=360,t=0>t?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return n.hexString(this.values.rgb)},rgbString:function(){return n.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return n.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return n.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return n.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return n.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return n.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return n.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],a=0;a=i?i/12.92:Math.pow((i+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),a=t.luminosity();return e>a?(e+.05)/(a+.05):(a+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb,e=(299*t[0]+587*t[1]+114*t[2])/1e3;return 128>e},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;3>e;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,a=(e[0]+t)%360;return e[0]=0>a?360+a:a,this.setValues("hsl",e),this},mix:function(t,e){var a=this,i=t,n=void 0===e?.5:e,o=2*n-1,r=a.alpha()-i.alpha(),l=((o*r===-1?o:(o+r)/(1+o*r))+1)/2,s=1-l;return this.rgb(l*a.red()+s*i.red(),l*a.green()+s*i.green(),l*a.blue()+s*i.blue()).alpha(a.alpha()*n+i.alpha()*(1-n))},toJSON:function(){return this.rgb()},clone:function(){var t,e,a=new o,i=this.values,n=a.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],e={}.toString.call(t),"[object Array]"===e?n[r]=t.slice(0):"[object Number]"===e?n[r]=t:console.error("unexpected color value:",t));return a}},o.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},o.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},o.prototype.getValues=function(t){for(var e=this.values,a={},i=0;ie&&(e+=360),i=(l+s)/2,a=s==l?0:.5>=i?d/(s+l):d/(2-s-l),[e,100*a,100*i]}function n(t){var e,a,i,n=t[0],o=t[1],r=t[2],l=Math.min(n,o,r),s=Math.max(n,o,r),d=s-l;return a=0==s?0:d/s*1e3/10,s==l?e=0:n==s?e=(o-r)/d:o==s?e=2+(r-n)/d:r==s&&(e=4+(n-o)/d),e=Math.min(60*e,360),0>e&&(e+=360),i=s/255*1e3/10,[e,a,i]}function o(t){var e=t[0],a=t[1],n=t[2],o=i(t)[0],r=1/255*Math.min(e,Math.min(a,n)),n=1-1/255*Math.max(e,Math.max(a,n));return[o,100*r,100*n]}function l(t){var e,a,i,n,o=t[0]/255,r=t[1]/255,l=t[2]/255;return n=Math.min(1-o,1-r,1-l),e=(1-o-n)/(1-n)||0,a=(1-r-n)/(1-n)||0,i=(1-l-n)/(1-n)||0,[100*e,100*a,100*i,100*n]}function s(t){return Q[JSON.stringify(t)]}function d(t){var e=t[0]/255,a=t[1]/255,i=t[2]/255;e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92,a=a>.04045?Math.pow((a+.055)/1.055,2.4):a/12.92,i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92;var n=.4124*e+.3576*a+.1805*i,o=.2126*e+.7152*a+.0722*i,r=.0193*e+.1192*a+.9505*i;return[100*n,100*o,100*r]}function u(t){var e,a,i,n=d(t),o=n[0],r=n[1],l=n[2];return o/=95.047,r/=100,l/=108.883,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,l=l>.008856?Math.pow(l,1/3):7.787*l+16/116,e=116*r-16,a=500*(o-r),i=200*(r-l),[e,a,i]}function c(t){return W(u(t))}function h(t){var e,a,i,n,o,r=t[0]/360,l=t[1]/100,s=t[2]/100;if(0==l)return o=255*s,[o,o,o];a=.5>s?s*(1+l):s+l-s*l,e=2*s-a,n=[0,0,0];for(var d=0;3>d;d++)i=r+1/3*-(d-1),0>i&&i++,i>1&&i--,o=1>6*i?e+6*(a-e)*i:1>2*i?a:2>3*i?e+(a-e)*(2/3-i)*6:e,n[d]=255*o;return n}function f(t){var e,a,i=t[0],n=t[1]/100,o=t[2]/100;return 0===o?[0,0,0]:(o*=2,n*=1>=o?o:2-o,a=(o+n)/2,e=2*n/(o+n),[i,100*e,100*a])}function p(t){return o(h(t))}function m(t){return l(h(t))}function v(t){return s(h(t))}function x(t){var e=t[0]/60,a=t[1]/100,i=t[2]/100,n=Math.floor(e)%6,o=e-Math.floor(e),r=255*i*(1-a),l=255*i*(1-a*o),s=255*i*(1-a*(1-o)),i=255*i;switch(n){case 0:return[i,s,r];case 1:return[l,i,r];case 2:return[r,i,s];case 3:return[r,l,i];case 4:return[s,r,i];case 5:return[i,r,l]}}function y(t){var e,a,i=t[0],n=t[1]/100,o=t[2]/100;return a=(2-n)*o,e=n*o,e/=1>=a?a:2-a,e=e||0,a/=2,[i,100*e,100*a]}function k(t){return o(x(t))}function S(t){return l(x(t))}function w(t){return s(x(t))}function C(t){var e,a,i,n,o=t[0]/360,l=t[1]/100,s=t[2]/100,d=l+s;switch(d>1&&(l/=d,s/=d),e=Math.floor(6*o),a=1-s,i=6*o-e,0!=(1&e)&&(i=1-i),n=l+i*(a-l),e){default:case 6:case 0:r=a,g=n,b=l;break;case 1:r=n,g=a,b=l;break;case 2:r=l,g=a,b=n;break;case 3:r=l,g=n,b=a;break;case 4:r=n,g=l,b=a;break;case 5:r=a,g=l,b=n}return[255*r,255*g,255*b]}function M(t){return i(C(t))}function D(t){return n(C(t))}function A(t){return l(C(t))}function I(t){return s(C(t))}function F(t){var e,a,i,n=t[0]/100,o=t[1]/100,r=t[2]/100,l=t[3]/100;return e=1-Math.min(1,n*(1-l)+l),a=1-Math.min(1,o*(1-l)+l),i=1-Math.min(1,r*(1-l)+l),[255*e,255*a,255*i]}function T(t){return i(F(t))}function P(t){return n(F(t))}function _(t){return o(F(t))}function R(t){return s(F(t))}function V(t){var e,a,i,n=t[0]/100,o=t[1]/100,r=t[2]/100;return e=3.2406*n+-1.5372*o+r*-.4986,a=n*-.9689+1.8758*o+.0415*r,i=.0557*n+o*-.204+1.057*r,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e=12.92*e,a=a>.0031308?1.055*Math.pow(a,1/2.4)-.055:a=12.92*a,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i=12.92*i,e=Math.min(Math.max(0,e),1),a=Math.min(Math.max(0,a),1),i=Math.min(Math.max(0,i),1),[255*e,255*a,255*i]}function O(t){var e,a,i,n=t[0],o=t[1],r=t[2];return n/=95.047,o/=100,r/=108.883,n=n>.008856?Math.pow(n,1/3):7.787*n+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,e=116*o-16,a=500*(n-o),i=200*(o-r),[e,a,i]}function L(t){return W(O(t))}function B(t){var e,a,i,n,o=t[0],r=t[1],l=t[2];return 8>=o?(a=100*o/903.3,n=7.787*(a/100)+16/116):(a=100*Math.pow((o+16)/116,3),n=Math.pow(a/100,1/3)),e=.008856>=e/95.047?e=95.047*(r/500+n-16/116)/7.787:95.047*Math.pow(r/500+n,3),i=.008859>=i/108.883?i=108.883*(n-l/200-16/116)/7.787:108.883*Math.pow(n-l/200,3),[e,a,i]}function W(t){var e,a,i,n=t[0],o=t[1],r=t[2];return e=Math.atan2(r,o),a=360*e/2/Math.PI,0>a&&(a+=360),i=Math.sqrt(o*o+r*r),[n,i,a]}function z(t){return V(B(t))}function H(t){var e,a,i,n=t[0],o=t[1],r=t[2];return i=r/360*2*Math.PI,e=o*Math.cos(i),a=o*Math.sin(i),[n,e,a]}function N(t){return B(H(t))}function E(t){return z(H(t))}function U(t){return G[t]}function q(t){return i(U(t))}function j(t){return n(U(t))}function Y(t){return o(U(t))}function J(t){return l(U(t))}function X(t){return u(U(t))}function Z(t){return d(U(t))}e.exports={rgb2hsl:i,rgb2hsv:n,rgb2hwb:o,rgb2cmyk:l,rgb2keyword:s,rgb2xyz:d,rgb2lab:u,rgb2lch:c,hsl2rgb:h,hsl2hsv:f,hsl2hwb:p,hsl2cmyk:m,hsl2keyword:v,hsv2rgb:x,hsv2hsl:y,hsv2hwb:k,hsv2cmyk:S,hsv2keyword:w,hwb2rgb:C,hwb2hsl:M,hwb2hsv:D,hwb2cmyk:A,hwb2keyword:I,cmyk2rgb:F,cmyk2hsl:T,cmyk2hsv:P,cmyk2hwb:_,cmyk2keyword:R,keyword2rgb:U,keyword2hsl:q,keyword2hsv:j,keyword2hwb:Y,keyword2cmyk:J,keyword2lab:X,keyword2xyz:Z,xyz2rgb:V,xyz2lab:O,xyz2lch:L,lab2xyz:B,lab2rgb:z,lab2lch:W,lch2lab:H,lch2xyz:N,lch2rgb:E};var G={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Q={};for(var $ in G)Q[JSON.stringify(G[$])]=$},{}],5:[function(t,e,a){var i=t(4),n=function(){return new d};for(var o in i){n[o+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(o);var r=/(\w+)2(\w+)/.exec(o),l=r[1],s=r[2];n[l]=n[l]||{},n[l][s]=n[o]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var a=i[t](e);if("string"==typeof a||void 0===a)return a;for(var n=0;ns)for(var d=0;t>d;d++){var u=l[d],c=r.getDatasetMeta(d);c.bar&&c.yAxisID===n.id&&r.isDatasetVisible(d)&&(o+=u.data[e]<0?u.data[e]:0)}else for(var h=0;t>h;h++){var f=l[h],g=r.getDatasetMeta(h);g.bar&&g.yAxisID===n.id&&r.isDatasetVisible(h)&&(o+=f.data[e]>0?f.data[e]:0)}return n.getPixelForValue(o)}return n.getBasePixel()},getRuler:function(t){var e,a=this,i=a.getMeta(),n=a.getScaleForId(i.xAxisID),o=a.getBarCount();e="category"===n.options.type?n.getPixelForTick(t+1)-n.getPixelForTick(t):n.width/n.ticks.length;var r=e*n.options.categoryPercentage,l=(e-e*n.options.categoryPercentage)/2,s=r/o;if(n.ticks.length!==a.chart.data.labels.length){var d=n.ticks.length/a.chart.data.labels.length;s*=d}var u=s*n.options.barPercentage,c=s-s*n.options.barPercentage;return{datasetCount:o,tickWidth:e,categoryWidth:r,categorySpacing:l,fullBarWidth:s,barWidth:u,barSpacing:c}},calculateBarWidth:function(t){var e=this.getScaleForId(this.getMeta().xAxisID),a=this.getRuler(t);return e.options.stacked?a.categoryWidth:a.barWidth},getBarIndex:function(t){var e,a,i=0;for(a=0;t>a;++a)e=this.chart.getDatasetMeta(a),e.bar&&this.chart.isDatasetVisible(a)&&++i;return i},calculateBarX:function(t,e){var a=this,i=a.getMeta(),n=a.getScaleForId(i.xAxisID),o=a.getBarIndex(e),r=a.getRuler(t),l=n.getPixelForValue(null,t,e,a.chart.isCombo);return l-=a.chart.isCombo?r.tickWidth/2:0,n.options.stacked?l+r.categoryWidth/2+r.categorySpacing:l+r.barWidth/2+r.categorySpacing+r.barWidth*o+r.barSpacing/2+r.barSpacing*o},calculateBarY:function(t,e){var a=this,i=a.getMeta(),n=a.getScaleForId(i.yAxisID),o=a.getDataset().data[t];if(n.options.stacked){for(var r=0,l=0,s=0;e>s;s++){var d=a.chart.data.datasets[s],u=a.chart.getDatasetMeta(s);u.bar&&u.yAxisID===n.id&&a.chart.isDatasetVisible(s)&&(d.data[t]<0?l+=d.data[t]||0:r+=d.data[t]||0)}return 0>o?n.getPixelForValue(l+o):n.getPixelForValue(r+o)}return n.getPixelForValue(o)},draw:function(t){var a=this,i=t||1;e.each(a.getMeta().data,function(t,e){var n=a.getDataset().data[e];null===n||void 0===n||isNaN(n)||t.transition(i).draw()},a)},setHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},o=t._model;o.backgroundColor=n.hoverBackgroundColor?n.hoverBackgroundColor:e.getValueAtIndexOrDefault(a.hoverBackgroundColor,i,e.getHoverColor(o.backgroundColor)),o.borderColor=n.hoverBorderColor?n.hoverBorderColor:e.getValueAtIndexOrDefault(a.hoverBorderColor,i,e.getHoverColor(o.borderColor)),o.borderWidth=n.hoverBorderWidth?n.hoverBorderWidth:e.getValueAtIndexOrDefault(a.hoverBorderWidth,i,o.borderWidth)},removeHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},o=t._model,r=this.chart.options.elements.rectangle;o.backgroundColor=n.backgroundColor?n.backgroundColor:e.getValueAtIndexOrDefault(a.backgroundColor,i,r.backgroundColor),o.borderColor=n.borderColor?n.borderColor:e.getValueAtIndexOrDefault(a.borderColor,i,r.borderColor),o.borderWidth=n.borderWidth?n.borderWidth:e.getValueAtIndexOrDefault(a.borderWidth,i,r.borderWidth)}}),t.defaults.horizontalBar={hover:{mode:"label"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{position:"left",type:"category",categoryPercentage:.8,barPercentage:.9,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{callbacks:{title:function(t,e){var a="";return t.length>0&&(t[0].yLabel?a=t[0].yLabel:e.labels.length>0&&t[0].indexc;c++)e.lineTo.apply(e,t(c));e.fill(),a.borderWidth&&e.stroke()},inRange:function(t,e){var a=this._view,i=!1;return a&&(i=a.x=a.y-a.height/2&&e<=a.y+a.height/2&&t>=a.x&&t<=a.base:e>=a.y-a.height/2&&e<=a.y+a.height/2&&t>=a.base&&t<=a.x),i}}),t.pivot()},calculateBarBase:function(t,e){ +var a=this,i=a.getMeta(),n=a.getScaleForId(i.xAxisID),o=0;if(n.options.stacked){var r=a.chart.data.datasets[t].data[e];if(0>r)for(var l=0;t>l;l++){var s=a.chart.data.datasets[l],d=a.chart.getDatasetMeta(l);d.bar&&d.xAxisID===n.id&&a.chart.isDatasetVisible(l)&&(o+=s.data[e]<0?s.data[e]:0)}else for(var u=0;t>u;u++){var c=a.chart.data.datasets[u],h=a.chart.getDatasetMeta(u);h.bar&&h.xAxisID===n.id&&a.chart.isDatasetVisible(u)&&(o+=c.data[e]>0?c.data[e]:0)}return n.getPixelForValue(o)}return n.getBasePixel()},getRuler:function(t){var e,a=this,i=a.getMeta(),n=a.getScaleForId(i.yAxisID),o=a.getBarCount();e="category"===n.options.type?n.getPixelForTick(t+1)-n.getPixelForTick(t):n.width/n.ticks.length;var r=e*n.options.categoryPercentage,l=(e-e*n.options.categoryPercentage)/2,s=r/o;if(n.ticks.length!==a.chart.data.labels.length){var d=n.ticks.length/a.chart.data.labels.length;s*=d}var u=s*n.options.barPercentage,c=s-s*n.options.barPercentage;return{datasetCount:o,tickHeight:e,categoryHeight:r,categorySpacing:l,fullBarHeight:s,barHeight:u,barSpacing:c}},calculateBarHeight:function(t){var e=this,a=e.getScaleForId(e.getMeta().yAxisID),i=e.getRuler(t);return a.options.stacked?i.categoryHeight:i.barHeight},calculateBarX:function(t,e){var a=this,i=a.getMeta(),n=a.getScaleForId(i.xAxisID),o=a.getDataset().data[t];if(n.options.stacked){for(var r=0,l=0,s=0;e>s;s++){var d=a.chart.data.datasets[s],u=a.chart.getDatasetMeta(s);u.bar&&u.xAxisID===n.id&&a.chart.isDatasetVisible(s)&&(d.data[t]<0?l+=d.data[t]||0:r+=d.data[t]||0)}return 0>o?n.getPixelForValue(l+o):n.getPixelForValue(r+o)}return n.getPixelForValue(o)},calculateBarY:function(t,e){var a=this,i=a.getMeta(),n=a.getScaleForId(i.yAxisID),o=a.getBarIndex(e),r=a.getRuler(t),l=n.getPixelForValue(null,t,e,a.chart.isCombo);return l-=a.chart.isCombo?r.tickHeight/2:0,n.options.stacked?l+r.categoryHeight/2+r.categorySpacing:l+r.barHeight/2+r.categorySpacing+r.barHeight*o+r.barSpacing/2+r.barSpacing*o}})}},{}],16:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.bubble={hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(t,e){return""},label:function(t,e){var a=e.datasets[t.datasetIndex].label||"",i=e.datasets[t.datasetIndex].data[t.index];return a+": ("+i.x+", "+i.y+", "+i.r+")"}}}},t.controllers.bubble=t.DatasetController.extend({dataElementType:t.elements.Point,update:function(t){var a=this,i=a.getMeta(),n=i.data;e.each(n,function(e,i){a.updateElement(e,i,t)})},updateElement:function(a,i,n){var o=this,r=o.getMeta(),l=o.getScaleForId(r.xAxisID),s=o.getScaleForId(r.yAxisID),d=a.custom||{},u=o.getDataset(),c=u.data[i],h=o.chart.options.elements.point,f=o.index;e.extend(a,{_xScale:l,_yScale:s,_datasetIndex:f,_index:i,_model:{x:n?l.getPixelForDecimal(.5):l.getPixelForValue(c,i,f,o.chart.isCombo),y:n?s.getBasePixel():s.getPixelForValue(c,i,f),radius:n?0:d.radius?d.radius:o.getRadius(c),hitRadius:d.hitRadius?d.hitRadius:e.getValueAtIndexOrDefault(u.hitRadius,i,h.hitRadius)}}),t.DatasetController.prototype.removeHoverStyle.call(o,a,h);var g=a._model;g.skip=d.skip?d.skip:isNaN(g.x)||isNaN(g.y),a.pivot()},getRadius:function(t){return t.r||this.chart.options.elements.point.radius},setHoverStyle:function(a){var i=this;t.DatasetController.prototype.setHoverStyle.call(i,a);var n=i.chart.data.datasets[a._datasetIndex],o=a._index,r=a.custom||{},l=a._model;l.radius=r.hoverRadius?r.hoverRadius:e.getValueAtIndexOrDefault(n.hoverRadius,o,i.chart.options.elements.point.hoverRadius)+i.getRadius(n.data[o])},removeHoverStyle:function(e){var a=this;t.DatasetController.prototype.removeHoverStyle.call(a,e,a.chart.options.elements.point);var i=a.chart.data.datasets[e._datasetIndex].data[e._index],n=e.custom||{},o=e._model;o.radius=n.radius?n.radius:a.getRadius(i)}})}},{}],17:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=t.defaults;a.doughnut={animation:{animateRotate:!0,animateScale:!1},aspectRatio:1,hover:{mode:"single"},legendCallback:function(t){var e=[];e.push('
      ');var a=t.data,i=a.datasets,n=a.labels;if(i.length)for(var o=0;o'),n[o]&&e.push(n[o]),e.push("");return e.push("
    "),e.join("")},legend:{labels:{generateLabels:function(t){var a=t.data;return a.labels.length&&a.datasets.length?a.labels.map(function(i,n){var o=t.getDatasetMeta(0),r=a.datasets[0],l=o.data[n],s=l.custom||{},d=e.getValueAtIndexOrDefault,u=t.options.elements.arc,c=s.backgroundColor?s.backgroundColor:d(r.backgroundColor,n,u.backgroundColor),h=s.borderColor?s.borderColor:d(r.borderColor,n,u.borderColor),f=s.borderWidth?s.borderWidth:d(r.borderWidth,n,u.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(r.data[n])||o.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var a,i,n,o=e.index,r=this.chart;for(a=0,i=(r.data.datasets||[]).length;i>a;++a)n=r.getDatasetMeta(a),n.data[o].hidden=!n.data[o].hidden;r.update()}},cutoutPercentage:50,rotation:Math.PI*-.5,circumference:2*Math.PI,tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+e.datasets[t.datasetIndex].data[t.index]}}}},a.pie=e.clone(a.doughnut),e.extend(a.pie,{cutoutPercentage:0}),t.controllers.doughnut=t.controllers.pie=t.DatasetController.extend({dataElementType:t.elements.Arc,linkScales:e.noop,getRingIndex:function(t){for(var e=0,a=0;t>a;++a)this.chart.isDatasetVisible(a)&&++e;return e},update:function(t){var a=this,i=a.chart,n=i.chartArea,o=i.options,r=o.elements.arc,l=n.right-n.left-r.borderWidth,s=n.bottom-n.top-r.borderWidth,d=Math.min(l,s),u={x:0,y:0},c=a.getMeta(),h=o.cutoutPercentage,f=o.circumference;if(f<2*Math.PI){var g=o.rotation%(2*Math.PI);g+=2*Math.PI*(g>=Math.PI?-1:g<-Math.PI?1:0);var p=g+f,m={x:Math.cos(g),y:Math.sin(g)},b={x:Math.cos(p),y:Math.sin(p)},v=0>=g&&p>=0||g<=2*Math.PI&&2*Math.PI<=p,x=g<=.5*Math.PI&&.5*Math.PI<=p||g<=2.5*Math.PI&&2.5*Math.PI<=p,y=g<=-Math.PI&&-Math.PI<=p||g<=Math.PI&&Math.PI<=p,k=g<=.5*-Math.PI&&.5*-Math.PI<=p||g<=1.5*Math.PI&&1.5*Math.PI<=p,S=h/100,w={x:y?-1:Math.min(m.x*(m.x<0?1:S),b.x*(b.x<0?1:S)),y:k?-1:Math.min(m.y*(m.y<0?1:S),b.y*(b.y<0?1:S))},C={x:v?1:Math.max(m.x*(m.x>0?1:S),b.x*(b.x>0?1:S)),y:x?1:Math.max(m.y*(m.y>0?1:S),b.y*(b.y>0?1:S))},M={width:.5*(C.x-w.x),height:.5*(C.y-w.y)};d=Math.min(l/M.width,s/M.height),u={x:(C.x+w.x)*-.5,y:(C.y+w.y)*-.5}}i.outerRadius=Math.max(d/2,0),i.innerRadius=Math.max(h?i.outerRadius/100*h:1,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),i.offsetX=u.x*i.outerRadius,i.offsetY=u.y*i.outerRadius,c.total=a.calculateTotal(),a.outerRadius=i.outerRadius-i.radiusLength*a.getRingIndex(a.index),a.innerRadius=a.outerRadius-i.radiusLength,e.each(c.data,function(e,i){a.updateElement(e,i,t)})},updateElement:function(t,a,i){var n=this,o=n.chart,r=o.chartArea,l=o.options,s=l.animation,d=(l.elements.arc,(r.left+r.right)/2),u=(r.top+r.bottom)/2,c=l.rotation,h=l.rotation,f=n.getDataset(),g=i&&s.animateRotate?0:t.hidden?0:n.calculateCircumference(f.data[a])*(l.circumference/(2*Math.PI)),p=i&&s.animateScale?0:n.innerRadius,m=i&&s.animateScale?0:n.outerRadius,b=(t.custom||{},e.getValueAtIndexOrDefault);e.extend(t,{_datasetIndex:n.index,_index:a,_model:{x:d+o.offsetX,y:u+o.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:m,innerRadius:p,label:b(f.label,a,o.data.labels[a])}});var v=t._model;this.removeHoverStyle(t),i&&s.animateRotate||(0===a?v.startAngle=l.rotation:v.startAngle=n.getMeta().data[a-1]._model.endAngle,v.endAngle=v.startAngle+v.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,a=this.getDataset(),i=this.getMeta(),n=0;return e.each(i.data,function(e,i){t=a.data[i],isNaN(t)||e.hidden||(n+=Math.abs(t))}),n},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0}})}},{}],18:[function(t,e,a){"use strict";e.exports=function(t){function e(t,e){return a.getValueOrDefault(t.showLine,e.showLines)}var a=t.helpers;t.defaults.line={showLines:!0,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}},t.controllers.line=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,addElementAndReset:function(a){var i=this,n=i.chart.options,o=i.getMeta();t.DatasetController.prototype.addElementAndReset.call(i,a),e(i.getDataset(),n)&&0!==o.dataset._model.tension&&i.updateBezierControlPoints()},update:function(t){var i,n,o,r=this,l=r.getMeta(),s=l.dataset,d=l.data||[],u=r.chart.options,c=u.elements.line,h=r.getScaleForId(l.yAxisID),f=r.getDataset(),g=e(f,u);for(g&&(o=s.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),s._scale=h,s._datasetIndex=r.index,s._children=d,s._model={spanGaps:f.spanGaps?f.spanGaps:!1,tension:o.tension?o.tension:a.getValueOrDefault(f.lineTension,c.tension),backgroundColor:o.backgroundColor?o.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:o.borderWidth?o.borderWidth:f.borderWidth||c.borderWidth,borderColor:o.borderColor?o.borderColor:f.borderColor||c.borderColor,borderCapStyle:o.borderCapStyle?o.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:o.borderDash?o.borderDash:f.borderDash||c.borderDash,borderDashOffset:o.borderDashOffset?o.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:o.borderJoinStyle?o.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:o.fill?o.fill:void 0!==f.fill?f.fill:c.fill,scaleTop:h.top,scaleBottom:h.bottom,scaleZero:h.getBasePixel()},s.pivot()),i=0,n=d.length;n>i;++i)r.updateElement(d[i],i,t);for(g&&0!==s._model.tension&&r.updateBezierControlPoints(),i=0,n=d.length;n>i;++i)d[i].pivot()},getPointBackgroundColor:function(t,e){var i=this.chart.options.elements.point.backgroundColor,n=this.getDataset(),o=t.custom||{};return o.backgroundColor?i=o.backgroundColor:n.pointBackgroundColor?i=a.getValueAtIndexOrDefault(n.pointBackgroundColor,e,i):n.backgroundColor&&(i=n.backgroundColor),i},getPointBorderColor:function(t,e){var i=this.chart.options.elements.point.borderColor,n=this.getDataset(),o=t.custom||{};return o.borderColor?i=o.borderColor:n.pointBorderColor?i=a.getValueAtIndexOrDefault(n.pointBorderColor,e,i):n.borderColor&&(i=n.borderColor),i},getPointBorderWidth:function(t,e){var i=this.chart.options.elements.point.borderWidth,n=this.getDataset(),o=t.custom||{};return o.borderWidth?i=o.borderWidth:n.pointBorderWidth?i=a.getValueAtIndexOrDefault(n.pointBorderWidth,e,i):n.borderWidth&&(i=n.borderWidth),i},updateElement:function(t,e,i){var n,o,r=this,l=r.getMeta(),s=t.custom||{},d=r.getDataset(),u=r.index,c=d.data[e],h=r.getScaleForId(l.yAxisID),f=r.getScaleForId(l.xAxisID),g=r.chart.options.elements.point;void 0!==d.radius&&void 0===d.pointRadius&&(d.pointRadius=d.radius),void 0!==d.hitRadius&&void 0===d.pointHitRadius&&(d.pointHitRadius=d.hitRadius),n=f.getPixelForValue(c,e,u,r.chart.isCombo),o=i?h.getBasePixel():r.calculatePointY(c,e,u,r.chart.isCombo),t._xScale=f,t._yScale=h,t._datasetIndex=u,t._index=e,t._model={x:n,y:o,skip:s.skip||isNaN(n)||isNaN(o),radius:s.radius||a.getValueAtIndexOrDefault(d.pointRadius,e,g.radius),pointStyle:s.pointStyle||a.getValueAtIndexOrDefault(d.pointStyle,e,g.pointStyle),backgroundColor:r.getPointBackgroundColor(t,e),borderColor:r.getPointBorderColor(t,e),borderWidth:r.getPointBorderWidth(t,e),tension:l.dataset._model?l.dataset._model.tension:0,hitRadius:s.hitRadius||a.getValueAtIndexOrDefault(d.pointHitRadius,e,g.hitRadius)}},calculatePointY:function(t,e,a,i){var n,o,r,l=this,s=l.chart,d=l.getMeta(),u=l.getScaleForId(d.yAxisID),c=0,h=0;if(u.options.stacked){for(n=0;a>n;n++)o=s.data.datasets[n],r=s.getDatasetMeta(n),"line"===r.type&&s.isDatasetVisible(n)&&(o.data[e]<0?h+=o.data[e]||0:c+=o.data[e]||0);return 0>t?u.getPixelForValue(h+t):u.getPixelForValue(c+t)}return u.getPixelForValue(t)},updateBezierControlPoints:function(){var t,e,i,n,o,r=this.getMeta(),l=(this.chart.chartArea,r.data||[]);for(t=0,e=l.length;e>t;++t)i=l[t],n=i._model,o=a.splineCurve(a.previousItem(l,t)._model,n,a.nextItem(l,t)._model,r.dataset._model.tension),n.controlPointPreviousX=o.previous.x,n.controlPointPreviousY=o.previous.y,n.controlPointNextX=o.next.x,n.controlPointNextY=o.next.y},draw:function(t){var a,i,n=this,o=n.getMeta(),r=o.data||[],l=t||1;for(a=0,i=r.length;i>a;++a)r[a].transition(l);for(e(n.getDataset(),n.chart.options)&&o.dataset.transition(l).draw(),a=0,i=r.length;i>a;++a)r[a].draw()},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},o=t._model;o.radius=n.hoverRadius||a.getValueAtIndexOrDefault(e.pointHoverRadius,i,this.chart.options.elements.point.hoverRadius),o.backgroundColor=n.hoverBackgroundColor||a.getValueAtIndexOrDefault(e.pointHoverBackgroundColor,i,a.getHoverColor(o.backgroundColor)),o.borderColor=n.hoverBorderColor||a.getValueAtIndexOrDefault(e.pointHoverBorderColor,i,a.getHoverColor(o.borderColor)),o.borderWidth=n.hoverBorderWidth||a.getValueAtIndexOrDefault(e.pointHoverBorderWidth,i,o.borderWidth)},removeHoverStyle:function(t){var e=this,i=e.chart.data.datasets[t._datasetIndex],n=t._index,o=t.custom||{},r=t._model;void 0!==i.radius&&void 0===i.pointRadius&&(i.pointRadius=i.radius),r.radius=o.radius||a.getValueAtIndexOrDefault(i.pointRadius,n,e.chart.options.elements.point.radius),r.backgroundColor=e.getPointBackgroundColor(t,n),r.borderColor=e.getPointBorderColor(t,n),r.borderWidth=e.getPointBorderWidth(t,n)}})}},{}],19:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.polarArea={scale:{type:"radialLinear",lineArc:!0},animation:{animateRotate:!0,animateScale:!0},aspectRatio:1,legendCallback:function(t){var e=[];e.push('
      ');var a=t.data,i=a.datasets,n=a.labels;if(i.length)for(var o=0;o'),n[o]&&e.push(n[o]),e.push("");return e.push("
    "),e.join("")},legend:{labels:{generateLabels:function(t){var a=t.data;return a.labels.length&&a.datasets.length?a.labels.map(function(i,n){var o=t.getDatasetMeta(0),r=a.datasets[0],l=o.data[n],s=l.custom||{},d=e.getValueAtIndexOrDefault,u=t.options.elements.arc,c=s.backgroundColor?s.backgroundColor:d(r.backgroundColor,n,u.backgroundColor),h=s.borderColor?s.borderColor:d(r.borderColor,n,u.borderColor),f=s.borderWidth?s.borderWidth:d(r.borderWidth,n,u.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(r.data[n])||o.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var a,i,n,o=e.index,r=this.chart;for(a=0,i=(r.data.datasets||[]).length;i>a;++a)n=r.getDatasetMeta(a),n.data[o].hidden=!n.data[o].hidden;r.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}},t.controllers.polarArea=t.DatasetController.extend({dataElementType:t.elements.Arc,linkScales:e.noop,update:function(t){var a=this,i=a.chart,n=i.chartArea,o=a.getMeta(),r=i.options,l=r.elements.arc,s=Math.min(n.right-n.left,n.bottom-n.top);i.outerRadius=Math.max((s-l.borderWidth/2)/2,0),i.innerRadius=Math.max(r.cutoutPercentage?i.outerRadius/100*r.cutoutPercentage:1,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),a.outerRadius=i.outerRadius-i.radiusLength*a.index,a.innerRadius=a.outerRadius-i.radiusLength,o.count=a.countVisibleElements(),e.each(o.data,function(e,i){a.updateElement(e,i,t)})},updateElement:function(t,a,i){for(var n=this,o=n.chart,r=o.chartArea,l=n.getDataset(),s=o.options,d=s.animation,u=(s.elements.arc,t.custom||{},o.scale),c=e.getValueAtIndexOrDefault,h=o.data.labels,f=n.calculateCircumference(l.data[a]),g=(r.left+r.right)/2,p=(r.top+r.bottom)/2,m=0,b=n.getMeta(),v=0;a>v;++v)isNaN(l.data[v])||b.data[v].hidden||++m;var x=-.5*Math.PI,y=t.hidden?0:u.getDistanceFromCenterForValue(l.data[a]),k=x+f*m,S=k+(t.hidden?0:f),w=d.animateScale?0:u.getDistanceFromCenterForValue(l.data[a]);e.extend(t,{_datasetIndex:n.index,_index:a,_scale:u,_model:{x:g,y:p,innerRadius:0,outerRadius:i?w:y,startAngle:i&&d.animateRotate?x:k,endAngle:i&&d.animateRotate?x:S,label:c(h,a,h[a])}}),n.removeHoverStyle(t),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},countVisibleElements:function(){var t=this.getDataset(),a=this.getMeta(),i=0;return e.each(a.data,function(e,a){isNaN(t.data[a])||e.hidden||i++}),i},calculateCircumference:function(t){var e=this.getMeta().count;return e>0&&!isNaN(t)?2*Math.PI/e:0}})}},{}],20:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.radar={scale:{type:"radialLinear"},elements:{line:{tension:0}}},t.controllers.radar=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,linkScales:e.noop,addElementAndReset:function(e){t.DatasetController.prototype.addElementAndReset.call(this,e),this.updateBezierControlPoints()},update:function(t){var a=this,i=a.getMeta(),n=i.dataset,o=i.data,r=n.custom||{},l=a.getDataset(),s=a.chart.options.elements.line,d=a.chart.scale;void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),e.extend(i.dataset,{_datasetIndex:a.index,_children:o,_loop:!0,_model:{tension:r.tension?r.tension:e.getValueOrDefault(l.lineTension,s.tension),backgroundColor:r.backgroundColor?r.backgroundColor:l.backgroundColor||s.backgroundColor,borderWidth:r.borderWidth?r.borderWidth:l.borderWidth||s.borderWidth,borderColor:r.borderColor?r.borderColor:l.borderColor||s.borderColor,fill:r.fill?r.fill:void 0!==l.fill?l.fill:s.fill,borderCapStyle:r.borderCapStyle?r.borderCapStyle:l.borderCapStyle||s.borderCapStyle,borderDash:r.borderDash?r.borderDash:l.borderDash||s.borderDash,borderDashOffset:r.borderDashOffset?r.borderDashOffset:l.borderDashOffset||s.borderDashOffset,borderJoinStyle:r.borderJoinStyle?r.borderJoinStyle:l.borderJoinStyle||s.borderJoinStyle,scaleTop:d.top,scaleBottom:d.bottom,scaleZero:d.getBasePosition()}}),i.dataset.pivot(),e.each(o,function(e,i){a.updateElement(e,i,t)},a),a.updateBezierControlPoints()},updateElement:function(t,a,i){var n=this,o=t.custom||{},r=n.getDataset(),l=n.chart.scale,s=n.chart.options.elements.point,d=l.getPointPositionForValue(a,r.data[a]);e.extend(t,{_datasetIndex:n.index,_index:a,_scale:l,_model:{x:i?l.xCenter:d.x,y:i?l.yCenter:d.y,tension:o.tension?o.tension:e.getValueOrDefault(r.tension,n.chart.options.elements.line.tension),radius:o.radius?o.radius:e.getValueAtIndexOrDefault(r.pointRadius,a,s.radius),backgroundColor:o.backgroundColor?o.backgroundColor:e.getValueAtIndexOrDefault(r.pointBackgroundColor,a,s.backgroundColor),borderColor:o.borderColor?o.borderColor:e.getValueAtIndexOrDefault(r.pointBorderColor,a,s.borderColor),borderWidth:o.borderWidth?o.borderWidth:e.getValueAtIndexOrDefault(r.pointBorderWidth,a,s.borderWidth),pointStyle:o.pointStyle?o.pointStyle:e.getValueAtIndexOrDefault(r.pointStyle,a,s.pointStyle),hitRadius:o.hitRadius?o.hitRadius:e.getValueAtIndexOrDefault(r.hitRadius,a,s.hitRadius)}}),t._model.skip=o.skip?o.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,a=this.getMeta();e.each(a.data,function(i,n){var o=i._model,r=e.splineCurve(e.previousItem(a.data,n,!0)._model,o,e.nextItem(a.data,n,!0)._model,o.tension);o.controlPointPreviousX=Math.max(Math.min(r.previous.x,t.right),t.left),o.controlPointPreviousY=Math.max(Math.min(r.previous.y,t.bottom),t.top),o.controlPointNextX=Math.max(Math.min(r.next.x,t.right),t.left),o.controlPointNextY=Math.max(Math.min(r.next.y,t.bottom),t.top),i.pivot()})},draw:function(t){var a=this.getMeta(),i=t||1;e.each(a.data,function(t,e){t.transition(i)}),a.dataset.transition(i).draw(),e.each(a.data,function(t){t.draw()})},setHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},n=t._index,o=t._model;o.radius=i.hoverRadius?i.hoverRadius:e.getValueAtIndexOrDefault(a.pointHoverRadius,n,this.chart.options.elements.point.hoverRadius),o.backgroundColor=i.hoverBackgroundColor?i.hoverBackgroundColor:e.getValueAtIndexOrDefault(a.pointHoverBackgroundColor,n,e.getHoverColor(o.backgroundColor)),o.borderColor=i.hoverBorderColor?i.hoverBorderColor:e.getValueAtIndexOrDefault(a.pointHoverBorderColor,n,e.getHoverColor(o.borderColor)),o.borderWidth=i.hoverBorderWidth?i.hoverBorderWidth:e.getValueAtIndexOrDefault(a.pointHoverBorderWidth,n,o.borderWidth)},removeHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},n=t._index,o=t._model,r=this.chart.options.elements.point;o.radius=i.radius?i.radius:e.getValueAtIndexOrDefault(a.radius,n,r.radius),o.backgroundColor=i.backgroundColor?i.backgroundColor:e.getValueAtIndexOrDefault(a.pointBackgroundColor,n,r.backgroundColor),o.borderColor=i.borderColor?i.borderColor:e.getValueAtIndexOrDefault(a.pointBorderColor,n,r.borderColor),o.borderWidth=i.borderWidth?i.borderWidth:e.getValueAtIndexOrDefault(a.pointBorderWidth,n,r.borderWidth)}})}},{}],21:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.animation={duration:1e3,easing:"easeOutQuart",onProgress:e.noop,onComplete:e.noop},t.Animation=t.Element.extend({currentStep:null,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,a,i){var n=this;i||(t.animating=!0);for(var o=0;o1&&(a=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1);for(var i=0;it.animations[i].animationObject.numSteps&&(t.animations[i].animationObject.currentStep=t.animations[i].animationObject.numSteps),t.animations[i].animationObject.render(t.animations[i].chartInstance,t.animations[i].animationObject),t.animations[i].animationObject.onAnimationProgress&&t.animations[i].animationObject.onAnimationProgress.call&&t.animations[i].animationObject.onAnimationProgress.call(t.animations[i].chartInstance,t.animations[i]),t.animations[i].animationObject.currentStep===t.animations[i].animationObject.numSteps?(t.animations[i].animationObject.onAnimationComplete&&t.animations[i].animationObject.onAnimationComplete.call&&t.animations[i].animationObject.onAnimationComplete.call(t.animations[i].chartInstance,t.animations[i]),t.animations[i].chartInstance.animating=!1,t.animations.splice(i,1)):++i;var n=Date.now(),o=(n-e)/t.frameDuration;t.dropFrames+=o,t.animations.length>0&&t.requestAnimationFrame()}}}},{}],22:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.types={},t.instances={},t.controllers={},t.Controller=function(a){return this.chart=a,this.config=a.config,this.options=this.config.options=e.configMerge(t.defaults.global,t.defaults[this.config.type],this.config.options||{}),this.id=e.uid(),Object.defineProperty(this,"data",{get:function(){return this.config.data}}),t.instances[this.id]=this,this.options.responsive&&this.resize(!0),this.initialize(),this},e.extend(t.Controller.prototype,{initialize:function(){var e=this;return t.plugins.notify("beforeInit",[e]),e.bindEvents(),e.ensureScalesHaveIDs(),e.buildOrUpdateControllers(),e.buildScales(),e.updateLayout(),e.resetElements(),e.initToolTip(),e.update(),t.plugins.notify("afterInit",[e]),e},clear:function(){return e.clear(this.chart),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(a){var i=this,n=i.chart,o=n.canvas,r=e.getMaximumWidth(o),l=n.aspectRatio,s=i.options.maintainAspectRatio&&isNaN(l)===!1&&isFinite(l)&&0!==l?r/l:e.getMaximumHeight(o),d=n.width!==r||n.height!==s;if(!d)return i;o.width=n.width=r,o.height=n.height=s,e.retinaScale(n);var u={width:r,height:s};return t.plugins.notify("resize",[i,u]),i.options.onResize&&i.options.onResize(i,u),a||(i.stop(),i.update(i.options.responsiveAnimationDuration)),i},ensureScalesHaveIDs:function(){var t=this.options,a=t.scales||{},i=t.scale;e.each(a.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),e.each(a.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),i&&(i.id=i.id||"scale")},buildScales:function(){var a=this,i=a.options,n=a.scales={},o=[];i.scales&&(o=o.concat((i.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category"}}),(i.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear"}}))),i.scale&&o.push({options:i.scale,dtype:"radialLinear",isDefault:!0}),e.each(o,function(i,o){var r=i.options,l=e.getValueOrDefault(r.type,i.dtype),s=t.scaleService.getScaleConstructor(l);if(s){var d=new s({id:r.id,options:r,ctx:a.chart.ctx,chart:a});n[d.id]=d,i.isDefault&&(a.scale=d)}}),t.scaleService.addScalesToLayout(this)},updateLayout:function(){t.layoutService.update(this,this.chart.width,this.chart.height)},buildOrUpdateControllers:function(){var a=this,i=[],n=[];if(e.each(a.data.datasets,function(e,o){var r=a.getDatasetMeta(o);r.type||(r.type=e.type||a.config.type),i.push(r.type),r.controller?r.controller.updateIndex(o):(r.controller=new t.controllers[r.type](a,o),n.push(r.controller))},a),i.length>1)for(var o=1;oe;++e)i.getDatasetMeta(e).controller.update();t.plugins.notify("afterDatasetsUpdate",[i])}},render:function(a,i){var n=this;t.plugins.notify("beforeRender",[n]);var o=n.options.animation;if(o&&("undefined"!=typeof a&&0!==a||"undefined"==typeof a&&0!==o.duration)){var r=new t.Animation;r.numSteps=(a||o.duration)/16.66,r.easing=o.easing,r.render=function(t,a){var i=e.easingEffects[a.easing],n=a.currentStep/a.numSteps,o=i(n);t.draw(o,n,a.currentStep)},r.onAnimationProgress=o.onProgress,r.onAnimationComplete=o.onComplete,t.animationService.addAnimation(n,r,a,i)}else n.draw(),o&&o.onComplete&&o.onComplete.call&&o.onComplete.call(n);return n},draw:function(a){var i=this,n=a||1;i.clear(),t.plugins.notify("beforeDraw",[i,n]),e.each(i.boxes,function(t){t.draw(i.chartArea)},i),i.scale&&i.scale.draw(),t.plugins.notify("beforeDatasetsDraw",[i,n]),e.each(i.data.datasets,function(t,e){i.isDatasetVisible(e)&&i.getDatasetMeta(e).controller.draw(a)},i,!0),t.plugins.notify("afterDatasetsDraw",[i,n]),i.tooltip.transition(n).draw(),t.plugins.notify("afterDraw",[i,n])},getElementAtEvent:function(t){var a=this,i=e.getRelativePosition(t,a.chart),n=[];return e.each(a.data.datasets,function(t,o){if(a.isDatasetVisible(o)){var r=a.getDatasetMeta(o);e.each(r.data,function(t,e){return t.inRange(i.x,i.y)?(n.push(t),n):void 0})}}),n},getElementsAtEvent:function(t){var a=this,i=e.getRelativePosition(t,a.chart),n=[],o=function(){if(a.data.datasets)for(var t=0;t0&&(e=this.getDatasetMeta(e[0]._datasetIndex).data),e},getDatasetMeta:function(t){var e=this,a=e.data.datasets[t];a._meta||(a._meta={});var i=a._meta[e.id];return i||(i=a._meta[e.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,a=this.data.datasets.length;a>e;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroy:function(){var a=this;a.stop(),a.clear(),e.unbindEvents(a,a.events),e.removeResizeListener(a.chart.canvas.parentNode);var i=a.chart.canvas;i.width=a.chart.width,i.height=a.chart.height,void 0!==a.chart.originalDevicePixelRatio&&a.chart.ctx.scale(1/a.chart.originalDevicePixelRatio,1/a.chart.originalDevicePixelRatio),i.style.width=a.chart.originalCanvasStyleWidth,i.style.height=a.chart.originalCanvasStyleHeight,t.plugins.notify("destroy",[a]),delete t.instances[a.id]},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)},initToolTip:function(){var e=this;e.tooltip=new t.Tooltip({_chart:e.chart,_chartInstance:e,_data:e.data,_options:e.options.tooltips},e)},bindEvents:function(){var t=this;e.bindEvents(t,t.options.events,function(e){t.eventHandler(e)})},updateHoverStyle:function(t,e,a){var i,n,o,r=a?"setHoverStyle":"removeHoverStyle";switch(e){case"single":t=[t[0]];break;case"label":case"dataset":break;default:return}for(n=0,o=t.length;o>n;++n)i=t[n],i&&this.getDatasetMeta(i._datasetIndex).controller[r](i)},eventHandler:function(t){var a=this,i=a.tooltip,n=a.options||{},o=n.hover,r=n.tooltips;return a.lastActive=a.lastActive||[],a.lastTooltipActive=a.lastTooltipActive||[],"mouseout"===t.type?(a.active=[],a.tooltipActive=[]):(a.active=a.getElementsAtEventForMode(t,o.mode),a.tooltipActive=a.getElementsAtEventForMode(t,r.mode)),o.onHover&&o.onHover.call(a,a.active),("mouseup"===t.type||"click"===t.type)&&(n.onClick&&n.onClick.call(a,t,a.active),a.legend&&a.legend.handleEvent&&a.legend.handleEvent(t)),a.lastActive.length&&a.updateHoverStyle(a.lastActive,o.mode,!1),a.active.length&&o.mode&&a.updateHoverStyle(a.active,o.mode,!0),(r.enabled||r.custom)&&(i.initialize(),i._active=a.tooltipActive,i.update(!0)),i.pivot(),a.animating||e.arrayEquals(a.active,a.lastActive)&&e.arrayEquals(a.tooltipActive,a.lastTooltipActive)||(a.stop(),(r.enabled||r.custom)&&i.update(!0),a.render(o.animationDuration,!0)),a.lastActive=a.active,a.lastTooltipActive=a.tooltipActive,a}})}},{}],23:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=e.noop;t.DatasetController=function(t,e){this.initialize.call(this,t,e)},e.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var a=this;a.chart=t,a.index=e,a.linkScales(),a.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),a=t.getDataset();null===e.xAxisID&&(e.xAxisID=a.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=a.yAxisID||t.chart.options.scales.yAxes[0].id); +},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,a=e.dataElementType;return a&&new a({_chart:e.chart.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,a=this,i=a.getMeta(),n=a.getDataset().data||[],o=i.data;for(t=0,e=n.length;e>t;++t)o[t]=o[t]||a.createMetaData(i,t);i.dataset=i.dataset||a.createMetaDataset()},addElementAndReset:function(t){var e=this,a=e.createMetaData(t);e.getMeta().data.splice(t,0,a),e.updateElement(a,t,!0)},buildOrUpdateElements:function(){var t=this.getMeta(),e=t.data,a=this.getDataset().data.length,i=e.length;if(i>a)e.splice(a,i-a);else if(a>i)for(var n=i;a>n;++n)this.addElementAndReset(n)},update:a,draw:function(t){var a=t||1;e.each(this.getMeta().data,function(t,e){t.transition(a).draw()})},removeHoverStyle:function(t,a){var i=this.chart.data.datasets[t._datasetIndex],n=t._index,o=t.custom||{},r=e.getValueAtIndexOrDefault,l=(e.color,t._model);l.backgroundColor=o.backgroundColor?o.backgroundColor:r(i.backgroundColor,n,a.backgroundColor),l.borderColor=o.borderColor?o.borderColor:r(i.borderColor,n,a.borderColor),l.borderWidth=o.borderWidth?o.borderWidth:r(i.borderWidth,n,a.borderWidth)},setHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},o=e.getValueAtIndexOrDefault,r=(e.color,e.getHoverColor),l=t._model;l.backgroundColor=n.hoverBackgroundColor?n.hoverBackgroundColor:o(a.hoverBackgroundColor,i,r(l.backgroundColor)),l.borderColor=n.hoverBorderColor?n.hoverBorderColor:o(a.hoverBorderColor,i,r(l.borderColor)),l.borderWidth=n.hoverBorderWidth?n.hoverBorderWidth:o(a.hoverBorderWidth,i,l.borderWidth)}}),t.DatasetController.extend=e.inherits}},{}],24:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.elements={},t.Element=function(t){e.extend(this,t),this.initialize.apply(this,arguments)},e.extend(t.Element.prototype,{initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=e.clone(t._model)),t._start=e.clone(t._view),t},transition:function(t){var a=this;return a._view||(a._view=e.clone(a._model)),1===t?(a._view=a._model,a._start=null,a):(a._start||a.pivot(),e.each(a._model,function(i,n){if("_"===n[0]);else if(a._view.hasOwnProperty(n))if(i===a._view[n]);else if("string"==typeof i)try{var o=e.color(a._model[n]).mix(e.color(a._start[n]),t);a._view[n]=o.rgbString()}catch(r){a._view[n]=i}else if("number"==typeof i){var l=void 0!==a._start[n]&&isNaN(a._start[n])===!1?a._start[n]:0;a._view[n]=(a._model[n]-l)*t+l}else a._view[n]=i;else"number"!=typeof i||isNaN(a._view[n])?a._view[n]=i:a._view[n]=i*t},a),a)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return e.isNumber(this._model.x)&&e.isNumber(this._model.y)}}),t.Element.extend=e.inherits}},{}],25:[function(t,e,a){"use strict";var i=t(3);e.exports=function(t){function e(t,e,a){var i;return"string"==typeof t?(i=parseInt(t,10),-1!=t.indexOf("%")&&(i=i/100*e.parentNode[a])):i=t,i}function a(t){return void 0!==t&&null!==t&&"none"!==t}function n(t,i,n){var o=document.defaultView,r=t.parentNode,l=o.getComputedStyle(t)[i],s=o.getComputedStyle(r)[i],d=a(l),u=a(s),c=Number.POSITIVE_INFINITY;return d||u?Math.min(d?e(l,t,n):c,u?e(s,r,n):c):"none"}var o=t.helpers={};o.each=function(t,e,a,i){var n,r;if(o.isArray(t))if(r=t.length,i)for(n=r-1;n>=0;n--)e.call(a,t[n],n);else for(n=0;r>n;n++)e.call(a,t[n],n);else if("object"==typeof t){var l=Object.keys(t);for(r=l.length,n=0;r>n;n++)e.call(a,t[l[n]],l[n])}},o.clone=function(t){var e={};return o.each(t,function(t,a){o.isArray(t)?e[a]=t.slice(0):"object"==typeof t&&null!==t?e[a]=o.clone(t):e[a]=t}),e},o.extend=function(t){for(var e=function(e,a){t[a]=e},a=1,i=arguments.length;i>a;a++)o.each(arguments[a],e);return t},o.configMerge=function(e){var a=o.clone(e);return o.each(Array.prototype.slice.call(arguments,1),function(e){o.each(e,function(e,i){if("scales"===i)a[i]=o.scaleMerge(a.hasOwnProperty(i)?a[i]:{},e);else if("scale"===i)a[i]=o.configMerge(a.hasOwnProperty(i)?a[i]:{},t.scaleService.getScaleDefaults(e.type),e);else if(a.hasOwnProperty(i)&&o.isArray(a[i])&&o.isArray(e)){var n=a[i];o.each(e,function(t,e){e=i[a].length||!i[a][n].type?i[a].push(o.configMerge(l,e)):e.type&&e.type!==i[a][n].type?i[a][n]=o.configMerge(i[a][n],l,e):i[a][n]=o.configMerge(i[a][n],e)}):(i[a]=[],o.each(e,function(e){var n=o.getValueOrDefault(e.type,"xAxes"===a?"category":"linear");i[a].push(o.configMerge(t.scaleService.getScaleDefaults(n),e))})):i.hasOwnProperty(a)&&"object"==typeof i[a]&&null!==i[a]&&"object"==typeof e?i[a]=o.configMerge(i[a],e):i[a]=e}),i},o.getValueAtIndexOrDefault=function(t,e,a){return void 0===t||null===t?a:o.isArray(t)?ea;++a)if(t[a]===e)return a;return-1},o.where=function(t,e){if(o.isArray(t)&&Array.prototype.filter)return t.filter(e);var a=[];return o.each(t,function(t){e(t)&&a.push(t)}),a},o.findIndex=Array.prototype.findIndex?function(t,e,a){return t.findIndex(e,a)}:function(t,e,a){a=void 0===a?t:a;for(var i=0,n=t.length;n>i;++i)if(e.call(a,t[i],i,t))return i;return-1},o.findNextWhere=function(t,e,a){(void 0===a||null===a)&&(a=-1);for(var i=a+1;i=0;i--){var n=t[i];if(e(n))return n}},o.inherits=function(t){var e=this,a=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},i=function(){this.constructor=a};return i.prototype=e.prototype,a.prototype=new i,a.extend=o.inherits,t&&o.extend(a.prototype,t),a.__super__=e.prototype,a},o.noop=function(){},o.uid=function(){var t=0;return function(){return t++}}(),o.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.almostEquals=function(t,e,a){return Math.abs(t-e)0?1:-1},o.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},o.toRadians=function(t){return t*(Math.PI/180)},o.toDegrees=function(t){return t*(180/Math.PI)},o.getAngleFromPoint=function(t,e){var a=e.x-t.x,i=e.y-t.y,n=Math.sqrt(a*a+i*i),o=Math.atan2(i,a);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:n}},o.aliasPixel=function(t){return t%2===0?0:.5},o.splineCurve=function(t,e,a,i){var n=t.skip?e:t,o=e,r=a.skip?e:a,l=Math.sqrt(Math.pow(o.x-n.x,2)+Math.pow(o.y-n.y,2)),s=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),d=l/(l+s),u=s/(l+s);d=isNaN(d)?0:d,u=isNaN(u)?0:u;var c=i*d,h=i*u;return{previous:{x:o.x-c*(r.x-n.x),y:o.y-c*(r.y-n.y)},next:{x:o.x+h*(r.x-n.x),y:o.y+h*(r.y-n.y)}}},o.nextItem=function(t,e,a){return a?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},o.previousItem=function(t,e,a){return a?0>=e?t[t.length-1]:t[e-1]:0>=e?t[0]:t[e-1]},o.niceNum=function(t,e){var a,i=Math.floor(o.log10(t)),n=t/Math.pow(10,i);return a=e?1.5>n?1:3>n?2:7>n?5:10:1>=n?1:2>=n?2:5>=n?5:10,a*Math.pow(10,i)};var r=o.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,a=0,i=1;return 0===t?0:1===(t/=1)?1:(a||(a=.3),it?-.5*(i*Math.pow(2,10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/a)):i*Math.pow(2,-10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/a)*.5+1)},easeInBack:function(t){var e=1.70158;return 1*(t/=1)*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return 1*((t=t/1-1)*t*((e+1)*t+e)+1)},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?.5*(t*t*(((e*=1.525)+1)*t-e)):.5*((t-=2)*t*(((e*=1.525)+1)*t+e)+2)},easeInBounce:function(t){return 1-r.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?1*(7.5625*t*t):2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*r.easeInBounce(2*t):.5*r.easeOutBounce(2*t-1)+.5}};o.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),o.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),o.getRelativePosition=function(t,e){var a,i,n=t.originalEvent||t,r=t.currentTarget||t.srcElement,l=r.getBoundingClientRect(),s=n.touches;s&&s.length>0?(a=s[0].clientX,i=s[0].clientY):(a=n.clientX,i=n.clientY);var d=parseFloat(o.getStyle(r,"padding-left")),u=parseFloat(o.getStyle(r,"padding-top")),c=parseFloat(o.getStyle(r,"padding-right")),h=parseFloat(o.getStyle(r,"padding-bottom")),f=l.right-l.left-d-c,g=l.bottom-l.top-u-h;return a=Math.round((a-l.left-d)/f*r.width/e.currentDevicePixelRatio),i=Math.round((i-l.top-u)/g*r.height/e.currentDevicePixelRatio),{x:a,y:i}},o.addEvent=function(t,e,a){t.addEventListener?t.addEventListener(e,a):t.attachEvent?t.attachEvent("on"+e,a):t["on"+e]=a},o.removeEvent=function(t,e,a){t.removeEventListener?t.removeEventListener(e,a,!1):t.detachEvent?t.detachEvent("on"+e,a):t["on"+e]=o.noop},o.bindEvents=function(t,e,a){var i=t.events=t.events||{};o.each(e,function(e){i[e]=function(){a.apply(t,arguments)},o.addEvent(t.chart.canvas,e,i[e])})},o.unbindEvents=function(t,e){var a=t.chart.canvas;o.each(e,function(t,e){o.removeEvent(a,e,t)})},o.getConstraintWidth=function(t){return n(t,"max-width","clientWidth")},o.getConstraintHeight=function(t){return n(t,"max-height","clientHeight")},o.getMaximumWidth=function(t){var e=t.parentNode,a=parseInt(o.getStyle(e,"padding-left"))+parseInt(o.getStyle(e,"padding-right")),i=e.clientWidth-a,n=o.getConstraintWidth(t);return isNaN(n)?i:Math.min(i,n)},o.getMaximumHeight=function(t){var e=t.parentNode,a=parseInt(o.getStyle(e,"padding-top"))+parseInt(o.getStyle(e,"padding-bottom")),i=e.clientHeight-a,n=o.getConstraintHeight(t);return isNaN(n)?i:Math.min(i,n)},o.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},o.retinaScale=function(t){var e=t.ctx,a=t.canvas,i=a.width,n=a.height,o=t.currentDevicePixelRatio=window.devicePixelRatio||1;1!==o&&(a.height=n*o,a.width=i*o,e.scale(o,o),t.originalDevicePixelRatio=t.originalDevicePixelRatio||o),a.style.width=i+"px",a.style.height=n+"px"},o.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},o.fontString=function(t,e,a){return e+" "+t+"px "+a},o.longestText=function(t,e,a,i){i=i||{};var n=i.data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(n=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var l=0;o.each(a,function(e){void 0!==e&&null!==e&&o.isArray(e)!==!0?l=o.measureText(t,n,r,l,e):o.isArray(e)&&o.each(e,function(e){void 0===e||null===e||o.isArray(e)||(l=o.measureText(t,n,r,l,e))})});var s=r.length/2;if(s>a.length){for(var d=0;s>d;d++)delete n[r[d]];r.splice(0,s)}return l},o.measureText=function(t,e,a,i,n){var o=e[n];return o||(o=e[n]=t.measureText(n).width,a.push(n)),o>i&&(i=o),i},o.numberOfLabelLines=function(t){var e=1;return o.each(t,function(t){o.isArray(t)&&t.length>e&&(e=t.length)}),e},o.drawRoundedRectangle=function(t,e,a,i,n,o){t.beginPath(),t.moveTo(e+o,a),t.lineTo(e+i-o,a),t.quadraticCurveTo(e+i,a,e+i,a+o),t.lineTo(e+i,a+n-o),t.quadraticCurveTo(e+i,a+n,e+i-o,a+n),t.lineTo(e+o,a+n),t.quadraticCurveTo(e,a+n,e,a+n-o),t.lineTo(e,a+o),t.quadraticCurveTo(e,a,e+o,a),t.closePath()},o.color=function(e){return i?i(e instanceof CanvasGradient?t.defaults.global.defaultColor:e):(console.log("Color.js not found!"),e)},o.addResizeListener=function(t,e){var a=document.createElement("iframe"),i="chartjs-hidden-iframe";a.classlist?a.classlist.add(i):a.setAttribute("class",i);var n=a.style;n.width="100%",n.display="block",n.border=0,n.height=0,n.margin=0,n.position="absolute",n.left=0,n.right=0,n.top=0,n.bottom=0,t.insertBefore(a,t.firstChild),(a.contentWindow||a).onresize=function(){e&&e()}},o.removeResizeListener=function(t){var e=t.querySelector(".chartjs-hidden-iframe");e&&e.parentNode.removeChild(e)},o.isArray=Array.isArray?function(t){return Array.isArray(t)}:function(t){return"[object Array]"===Object.prototype.toString.call(t)},o.arrayEquals=function(t,e){var a,i,n,r;if(!t||!e||t.length!=e.length)return!1;for(a=0,i=t.length;i>a;++a)if(n=t[a],r=e[a],n instanceof Array&&r instanceof Array){if(!o.arrayEquals(n,r))return!1}else if(n!=r)return!1;return!0},o.callCallback=function(t,e,a){t&&"function"==typeof t.call&&t.apply(a,e)},o.getHoverColor=function(t){return t instanceof CanvasPattern?t:o.color(t).saturate(.5).darken(.1).rgbString()}}},{3:3}],26:[function(t,e,a){"use strict";e.exports=function(){var t=function(e,a){var i=this,n=t.helpers;return i.config=a,e.length&&e[0].getContext&&(e=e[0]),e.getContext&&(e=e.getContext("2d")),i.ctx=e,i.canvas=e.canvas,e.canvas.style.display=e.canvas.style.display||"block",i.width=e.canvas.width||parseInt(n.getStyle(e.canvas,"width"),10)||n.getMaximumWidth(e.canvas),i.height=e.canvas.height||parseInt(n.getStyle(e.canvas,"height"),10)||n.getMaximumHeight(e.canvas),i.aspectRatio=i.width/i.height,(isNaN(i.aspectRatio)||isFinite(i.aspectRatio)===!1)&&(i.aspectRatio=void 0!==a.aspectRatio?a.aspectRatio:2),i.originalCanvasStyleWidth=e.canvas.style.width,i.originalCanvasStyleHeight=e.canvas.style.height,n.retinaScale(i),a&&(i.controller=new t.Controller(i)),n.addResizeListener(e.canvas.parentNode,function(){i.controller&&i.controller.config.options.responsive&&i.controller.resize()}),i.controller?i.controller:i};return t.defaults={global:{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"single",animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},legendCallback:function(t){var e=[];e.push('
      ');for(var a=0;a'),t.data.datasets[a].label&&e.push(t.data.datasets[a].label),e.push("");return e.push("
    "),e.join("")}}},t.Chart=t,t}},{}],27:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),t.boxes.push(e)},removeBox:function(t,e){t.boxes&&t.boxes.splice(t.boxes.indexOf(e),1)},update:function(t,a,i){function n(t){var e,a=t.isHorizontal();a?(e=t.update(t.options.fullWidth?p:k,y),S-=e.height):(e=t.update(x,v),k-=e.width),w.push({horizontal:a,minSize:e,box:t})}function o(t){var a=e.findNextWhere(w,function(e){return e.box===t});if(a)if(t.isHorizontal()){var i={left:C,right:M,top:0,bottom:0};t.update(t.options.fullWidth?p:k,m/2,i)}else t.update(a.minSize.width,S)}function r(t){var a=e.findNextWhere(w,function(e){return e.box===t}),i={left:0,right:0,top:D,bottom:A};a&&t.update(a.minSize.width,S,i)}function l(t){t.isHorizontal()?(t.left=t.options.fullWidth?s:C,t.right=t.options.fullWidth?a-s:C+k,t.top=P,t.bottom=P+t.height,P=t.bottom):(t.left=T,t.right=T+t.width,t.top=D,t.bottom=D+S,T=t.right)}if(t){var s=0,d=0,u=e.where(t.boxes,function(t){return"left"===t.options.position}),c=e.where(t.boxes,function(t){return"right"===t.options.position}),h=e.where(t.boxes,function(t){return"top"===t.options.position}),f=e.where(t.boxes,function(t){return"bottom"===t.options.position}),g=e.where(t.boxes,function(t){return"chartArea"===t.options.position});h.sort(function(t,e){return(e.options.fullWidth?1:0)-(t.options.fullWidth?1:0)}),f.sort(function(t,e){return(t.options.fullWidth?1:0)-(e.options.fullWidth?1:0)});var p=a-2*s,m=i-2*d,b=p/2,v=m/2,x=(a-b)/(u.length+c.length),y=(i-v)/(h.length+f.length),k=p,S=m,w=[];e.each(u.concat(c,h,f),n);var C=s,M=s,D=d,A=d;e.each(u.concat(c),o),e.each(u,function(t){C+=t.width}),e.each(c,function(t){M+=t.width}),e.each(h.concat(f),o),e.each(h,function(t){D+=t.height}),e.each(f,function(t){A+=t.height}),e.each(u.concat(c),r),C=s,M=s,D=d,A=d,e.each(u,function(t){C+=t.width}),e.each(c,function(t){M+=t.width}),e.each(h,function(t){D+=t.height}),e.each(f,function(t){A+=t.height});var I=i-D-A,F=a-C-M;(F!==k||I!==S)&&(e.each(u,function(t){t.height=I}),e.each(c,function(t){t.height=I}),e.each(h,function(t){t.options.fullWidth||(t.width=F)}),e.each(f,function(t){t.options.fullWidth||(t.width=F)}),S=I,k=F);var T=s,P=d;e.each(u.concat(h),l),T+=k,P+=S,e.each(c,l),e.each(f,l),t.chartArea={left:C,top:D,right:C+k,bottom:D+S},e.each(g,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(k,S)})}}}}},{}],28:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=e.noop;t.defaults.global.legend={display:!0,position:"top",fullWidth:!0,reverse:!1,onClick:function(t,e){var a=e.datasetIndex,i=this.chart,n=i.getDatasetMeta(a);n.hidden=null===n.hidden?!i.data.datasets[a].hidden:null,i.update()},labels:{boxWidth:40,padding:10,generateLabels:function(t){var a=t.data;return e.isArray(a.datasets)?a.datasets.map(function(a,i){return{text:a.label,fillStyle:e.isArray(a.backgroundColor)?a.backgroundColor[0]:a.backgroundColor,hidden:!t.isDatasetVisible(i),lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:a.borderWidth,strokeStyle:a.borderColor,datasetIndex:i}},this):[]}}},t.Legend=t.Element.extend({initialize:function(t){e.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:a,update:function(t,e,a){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=a,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:a,beforeSetDimensions:a,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:a,beforeBuildLabels:a,buildLabels:function(){var t=this;t.legendItems=t.options.labels.generateLabels.call(t,t.chart),t.options.reverse&&t.legendItems.reverse()},afterBuildLabels:a,beforeFit:a,fit:function(){var a=this,i=a.options,n=i.labels,o=i.display,r=a.ctx,l=t.defaults.global,s=e.getValueOrDefault,d=s(n.fontSize,l.defaultFontSize),u=s(n.fontStyle,l.defaultFontStyle),c=s(n.fontFamily,l.defaultFontFamily),h=e.fontString(d,u,c),f=a.legendHitBoxes=[],g=a.minSize,p=a.isHorizontal();if(p?(g.width=a.maxWidth,g.height=o?10:0):(g.width=o?10:0,g.height=a.maxHeight),o)if(r.font=h,p){var m=a.lineWidths=[0],b=a.legendItems.length?d+n.padding:0;r.textAlign="left",r.textBaseline="top",e.each(a.legendItems,function(t,e){var i=n.boxWidth+d/2+r.measureText(t.text).width;m[m.length-1]+i+n.padding>=a.width&&(b+=d+n.padding,m[m.length]=a.left),f[e]={left:0,top:0,width:i,height:d},m[m.length-1]+=i+n.padding}),g.height+=b}else{var v=n.padding,x=a.columnWidths=[],y=n.padding,k=0,S=0,w=d+v;e.each(a.legendItems,function(t,e){var a=n.boxWidth+d/2+r.measureText(t.text).width;S+w>g.height&&(y+=k+n.padding,x.push(k),k=0,S=0),k=Math.max(k,a),S+=w,f[e]={left:0,top:0,width:a,height:d}}),y+=k,x.push(k),g.width+=y}a.width=g.width,a.height=g.height},afterFit:a,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var a=this,i=a.options,n=i.labels,o=t.defaults.global,r=o.elements.line,l=a.width,s=(a.height,a.lineWidths);if(i.display){var d,u=a.ctx,c=e.getValueOrDefault,h=c(n.fontColor,o.defaultFontColor),f=c(n.fontSize,o.defaultFontSize),g=c(n.fontStyle,o.defaultFontStyle),p=c(n.fontFamily,o.defaultFontFamily),m=e.fontString(f,g,p);u.textAlign="left",u.textBaseline="top",u.lineWidth=.5,u.strokeStyle=h,u.fillStyle=h,u.font=m;var b=n.boxWidth,v=a.legendHitBoxes,x=function(t,e,a){u.save(),u.fillStyle=c(a.fillStyle,o.defaultColor),u.lineCap=c(a.lineCap,r.borderCapStyle),u.lineDashOffset=c(a.lineDashOffset,r.borderDashOffset),u.lineJoin=c(a.lineJoin,r.borderJoinStyle),u.lineWidth=c(a.lineWidth,r.borderWidth),u.strokeStyle=c(a.strokeStyle,o.defaultColor),u.setLineDash&&u.setLineDash(c(a.lineDash,r.borderDash)),u.strokeRect(t,e,b,f),u.fillRect(t,e,b,f),u.restore()},y=function(t,e,a,i){u.fillText(a.text,b+f/2+t,e),a.hidden&&(u.beginPath(),u.lineWidth=2,u.moveTo(b+f/2+t,e+f/2),u.lineTo(b+f/2+t+i,e+f/2),u.stroke())},k=a.isHorizontal();d=k?{x:a.left+(l-s[0])/2,y:a.top+n.padding,line:0}:{x:a.left+n.padding,y:a.top,line:0};var S=f+n.padding;e.each(a.legendItems,function(t,e){var i=u.measureText(t.text).width,o=b+f/2+i,r=d.x,c=d.y;k?r+o>=l&&(c=d.y+=f+n.padding,d.line++,r=d.x=a.left+(l-s[d.line])/2):c+S>a.bottom&&(r=d.x=r+a.columnWidths[d.line]+n.padding,c=d.y=a.top,d.line++),x(r,c,t),v[e].left=r,v[e].top=c,y(r,c,t,i),k?d.x+=o+n.padding:d.y+=S})}},handleEvent:function(t){var a=this,i=e.getRelativePosition(t,a.chart.chart),n=i.x,o=i.y,r=a.options;if(n>=a.left&&n<=a.right&&o>=a.top&&o<=a.bottom)for(var l=a.legendHitBoxes,s=0;s=d.left&&n<=d.left+d.width&&o>=d.top&&o<=d.top+d.height){r.onClick&&r.onClick.call(a,t,a.legendItems[s]);break}}}}),t.plugins.register({beforeInit:function(e){var a=e.options,i=a.legend;i&&(e.legend=new t.Legend({ctx:e.chart.ctx,options:i,chart:e}),t.layoutService.addBox(e,e.legend))}})}},{}],29:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers.noop;t.plugins={_plugins:[],register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){-1===e.indexOf(t)&&e.push(t)})},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var a=e.indexOf(t);-1!==a&&e.splice(a,1)})},clear:function(){this._plugins=[]},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e){var a,i,n=this._plugins,o=n.length;for(a=0;o>a;++a)if(i=n[a],"function"==typeof i[t]&&i[t].apply(i,e||[])===!1)return!1;return!0}},t.PluginBase=t.Element.extend({beforeInit:e,afterInit:e,beforeUpdate:e,afterUpdate:e,beforeDraw:e,afterDraw:e,destroy:e}),t.pluginService=t.plugins}},{}],30:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.scale={display:!0,position:"left",gridLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",offsetGridLines:!1},scaleLabel:{labelString:"",display:!1},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:10,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:function(t){return e.isArray(t)?t:""+t}}},t.Scale=t.Element.extend({beforeUpdate:function(){e.callCallback(this.options.beforeUpdate,[this])},update:function(t,a,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=a,n.margins=e.extend({left:0,right:0,top:0,bottom:0},i),n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeDataLimits(),n.determineDataLimits(),n.afterDataLimits(),n.beforeBuildTicks(),n.buildTicks(),n.afterBuildTicks(),n.beforeTickToLabelConversion(),n.convertTicksToLabels(),n.afterTickToLabelConversion(),n.beforeCalculateTickRotation(),n.calculateTickRotation(),n.afterCalculateTickRotation(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:function(){e.callCallback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){e.callCallback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){e.callCallback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){e.callCallback(this.options.beforeDataLimits,[this])},determineDataLimits:e.noop,afterDataLimits:function(){e.callCallback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){e.callCallback(this.options.beforeBuildTicks,[this])},buildTicks:e.noop,afterBuildTicks:function(){e.callCallback(this.options.afterBuildTicks,[this])},beforeTickToLabelConversion:function(){e.callCallback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this;t.ticks=t.ticks.map(function(e,a,i){return t.options.ticks.userCallback?t.options.ticks.userCallback(e,a,i):t.options.ticks.callback(e,a,i)},t)},afterTickToLabelConversion:function(){e.callCallback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){e.callCallback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var a=this,i=a.ctx,n=t.defaults.global,o=a.options.ticks,r=e.getValueOrDefault(o.fontSize,n.defaultFontSize),l=e.getValueOrDefault(o.fontStyle,n.defaultFontStyle),s=e.getValueOrDefault(o.fontFamily,n.defaultFontFamily),d=e.fontString(r,l,s);i.font=d;var u,c=i.measureText(a.ticks[0]).width,h=i.measureText(a.ticks[a.ticks.length-1]).width;if(a.labelRotation=o.minRotation||0,a.paddingRight=0,a.paddingLeft=0,a.options.display&&a.isHorizontal()){a.paddingRight=h/2+3,a.paddingLeft=c/2+3,a.longestTextCache||(a.longestTextCache={});for(var f,g,p=e.longestText(i,d,a.ticks,a.longestTextCache),m=p,b=a.getPixelForTick(1)-a.getPixelForTick(0)-6;m>b&&a.labelRotationa.yLabelWidth&&(a.paddingLeft=u+r/2),a.paddingRight=r/2,g*p>a.maxHeight){a.labelRotation--;break}a.labelRotation++,m=f*p}}a.margins&&(a.paddingLeft=Math.max(a.paddingLeft-a.margins.left,0),a.paddingRight=Math.max(a.paddingRight-a.margins.right,0))},afterCalculateTickRotation:function(){e.callCallback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){e.callCallback(this.options.beforeFit,[this])},fit:function(){var a=this,i=a.minSize={width:0,height:0},n=a.options,o=t.defaults.global,r=n.ticks,l=n.scaleLabel,s=n.display,d=a.isHorizontal(),u=e.getValueOrDefault(r.fontSize,o.defaultFontSize),c=e.getValueOrDefault(r.fontStyle,o.defaultFontStyle),h=e.getValueOrDefault(r.fontFamily,o.defaultFontFamily),f=e.fontString(u,c,h),g=e.getValueOrDefault(l.fontSize,o.defaultFontSize),p=e.getValueOrDefault(l.fontStyle,o.defaultFontStyle),m=e.getValueOrDefault(l.fontFamily,o.defaultFontFamily),b=(e.fontString(g,p,m),n.gridLines.tickMarkLength);if(d?i.width=a.isFullWidth()?a.maxWidth-a.margins.left-a.margins.right:a.maxWidth:i.width=s?b:0,d?i.height=s?b:0:i.height=a.maxHeight,l.display&&s&&(d?i.height+=1.5*g:i.width+=1.5*g),r.display&&s){a.longestTextCache||(a.longestTextCache={});var v=e.longestText(a.ctx,f,a.ticks,a.longestTextCache),x=e.numberOfLabelLines(a.ticks),y=.5*u;if(d){a.longestLabelWidth=v;var k=Math.sin(e.toRadians(a.labelRotation))*a.longestLabelWidth+u*x+y*x;i.height=Math.min(a.maxHeight,i.height+k),a.ctx.font=f;var S=a.ctx.measureText(a.ticks[0]).width,w=a.ctx.measureText(a.ticks[a.ticks.length-1]).width,C=Math.cos(e.toRadians(a.labelRotation)),M=Math.sin(e.toRadians(a.labelRotation));a.paddingLeft=0!==a.labelRotation?C*S+3:S/2+3,a.paddingRight=0!==a.labelRotation?M*(u/2)+3:w/2+3}else{var D=a.maxWidth-i.width,A=r.mirror;A?v=0:v+=a.options.ticks.padding,D>v?i.width+=v:i.width=a.maxWidth,a.paddingTop=u/2,a.paddingBottom=u/2}}a.margins&&(a.paddingLeft=Math.max(a.paddingLeft-a.margins.left,0),a.paddingTop=Math.max(a.paddingTop-a.margins.top,0),a.paddingRight=Math.max(a.paddingRight-a.margins.right,0),a.paddingBottom=Math.max(a.paddingBottom-a.margins.bottom,0)),a.width=i.width,a.height=i.height},afterFit:function(){e.callCallback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function a(t){return null===t||"undefined"==typeof t?NaN:"number"==typeof t&&isNaN(t)?NaN:"object"==typeof t?t instanceof Date||t.isValid?t:a(this.isHorizontal()?t.x:t.y):t},getLabelForIndex:e.noop,getPixelForValue:e.noop,getValueForPixel:e.noop,getPixelForTick:function(t,e){var a=this;if(a.isHorizontal()){var i=a.width-(a.paddingLeft+a.paddingRight),n=i/Math.max(a.ticks.length-(a.options.gridLines.offsetGridLines?0:1),1),o=n*t+a.paddingLeft;e&&(o+=n/2);var r=a.left+Math.round(o);return r+=a.isFullWidth()?a.margins.left:0}var l=a.height-(a.paddingTop+a.paddingBottom);return a.top+t*(l/(a.ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var a=e.width-(e.paddingLeft+e.paddingRight),i=a*t+e.paddingLeft,n=e.left+Math.round(i);return n+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){var t=this,e=t.min,a=t.max;return t.getPixelForValue(t.beginAtZero?0:0>e&&0>a?a:e>0&&a>0?e:0)},draw:function(a){var i=this,n=i.options;if(n.display){ +var o,r,l=i.ctx,s=t.defaults.global,d=n.ticks,u=n.gridLines,c=n.scaleLabel,h=0!==i.labelRotation,f=d.autoSkip,g=i.isHorizontal();d.maxTicksLimit&&(r=d.maxTicksLimit);var p=e.getValueOrDefault(d.fontColor,s.defaultFontColor),m=e.getValueOrDefault(d.fontSize,s.defaultFontSize),b=e.getValueOrDefault(d.fontStyle,s.defaultFontStyle),v=e.getValueOrDefault(d.fontFamily,s.defaultFontFamily),x=e.fontString(m,b,v),y=u.tickMarkLength,k=e.getValueOrDefault(c.fontColor,s.defaultFontColor),S=e.getValueOrDefault(c.fontSize,s.defaultFontSize),w=e.getValueOrDefault(c.fontStyle,s.defaultFontStyle),C=e.getValueOrDefault(c.fontFamily,s.defaultFontFamily),M=e.fontString(S,w,C),D=e.toRadians(i.labelRotation),A=Math.cos(D),I=(Math.sin(D),i.longestLabelWidth*A);l.fillStyle=p;var F=[];if(g){if(o=!1,h&&(I/=2),(I+d.autoSkipPadding)*i.ticks.length>i.width-(i.paddingLeft+i.paddingRight)&&(o=1+Math.floor((I+d.autoSkipPadding)*i.ticks.length/(i.width-(i.paddingLeft+i.paddingRight)))),r&&i.ticks.length>r)for(;!o||i.ticks.length/(o||1)>r;)o||(o=1),o+=1;f||(o=!1)}var T="right"===n.position?i.left:i.right-y,P="right"===n.position?i.left+y:i.right,_="bottom"===n.position?i.top:i.bottom-y,R="bottom"===n.position?i.top+y:i.bottom;if(e.each(i.ticks,function(t,r){if(void 0!==t&&null!==t){var l=i.ticks.length===r+1,s=o>1&&r%o>0||r%o===0&&r+o>=i.ticks.length;if((!s||l)&&void 0!==t&&null!==t){var c,f;r===("undefined"!=typeof i.zeroLineIndex?i.zeroLineIndex:0)?(c=u.zeroLineWidth,f=u.zeroLineColor):(c=e.getValueAtIndexOrDefault(u.lineWidth,r),f=e.getValueAtIndexOrDefault(u.color,r));var p,m,b,v,x,k,S,w,C,M,A,I="middle";if(g){h||(I="top"===n.position?"bottom":"top"),A=h?"right":"center";var V=i.getPixelForTick(r)+e.aliasPixel(c);C=i.getPixelForTick(r,u.offsetGridLines)+d.labelOffset,M=h?i.top+12:"top"===n.position?i.bottom-y:i.top+y,p=b=x=S=V,m=_,v=R,k=a.top,w=a.bottom}else{"left"===n.position?d.mirror?(C=i.right+d.padding,A="left"):(C=i.right-d.padding,A="right"):d.mirror?(C=i.left-d.padding,A="right"):(C=i.left+d.padding,A="left");var O=i.getPixelForTick(r);O+=e.aliasPixel(c),M=i.getPixelForTick(r,u.offsetGridLines),p=T,b=P,x=a.left,S=a.right,m=v=k=w=O}F.push({tx1:p,ty1:m,tx2:b,ty2:v,x1:x,y1:k,x2:S,y2:w,labelX:C,labelY:M,glWidth:c,glColor:f,rotation:-1*D,label:t,textBaseline:I,textAlign:A})}}}),e.each(F,function(t){if(u.display&&(l.lineWidth=t.glWidth,l.strokeStyle=t.glColor,l.beginPath(),u.drawTicks&&(l.moveTo(t.tx1,t.ty1),l.lineTo(t.tx2,t.ty2)),u.drawOnChartArea&&(l.moveTo(t.x1,t.y1),l.lineTo(t.x2,t.y2)),l.stroke()),d.display){l.save(),l.translate(t.labelX,t.labelY),l.rotate(t.rotation),l.font=x,l.textBaseline=t.textBaseline,l.textAlign=t.textAlign;var a=t.label;if(e.isArray(a))for(var i=0,n=0;ie;++e){var o=t[e];if(o&&o.hasValue()){var r=o.tooltipPosition();i.push(r.x),n.push(r.y)}}var l=0,s=0;for(e=0,a-i.length;a>e;++e)l+=i[e],s+=n[e];return{x:Math.round(l/i.length),y:Math.round(s/i.length)}}function i(t){var e=t._xScale,a=t._yScale||t._scale,i=t._index,n=t._datasetIndex;return{xLabel:e?e.getLabelForIndex(i,n):"",yLabel:a?a.getLabelForIndex(i,n):"",index:i,datasetIndex:n}}var n=t.helpers;t.defaults.global.tooltips={enabled:!0,custom:null,mode:"single",backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,yAlign:"center",xAlign:"center",caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",callbacks:{beforeTitle:n.noop,title:function(t,e){var a="",i=e.labels,n=i?i.length:0;if(t.length>0){var o=t[0];o.xLabel?a=o.xLabel:n>0&&o.indexe;++e)g.push(i(d[e]));l.itemSort&&(g=g.sort(l.itemSort)),d.length>1&&n.each(g,function(t){h.push(l.callbacks.labelColor.call(r,t,c))}),n.extend(s,{title:r.getTitle(g,u),beforeBody:r.getBeforeBody(g,u),body:r.getBody(g,u),afterBody:r.getAfterBody(g,u),footer:r.getFooter(g,u),x:Math.round(f.x),y:Math.round(f.y),caretPadding:n.getValueOrDefault(f.padding,2),labelColors:h});var p=r.getTooltipSize(s);r.determineAlignment(p),n.extend(s,r.getBackgroundPoint(s,p))}else r._model.opacity=0;return t&&l.custom&&l.custom.call(r,s),r},getTooltipSize:function(t){var e=this._chart.ctx,a={height:2*t.yPadding,width:0},i=t.body,o=i.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);o+=t.beforeBody.length+t.afterBody.length;var r=t.title.length,l=t.footer.length,s=t.titleFontSize,d=t.bodyFontSize,u=t.footerFontSize;a.height+=r*s,a.height+=(r-1)*t.titleSpacing,a.height+=r?t.titleMarginBottom:0,a.height+=o*d,a.height+=o?(o-1)*t.bodySpacing:0,a.height+=l?t.footerMarginTop:0,a.height+=l*u,a.height+=l?(l-1)*t.footerSpacing:0;var c=0,h=function(t){a.width=Math.max(a.width,e.measureText(t).width+c)};return e.font=n.fontString(s,t._titleFontStyle,t._titleFontFamily),n.each(t.title,h),e.font=n.fontString(d,t._bodyFontStyle,t._bodyFontFamily),n.each(t.beforeBody.concat(t.afterBody),h),c=i.length>1?d+2:0,n.each(i,function(t){n.each(t.before,h),n.each(t.lines,h),n.each(t.after,h)}),c=0,e.font=n.fontString(u,t._footerFontStyle,t._footerFontFamily),n.each(t.footer,h),a.width+=2*t.xPadding,a},determineAlignment:function(t){var e=this,a=e._model,i=e._chart,n=e._chartInstance.chartArea;a.yi.height-t.height&&(a.yAlign="bottom");var o,r,l,s,d,u=(n.left+n.right)/2,c=(n.top+n.bottom)/2;"center"===a.yAlign?(o=function(t){return u>=t},r=function(t){return t>u}):(o=function(e){return e<=t.width/2},r=function(e){return e>=i.width-t.width/2}),l=function(e){return e+t.width>i.width},s=function(e){return e-t.width<0},d=function(t){return c>=t?"top":"bottom"},o(a.x)?(a.xAlign="left",l(a.x)&&(a.xAlign="center",a.yAlign=d(a.y))):r(a.x)&&(a.xAlign="right",s(a.x)&&(a.xAlign="center",a.yAlign=d(a.y)))},getBackgroundPoint:function(t,e){var a={x:t.x,y:t.y},i=t.caretSize,n=t.caretPadding,o=t.cornerRadius,r=t.xAlign,l=t.yAlign,s=i+n,d=o+n;return"right"===r?a.x-=e.width:"center"===r&&(a.x-=e.width/2),"top"===l?a.y+=s:"bottom"===l?a.y-=e.height+s:a.y-=e.height/2,"center"===l?"left"===r?a.x+=s:"right"===r&&(a.x-=s):"left"===r?a.x-=d:"right"===r&&(a.x+=d),a},drawCaret:function(t,e,a,i){var o,r,l,s,d,u,c=this._view,h=this._chart.ctx,f=c.caretSize,g=c.cornerRadius,p=c.xAlign,m=c.yAlign,b=t.x,v=t.y,x=e.width,y=e.height;"center"===m?("left"===p?(o=b,r=o-f,l=o):(o=b+x,r=o+f,l=o),d=v+y/2,s=d-f,u=d+f):("left"===p?(o=b+g,r=o+f,l=r+f):"right"===p?(o=b+x-g,r=o-f,l=r-f):(r=b+x/2,o=r-f,l=r+f),"top"===m?(s=v,d=s-f,u=s):(s=v+y,d=s+f,u=s));var k=n.color(c.backgroundColor);h.fillStyle=k.alpha(a*k.alpha()).rgbString(),h.beginPath(),h.moveTo(o,s),h.lineTo(r,d),h.lineTo(l,u),h.closePath(),h.fill()},drawTitle:function(t,e,a,i){var o=e.title;if(o.length){a.textAlign=e._titleAlign,a.textBaseline="top";var r=e.titleFontSize,l=e.titleSpacing,s=n.color(e.titleFontColor);a.fillStyle=s.alpha(i*s.alpha()).rgbString(),a.font=n.fontString(r,e._titleFontStyle,e._titleFontFamily);var d,u;for(d=0,u=o.length;u>d;++d)a.fillText(o[d],t.x,t.y),t.y+=r+l,d+1===o.length&&(t.y+=e.titleMarginBottom-l)}},drawBody:function(t,e,a,i){var o=e.bodyFontSize,r=e.bodySpacing,l=e.body;a.textAlign=e._bodyAlign,a.textBaseline="top";var s=n.color(e.bodyFontColor),d=s.alpha(i*s.alpha()).rgbString();a.fillStyle=d,a.font=n.fontString(o,e._bodyFontStyle,e._bodyFontFamily);var u=0,c=function(e){a.fillText(e,t.x+u,t.y),t.y+=o+r};n.each(e.beforeBody,c);var h=l.length>1;u=h?o+2:0,n.each(l,function(r,l){n.each(r.before,c),n.each(r.lines,function(r){h&&(a.fillStyle=n.color(e.legendColorBackground).alpha(i).rgbaString(),a.fillRect(t.x,t.y,o,o),a.strokeStyle=n.color(e.labelColors[l].borderColor).alpha(i).rgbaString(),a.strokeRect(t.x,t.y,o,o),a.fillStyle=n.color(e.labelColors[l].backgroundColor).alpha(i).rgbaString(),a.fillRect(t.x+1,t.y+1,o-2,o-2),a.fillStyle=d),c(r)}),n.each(r.after,c)}),u=0,n.each(e.afterBody,c),t.y-=r},drawFooter:function(t,e,a,i){var o=e.footer;if(o.length){t.y+=e.footerMarginTop,a.textAlign=e._footerAlign,a.textBaseline="top";var r=n.color(e.footerFontColor);a.fillStyle=r.alpha(i*r.alpha()).rgbString(),a.font=n.fontString(e.footerFontSize,e._footerFontStyle,e._footerFontFamily),n.each(o,function(i){a.fillText(i,t.x,t.y),t.y+=e.footerFontSize+e.footerSpacing})}},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var a=this.getTooltipSize(e),i={x:e.x,y:e.y},o=Math.abs(e.opacity<.001)?0:e.opacity;if(this._options.enabled){var r=n.color(e.backgroundColor);t.fillStyle=r.alpha(o*r.alpha()).rgbString(),n.drawRoundedRectangle(t,i.x,i.y,a.width,a.height,e.cornerRadius),t.fill(),this.drawCaret(i,a,o,e.caretPadding),i.x+=e.xPadding,i.y+=e.yPadding,this.drawTitle(i,e,t,o),this.drawBody(i,e,t,o),this.drawFooter(i,e,t,o)}}}})}},{}],34:[function(t,e,a){"use strict";e.exports=function(t,e){var a=t.helpers,i=t.defaults.global;i.elements.arc={backgroundColor:i.defaultColor,borderColor:"#fff",borderWidth:2},t.elements.Arc=t.Element.extend({inLabelRange:function(t){var e=this._view;return e?Math.pow(t-e.x,2)s;)s+=2*Math.PI;for(;o>s;)o-=2*Math.PI;for(;l>o;)o+=2*Math.PI;var d=o>=l&&s>=o,u=r>=i.innerRadius&&r<=i.outerRadius;return d&&u}return!1},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,a=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*a,y:t.y+Math.sin(e)*a}},draw:function(){var t=this._chart.ctx,e=this._view,a=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,a,i),t.arc(e.x,e.y,e.innerRadius,i,a,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})}},{}],35:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=t.defaults.global;t.defaults.global.elements.line={tension:.4,backgroundColor:a.defaultColor,borderWidth:3,borderColor:a.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",fill:!0},t.elements.Line=t.Element.extend({lineToNextPoint:function(t,e,a,i,n){var o=this,r=o._chart.ctx,l=o._view?o._view.spanGaps:!1;e._view.skip&&!l?i.call(o,t,e,a):t._view.skip&&!l?n.call(o,t,e,a):0===e._view.tension?r.lineTo(e._view.x,e._view.y):r.bezierCurveTo(t._view.controlPointNextX,t._view.controlPointNextY,e._view.controlPointPreviousX,e._view.controlPointPreviousY,e._view.x,e._view.y)},draw:function(){function t(t){r._view.skip||l._view.skip?t&&o.lineTo(i._view.scaleZero.x,i._view.scaleZero.y):o.bezierCurveTo(l._view.controlPointNextX,l._view.controlPointNextY,r._view.controlPointPreviousX,r._view.controlPointPreviousY,r._view.x,r._view.y)}var i=this,n=i._view,o=i._chart.ctx,r=i._children[0],l=i._children[i._children.length-1];o.save(),i._children.length>0&&n.fill&&(o.beginPath(),e.each(i._children,function(t,a){var r=e.previousItem(i._children,a),l=e.nextItem(i._children,a);0===a?(i._loop?o.moveTo(n.scaleZero.x,n.scaleZero.y):o.moveTo(t._view.x,n.scaleZero),t._view.skip?i._loop||o.moveTo(l._view.x,i._view.scaleZero):o.lineTo(t._view.x,t._view.y)):i.lineToNextPoint(r,t,l,function(t,e,a){i._loop?o.lineTo(i._view.scaleZero.x,i._view.scaleZero.y):(o.lineTo(t._view.x,i._view.scaleZero),o.moveTo(a._view.x,i._view.scaleZero))},function(t,e){o.lineTo(e._view.x,e._view.y)})},i),i._loop?t(!0):(o.lineTo(i._children[i._children.length-1]._view.x,n.scaleZero),o.lineTo(i._children[0]._view.x,n.scaleZero)),o.fillStyle=n.backgroundColor||a.defaultColor,o.closePath(),o.fill());var s=a.elements.line;o.lineCap=n.borderCapStyle||s.borderCapStyle,o.setLineDash&&o.setLineDash(n.borderDash||s.borderDash),o.lineDashOffset=n.borderDashOffset||s.borderDashOffset,o.lineJoin=n.borderJoinStyle||s.borderJoinStyle,o.lineWidth=n.borderWidth||s.borderWidth,o.strokeStyle=n.borderColor||a.defaultColor,o.beginPath(),e.each(i._children,function(t,a){var n=e.previousItem(i._children,a),r=e.nextItem(i._children,a);0===a?o.moveTo(t._view.x,t._view.y):i.lineToNextPoint(n,t,r,function(t,e,a){o.moveTo(a._view.x,a._view.y)},function(t,e){o.moveTo(e._view.x,e._view.y)})},i),i._loop&&i._children.length>0&&t(),o.stroke(),o.restore()}})}},{}],36:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=t.defaults.global,i=a.defaultColor;a.elements.point={radius:3,pointStyle:"circle",backgroundColor:i,borderWidth:1,borderColor:i,hitRadius:1,hoverRadius:4,hoverBorderWidth:1},t.elements.Point=t.Element.extend({inRange:function(t,e){var a=this._view;return a?Math.pow(t-a.x,2)+Math.pow(e-a.y,2)=h)){switch(u.strokeStyle=d.borderColor||i,u.lineWidth=e.getValueOrDefault(d.borderWidth,a.elements.point.borderWidth),u.fillStyle=d.backgroundColor||i,c){default:u.beginPath(),u.arc(f,g,h,0,2*Math.PI),u.closePath(),u.fill();break;case"triangle":u.beginPath(),n=3*h/Math.sqrt(3),l=n*Math.sqrt(3)/2,u.moveTo(f-n/2,g+l/3),u.lineTo(f+n/2,g+l/3),u.lineTo(f,g-2*l/3),u.closePath(),u.fill();break;case"rect":s=1/Math.SQRT2*h,u.fillRect(f-s,g-s,2*s,2*s),u.strokeRect(f-s,g-s,2*s,2*s);break;case"rectRot":s=1/Math.SQRT2*h,u.beginPath(),u.moveTo(f-s,g),u.lineTo(f,g+s),u.lineTo(f+s,g),u.lineTo(f,g-s),u.closePath(),u.fill();break;case"cross":u.beginPath(),u.moveTo(f,g+h),u.lineTo(f,g-h),u.moveTo(f-h,g),u.lineTo(f+h,g),u.closePath();break;case"crossRot":u.beginPath(),o=Math.cos(Math.PI/4)*h,r=Math.sin(Math.PI/4)*h,u.moveTo(f-o,g-r),u.lineTo(f+o,g+r),u.moveTo(f-o,g+r),u.lineTo(f+o,g-r),u.closePath();break;case"star":u.beginPath(),u.moveTo(f,g+h),u.lineTo(f,g-h),u.moveTo(f-h,g),u.lineTo(f+h,g),o=Math.cos(Math.PI/4)*h,r=Math.sin(Math.PI/4)*h,u.moveTo(f-o,g-r),u.lineTo(f+o,g+r),u.moveTo(f-o,g+r),u.lineTo(f+o,g-r),u.closePath();break;case"line":u.beginPath(),u.moveTo(f-h,g),u.lineTo(f+h,g),u.closePath();break;case"dash":u.beginPath(),u.moveTo(f,g),u.lineTo(f+h,g),u.closePath()}u.stroke()}}}})}},{}],37:[function(t,e,a){"use strict";e.exports=function(t){var e=(t.helpers,t.defaults.global);e.elements.rectangle={backgroundColor:e.defaultColor,borderWidth:0,borderColor:e.defaultColor,borderSkipped:"bottom"},t.elements.Rectangle=t.Element.extend({draw:function(){function t(t){return s[(u+t)%4]}var e=this._chart.ctx,a=this._view,i=a.width/2,n=a.x-i,o=a.x+i,r=a.base-(a.base-a.y),l=a.borderWidth/2;a.borderWidth&&(n+=l,o-=l,r+=l),e.beginPath(),e.fillStyle=a.backgroundColor,e.strokeStyle=a.borderColor,e.lineWidth=a.borderWidth;var s=[[n,a.base],[n,r],[o,r],[o,a.base]],d=["bottom","left","top","right"],u=d.indexOf(a.borderSkipped,0);-1===u&&(u=0),e.moveTo.apply(e,t(0));for(var c=1;4>c;c++)e.lineTo.apply(e,t(c));e.fill(),a.borderWidth&&e.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var a=this._view;return a?a.y=a.x-a.width/2&&t<=a.x+a.width/2&&e>=a.y&&e<=a.base:t>=a.x-a.width/2&&t<=a.x+a.width/2&&e>=a.base&&e<=a.y:!1},inLabelRange:function(t){var e=this._view;return e?t>=e.x-e.width/2&&t<=e.x+e.width/2:!1},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})}},{}],38:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a={position:"bottom"},i=t.Scale.extend({determineDataLimits:function(){var t=this;t.minIndex=0,t.maxIndex=t.chart.data.labels.length-1;var a;void 0!==t.options.ticks.min&&(a=e.indexOf(t.chart.data.labels,t.options.ticks.min),t.minIndex=-1!==a?a:t.minIndex),void 0!==t.options.ticks.max&&(a=e.indexOf(t.chart.data.labels,t.options.ticks.max),t.maxIndex=-1!==a?a:t.maxIndex),t.min=t.chart.data.labels[t.minIndex],t.max=t.chart.data.labels[t.maxIndex]},buildTicks:function(t){var e=this;e.ticks=0===e.minIndex&&e.maxIndex===e.chart.data.labels.length-1?e.chart.data.labels:e.chart.data.labels.slice(e.minIndex,e.maxIndex+1)},getLabelForIndex:function(t,e){return this.ticks[t]},getPixelForValue:function(t,e,a,i){var n=this,o=Math.max(n.maxIndex+1-n.minIndex-(n.options.gridLines.offsetGridLines?0:1),1);if(n.isHorizontal()){var r=n.width-(n.paddingLeft+n.paddingRight),l=r/o,s=l*(e-n.minIndex)+n.paddingLeft;return n.options.gridLines.offsetGridLines&&i&&(s+=l/2),n.left+Math.round(s)}var d=n.height-(n.paddingTop+n.paddingBottom),u=d/o,c=u*(e-n.minIndex)+n.paddingTop;return n.options.gridLines.offsetGridLines&&i&&(c+=u/2),n.top+Math.round(c)},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null,e)},getValueForPixel:function(t){var e,a=this,i=Math.max(a.ticks.length-(a.options.gridLines.offsetGridLines?0:1),1),n=a.isHorizontal(),o=n?a.width-(a.paddingLeft+a.paddingRight):a.height-(a.paddingTop+a.paddingBottom),r=o/i;return a.options.gridLines.offsetGridLines&&(t-=r/2),t-=n?a.paddingLeft:a.paddingTop,e=0>=t?0:Math.round(t/r)}});t.scaleService.registerScaleType("category",i,a)}},{}],39:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a={position:"left",ticks:{callback:function(t,a,i){var n=i.length>3?i[2]-i[1]:i[1]-i[0];Math.abs(n)>1&&t!==Math.floor(t)&&(n=t-Math.floor(t));var o=e.log10(Math.abs(n)),r="";if(0!==t){var l=-1*Math.floor(o);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r}}},i=t.LinearScaleBase.extend({determineDataLimits:function(){function t(t){return l?t.xAxisID===a.id:t.yAxisID===a.id}var a=this,i=a.options,n=(i.ticks,a.chart),o=n.data,r=o.datasets,l=a.isHorizontal();if(a.min=null,a.max=null,i.stacked){var s={},d=!1,u=!1;e.each(r,function(o,r){var l=n.getDatasetMeta(r);void 0===s[l.type]&&(s[l.type]={positiveValues:[],negativeValues:[]});var c=s[l.type].positiveValues,h=s[l.type].negativeValues;n.isDatasetVisible(r)&&t(l)&&e.each(o.data,function(t,e){var n=+a.getRightValue(t);isNaN(n)||l.data[e].hidden||(c[e]=c[e]||0,h[e]=h[e]||0,i.relativePoints?c[e]=100:0>n?(u=!0,h[e]+=n):(d=!0,c[e]+=n))})}),e.each(s,function(t){var i=t.positiveValues.concat(t.negativeValues),n=e.min(i),o=e.max(i);a.min=null===a.min?n:Math.min(a.min,n),a.max=null===a.max?o:Math.max(a.max,o)})}else e.each(r,function(i,o){var r=n.getDatasetMeta(o);n.isDatasetVisible(o)&&t(r)&&e.each(i.data,function(t,e){var i=+a.getRightValue(t);isNaN(i)||r.data[e].hidden||(null===a.min?a.min=i:ia.max&&(a.max=i))})});this.handleTickRangeOptions()},getTickLimit:function(){var a,i=this,n=i.options.ticks;if(i.isHorizontal())a=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(i.width/50));else{var o=e.getValueOrDefault(n.fontSize,t.defaults.global.defaultFontSize);a=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(i.height/(2*o)))}return a},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t,e,a,i){var n,o,r=this,l=r.paddingLeft,s=r.paddingBottom,d=r.start,u=+r.getRightValue(t),c=r.end-d;return r.isHorizontal()?(o=r.width-(l+r.paddingRight),n=r.left+o/c*(u-d),Math.round(n+l)):(o=r.height-(r.paddingTop+s),n=r.bottom-s-o/c*(u-d),Math.round(n))},getValueForPixel:function(t){var e=this,a=e.isHorizontal(),i=e.paddingLeft,n=e.paddingBottom,o=a?e.width-(i+e.paddingRight):e.height-(e.paddingTop+n),r=(a?t-e.left-i:e.bottom-n-t)/o;return e.start+(e.end-e.start)*r},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticksAsNumbers[t],null,null,e)}});t.scaleService.registerScaleType("linear",i,a)}},{}],40:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=e.noop;t.LinearScaleBase=t.Scale.extend({handleTickRangeOptions:function(){var t=this,a=t.options,i=a.ticks;if(i.beginAtZero){var n=e.sign(t.min),o=e.sign(t.max);0>n&&0>o?t.max=0:n>0&&o>0&&(t.min=0)}void 0!==i.min?t.min=i.min:void 0!==i.suggestedMin&&(t.min=Math.min(t.min,i.suggestedMin)),void 0!==i.max?t.max=i.max:void 0!==i.suggestedMax&&(t.max=Math.max(t.max,i.suggestedMax)),t.min===t.max&&(t.max++,i.beginAtZero||t.min--)},getTickLimit:a,handleDirectionalChanges:a,buildTicks:function(){var t=this,a=t.options,i=a.ticks,n=e.getValueOrDefault,o=(t.isHorizontal(),t.ticks=[]),r=t.getTickLimit();r=Math.max(2,r);var l,s=i.fixedStepSize&&i.fixedStepSize>0||i.stepSize&&i.stepSize>0;if(s)l=n(i.fixedStepSize,i.stepSize);else{var d=e.niceNum(t.max-t.min,!1);l=e.niceNum(d/(r-1),!0)}var u=Math.floor(t.min/l)*l,c=Math.ceil(t.max/l)*l,h=(c-u)/l;h=e.almostEquals(h,Math.round(h),l/1e3)?Math.round(h):Math.ceil(h),o.push(void 0!==i.min?i.min:u);for(var f=1;h>f;++f)o.push(u+f*l);o.push(void 0!==i.max?i.max:c),t.handleDirectionalChanges(),t.max=e.max(o),t.min=e.min(o),i.reverse?(o.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{}],41:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a={position:"left",ticks:{callback:function(t,a,i){var n=t/Math.pow(10,Math.floor(e.log10(t)));return 1===n||2===n||5===n||0===a||a===i.length-1?t.toExponential():""}}},i=t.Scale.extend({determineDataLimits:function(){function t(t){return d?t.xAxisID===a.id:t.yAxisID===a.id}var a=this,i=a.options,n=i.ticks,o=a.chart,r=o.data,l=r.datasets,s=e.getValueOrDefault,d=a.isHorizontal();if(a.min=null,a.max=null,i.stacked){var u={};e.each(l,function(n,r){var l=o.getDatasetMeta(r);o.isDatasetVisible(r)&&t(l)&&(void 0===u[l.type]&&(u[l.type]=[]),e.each(n.data,function(t,e){var n=u[l.type],o=+a.getRightValue(t);isNaN(o)||l.data[e].hidden||(n[e]=n[e]||0,i.relativePoints?n[e]=100:n[e]+=o)}))}),e.each(u,function(t){var i=e.min(t),n=e.max(t);a.min=null===a.min?i:Math.min(a.min,i),a.max=null===a.max?n:Math.max(a.max,n)})}else e.each(l,function(i,n){var r=o.getDatasetMeta(n);o.isDatasetVisible(n)&&t(r)&&e.each(i.data,function(t,e){var i=+a.getRightValue(t);isNaN(i)||r.data[e].hidden||(null===a.min?a.min=i:ia.max&&(a.max=i))})});a.min=s(n.min,a.min),a.max=s(n.max,a.max),a.min===a.max&&(0!==a.min&&null!==a.min?(a.min=Math.pow(10,Math.floor(e.log10(a.min))-1),a.max=Math.pow(10,Math.floor(e.log10(a.max))+1)):(a.min=1,a.max=10))},buildTicks:function(){for(var t=this,a=t.options,i=a.ticks,n=e.getValueOrDefault,o=t.ticks=[],r=n(i.min,Math.pow(10,Math.floor(e.log10(t.min))));rt.max&&(t.max=i))})}}),t.handleTickRangeOptions()},getTickLimit:function(){var t=this.options.ticks,i=e.getValueOrDefault(t.fontSize,a.defaultFontSize);return Math.min(t.maxTicksLimit?t.maxTicksLimit:11,Math.ceil(this.drawingArea/(1.5*i)))},convertTicksToLabels:function(){ +var e=this;t.LinearScaleBase.prototype.convertTicksToLabels.call(e),e.pointLabels=e.chart.data.labels.map(e.options.pointLabels.callback,e)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t,i,n,o,r,l,s,d,u,c,h,f,g=this.options.pointLabels,p=e.getValueOrDefault(g.fontSize,a.defaultFontSize),m=e.getValueOrDefault(g.fontStyle,a.defaultFontStyle),b=e.getValueOrDefault(g.fontFamily,a.defaultFontFamily),v=e.fontString(p,m,b),x=e.min([this.height/2-p-5,this.width/2]),y=this.width,k=0;for(this.ctx.font=v,i=0;iy&&(y=t.x+o,r=i),t.x-oy&&(y=t.x+n,r=i):i>this.getValueCount()/2&&t.x-ne&&0>a?a:e>0&&a>0?e:0)},draw:function(){var t=this,i=t.options,n=i.gridLines,o=i.ticks,r=i.angleLines,l=i.pointLabels,s=e.getValueOrDefault;if(i.display){var d=t.ctx,u=s(o.fontSize,a.defaultFontSize),c=s(o.fontStyle,a.defaultFontStyle),h=s(o.fontFamily,a.defaultFontFamily),f=e.fontString(u,c,h);if(e.each(t.ticks,function(r,l){if(l>0||i.reverse){var c=t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]),h=t.yCenter-c;if(n.display&&0!==l)if(d.strokeStyle=e.getValueAtIndexOrDefault(n.color,l-1),d.lineWidth=e.getValueAtIndexOrDefault(n.lineWidth,l-1),i.lineArc)d.beginPath(),d.arc(t.xCenter,t.yCenter,c,0,2*Math.PI),d.closePath(),d.stroke();else{d.beginPath();for(var g=0;g=0;x--){if(r.display){var y=t.getPointPosition(x,g);d.beginPath(),d.moveTo(t.xCenter,t.yCenter),d.lineTo(y.x,y.y),d.stroke(),d.closePath()}var k=t.getPointPosition(x,g+5),S=s(l.fontColor,a.defaultFontColor);d.font=v,d.fillStyle=S;var w=t.pointLabels,C=w.length,M=w.length/2,D=M/2,A=D>x||x>C-D,I=x===D||x===C-D;0===x?d.textAlign="center":x===M?d.textAlign="center":M>x?d.textAlign="left":d.textAlign="right",I?d.textBaseline="middle":A?d.textBaseline="bottom":d.textBaseline="top",d.fillText(w[x]?w[x]:"",k.x,k.y)}}}}});t.scaleService.registerScaleType("radialLinear",n,i)}},{}],43:[function(t,e,a){"use strict";var i=t(1);i="function"==typeof i?i:window.moment,e.exports=function(t){var e=t.helpers,a={units:[{name:"millisecond",steps:[1,2,5,10,20,50,100,250,500]},{name:"second",steps:[1,2,5,10,30]},{name:"minute",steps:[1,2,5,10,30]},{name:"hour",steps:[1,2,3,6,12]},{name:"day",steps:[1,2,5]},{name:"week",maxStep:4},{name:"month",maxStep:3},{name:"quarter",maxStep:4},{name:"year",maxStep:!1}]},n={position:"bottom",time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,displayFormats:{millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm:ss a",hour:"MMM D, hA",day:"ll",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"}},ticks:{autoSkip:!1}},o=t.Scale.extend({initialize:function(){if(!i)throw new Error("Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com");t.Scale.prototype.initialize.call(this)},getLabelMoment:function(t,e){return this.labelMoments[t][e]},getMomentStartOf:function(t){var e=this;return"week"===e.options.time.unit&&e.options.time.isoWeekday!==!1?t.clone().startOf("isoWeek").isoWeekday(e.options.time.isoWeekday):t.clone().startOf(e.tickUnit)},determineDataLimits:function(){var t=this;t.labelMoments=[];var a=[];t.chart.data.labels&&t.chart.data.labels.length>0?(e.each(t.chart.data.labels,function(e,i){var n=t.parseTime(e);n.isValid()&&(t.options.time.round&&n.startOf(t.options.time.round),a.push(n))},t),t.firstTick=i.min.call(t,a),t.lastTick=i.max.call(t,a)):(t.firstTick=null,t.lastTick=null),e.each(t.chart.data.datasets,function(n,o){var r=[],l=t.chart.isDatasetVisible(o);"object"==typeof n.data[0]&&null!==n.data[0]?e.each(n.data,function(e,a){var n=t.parseTime(t.getRightValue(e));n.isValid()&&(t.options.time.round&&n.startOf(t.options.time.round),r.push(n),l&&(t.firstTick=null!==t.firstTick?i.min(t.firstTick,n):n,t.lastTick=null!==t.lastTick?i.max(t.lastTick,n):n))},t):r=a,t.labelMoments.push(r)},t),t.options.time.min&&(t.firstTick=t.parseTime(t.options.time.min)),t.options.time.max&&(t.lastTick=t.parseTime(t.options.time.max)),t.firstTick=(t.firstTick||i()).clone(),t.lastTick=(t.lastTick||i()).clone()},buildTicks:function(i){var n=this;n.ctx.save();var o=e.getValueOrDefault(n.options.ticks.fontSize,t.defaults.global.defaultFontSize),r=e.getValueOrDefault(n.options.ticks.fontStyle,t.defaults.global.defaultFontStyle),l=e.getValueOrDefault(n.options.ticks.fontFamily,t.defaults.global.defaultFontFamily),s=e.fontString(o,r,l);if(n.ctx.font=s,n.ticks=[],n.unitScale=1,n.scaleSizeInUnits=0,n.options.time.unit)n.tickUnit=n.options.time.unit||"day",n.displayFormat=n.options.time.displayFormats[n.tickUnit],n.scaleSizeInUnits=n.lastTick.diff(n.firstTick,n.tickUnit,!0),n.unitScale=e.getValueOrDefault(n.options.time.unitStepSize,1);else{var d=n.isHorizontal()?n.width-(n.paddingLeft+n.paddingRight):n.height-(n.paddingTop+n.paddingBottom),u=n.tickFormatFunction(n.firstTick,0,[]),c=n.ctx.measureText(u).width,h=Math.cos(e.toRadians(n.options.ticks.maxRotation)),f=Math.sin(e.toRadians(n.options.ticks.maxRotation));c=c*h+o*f;var g=d/c;n.tickUnit="millisecond",n.scaleSizeInUnits=n.lastTick.diff(n.firstTick,n.tickUnit,!0),n.displayFormat=n.options.time.displayFormats[n.tickUnit];for(var p=0,m=a.units[p];p=Math.ceil(n.scaleSizeInUnits/g)){n.unitScale=e.getValueOrDefault(n.options.time.unitStepSize,m.steps[b]);break}break}if(m.maxStep===!1||Math.ceil(n.scaleSizeInUnits/g)=0)break;S%n.unitScale===0&&n.ticks.push(w)}var C=n.ticks[n.ticks.length-1].diff(n.lastTick,n.tickUnit);(0!==C||0===n.scaleSizeInUnits)&&(n.options.time.max?(n.ticks.push(n.lastTick.clone()),n.scaleSizeInUnits=n.lastTick.diff(n.ticks[0],n.tickUnit,!0)):(n.ticks.push(n.lastTick.clone()),n.scaleSizeInUnits=n.lastTick.diff(n.firstTick,n.tickUnit,!0))),n.ctx.restore()},getLabelForIndex:function(t,e){var a=this,i=a.chart.data.labels&&tb;b++)if(b in this&&this[b]===a)return b;return-1};for(t={catchupTime:500,initialRate:.03,minTime:500,ghostTime:500,maxProgressPerFrame:10,easeFactor:1.25,startOnPageLoad:!0,restartOnPushState:!0,restartOnRequestAfter:500,target:"body",elements:{checkInterval:100,selectors:["body"]},eventLag:{minSamples:10,sampleCount:3,lagThreshold:3},ajax:{trackMethods:["GET"],trackWebSockets:!0,ignoreURLs:[]}},B=function(){var a;return null!=(a="undefined"!=typeof performance&&null!==performance&&"function"==typeof performance.now?performance.now():void 0)?a:+new Date},D=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,s=window.cancelAnimationFrame||window.mozCancelAnimationFrame,null==D&&(D=function(a){return setTimeout(a,50)},s=function(a){return clearTimeout(a)}),F=function(a){var b,c;return b=B(),(c=function(){var d;return d=B()-b,d>=33?(b=B(),a(d,function(){return D(c)})):setTimeout(c,33-d)})()},E=function(){var a,b,c;return c=arguments[0],b=arguments[1],a=3<=arguments.length?W.call(arguments,2):[],"function"==typeof c[b]?c[b].apply(c,a):c[b]},u=function(){var a,b,c,d,e,f,g;for(b=arguments[0],d=2<=arguments.length?W.call(arguments,1):[],f=0,g=d.length;g>f;f++)if(c=d[f])for(a in c)X.call(c,a)&&(e=c[a],null!=b[a]&&"object"==typeof b[a]&&null!=e&&"object"==typeof e?u(b[a],e):b[a]=e);return b},p=function(a){var b,c,d,e,f;for(c=b=0,e=0,f=a.length;f>e;e++)d=a[e],c+=Math.abs(d),b++;return c/b},w=function(a,b){var c,d,e;if(null==a&&(a="options"),null==b&&(b=!0),e=document.querySelector("[data-pace-"+a+"]")){if(c=e.getAttribute("data-pace-"+a),!b)return c;try{return JSON.parse(c)}catch(f){return d=f,"undefined"!=typeof console&&null!==console?console.error("Error parsing inline pace options",d):void 0}}},g=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];cP;P++)J=T[P],C[J]===!0&&(C[J]=t[J]);i=function(a){function b(){return U=b.__super__.constructor.apply(this,arguments)}return Y(b,a),b}(Error),b=function(){function a(){this.progress=0}return a.prototype.getElement=function(){var a;if(null==this.el){if(a=document.querySelector(C.target),!a)throw new i;this.el=document.createElement("div"),this.el.className="pace pace-active",document.body.className=document.body.className.replace(/pace-done/g,""),document.body.className+=" pace-running",this.el.innerHTML='
    \n
    \n
    \n
    ',null!=a.firstChild?a.insertBefore(this.el,a.firstChild):a.appendChild(this.el)}return this.el},a.prototype.finish=function(){var a;return a=this.getElement(),a.className=a.className.replace("pace-active",""),a.className+=" pace-inactive",document.body.className=document.body.className.replace("pace-running",""),document.body.className+=" pace-done"},a.prototype.update=function(a){return this.progress=a,this.render()},a.prototype.destroy=function(){try{this.getElement().parentNode.removeChild(this.getElement())}catch(a){i=a}return this.el=void 0},a.prototype.render=function(){var a,b;return null==document.querySelector(C.target)?!1:(a=this.getElement(),a.children[0].style.width=""+this.progress+"%",(!this.lastRenderedProgress||this.lastRenderedProgress|0!==this.progress|0)&&(a.children[0].setAttribute("data-progress-text",""+(0|this.progress)+"%"),this.progress>=100?b="99":(b=this.progress<10?"0":"",b+=0|this.progress),a.children[0].setAttribute("data-progress",""+b)),this.lastRenderedProgress=this.progress)},a.prototype.done=function(){return this.progress>=100},a}(),h=function(){function a(){this.bindings={}}return a.prototype.trigger=function(a,b){var c,d,e,f,g;if(null!=this.bindings[a]){for(f=this.bindings[a],g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(c.call(this,b));return g}},a.prototype.on=function(a,b){var c;return null==(c=this.bindings)[a]&&(c[a]=[]),this.bindings[a].push(b)},a}(),O=window.XMLHttpRequest,N=window.XDomainRequest,M=window.WebSocket,v=function(a,b){var c,d,e,f;f=[];for(d in b.prototype)try{e=b.prototype[d],f.push(null==a[d]&&"function"!=typeof e?a[d]=e:void 0)}catch(g){c=g}return f},z=[],Pace.ignore=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?W.call(arguments,1):[],z.unshift("ignore"),c=b.apply(null,a),z.shift(),c},Pace.track=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?W.call(arguments,1):[],z.unshift("track"),c=b.apply(null,a),z.shift(),c},I=function(a){var b;if(null==a&&(a="GET"),"track"===z[0])return"force";if(!z.length&&C.ajax){if("socket"===a&&C.ajax.trackWebSockets)return!0;if(b=a.toUpperCase(),Z.call(C.ajax.trackMethods,b)>=0)return!0}return!1},j=function(a){function b(){var a,c=this;b.__super__.constructor.apply(this,arguments),a=function(a){var b;return b=a.open,a.open=function(d,e){return I(d)&&c.trigger("request",{type:d,url:e,request:a}),b.apply(a,arguments)}},window.XMLHttpRequest=function(b){var c;return c=new O(b),a(c),c},v(window.XMLHttpRequest,O),null!=N&&(window.XDomainRequest=function(){var b;return b=new N,a(b),b},v(window.XDomainRequest,N)),null!=M&&C.ajax.trackWebSockets&&(window.WebSocket=function(a,b){var d;return d=null!=b?new M(a,b):new M(a),I("socket")&&c.trigger("request",{type:"socket",url:a,protocols:b,request:d}),d},v(window.WebSocket,M))}return Y(b,a),b}(h),Q=null,x=function(){return null==Q&&(Q=new j),Q},H=function(a){var b,c,d,e;for(e=C.ajax.ignoreURLs,c=0,d=e.length;d>c;c++)if(b=e[c],"string"==typeof b){if(-1!==a.indexOf(b))return!0}else if(b.test(a))return!0;return!1},x().on("request",function(b){var c,d,e,f,g;return f=b.type,e=b.request,g=b.url,H(g)?void 0:Pace.running||C.restartOnRequestAfter===!1&&"force"!==I(f)?void 0:(d=arguments,c=C.restartOnRequestAfter||0,"boolean"==typeof c&&(c=0),setTimeout(function(){var b,c,g,h,i,j;if(b="socket"===f?e.readyState<2:0<(h=e.readyState)&&4>h){for(Pace.restart(),i=Pace.sources,j=[],c=0,g=i.length;g>c;c++){if(J=i[c],J instanceof a){J.watch.apply(J,d);break}j.push(void 0)}return j}},c))}),a=function(){function a(){var a=this;this.elements=[],x().on("request",function(){return a.watch.apply(a,arguments)})}return a.prototype.watch=function(a){var b,c,d,e;return d=a.type,b=a.request,e=a.url,H(e)?void 0:(c="socket"===d?new m(b):new n(b),this.elements.push(c))},a}(),n=function(){function a(a){var b,c,d,e,f,g,h=this;if(this.progress=0,null!=window.ProgressEvent)for(c=null,a.addEventListener("progress",function(a){return h.progress=a.lengthComputable?100*a.loaded/a.total:h.progress+(100-h.progress)/2}),g=["load","abort","timeout","error"],d=0,e=g.length;e>d;d++)b=g[d],a.addEventListener(b,function(){return h.progress=100});else f=a.onreadystatechange,a.onreadystatechange=function(){var b;return 0===(b=a.readyState)||4===b?h.progress=100:3===a.readyState&&(h.progress=50),"function"==typeof f?f.apply(null,arguments):void 0}}return a}(),m=function(){function a(a){var b,c,d,e,f=this;for(this.progress=0,e=["error","open"],c=0,d=e.length;d>c;c++)b=e[c],a.addEventListener(b,function(){return f.progress=100})}return a}(),d=function(){function a(a){var b,c,d,f;for(null==a&&(a={}),this.elements=[],null==a.selectors&&(a.selectors=[]),f=a.selectors,c=0,d=f.length;d>c;c++)b=f[c],this.elements.push(new e(b))}return a}(),e=function(){function a(a){this.selector=a,this.progress=0,this.check()}return a.prototype.check=function(){var a=this;return document.querySelector(this.selector)?this.done():setTimeout(function(){return a.check()},C.elements.checkInterval)},a.prototype.done=function(){return this.progress=100},a}(),c=function(){function a(){var a,b,c=this;this.progress=null!=(b=this.states[document.readyState])?b:100,a=document.onreadystatechange,document.onreadystatechange=function(){return null!=c.states[document.readyState]&&(c.progress=c.states[document.readyState]),"function"==typeof a?a.apply(null,arguments):void 0}}return a.prototype.states={loading:0,interactive:50,complete:100},a}(),f=function(){function a(){var a,b,c,d,e,f=this;this.progress=0,a=0,e=[],d=0,c=B(),b=setInterval(function(){var g;return g=B()-c-50,c=B(),e.push(g),e.length>C.eventLag.sampleCount&&e.shift(),a=p(e),++d>=C.eventLag.minSamples&&a=100&&(this.done=!0),b===this.last?this.sinceLastUpdate+=a:(this.sinceLastUpdate&&(this.rate=(b-this.last)/this.sinceLastUpdate),this.catchup=(b-this.progress)/C.catchupTime,this.sinceLastUpdate=0,this.last=b),b>this.progress&&(this.progress+=this.catchup*a),c=1-Math.pow(this.progress/100,C.easeFactor),this.progress+=c*this.rate*a,this.progress=Math.min(this.lastProgress+C.maxProgressPerFrame,this.progress),this.progress=Math.max(0,this.progress),this.progress=Math.min(100,this.progress),this.lastProgress=this.progress,this.progress},a}(),K=null,G=null,q=null,L=null,o=null,r=null,Pace.running=!1,y=function(){return C.restartOnPushState?Pace.restart():void 0},null!=window.history.pushState&&(S=window.history.pushState,window.history.pushState=function(){return y(),S.apply(window.history,arguments)}),null!=window.history.replaceState&&(V=window.history.replaceState,window.history.replaceState=function(){return y(),V.apply(window.history,arguments)}),k={ajax:a,elements:d,document:c,eventLag:f},(A=function(){var a,c,d,e,f,g,h,i;for(Pace.sources=K=[],g=["ajax","elements","document","eventLag"],c=0,e=g.length;e>c;c++)a=g[c],C[a]!==!1&&K.push(new k[a](C[a]));for(i=null!=(h=C.extraSources)?h:[],d=0,f=i.length;f>d;d++)J=i[d],K.push(new J(C));return Pace.bar=q=new b,G=[],L=new l})(),Pace.stop=function(){return Pace.trigger("stop"),Pace.running=!1,q.destroy(),r=!0,null!=o&&("function"==typeof s&&s(o),o=null),A()},Pace.restart=function(){return Pace.trigger("restart"),Pace.stop(),Pace.start()},Pace.go=function(){var a;return Pace.running=!0,q.render(),a=B(),r=!1,o=F(function(b,c){var d,e,f,g,h,i,j,k,m,n,o,p,s,t,u,v;for(k=100-q.progress,e=o=0,f=!0,i=p=0,t=K.length;t>p;i=++p)for(J=K[i],n=null!=G[i]?G[i]:G[i]=[],h=null!=(v=J.elements)?v:[J],j=s=0,u=h.length;u>s;j=++s)g=h[j],m=null!=n[j]?n[j]:n[j]=new l(g),f&=m.done,m.done||(e++,o+=m.tick(b));return d=o/e,q.update(L.tick(b,d)),q.done()||f||r?(q.update(100),Pace.trigger("done"),setTimeout(function(){return q.finish(),Pace.running=!1,Pace.trigger("hide")},Math.max(C.ghostTime,Math.max(C.minTime-(B()-a),0)))):c()})},Pace.start=function(a){u(C,a),Pace.running=!0;try{q.render()}catch(b){i=b}return document.querySelector(".pace")?(Pace.trigger("start"),Pace.go()):setTimeout(Pace.start,50)},"function"==typeof define&&define.amd?define(function(){return Pace}):"object"==typeof exports?module.exports=Pace:C.startOnPageLoad&&Pace.start()}).call(this); \ No newline at end of file diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..39d3ef8 --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,21 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "module": "esnext", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es2015", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2017", + "dom", + "ES2017.object" + ] + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..26abde9 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +/* + This is a "Solution Style" tsconfig.json file, and is used by editors and TypeScript’s language server to improve development experience. + It is not intended to be used to perform a compilation. + + To learn more about this file see: https://angular.io/config/solution-tsconfig. +*/ +{ + "files": [], + "references": [ + { + "path": "./src/tsconfig.app.json" + }, + { + "path": "./src/tsconfig.spec.json" + } + ] +} \ No newline at end of file diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..3441ecc --- /dev/null +++ b/tslint.json @@ -0,0 +1,142 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "deprecation": { + "severity": "warning" + }, + "eofline": true, + "forin": true, + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-super": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-misused-new": true, + "no-non-null-assertion": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, + "no-unused-expression": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "typeof-compare": true, + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ], + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "no-inputs-metadata-property": true, + "no-outputs-metadata-property": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-output-rename": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true, + "invoke-injectable": true + } +}