commit e147c3c818af01544170446e9cda425a9850ca52 Author: Richard Park Date: Sat Aug 17 22:03:21 2019 +0900 project is initialized diff --git a/README.md b/README.md new file mode 100644 index 0000000..c3b85d7 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# Frontend + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.1.2. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/angular.json b/angular.json new file mode 100644 index 0000000..637f31f --- /dev/null +++ b/angular.json @@ -0,0 +1,132 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "frontend": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "apm", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/frontend", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "aot": false, + "assets": ["src/favicon.ico", "src/assets"], + "styles": ["src/styles.scss"], + "scripts": [] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + } + ] + }, + "hmr": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.hmr.ts" + } + ] + }, + "ec": { + "sourceMap": true, + "extractCss": true + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "frontend:build" + }, + "configurations": { + "production": { + "browserTarget": "frontend:build:production" + }, + "hmr": { + "hmr": true, + "browserTarget": "frontend:build:hmr" + }, + "ec": { + "browserTarget": "frontend:build:ec" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "frontend:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": ["src/favicon.ico", "src/assets"], + "styles": ["src/styles.scss"], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "tsconfig.app.json", + "tsconfig.spec.json", + "e2e/tsconfig.json" + ], + "exclude": ["**/node_modules/**"] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "frontend:serve" + }, + "configurations": { + "production": { + "devServerTarget": "frontend:serve:production" + } + } + } + } + } + }, + "defaultProject": "frontend" +} diff --git a/browserslist b/browserslist new file mode 100644 index 0000000..8084853 --- /dev/null +++ b/browserslist @@ -0,0 +1,12 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/e2e/protractor.conf.js b/e2e/protractor.conf.js new file mode 100644 index 0000000..73e4e68 --- /dev/null +++ b/e2e/protractor.conf.js @@ -0,0 +1,32 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.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: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; \ No newline at end of file diff --git a/e2e/src/app.e2e-spec.ts b/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000..1b41240 --- /dev/null +++ b/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getTitleText()).toEqual('Welcome to frontend!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + } as logging.Entry)); + }); +}); diff --git a/e2e/src/app.po.ts b/e2e/src/app.po.ts new file mode 100644 index 0000000..84c9275 --- /dev/null +++ b/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get(browser.baseUrl) as Promise; + } + + getTitleText() { + return element(by.css('apm-root h1')).getText() as Promise; + } +} diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json new file mode 100644 index 0000000..39b800f --- /dev/null +++ b/e2e/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000..d26663c --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,32 @@ +// 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/frontend'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5158dcf --- /dev/null +++ b/package-lock.json @@ -0,0 +1,13798 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.801.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.801.2.tgz", + "integrity": "sha512-gdPdT6y3TDA3hzTAlI3Ym8QB8Zj8kqAMzDwP1JSXxekF6md0qc+NK7WCu6Y+pj1Bbo5mXpxHBov4Xwv1l4STQA==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.2", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/build-angular": { + "version": "0.801.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.801.2.tgz", + "integrity": "sha512-PXwqvogl/brFjWhQMJoBTif5cGs5w1O/dahNaW3s9qbPGOg0E0nta+K8F/lL8x2pksslQi0jui6CeP1Yv+i1aA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.801.2", + "@angular-devkit/build-optimizer": "0.801.2", + "@angular-devkit/build-webpack": "0.801.2", + "@angular-devkit/core": "8.1.2", + "@ngtools/webpack": "8.1.2", + "ajv": "6.10.0", + "autoprefixer": "9.6.0", + "browserslist": "4.6.3", + "caniuse-lite": "1.0.30000979", + "circular-dependency-plugin": "5.0.2", + "clean-css": "4.2.1", + "copy-webpack-plugin": "5.0.3", + "core-js": "3.1.4", + "file-loader": "4.0.0", + "glob": "7.1.4", + "istanbul-instrumenter-loader": "3.0.1", + "karma-source-map-support": "1.4.0", + "less": "3.9.0", + "less-loader": "5.0.0", + "license-webpack-plugin": "2.1.1", + "loader-utils": "1.2.3", + "mini-css-extract-plugin": "0.7.0", + "minimatch": "3.0.4", + "open": "6.4.0", + "parse5": "4.0.0", + "postcss": "7.0.17", + "postcss-import": "12.0.1", + "postcss-loader": "3.0.0", + "raw-loader": "1.0.0", + "rxjs": "6.4.0", + "sass": "1.22.2", + "sass-loader": "7.1.0", + "semver": "6.2.0", + "source-map-loader": "0.2.4", + "source-map-support": "0.5.12", + "speed-measure-webpack-plugin": "1.3.1", + "style-loader": "0.23.1", + "stylus": "0.54.5", + "stylus-loader": "3.0.2", + "terser-webpack-plugin": "1.3.0", + "tree-kill": "1.2.1", + "webpack": "4.35.2", + "webpack-dev-middleware": "3.7.0", + "webpack-dev-server": "3.7.2", + "webpack-merge": "4.2.1", + "webpack-sources": "1.3.0", + "webpack-subresource-integrity": "1.1.0-rc.6", + "worker-plugin": "3.1.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/build-ng-packagr": { + "version": "0.801.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.801.2.tgz", + "integrity": "sha512-VZZiX+V7uLMgLg0pjgh1fFjqQmhBaoo1U0F5tqD3dKeBjLe1cvhLOaArAtlt5FEETudR6xjUrQyF+BhRlYPeDg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.801.2", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.801.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.801.2.tgz", + "integrity": "sha512-BwbRn+11MpR4XjVLoFZZY1DAPCnft/5z6g6kfbTmoJNm6TD7+KypCEXw3MzdGt9vp085XJibc405R1QmmrOF+g==", + "dev": true, + "requires": { + "loader-utils": "1.2.3", + "source-map": "0.5.6", + "typescript": "3.4.5", + "webpack-sources": "1.3.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.801.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.801.2.tgz", + "integrity": "sha512-xy0MHLaXw4pz0NEg7fNyPjXdKkjeLAI6T2fnzYbLw3TJOqVe9y7p5uDLWa2/wp66mk34gcM/7A0ILqaIJ/ytGg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.801.2", + "@angular-devkit/core": "8.1.2", + "rxjs": "6.4.0", + "webpack-merge": "4.2.1" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/core": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.1.2.tgz", + "integrity": "sha512-sNkqXbkHE9+ObtLOYmDKJL1bOf1zY0AwGVKemgDqCmu1mRUNqhb7CmF13DRscfU3MEcuiJYDjXqBQDjIszrFiw==", + "dev": true, + "requires": { + "ajv": "6.10.0", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/schematics": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.1.2.tgz", + "integrity": "sha512-Di/3vPR4jwdYcMAk13t19sAF0qQUH8KSkFcmO/5E/gECTL1tXNvV690K1Vhn6zpeE17Z1MLB5HwRNcb6nJkD+Q==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.2", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular/animations": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.1.2.tgz", + "integrity": "sha512-szR5qzRe6vS1qrPhV2p5fMp5vQxT2SaljXGs3Xgt2Tl23om0XVNcqK0I8NNuK/ehuJ5LXQ1fJHniGcmN2aUw0g==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/cdk": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-8.1.1.tgz", + "integrity": "sha512-5hBmhrHf9+WjGVIT8gbhT0Nh37BAjgI2TGRkt1o4qX8cG+1B6gU2MxM+CDJ7PhxSJi9lW93lq2AMuWwnRSllyg==", + "requires": { + "parse5": "^5.0.0", + "tslib": "^1.7.1" + }, + "dependencies": { + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "optional": true + } + } + }, + "@angular/cli": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.1.2.tgz", + "integrity": "sha512-Zz9WGqPgr+w9SfpDeKLPzGFLZaX7uu2kU7/r6vxvnESJcnoxKOJBf+ipXu42TY7D3FtSiPBO27GBTSVgPCseoQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.801.2", + "@angular-devkit/core": "8.1.2", + "@angular-devkit/schematics": "8.1.2", + "@schematics/angular": "8.1.2", + "@schematics/update": "0.801.2", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.0", + "debug": "^4.1.1", + "ini": "1.3.5", + "inquirer": "6.4.1", + "npm-package-arg": "6.1.0", + "open": "6.4.0", + "pacote": "9.5.1", + "read-package-tree": "5.3.1", + "semver": "6.2.0", + "symbol-observable": "1.2.0", + "universal-analytics": "^0.4.20", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.0.tgz", + "integrity": "sha512-3NkLpm6I6kEgC8J0I9EZ0fouXc/mm5J9zqJFCgA2jGqmsL0O64I7Uvi3AmUMnnRqc6u7uLgVVnY4pyBQ03nCiw==", + "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 + } + } + }, + "@angular/common": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.1.2.tgz", + "integrity": "sha512-bywFofN5RjcvygYEC/3eo+bfUnYBmARA6DPau8fm6D2ZGpXrWXJ3Thd99ZesuuffvpniaIHlAjbHGI83XSnixQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.1.2.tgz", + "integrity": "sha512-oRkHrstOV6imbb4mGf6q20d4N4iYfBbI6WfxtPL4dz08GipGg4Zvekn4e3R01vzhFBxssGcgmeEtFQJh/UzI8g==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler-cli": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.1.2.tgz", + "integrity": "sha512-Dxm99iuv265AlUf3aX3nRl+Iqrj3RvlQgPOYLsV1EEVnA2+4Mjj52zbKgdOOOfhCF48imVbaU45Sh8p2l1xdOw==", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "^2.1.1", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "source-map": "^0.6.1", + "tslib": "^1.9.0", + "yargs": "13.1.0" + }, + "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 + }, + "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" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + }, + "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-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-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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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": "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" + } + }, + "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" + } + }, + "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" + } + }, + "yargs": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", + "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "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.0.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "@angular/core": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.1.2.tgz", + "integrity": "sha512-Gm/UIUnIkeah39vxi4enVH/CUcPZOgGDyw4RNagw4pH8dTP8V0RUz8uteOr3DS+Eh49BcHkrT2oU5MBZSZ3lvw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/flex-layout": { + "version": "8.0.0-beta.26", + "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-8.0.0-beta.26.tgz", + "integrity": "sha512-lXDLlMSNQhidW0grvisIsj/3gqLuYyN2MvABuRYybnFTc233sXGZuOAaulqq663LA0/DP/GNcz6a+A4ZAAlmPA==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/forms": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.1.2.tgz", + "integrity": "sha512-DHqbWt6AGnLkNajLZUAH4yQrxZdgUkjzEW6oxwvS2PxmLIrppz4TYWizfAVQndZ1Ddl7Eo1zRoRzqqHT90XyGA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/language-service": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-8.1.2.tgz", + "integrity": "sha512-9DR5TclsEpMIzCmagLHKYDTAqcZUkZKPjkngqIAUJg5R4IUjsuYn8NZX+agoOrS4ky6Dy9FXGYUC+QB0iEiycg==", + "dev": true + }, + "@angular/material": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-8.1.1.tgz", + "integrity": "sha512-45aaxKuLTrthzhAhG2+OY86wafuRBteZcRjDG7rKZ3Cc3KteUp5QwAi+QbhHzs4O3WXLWTAmuLYJelRqRqqw7g==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/material-moment-adapter": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-8.1.1.tgz", + "integrity": "sha512-tptfSOypLX39C2bXNdhrM9L2V5F8swG2dUQrh6Jb0HZUs0qDsXE5Kq+TB31IzG0XLobvViuImQj8TXbcoKyQmw==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/platform-browser": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.1.2.tgz", + "integrity": "sha512-n61OtH3B0e+LTHCfHPjB7hiuo0ZxKxZvNWigczGyLZf2abga5jac2bNrdZnU8zXC44AUfasUD2qDS2IPIhNbqA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.1.2.tgz", + "integrity": "sha512-NmbGMwKPbYq3ZFt6nOqRslJsQNRS2E94cjkSLseEb5wauUmdUBX9stoHu8BOhvd+EIEcYhD7uxPB+L/qPsH46g==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/router": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.1.2.tgz", + "integrity": "sha512-+SWoYZHyDBBUydDTbIu+hyoGzWtSA4VUsriUPWEOCplzQiabFhWxVvcT00mO0cim4XfupL1tmiPjE66sivLYBw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angularclass/hmr": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@angularclass/hmr/-/hmr-2.1.3.tgz", + "integrity": "sha1-NOZY7T2jfyOwogDi2lqJvpK7IJ8=", + "dev": true + }, + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "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-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "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.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "dev": true + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "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" + } + }, + "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 + }, + "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 + } + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "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 + } + } + }, + "@ngrx/effects": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-8.1.0.tgz", + "integrity": "sha512-JQKD39Itsq70Mlq8kJ/yQuVbM08luAUexMqyi5HECe8izyRNkcIGJFh/2VkQSMLUGSNkU7qnT7y7xug8GA+AGA==" + }, + "@ngrx/router-store": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ngrx/router-store/-/router-store-8.1.0.tgz", + "integrity": "sha512-mS1yfB5fsE9Vh4SFhWZS51KOSxrTBdaU3PZfLS+v+NOpiDUPM8Ja3lIGQvo9yUd3sky/IGhzbZ4Qn8MZmwHFrg==" + }, + "@ngrx/store": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-8.1.0.tgz", + "integrity": "sha512-1Pfe8uLoEjfLyXpX2UoqeSzYz4yPhsTlMVHIP7EybLD9YC/IrhecnCMmBCkNpJDRBQYqmJPbfUBrp8/q9wcB6g==" + }, + "@ngrx/store-devtools": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-8.1.0.tgz", + "integrity": "sha512-1xqZR728Jev2bjV/KDxFCT+B1aGhbIWbn3yeAm/gPyDGaJAmaQlBdE6M8Yxjsr3kCffwyPv8jtD3ekdY47l2VA==", + "dev": true + }, + "@ngtools/json-schema": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.1.0.tgz", + "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=", + "dev": true + }, + "@ngtools/webpack": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.1.2.tgz", + "integrity": "sha512-xA1SZI6BiEqmfxyaxw2TobF3gkZdfyEeCP1zhPm38PjQ1zU7Xx3TbvxTeMKGV3EOTMxvUETDiS65YJrIvGnaNA==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.2", + "enhanced-resolve": "4.1.0", + "rxjs": "6.4.0", + "tree-kill": "1.2.1", + "webpack-sources": "1.3.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@ngx-translate/core": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-11.0.1.tgz", + "integrity": "sha512-nBCa1ZD9fAUY/3eskP3Lql2fNg8OMrYIej1/5GRsfcutx9tG/5fZLCv9m6UCw1aS+u4uK/vXjv1ctG/FdMvaWg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@schematics/angular": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.1.2.tgz", + "integrity": "sha512-BeEzuS0s4j+BPboUhl97VMfhj7V+HpNbbY3PkD3TLd0cnSEoaLmtX+YjxbxZgwk6vhDp+l6YtpWt//5H/+0rFQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.2", + "@angular-devkit/schematics": "8.1.2" + } + }, + "@schematics/update": { + "version": "0.801.2", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.801.2.tgz", + "integrity": "sha512-xb54QXvII1JLdqgEqsh6mWu5qTt5UezmOWTZayRegsj0vNlzWFzoLXpiPFCWVEKUODa6aV4O5XW5CiQuVYPVuQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.1.2", + "@angular-devkit/schematics": "8.1.2", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "pacote": "9.5.1", + "rxjs": "6.4.0", + "semver": "6.2.0", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@swimlane/dragula": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@swimlane/dragula/-/dragula-3.8.0.tgz", + "integrity": "sha512-1F3sWPs9GRbQysuOa92llH21YYgc0YezTAtt72AmMxgv8erX8h/S6hYWzqEj5SIB/+u/YRx298dKU0tGoYGgNg==", + "requires": { + "contra": "1.9.4", + "crossvent": "1.5.4" + } + }, + "@swimlane/ngx-charts": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@swimlane/ngx-charts/-/ngx-charts-12.0.1.tgz", + "integrity": "sha512-Dmm46eTtyKtTkku1ZIB39q/AHvUGdGIRJc7jPUucJLoSPWeD7AjvE6OFiIZYP48IkPwV0R3OI/ZmKyNA3DPkRQ==", + "requires": { + "d3": "^4.10.2", + "d3-array": "^1.2.1", + "d3-brush": "^1.0.4", + "d3-color": "^1.0.3", + "d3-force": "^1.1.0", + "d3-format": "^1.2.0", + "d3-hierarchy": "^1.1.5", + "d3-interpolate": "^1.1.5", + "d3-scale": "^1.0.6", + "d3-selection": "^1.1.0", + "d3-shape": "^1.2.0", + "d3-time-format": "^2.1.0" + }, + "dependencies": { + "d3": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-4.13.0.tgz", + "integrity": "sha512-l8c4+0SldjVKLaE2WG++EQlqD7mh/dmQjvi2L2lKPadAVC+TbJC4ci7Uk9bRi+To0+ansgsS0iWfPjD7DBy+FQ==", + "requires": { + "d3-array": "1.2.1", + "d3-axis": "1.0.8", + "d3-brush": "1.0.4", + "d3-chord": "1.0.4", + "d3-collection": "1.0.4", + "d3-color": "1.0.3", + "d3-dispatch": "1.0.3", + "d3-drag": "1.2.1", + "d3-dsv": "1.0.8", + "d3-ease": "1.0.3", + "d3-force": "1.1.0", + "d3-format": "1.2.2", + "d3-geo": "1.9.1", + "d3-hierarchy": "1.1.5", + "d3-interpolate": "1.1.6", + "d3-path": "1.0.5", + "d3-polygon": "1.0.3", + "d3-quadtree": "1.0.3", + "d3-queue": "3.0.7", + "d3-random": "1.1.0", + "d3-request": "1.0.6", + "d3-scale": "1.0.7", + "d3-selection": "1.3.0", + "d3-shape": "1.2.0", + "d3-time": "1.0.8", + "d3-time-format": "2.1.1", + "d3-timer": "1.0.7", + "d3-transition": "1.1.1", + "d3-voronoi": "1.1.2", + "d3-zoom": "1.7.1" + }, + "dependencies": { + "d3-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz", + "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" + }, + "d3-brush": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.4.tgz", + "integrity": "sha1-AMLyOAGfJPbAoZSibUGhUw/+e8Q=", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-color": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz", + "integrity": "sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs=" + }, + "d3-force": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz", + "integrity": "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-format": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.2.tgz", + "integrity": "sha512-zH9CfF/3C8zUI47nsiKfD0+AGDEuM8LwBIP7pBVpyR4l/sKkZqITmMtxRp04rwBrlshIZ17XeFAaovN3++wzkw==" + }, + "d3-hierarchy": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz", + "integrity": "sha1-ochFxC+Eoga88cAcAQmOpN2qeiY=" + }, + "d3-interpolate": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz", + "integrity": "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==", + "requires": { + "d3-color": "1" + } + }, + "d3-selection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.0.tgz", + "integrity": "sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA==" + }, + "d3-shape": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", + "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=", + "requires": { + "d3-path": "1" + } + }, + "d3-time-format": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", + "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", + "requires": { + "d3-time": "1" + } + } + } + }, + "d3-axis": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz", + "integrity": "sha1-MacFoLU15ldZ3hQXOjGTMTfxjvo=" + }, + "d3-chord": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.4.tgz", + "integrity": "sha1-fexPC6iG9xP+ERxF92NBT290yiw=", + "requires": { + "d3-array": "1", + "d3-path": "1" + } + }, + "d3-collection": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", + "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI=" + }, + "d3-dispatch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.3.tgz", + "integrity": "sha1-RuFJHqqbWMNY/OW+TovtYm54cfg=" + }, + "d3-drag": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.1.tgz", + "integrity": "sha512-Cg8/K2rTtzxzrb0fmnYOUeZHvwa4PHzwXOLZZPwtEs2SKLLKLXeYwZKBB+DlOxUvFmarOnmt//cU4+3US2lyyQ==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-dsv": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.8.tgz", + "integrity": "sha512-IVCJpQ+YGe3qu6odkPQI0KPqfxkhbP/oM1XhhE/DFiYmcXKfCRub4KXyiuehV1d4drjWVXHUWx4gHqhdZb6n/A==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-ease": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.3.tgz", + "integrity": "sha1-aL+8NJM4o4DETYrMT7wzBKotjA4=" + }, + "d3-geo": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.9.1.tgz", + "integrity": "sha512-l9wL/cEQkyZQYXw3xbmLsH3eQ5ij+icNfo4r0GrLa5rOCZR/e/3am45IQ0FvQ5uMsv+77zBRunLc9ufTWSQYFA==", + "requires": { + "d3-array": "1" + } + }, + "d3-path": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz", + "integrity": "sha1-JB6xhJvZ6egCHA0KeZ+KDo5EF2Q=" + }, + "d3-polygon": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.3.tgz", + "integrity": "sha1-FoiOkCZGCTPysXllKtN4Ik04LGI=" + }, + "d3-quadtree": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.3.tgz", + "integrity": "sha1-rHmH4+I/6AWpkPKOG1DTj8uCJDg=" + }, + "d3-random": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.0.tgz", + "integrity": "sha1-ZkLlBsb6OmSFldKyRpeIqNElKdM=" + }, + "d3-scale": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", + "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-color": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-time": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz", + "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==" + }, + "d3-timer": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.7.tgz", + "integrity": "sha512-vMZXR88XujmG/L5oB96NNKH5lCWwiLM/S2HyyAQLcjWJCloK5shxta4CwOFYLZoY3AWX73v8Lgv4cCAdWtRmOA==" + }, + "d3-transition": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.1.tgz", + "integrity": "sha512-xeg8oggyQ+y5eb4J13iDgKIjUcEfIOZs2BqV/eEmXm2twx80wTzJ4tB4vaZ5BKfz7XsI/DFmQL5me6O27/5ykQ==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-voronoi": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz", + "integrity": "sha1-Fodmfo8TotFYyAwUgMWinLDYlzw=" + }, + "d3-zoom": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.1.tgz", + "integrity": "sha512-sZHQ55DGq5BZBFGnRshUT8tm2sfhPHFnOlmPbbwTkAoPeVdRTkB4Xsf9GCY0TSHrTD8PeJPZGmP/TpGicwJDJQ==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + } + } + }, + "@swimlane/ngx-datatable": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@swimlane/ngx-datatable/-/ngx-datatable-15.0.2.tgz", + "integrity": "sha512-IlUyCs/hLv12hzz2pGugbrdRpBbwE6JUM4Bm4CCqLptmZj+t8pw8Ywthde8yUDdpgGgTJeJ9G5o92QadyGbP3g==" + }, + "@swimlane/ngx-dnd": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@swimlane/ngx-dnd/-/ngx-dnd-8.0.0.tgz", + "integrity": "sha512-+QK2+ukLjQtm9pzeXltaUoLywlkaxCrT69Va4RZzFoNYupP7KjNdwlTDmz8V51yqAO7h7Ayz6KzxOBeqYHzPfA==", + "requires": { + "@swimlane/dragula": "^3.8.0", + "@types/dragula": "^2.1.34", + "tslib": "^1.9.0" + } + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/chart.js": { + "version": "2.7.56", + "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.7.56.tgz", + "integrity": "sha512-toWLqetzDO32PtrDCRKCsMmOYgHzOQUbWh3h7dGuupDpxoyx+o33lZkBBXFV0FoOUuMMEHluZBjw9Xye9ubYvg==" + }, + "@types/dragula": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/@types/dragula/-/dragula-2.1.34.tgz", + "integrity": "sha512-tZbauiqJgEpKKtBQI8pQ24FrkDNGhiXCFsygqQPeAJTPJJC1RI0BOmHv7VHI9qDehhXXffq9aJEUhqEQyY/PVA==" + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.3.15.tgz", + "integrity": "sha512-MljubxUVLT9wh/0NiyRWlcxSu/0axK+UYheZ04N5yaQclQkE8JuFYMsmwltPap2LEsJrvSf5p49/1514IY+d1Q==", + "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/lodash": { + "version": "4.14.136", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.136.tgz", + "integrity": "sha512-0GJhzBdvsW2RUccNHOBkabI8HZVdOXmXbXhuKlDEd5Vv12P7oAVGfomGp3Ne21o5D/qu1WmthlNKFaoZJJeErA==", + "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": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/prismjs": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.16.0.tgz", + "integrity": "sha512-mEyuziLrfDCQ4juQP1k706BUU/c8OGn/ZFl69AXXY6dStHClKX4P+N8+rhqpul1vRDA2VOygzMRSJJZHyDEOfw==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/selenium-webdriver": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz", + "integrity": "sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA==", + "dev": true + }, + "@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.5", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz", + "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==", + "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.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@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" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", + "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "dev": true + }, + "adm-zip": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", + "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", + "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" + } + }, + "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.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "angular-gridster2": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/angular-gridster2/-/angular-gridster2-8.0.0.tgz", + "integrity": "sha512-mSgOvRfhEKAERU63SsunI/NWajU2wXVTToR6sA5JM1sRptK6PLoAIi9VqcNETTmdRssflOFwJJqBqEeRgelUvg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "angular2-uuid": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/angular2-uuid/-/angular2-uuid-1.1.1.tgz", + "integrity": "sha1-cvA81TK39AAy6x7PufhFc4S+lW4=" + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "requires": { + "string-width": "^3.0.0" + }, + "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 + }, + "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" + } + }, + "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" + } + } + } + }, + "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": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "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": "3.0.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.0.3.tgz", + "integrity": "sha512-c6IvoeBECQlMVuYUjSwimnhmztImpErfxJzWZhIQinIvQWoGOnB0dLIgifbPHQt5heS6mNlaZG16f06H3C8t1g==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "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 + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "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" + } + }, + "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": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "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" + } + }, + "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" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "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" + } + } + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "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 + }, + "atoa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atoa/-/atoa-1.0.0.tgz", + "integrity": "sha1-DMDpGkgOc4+SPrwQNnZHF3mzSkk=" + }, + "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.6.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.0.tgz", + "integrity": "sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ==", + "dev": true, + "requires": { + "browserslist": "^4.6.1", + "caniuse-lite": "^1.0.30000971", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.16", + "postcss-value-parser": "^3.3.1" + } + }, + "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-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "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" + } + }, + "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 + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "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 + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "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": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "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==", + "dev": true, + "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" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "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" + } + }, + "boxen": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", + "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^2.4.2", + "cli-boxes": "^2.2.0", + "string-width": "^3.0.0", + "term-size": "^1.2.0", + "type-fest": "^0.3.0", + "widest-line": "^2.0.0" + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "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": "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" + } + }, + "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" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "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.6.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", + "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000975", + "electron-to-chromium": "^1.3.164", + "node-releases": "^1.1.23" + } + }, + "browserstack": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.2.tgz", + "integrity": "sha512-+6AFt9HzhKykcPF79W6yjEUJcdvZOV0lIXdkORXMJftGrDl0OKWqRF4GHqpDNkxiceDT/uB7Fb/aDwktvXX7dg==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "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.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "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", + "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" + } + }, + "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" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "http-cache-semantics": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", + "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==", + "dev": true + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "normalize-url": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.3.0.tgz", + "integrity": "sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ==", + "dev": true + } + } + }, + "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-lite": { + "version": "1.0.30000979", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000979.tgz", + "integrity": "sha512-gcu45yfq3B7Y+WB05fOMfr0EiSlq+1u+m6rPHyJli/Wy3PVQNGaU7VA4bZE5qw+AU2UVOBR/N5g1bzADUqdvFw==", + "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" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chart.js": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.8.0.tgz", + "integrity": "sha512-Di3wUL4BFvqI5FB5K26aQ+hvWh8wnP9A3DWGvXHVkO13D3DSnaSsdZx29cXlEsYKVkn1E2az+ZYFS4t0zi8x0w==", + "requires": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "chartjs-color": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.3.0.tgz", + "integrity": "sha512-hEvVheqczsoHD+fZ+tfPUE+1+RbV6b+eksp2LwAhwRTVXEjCSEavvk+Hg3H6SZfGlPh/UfmWKGIvZbtobOEm3g==", + "requires": { + "chartjs-color-string": "^0.6.0", + "color-convert": "^0.5.3" + }, + "dependencies": { + "color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=" + } + } + }, + "chartjs-color-string": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz", + "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", + "requires": { + "color-name": "^1.0.0" + } + }, + "chokidar": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz", + "integrity": "sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA==", + "dev": true, + "requires": { + "anymatch": "^3.0.1", + "braces": "^3.0.2", + "fsevents": "^2.0.6", + "glob-parent": "^5.0.0", + "is-binary-path": "^2.1.0", + "is-glob": "^4.0.1", + "normalize-path": "^3.0.0", + "readdirp": "^3.1.1" + }, + "dependencies": { + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chownr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", + "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" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "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.0.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz", + "integrity": "sha512-oC7/DVAyfcY3UWKm0sN/oVoDedQDQiw/vIiAnuTWTpE5s0zWf7l3WY417Xw/Fbi/QbAjctAkxgMiS9P0s3zkmA==", + "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-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "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 + } + } + }, + "cli-boxes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "clipboard": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz", + "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", + "optional": true, + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.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": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codelyzer": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.1.0.tgz", + "integrity": "sha512-QiyY2/oDQnYx4mAVEDqr+z9MwrOto18tQFjExiuRChXCy0yvngS5fQpWIxvAGpbOmZFiR1PRTRLbEI71u10maA==", + "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-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=" + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "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==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.0.tgz", + "integrity": "sha512-hX+4kt2Rcwu+x1U0SsEFCn1quURjEjPEGH/cPBlpME/IidGimAdwfMU+B+xDr7et/KTR7VH2+ZqWGerv4NGs2w==", + "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 + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "dev": true, + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "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" + } + }, + "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" + } + }, + "configstore": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", + "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "contra": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/contra/-/contra-1.9.4.tgz", + "integrity": "sha1-9TveQtfltZhcrk2ZqNYQUm3o8o0=", + "requires": { + "atoa": "1.0.0", + "ticky": "1.0.1" + } + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "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==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "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": "5.0.3", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-PlZRs9CUMnAVylZq+vg2Juew662jWtwOXOqH4lbQD9ZFhRG9R7tVStOgHt21CBGVq7k5yIJaz8TXDLSjV+Lj8Q==", + "dev": true, + "requires": { + "cacache": "^11.3.2", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "webpack-log": "^2.0.0" + } + }, + "core-js": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.4.tgz", + "integrity": "sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==", + "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" + } + }, + "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 + } + } + }, + "crossvent": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/crossvent/-/crossvent-1.5.4.tgz", + "integrity": "sha1-2ixPj0DJR4JRe/K+7BBEFIGUq5I=", + "requires": { + "custom-event": "1.0.0" + }, + "dependencies": { + "custom-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.0.tgz", + "integrity": "sha1-LkYovhncSyFLXAJjDFlx6BFhgGI=" + } + } + }, + "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" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "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" + } + }, + "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 + }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "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": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "d3": { + "version": "5.9.7", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.9.7.tgz", + "integrity": "sha512-jENytrmdXtGPw7HuSK2S4gxRM1eUGjKvWQkQ6ct4yK+DB8SG3VcnVrwesfnsv8rIcxMUg18TafT4Q8mOZUMP4Q==", + "requires": { + "d3-array": "1", + "d3-axis": "1", + "d3-brush": "1", + "d3-chord": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-contour": "1", + "d3-dispatch": "1", + "d3-drag": "1", + "d3-dsv": "1", + "d3-ease": "1", + "d3-fetch": "1", + "d3-force": "1", + "d3-format": "1", + "d3-geo": "1", + "d3-hierarchy": "1", + "d3-interpolate": "1", + "d3-path": "1", + "d3-polygon": "1", + "d3-quadtree": "1", + "d3-random": "1", + "d3-scale": "2", + "d3-scale-chromatic": "1", + "d3-selection": "1", + "d3-shape": "1", + "d3-time": "1", + "d3-time-format": "2", + "d3-timer": "1", + "d3-transition": "1", + "d3-voronoi": "1", + "d3-zoom": "1" + } + }, + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "d3-brush": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.6.tgz", + "integrity": "sha512-lGSiF5SoSqO5/mYGD5FAeGKKS62JdA1EV7HPrU2b5rTX4qEJJtpjaGLJngjnkewQy7UnGstnFd3168wpf5z76w==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "requires": { + "d3-array": "1", + "d3-path": "1" + } + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "d3-color": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.8.tgz", + "integrity": "sha512-yeANXzP37PHk0DbSTMNPhnJD+Nn4G//O5E825bR6fAfHH43hobSBpgB9G9oWVl9+XgUaQ4yCnsX1H+l8DoaL9A==" + }, + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "requires": { + "d3-array": "^1.1.1" + } + }, + "d3-dispatch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.5.tgz", + "integrity": "sha512-vwKx+lAqB1UuCeklr6Jh1bvC4SZgbSqbkGBLClItFBIYH4vqDJCA7qfoy14lXmJdnBOdxndAMxjCbImJYW7e6g==" + }, + "d3-drag": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.3.tgz", + "integrity": "sha512-8S3HWCAg+ilzjJsNtWW1Mutl74Nmzhb9yU6igspilaJzeZVFktmY6oO9xOh5TDk+BM2KrNFjttZNoJJmDnkjkg==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-dsv": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.1.1.tgz", + "integrity": "sha512-1EH1oRGSkeDUlDRbhsFytAXU6cAmXFzc52YUe6MRlPClmWb85MP1J5x+YJRzya4ynZWnbELdSAvATFW/MbxaXw==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-ease": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.5.tgz", + "integrity": "sha512-Ct1O//ly5y5lFM9YTdu+ygq7LleSgSE4oj7vUt9tPLHUi8VCV7QoizGpdWRWAwCO9LdYzIrQDg97+hGVdsSGPQ==" + }, + "d3-fetch": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz", + "integrity": "sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==", + "requires": { + "d3-dsv": "1" + } + }, + "d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-format": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz", + "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==" + }, + "d3-geo": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.6.tgz", + "integrity": "sha512-z0J8InXR9e9wcgNtmVnPTj0TU8nhYT6lD/ak9may2PdKqXIeHUr8UbFLoCtrPYNsjv6YaLvSDQVl578k6nm7GA==", + "requires": { + "d3-array": "1" + } + }, + "d3-hierarchy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", + "integrity": "sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w==" + }, + "d3-interpolate": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", + "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz", + "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==" + }, + "d3-polygon": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.5.tgz", + "integrity": "sha512-RHhh1ZUJZfhgoqzWWuRhzQJvO7LavchhitSTHGu9oj6uuLFzYZVeBzaWTQ2qSO6bz2w55RMoOCf0MsLCDB6e0w==" + }, + "d3-quadtree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.6.tgz", + "integrity": "sha512-NUgeo9G+ENQCQ1LsRr2qJg3MQ4DJvxcDNCiohdJGHt5gRhBW6orIB5m5FJ9kK3HNL8g9F4ERVoBzcEwQBfXWVA==" + }, + "d3-queue": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/d3-queue/-/d3-queue-3.0.7.tgz", + "integrity": "sha1-yTouVLQXwJWRKdfXP2z31Ckudhg=" + }, + "d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "d3-request": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-request/-/d3-request-1.0.6.tgz", + "integrity": "sha512-FJj8ySY6GYuAJHZMaCQ83xEYE4KbkPkmxZ3Hu6zA1xxG2GD+z6P+Lyp+zjdsHf0xEbp2xcluDI50rCS855EQ6w==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-dsv": "1", + "xmlhttprequest": "1" + } + }, + "d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-scale-chromatic": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.3.3.tgz", + "integrity": "sha512-BWTipif1CimXcYfT02LKjAyItX5gKiwxuPRgr4xM58JwlLocWbjPLI7aMEjkcoOQXMkYsmNsvv3d2yl/OKuHHw==", + "requires": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "d3-selection": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.0.tgz", + "integrity": "sha512-EYVwBxQGEjLCKF2pJ4+yrErskDnz5v403qvAid96cNdCMr8rmCYfY5RGzWz24mdIbxmDf6/4EAH+K9xperD5jg==" + }, + "d3-shape": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.5.tgz", + "integrity": "sha512-VKazVR3phgD+MUCldapHD7P9kcrvPcexeX/PkMJmkUov4JM8IxsSg1DvbYoYich9AtdTsa5nNk2++ImPiDiSxg==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.11.tgz", + "integrity": "sha512-Z3wpvhPLW4vEScGeIMUckDW7+3hWKOQfAWg/U7PlWBnQmeKQ00gCUsTtWSYulrKNA7ta8hJ+xXc6MHrMuITwEw==" + }, + "d3-time-format": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz", + "integrity": "sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz", + "integrity": "sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg==" + }, + "d3-transition": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.2.0.tgz", + "integrity": "sha512-VJ7cmX/FPIPJYuaL2r1o1EMHLttvoIuZhhuAlRoOxDzogV8iQS6jYulDm3xEU3TqL80IZIhI551/ebmCMrkvhw==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "d3-zoom": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.3.tgz", + "integrity": "sha512-xEBSwFx5Z9T3/VrwDkMt+mr0HCzv7XjpGURJ8lWmIC8wxe32L39eWHIasEe/e7Ox8MPU4p1hvH8PKN2olLzIBg==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "damerau-levenshtein": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", + "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==", + "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" + } + }, + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "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 + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-freeze-strict": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-freeze-strict/-/deep-freeze-strict-1.1.1.tgz", + "integrity": "sha1-d9BYPKJKab5LvZrC+uQV1VUj5bA=", + "dev": true + }, + "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" + } + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, + "defer-to-connect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.0.2.tgz", + "integrity": "sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw==", + "dev": true + }, + "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": { + "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 + } + } + } + } + }, + "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 + }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "optional": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "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=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "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" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.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" + } + }, + "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 + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "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=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.200", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.200.tgz", + "integrity": "sha512-PUurrpyDA74MuAjJRD+79ss5BqJlU3mdArRbuu4wO/dt6jc3Ic/6BDmFJxkdwbfq39cHf/XKm2vW98XSvut9Dg==", + "dev": true + }, + "elliptic": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", + "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", + "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" + } + }, + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "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": "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" + } + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "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": "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" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "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.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.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 + }, + "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.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "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" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "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=", + "dev": true + }, + "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.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "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==", + "dev": true, + "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" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "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-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 + }, + "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.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.0.0.tgz", + "integrity": "sha512-roAbL6IdSGczwfXxhMi6Zq+jD4IfUpL0jWHD7fvmjdOVb7xBfdRUHe4LpBgO23VtVK5AW1OlWZo0p34Jvx3iWg==", + "dev": true, + "requires": { + "loader-utils": "^1.2.2", + "schema-utils": "^1.0.0" + } + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "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" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "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": "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" + } + }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "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.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "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.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "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 + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "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-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "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.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", + "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", + "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 + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "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.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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" + } + } + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "optional": true, + "requires": { + "delegate": "^3.1.2" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "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 + } + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "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": { + "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" + } + } + } + }, + "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" + } + } + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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" + } + }, + "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" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "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" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "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==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", + "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.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 + } + } + }, + "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" + } + }, + "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": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "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-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "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 + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "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.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "injection-js": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.2.1.tgz", + "integrity": "sha512-zHI+E+dM0PXix5FFTO1Y4/UOyAzE7zG1l/QwAn4jchTThOoBq+UYRFK4AVG7lQgFL+go62SbrzSsjXy9DFEZUg==", + "dev": true + }, + "inquirer": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.4.1.tgz", + "integrity": "sha512-/Jw+qPZx4EDYsaT6uz7F4GJRNFMRdKNeUZw3ZnKV8lyuUgz/YWRCSUAJMZSVhSq4Ec0R2oYnyi6b3d4JXcL5Nw==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.11", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "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 + }, + "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" + } + } + } + }, + "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" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "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==", + "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-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": "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-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.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.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.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "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-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-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "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-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-npm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", + "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==", + "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 + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "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-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-reference": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.3.tgz", + "integrity": "sha512-W1iHHv/oyBb2pPxkBxtaewxa1BC58Pn5J0hogyCdefwUIvb6R+TGbAcIa4qPNYLqLhb3EnOgUf2MQkkF76BcKw==", + "dev": true, + "requires": { + "@types/estree": "0.0.39" + } + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "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-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "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": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "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-api": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz", + "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "compare-versions": "^3.4.0", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "minimatch": "^3.0.4", + "once": "^1.4.0" + }, + "dependencies": { + "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 + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + } + } + } + }, + "istanbul-instrumenter-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", + "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", + "dev": true, + "requires": { + "convert-source-map": "^1.5.0", + "istanbul-lib-instrument": "^1.7.3", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + }, + "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 + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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 + }, + "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" + } + } + } + }, + "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": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "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.4.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.4.0.tgz", + "integrity": "sha512-HU/YxV4i6GcmiH4duATwAbJQMlE0MsDIR5XmSVxURxKHn3aGAdbY1/ZJFmVRbKtnLwIxxMJD7gYaPsypcbYimg==", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "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 + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "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==", + "dev": true + }, + "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": "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" + } + }, + "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.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "karma": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.1.0.tgz", + "integrity": "sha512-xckiDqyNi512U4dXGOOSyLKPwek6X/vUizSy2f3geYevbLj+UIdvNwbn7IwfUIL2g1GXEPWt/87qFD1fBbl/Uw==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "braces": "^2.3.2", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "flatted": "^2.0.0", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.11", + "log4js": "^4.0.0", + "mime": "^2.3.1", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "2.1.1", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.3.0" + }, + "dependencies": { + "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" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + }, + "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-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" + } + }, + "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" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "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" + } + }, + "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 + }, + "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" + } + } + } + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "requires": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.6.tgz", + "integrity": "sha512-WFh77RI8bMIKdOvI/1/IBmgnM+Q7NOLhnwG91QJrM8lW+CIXCjTzhhUsT/svLvAkLmR10uWY4RyYbHMLkTglvg==", + "dev": true, + "requires": { + "istanbul-api": "^2.1.6", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", + "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", + "dev": true, + "requires": { + "jasmine-core": "^3.3" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.4.2.tgz", + "integrity": "sha512-7g0gPj8+9JepCNJR9WjDyQ2RkZ375jpdurYQyAYv8PorUCadepl8vrD6LmMqOGcM17cnrynBawQYZHaumgDjBw==", + "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" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "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 + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "less": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", + "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.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, + "optional": true + } + } + }, + "less-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", + "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^4.0.1" + } + }, + "less-plugin-npm-import": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/less-plugin-npm-import/-/less-plugin-npm-import-2.1.0.tgz", + "integrity": "sha1-gj5phskzGKmBccqFiEi2vq1Vvz4=", + "dev": true, + "requires": { + "promise": "~7.0.1", + "resolve": "~1.1.6" + }, + "dependencies": { + "promise": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.0.4.tgz", + "integrity": "sha1-Nj6EpMNsg1a4kP7WLJHOhdAu1Tk=", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "license-webpack-plugin": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.1.tgz", + "integrity": "sha512-TiarZIg5vkQ2rGdYJn2+5YxO/zqlqjpK5IVglr7OfmrN1sBCakS+PQrsP2uC5gtve1ZDb9WMSUMlmHDQ0FoW4w==", + "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" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "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": "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" + } + }, + "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==" + }, + "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.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, + "log4js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", + "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", + "dev": true, + "requires": { + "date-format": "^2.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.0", + "rfdc": "^1.1.4", + "streamroller": "^1.0.6" + }, + "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 + } + } + }, + "loglevel": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", + "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==", + "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" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "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.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "dev": true, + "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.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "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": "4.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.2.tgz", + "integrity": "sha512-YMJrAjHSb/BordlsDEcVcPyTbiJKkzqMf48N8dAJZT9Zjctrkb6Yg4TY9Sq2AwSIQJFn5qBBKVTYt3vP5FMIHA==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^11.3.3", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "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" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "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" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "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" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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" + } + } + } + }, + "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" + } + } + } + }, + "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" + } + } + } + }, + "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" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "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==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "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==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.7.0.tgz", + "integrity": "sha512-RQIw6+7utTYn8DBGsf/LpRgZCJMpZt+kuawJ/fju0KiOL6nAaTBNmCJwS7HtwSCXfS47gCkmtBFS7HdsquhdxQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.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" + } + }, + "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" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "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.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "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==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "ng-packagr": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-5.3.0.tgz", + "integrity": "sha512-i+964lzZC7VVzatDCLDZndiXTog1XGozY7K1Bs78+uBF8O1YHNQP9wB9C5fR4uEaSKVhCWEBYekoS69flCugMA==", + "dev": true, + "requires": { + "@ngtools/json-schema": "^1.1.0", + "autoprefixer": "^9.6.0", + "browserslist": "^4.0.0", + "chalk": "^2.3.1", + "chokidar": "^3.0.0", + "clean-css": "^4.1.11", + "commander": "^2.12.0", + "fs-extra": "^8.0.0", + "glob": "^7.1.2", + "injection-js": "^2.2.1", + "less": "^3.8.0", + "less-plugin-npm-import": "^2.1.0", + "node-sass-tilde-importer": "^1.0.0", + "postcss": "^7.0.0", + "postcss-url": "^8.0.0", + "read-pkg-up": "^5.0.0", + "rimraf": "^2.6.1", + "rollup": "^1.12.1", + "rollup-plugin-commonjs": "^10.0.0", + "rollup-plugin-json": "^4.0.0", + "rollup-plugin-node-resolve": "^5.0.0", + "rollup-plugin-sourcemaps": "^0.4.2", + "rxjs": "^6.0.0", + "sass": "^1.17.3", + "stylus": "^0.54.5", + "terser": "^4.0.0", + "update-notifier": "^3.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "ng2-charts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-2.3.0.tgz", + "integrity": "sha512-D5K7OqF0m5lOBYvNOsraoEo4OPHja9zfGNj+HWy2nUcP0LP2s+Y/QaQlkG/1rHlwXq9HPm8rLxzSutA0eLHxGQ==", + "requires": { + "@types/chart.js": "^2.7.48", + "lodash": "^4.17.11", + "tslib": "^1.9.0" + } + }, + "ngrx-store-freeze": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/ngrx-store-freeze/-/ngrx-store-freeze-0.2.4.tgz", + "integrity": "sha512-90awpbbMa/x2H81eWWYniyli3LJ1PZU/FaztL10d9Rp/4kw2+97pqyLjdxSPxcOv9St//m9kfuWZ7gyoVDjgcg==", + "dev": true, + "requires": { + "deep-freeze-strict": "^1.1.1" + } + }, + "ngx-cookie-service": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-2.2.0.tgz", + "integrity": "sha512-2kaC1itlEMxiMAPJ320hOpcwU9vhvjbKQCZ1Go6bGhYjJtqG7eYvhNP7mM9IhFz1/afG2tBryJPySWmFUGhRpA==" + }, + "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.2", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", + "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "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 + } + } + }, + "node-releases": { + "version": "1.1.26", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.26.tgz", + "integrity": "sha512-fZPsuhhUHMTlfkhDLGtfY80DSJTjOcx+qD1j5pqPkuhUHVS7xHZIg9EE4DHK8O3f0zTxXHX5VIkDG8pu98/wfQ==", + "dev": true, + "requires": { + "semver": "^5.3.0" + }, + "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 + } + } + }, + "node-sass-tilde-importer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-sass-tilde-importer/-/node-sass-tilde-importer-1.0.2.tgz", + "integrity": "sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg==", + "dev": true, + "requires": { + "find-parent-dir": "^0.3.0" + } + }, + "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": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "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": "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" + } + }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", + "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + }, + "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 + } + } + }, + "npm-packlist": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.4.tgz", + "integrity": "sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + }, + "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 + } + } + }, + "npm-registry-fetch": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.9.1.tgz", + "integrity": "sha512-VQCEZlydXw4AwLROAXWUR7QDfe2Y8Id/vpAgp6TI1/H78a4SiQ1kQrKZALm5/zxM5n4HIi+aYb+idUAV/RuY0Q==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^4.0.2", + "npm-package-arg": "^6.1.0" + } + }, + "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" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "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-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-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.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.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" + } + }, + "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=", + "dev": true, + "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": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + } + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "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" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "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-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "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-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "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-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "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 + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + } + }, + "pacote": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.1.tgz", + "integrity": "sha512-Zqvczvf/zZ7QNosdE9uTC7SRuvSs9tFqRkF6cJl+2HH7COBnx4BRAGpeXJlrbN+mM0CMHpbi620xdEHhCflghA==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^11.3.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^4.0.1", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^3.8.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.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "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 + } + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "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" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": 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==", + "dev": true + }, + "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=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "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.4.0", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.4.0.tgz", + "integrity": "sha512-/2Sk/khljhdrsamjJYS5NjrH+GKEHEwh7zFSiYyxROyYKagkE4kSn2zDQDRTOMo8mpT2jikxx6yI1dG7lNP/hw==" + }, + "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.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "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" + } + }, + "portfinder": { + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.21.tgz", + "integrity": "sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "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.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "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 + }, + "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" + } + } + } + }, + "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" + } + }, + "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" + } + }, + "postcss-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-8.0.0.tgz", + "integrity": "sha512-E2cbOQ5aii2zNHh8F6fk1cxls7QVFZjLPSrqvmiza8OuXLzIpErij8BDS5Y3STPfJgpIMNCPEr8JlKQWEoozUw==", + "dev": true, + "requires": { + "mime": "^2.3.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.0", + "postcss": "^7.0.2", + "xxhashjs": "^0.2.1" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "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 + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prismjs": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.17.1.tgz", + "integrity": "sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q==", + "requires": { + "clipboard": "^2.0.0" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "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": "5.4.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.2.tgz", + "integrity": "sha512-zlIj64Cr6IOWP7RwxVeD8O4UskLYPoyIcg0HboWJL9T79F1F0VWtKkGTr/9GN6BKL+/Q/GmM7C9kFVCfDbP5sA==", + "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", + "optimist": "~0.6.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.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "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 + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "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.5", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.5.tgz", + "integrity": "sha512-f1apDjMpZ8SHlXtXGzqBxOjV+WQcDRz5PN7pWScgjXS7vhUIFcM3V89Shetf4A04n8DDR2MxiVQq6JproFcRZw==", + "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==", + "dev": true, + "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 + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", + "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==", + "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" + } + }, + "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==", + "dev": true + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "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.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "raw-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-1.0.0.tgz", + "integrity": "sha512-Uqy5AqELpytJTRxYT4fhltcKPj0TyaEpzJDcGz7DFJi+pQOOi3GjR/DOdxTkTsF+NzhnldIoG6TORaBlInUuqA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "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.0.13", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", + "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", + "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", + "slash": "^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" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + } + } + }, + "read-pkg-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-5.0.0.tgz", + "integrity": "sha512-XBQjqOBtTzyol2CpsQOw8LHV0XbDZVG7xMMjmXAJomlVY03WOBRmYgDJETlvcg0H63AJvPRwT7GFi5rvOzUOKg==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^5.0.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": "3.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.1.tgz", + "integrity": "sha512-XXdSXZrQuvqoETj50+JAitxz1UPdt5dupjT6T5nVB+WvjMv2XKYj+s7hPeAVCXvmJrL36O4YYyWlIC3an2ePiQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "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 + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "registry-auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.0.0.tgz", + "integrity": "sha512-lpQkHxd9UL6tb3k/aHAVfnVtn+Bcs9ob5InuFLLEDqSqeq+AljB8GZW9xY0x7F+xYwEcjKe07nyoxzEYz6yvkw==", + "dev": true, + "requires": { + "rc": "^1.2.8", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "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 + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "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" + } + }, + "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": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "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 + }, + "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 + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.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 + }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "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": "1.17.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.17.0.tgz", + "integrity": "sha512-k/j1m0NIsI4SYgCJR4MWPstGJOWfJyd6gycKoMhyoKPVXxm+L49XtbUwZyFsrSU2YXsOkM4u1ll9CS/ZgJBUpw==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "@types/node": "^12.6.2", + "acorn": "^6.2.0" + }, + "dependencies": { + "@types/node": { + "version": "12.6.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.8.tgz", + "integrity": "sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==", + "dev": true + } + } + }, + "rollup-plugin-commonjs": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.0.1.tgz", + "integrity": "sha512-x0PcCVdEc4J8igv1qe2vttz8JKAKcTs3wfIA3L8xEty3VzxgORLrzZrNWaVMc+pBC4U3aDOb9BnWLAQ8J11vkA==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1", + "is-reference": "^1.1.2", + "magic-string": "^0.25.2", + "resolve": "^1.11.0", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-plugin-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-4.0.0.tgz", + "integrity": "sha512-hgb8N7Cgfw5SZAkb3jf0QXii6QX/FOkiIq2M7BAQIEydjHvTyxXHQiIzZaTFgx1GK0cRCHOCBHIyEkkLdWKxow==", + "dev": true, + "requires": { + "rollup-pluginutils": "^2.5.0" + } + }, + "rollup-plugin-node-resolve": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", + "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", + "dev": true, + "requires": { + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.11.1", + "rollup-pluginutils": "^2.8.1" + }, + "dependencies": { + "builtin-modules": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", + "dev": true + } + } + }, + "rollup-plugin-sourcemaps": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz", + "integrity": "sha1-YhJaqUCHqt97g+9N+vYptHMTXoc=", + "dev": true, + "requires": { + "rollup-pluginutils": "^2.0.1", + "source-map-resolve": "^0.5.0" + } + }, + "rollup-pluginutils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz", + "integrity": "sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "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" + } + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "rxjs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "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==", + "dev": true + }, + "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.22.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.2.tgz", + "integrity": "sha512-enuQuy/CbfrZLA2vOy9tB7CK7pP5bZllnMbr5nPGWCFelwt0EMUVGC11gsv9rybkWc8pp/NKVY/c5+AKyjbnXg==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", + "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", + "dev": true, + "requires": { + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0", + "semver": "^5.5.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "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": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "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" + } + }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "optional": 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.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "dev": true, + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", + "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + }, + "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 + } + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "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.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "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==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", + "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", + "dev": true + }, + "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" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dev": true, + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "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 + } + } + }, + "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=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "smart-buffer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", + "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", + "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.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.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" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.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.2.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": "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" + } + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.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": "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" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "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.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", + "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "4.0.2" + } + }, + "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==", + "dev": true + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + } + }, + "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.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "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.6", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", + "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "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.0", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", + "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", + "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.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "speed-measure-webpack-plugin": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz", + "integrity": "sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ==", + "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": "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" + } + }, + "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=", + "dev": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamroller": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", + "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "date-format": "^2.0.0", + "debug": "^3.2.6", + "fs-extra": "^7.0.1", + "lodash": "^4.17.14" + }, + "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 + } + } + }, + "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": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "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-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "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": "0.23.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", + "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "tar": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", + "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.5", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "terser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.2.tgz", + "integrity": "sha512-jvNoEQSPXJdssFwqPSgWjsOrb+ELoE+ILpHPKXC83tIxOlh2U75F1KuB2luLD/3a6/7K3Vw5pDn+hvu0C4AzSw==", + "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": "1.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==", + "dev": true, + "requires": { + "cacache": "^11.3.2", + "find-cache-dir": "^2.0.0", + "is-wsl": "^1.1.0", + "loader-utils": "^1.2.3", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.0.0", + "webpack-sources": "^1.3.0", + "worker-farm": "^1.7.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 + } + } + }, + "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.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "dev": true + }, + "ticky": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ticky/-/ticky-1.0.1.tgz", + "integrity": "sha1-t8+nHnaPHJAAxJe5FRswlHxQ5G0=" + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "optional": true + }, + "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-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "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-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, + "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": "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" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "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 + } + } + }, + "tree-kill": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + } + }, + "tsickle": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.35.0.tgz", + "integrity": "sha512-irsZLX4293YUl9TuwNC5Fy020eLSc4bC3LfKnxnx1oq5wmZD9zSP8qvNNTiwRmf2/rxH+58JINcTARDjuvn+oQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map": "^0.7.3" + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "tslint": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.15.0.tgz", + "integrity": "sha512-6bIEujKR21/3nyeoX2uBnE8s+tMXCQXhqMmaIPJpHmXJoBJPTLcI7/VHRtUwMhnLVdwLqqY3zmd8Dxqa5CVdJA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.13.0", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "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 + } + } + }, + "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" + } + }, + "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-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "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==", + "dev": true, + "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.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", + "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", + "dev": true + }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.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, + "optional": true + } + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "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" + } + }, + "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" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "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=", + "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 + }, + "update-notifier": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", + "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", + "dev": true, + "requires": { + "boxen": "^3.0.0", + "chalk": "^2.0.1", + "configstore": "^4.0.0", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.1.0", + "is-npm": "^3.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "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==", + "dev": true, + "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" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + } + } + }, + "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 + }, + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "requires": { + "lru-cache": "4.1.x", + "tmp": "0.0.x" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "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" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "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" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "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=", + "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.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "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.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "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" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + }, + "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-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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "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" + } + }, + "web-animations-js": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/web-animations-js/-/web-animations-js-2.3.2.tgz", + "integrity": "sha512-TOMFWtQdxzjWp8qx4DAraTWTsdhxVSiWa6NkPFSaPtZ1diKUxTn4yTix73A1euG1WbSOMMPcY51cnjTIHrGtDA==" + }, + "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" + } + }, + "webpack": { + "version": "4.35.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.35.2.tgz", + "integrity": "sha512-TZAmorNymV4q66gAM/h90cEjG+N3627Q2MnkSgKlX/z3DlNVKUtqy57lz1WmZU2+FUZwzM+qm7cGaO95PyrX5A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.0.5", + "acorn-dynamic-import": "^4.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^1.0.0", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", + "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.2", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz", + "integrity": "sha512-mjWtrKJW2T9SsjJ4/dxDC2fkFVUw8jlpemDERqV0ZJIkjjjamR2AbQlr3oz+j4JLhYCHImHnXZK5H06P2wvUew==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.6", + "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.2.1", + "http-proxy-middleware": "^0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "killable": "^1.0.1", + "loglevel": "^1.6.3", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.20", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.4", + "semver": "^6.1.1", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.0", + "webpack-log": "^2.0.0", + "yargs": "12.0.5" + }, + "dependencies": { + "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" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + }, + "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-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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", + "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "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.1.0-rc.6", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz", + "integrity": "sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w==", + "dev": true, + "requires": { + "webpack-core": "^0.6.8" + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "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 + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "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": "3.1.0", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-3.1.0.tgz", + "integrity": "sha512-iQ9KTTmmN5fhfc2KMR7CcDblvcrg1QQ4pXymqZ3cRZF8L0890YLBcEqlIsGPdxoFwghyN8RA1pCEhCKuTF4Lkw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + }, + "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 + }, + "xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dev": true, + "requires": { + "cuint": "^0.2.2" + } + }, + "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": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "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.9.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.9.1.tgz", + "integrity": "sha512-GkPiJL8jifSrKReKaTZ5jkhrMEgXbXYC+IPo1iquBjayRa0q86w3Dipjn8b415jpitMExe9lV8iTsv8tk3DGag==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e1b400b --- /dev/null +++ b/package.json @@ -0,0 +1,80 @@ +{ + "name": "frontend", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "start:hmr": "ng serve --configuration hmr --source-map=false --hmr-warning=false", + "start:hmr:sourcemaps": "ng serve --configuration hmr --source-map=true --hmr-warning=false", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular/animations": "~8.1.2", + "@angular/cdk": "^8.1.1", + "@angular/common": "~8.1.2", + "@angular/compiler": "~8.1.2", + "@angular/core": "~8.1.2", + "@angular/flex-layout": "^8.0.0-beta.26", + "@angular/forms": "~8.1.2", + "@angular/material": "^8.1.1", + "@angular/material-moment-adapter": "^8.1.1", + "@angular/platform-browser": "~8.1.2", + "@angular/platform-browser-dynamic": "~8.1.2", + "@angular/router": "~8.1.2", + "@ngrx/effects": "^8.1.0", + "@ngrx/router-store": "^8.1.0", + "@ngrx/store": "^8.1.0", + "@ngx-translate/core": "^11.0.1", + "@swimlane/ngx-charts": "^12.0.1", + "@swimlane/ngx-datatable": "^15.0.2", + "@swimlane/ngx-dnd": "^8.0.0", + "angular-gridster2": "^8.0.0", + "angular2-uuid": "^1.1.1", + "chart.js": "^2.8.0", + "d3": "^5.9.7", + "hammerjs": "^2.0.8", + "lodash": "^4.17.15", + "moment": "^2.24.0", + "ng2-charts": "^2.3.0", + "ngx-cookie-service": "^2.2.0", + "perfect-scrollbar": "^1.4.0", + "prismjs": "^1.17.1", + "rxjs": "^6.5.2", + "tslib": "^1.9.0", + "web-animations-js": "^2.3.2", + "zone.js": "~0.9.1" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~0.801.2", + "@angular-devkit/build-ng-packagr": "~0.801.2", + "@angular/cli": "~8.1.2", + "@angular/compiler-cli": "~8.1.2", + "@angular/language-service": "~8.1.2", + "@angularclass/hmr": "^2.1.3", + "@ngrx/store-devtools": "^8.1.0", + "@types/node": "~8.9.4", + "@types/jasmine": "~3.3.8", + "@types/jasminewd2": "~2.0.3", + "@types/lodash": "^4.14.136", + "@types/prismjs": "^1.16.0", + "codelyzer": "^5.0.0", + "jasmine-core": "~3.4.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~4.1.0", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "~2.0.1", + "karma-jasmine": "~2.0.1", + "karma-jasmine-html-reporter": "^1.4.0", + "ng-packagr": "^5.1.0", + "ngrx-store-freeze": "^0.2.4", + "protractor": "~5.4.0", + "ts-node": "~7.0.0", + "tsickle": "^0.35.0", + "tslint": "~5.15.0", + "typescript": "~3.4.3" + } +} diff --git a/src/@fuse/animations/index.ts b/src/@fuse/animations/index.ts new file mode 100644 index 0000000..eab5b25 --- /dev/null +++ b/src/@fuse/animations/index.ts @@ -0,0 +1,552 @@ +import { + sequence, + trigger, + animate, + style, + group, + query, + transition, + animateChild, + state, + animation, + useAnimation, + stagger +} from '@angular/animations'; + +const customAnimation = 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 fuseAnimations = [ + trigger('animate', [ + transition('void => *', [useAnimation(customAnimation)]) + ]), + + trigger('animateStagger', [ + state('50', style('*')), + state('100', style('*')), + state('200', style('*')), + + transition( + 'void => 50', + query('@*', [stagger('50ms', [animateChild()])], { optional: true }) + ), + transition( + 'void => 100', + query('@*', [stagger('100ms', [animateChild()])], { optional: true }) + ), + transition( + 'void => 200', + query('@*', [stagger('200ms', [animateChild()])], { optional: true }) + ) + ]), + + trigger('fadeInOut', [ + state( + '0, void', + style({ + opacity: 0 + }) + ), + state( + '1, *', + style({ + opacity: 1 + }) + ), + transition('1 => 0', animate('300ms ease-out')), + transition('0 => 1', animate('300ms ease-in')), + transition('void <=> *', animate('300ms ease-in')) + ]), + + trigger('slideInOut', [ + state( + '0', + style({ + height: '0px' + }) + ), + state( + '1', + style({ + height: '*' + }) + ), + transition('1 => 0', animate('300ms ease-out')), + transition('0 => 1', animate('300ms ease-in')) + ]), + + trigger('slideIn', [ + transition('void => left', [ + style({ + transform: 'translateX(100%)' + }), + animate( + '300ms ease-in', + style({ + transform: 'translateX(0)' + }) + ) + ]), + transition('left => void', [ + style({ + transform: 'translateX(0)' + }), + animate( + '300ms ease-in', + style({ + transform: 'translateX(-100%)' + }) + ) + ]), + transition('void => right', [ + style({ + transform: 'translateX(-100%)' + }), + animate( + '300ms ease-in', + style({ + transform: 'translateX(0)' + }) + ) + ]), + transition('right => void', [ + style({ + transform: 'translateX(0)' + }), + animate( + '300ms ease-in', + style({ + transform: 'translateX(100%)' + }) + ) + ]) + ]), + + trigger('slideInLeft', [ + state( + 'void', + style({ + transform: 'translateX(-100%)' + }) + ), + state( + '*', + style({ + transform: 'translateX(0)' + }) + ), + transition('void => *', animate('300ms')), + transition('* => void', animate('300ms')) + ]), + + trigger('slideInRight', [ + state( + 'void', + style({ + transform: 'translateX(100%)' + }) + ), + state( + '*', + style({ + transform: 'translateX(0)' + }) + ), + transition('void => *', animate('300ms')), + transition('* => void', animate('300ms')) + ]), + + trigger('slideInTop', [ + state( + 'void', + style({ + transform: 'translateY(-100%)' + }) + ), + state( + '*', + style({ + transform: 'translateY(0)' + }) + ), + transition('void => *', animate('300ms')), + transition('* => void', animate('300ms')) + ]), + + trigger('slideInBottom', [ + state( + 'void', + style({ + transform: 'translateY(100%)' + }) + ), + state( + '*', + style({ + transform: 'translateY(0)' + }) + ), + transition('void => *', animate('300ms')), + transition('* => void', animate('300ms')) + ]), + + trigger('expandCollapse', [ + state( + 'void', + style({ + height: '0px' + }) + ), + state( + '*', + style({ + height: '*' + }) + ), + transition('void => *', animate('300ms ease-out')), + transition('* => void', animate('300ms ease-in')) + ]), + + // ----------------------------------------------------------------------------------------------------- + // @ Router animations + // ----------------------------------------------------------------------------------------------------- + + trigger('routerTransitionLeft', [ + transition('* => *', [ + query( + 'content > :enter, content > :leave', + [ + style({ + position: 'absolute', + top: 0, + bottom: 0, + left: 0, + right: 0 + }) + ], + { optional: true } + ), + query( + 'content > :enter', + [ + style({ + transform: 'translateX(100%)', + opacity: 0 + }) + ], + { optional: true } + ), + sequence([ + group([ + query( + 'content > :leave', + [ + style({ + transform: 'translateX(0)', + opacity: 1 + }), + animate( + '600ms cubic-bezier(0.0, 0.0, 0.2, 1)', + style({ + transform: 'translateX(-100%)', + opacity: 0 + }) + ) + ], + { optional: true } + ), + query( + 'content > :enter', + [ + style({ transform: 'translateX(100%)' }), + animate( + '600ms cubic-bezier(0.0, 0.0, 0.2, 1)', + style({ + transform: 'translateX(0%)', + opacity: 1 + }) + ) + ], + { optional: true } + ) + ]), + query('content > :leave', animateChild(), { optional: true }), + query('content > :enter', animateChild(), { optional: true }) + ]) + ]) + ]), + + trigger('routerTransitionRight', [ + transition('* => *', [ + query( + 'content > :enter, content > :leave', + [ + style({ + position: 'absolute', + top: 0, + bottom: 0, + left: 0, + right: 0 + }) + ], + { optional: true } + ), + query( + 'content > :enter', + [ + style({ + transform: 'translateX(-100%)', + opacity: 0 + }) + ], + { optional: true } + ), + sequence([ + group([ + query( + 'content > :leave', + [ + style({ + transform: 'translateX(0)', + opacity: 1 + }), + animate( + '600ms cubic-bezier(0.0, 0.0, 0.2, 1)', + style({ + transform: 'translateX(100%)', + opacity: 0 + }) + ) + ], + { optional: true } + ), + query( + 'content > :enter', + [ + style({ transform: 'translateX(-100%)' }), + animate( + '600ms cubic-bezier(0.0, 0.0, 0.2, 1)', + style({ + transform: 'translateX(0%)', + opacity: 1 + }) + ) + ], + { optional: true } + ) + ]), + query('content > :leave', animateChild(), { optional: true }), + query('content > :enter', animateChild(), { optional: true }) + ]) + ]) + ]), + + trigger('routerTransitionUp', [ + transition('* => *', [ + query( + 'content > :enter, content > :leave', + [ + style({ + position: 'absolute', + top: 0, + bottom: 0, + left: 0, + right: 0 + }) + ], + { optional: true } + ), + query( + 'content > :enter', + [ + style({ + transform: 'translateY(100%)', + opacity: 0 + }) + ], + { optional: true } + ), + group([ + query( + 'content > :leave', + [ + style({ + transform: 'translateY(0)', + opacity: 1 + }), + animate( + '600ms cubic-bezier(0.0, 0.0, 0.2, 1)', + style({ + transform: 'translateY(-100%)', + opacity: 0 + }) + ) + ], + { optional: true } + ), + query( + 'content > :enter', + [ + style({ transform: 'translateY(100%)' }), + animate( + '600ms cubic-bezier(0.0, 0.0, 0.2, 1)', + style({ + transform: 'translateY(0%)', + opacity: 1 + }) + ) + ], + { optional: true } + ) + ]), + query('content > :leave', animateChild(), { optional: true }), + query('content > :enter', animateChild(), { optional: true }) + ]) + ]), + + trigger('routerTransitionDown', [ + transition('* => *', [ + query( + 'content > :enter, content > :leave', + [ + style({ + position: 'absolute', + top: 0, + bottom: 0, + left: 0, + right: 0 + }) + ], + { optional: true } + ), + query( + 'content > :enter', + [ + style({ + transform: 'translateY(-100%)', + opacity: 0 + }) + ], + { optional: true } + ), + sequence([ + group([ + query( + 'content > :leave', + [ + style({ + transform: 'translateY(0)', + opacity: 1 + }), + animate( + '600ms cubic-bezier(0.0, 0.0, 0.2, 1)', + style({ + transform: 'translateY(100%)', + opacity: 0 + }) + ) + ], + { optional: true } + ), + query( + 'content > :enter', + [ + style({ transform: 'translateY(-100%)' }), + animate( + '600ms cubic-bezier(0.0, 0.0, 0.2, 1)', + style({ + transform: 'translateY(0%)', + opacity: 1 + }) + ) + ], + { optional: true } + ) + ]), + query('content > :leave', animateChild(), { optional: true }), + query('content > :enter', animateChild(), { optional: true }) + ]) + ]) + ]), + + trigger('routerTransitionFade', [ + transition( + '* => *', + group([ + query( + 'content > :enter, content > :leave ', + [ + style({ + position: 'absolute', + top: 0, + bottom: 0, + left: 0, + right: 0 + }) + ], + { optional: true } + ), + + query( + 'content > :enter', + [ + style({ + opacity: 0 + }) + ], + { optional: true } + ), + query( + 'content > :leave', + [ + style({ + opacity: 1 + }), + animate( + '300ms cubic-bezier(0.0, 0.0, 0.2, 1)', + style({ + opacity: 0 + }) + ) + ], + { optional: true } + ), + query( + 'content > :enter', + [ + style({ + opacity: 0 + }), + animate( + '300ms cubic-bezier(0.0, 0.0, 0.2, 1)', + style({ + opacity: 1 + }) + ) + ], + { optional: true } + ), + query('content > :enter', animateChild(), { optional: true }), + query('content > :leave', animateChild(), { optional: true }) + ]) + ) + ]) +]; diff --git a/src/@fuse/components/confirm-dialog/confirm-dialog.component.html b/src/@fuse/components/confirm-dialog/confirm-dialog.component.html new file mode 100644 index 0000000..d6223ce --- /dev/null +++ b/src/@fuse/components/confirm-dialog/confirm-dialog.component.html @@ -0,0 +1,12 @@ +

Confirm

+
{{ confirmMessage }}
+
+ + +
diff --git a/src/@fuse/components/confirm-dialog/confirm-dialog.component.scss b/src/@fuse/components/confirm-dialog/confirm-dialog.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/@fuse/components/confirm-dialog/confirm-dialog.component.ts b/src/@fuse/components/confirm-dialog/confirm-dialog.component.ts new file mode 100644 index 0000000..87ae144 --- /dev/null +++ b/src/@fuse/components/confirm-dialog/confirm-dialog.component.ts @@ -0,0 +1,18 @@ +import { Component } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'fuse-confirm-dialog', + templateUrl: './confirm-dialog.component.html', + styleUrls: ['./confirm-dialog.component.scss'] +}) +export class FuseConfirmDialogComponent { + public confirmMessage: string; + + /** + * Constructor + * + * @param {MatDialogRef} dialogRef + */ + constructor(public dialogRef: MatDialogRef) {} +} diff --git a/src/@fuse/components/confirm-dialog/confirm-dialog.module.ts b/src/@fuse/components/confirm-dialog/confirm-dialog.module.ts new file mode 100644 index 0000000..98942cf --- /dev/null +++ b/src/@fuse/components/confirm-dialog/confirm-dialog.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; + +import { FuseConfirmDialogComponent } from './confirm-dialog.component'; + +@NgModule({ + declarations: [FuseConfirmDialogComponent], + imports: [MatDialogModule, MatButtonModule], + entryComponents: [FuseConfirmDialogComponent] +}) +export class FuseConfirmDialogModule {} diff --git a/src/@fuse/components/countdown/countdown.component.html b/src/@fuse/components/countdown/countdown.component.html new file mode 100644 index 0000000..f8e8d70 --- /dev/null +++ b/src/@fuse/components/countdown/countdown.component.html @@ -0,0 +1,37 @@ +
+
+
+ {{ countdown.days }} +
+
+ days +
+
+ +
+
+ {{ countdown.hours }} +
+
+ hours +
+
+ +
+
+ {{ countdown.minutes }} +
+
+ minutes +
+
+ +
+
+ {{ countdown.seconds }} +
+
+ seconds +
+
+
diff --git a/src/@fuse/components/countdown/countdown.component.scss b/src/@fuse/components/countdown/countdown.component.scss new file mode 100644 index 0000000..e95e322 --- /dev/null +++ b/src/@fuse/components/countdown/countdown.component.scss @@ -0,0 +1,30 @@ +fuse-countdown { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + + .fuse-countdown { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + text-align: center; + + .time { + display: flex; + flex-direction: column; + padding: 0 12px; + + .value { + font-size: 34px; + line-height: 34px; + padding-bottom: 8px; + } + + .title { + color: rgba(0, 0, 0, 0.54); + } + } + } +} diff --git a/src/@fuse/components/countdown/countdown.component.ts b/src/@fuse/components/countdown/countdown.component.ts new file mode 100644 index 0000000..2072fd3 --- /dev/null +++ b/src/@fuse/components/countdown/countdown.component.ts @@ -0,0 +1,107 @@ +import { + Component, + Input, + OnDestroy, + OnInit, + ViewEncapsulation +} from '@angular/core'; +import { interval, Subject } from 'rxjs'; +import { map, takeUntil } from 'rxjs/operators'; +import * as moment from 'moment'; + +@Component({ + selector: 'fuse-countdown', + templateUrl: './countdown.component.html', + styleUrls: ['./countdown.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class FuseCountdownComponent implements OnInit, OnDestroy { + // Event date + @Input('eventDate') + eventDate; + + countdown: any; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + */ + constructor() { + // Set the defaults + this.countdown = { + days: '', + hours: '', + minutes: '', + seconds: '' + }; + + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + const currDate = moment(); + const eventDate = moment(this.eventDate); + + // Get the difference in between the current date and event date in seconds + let diff = eventDate.diff(currDate, 'seconds'); + + // Calculate the remaining time for the first time so there will be no + // delay on the countdown + this.countdown = this._secondsToRemaining(diff); + + // Create a subscribable interval + const countDown = interval(1000).pipe( + map(value => { + return (diff = diff - 1); + }), + map(value => { + return this._secondsToRemaining(value); + }) + ); + + // Subscribe to the countdown interval + countDown.pipe(takeUntil(this._unsubscribeAll)).subscribe(value => { + this.countdown = value; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Converts given seconds to a remaining time + * + * @param seconds + * @private + */ + private _secondsToRemaining(seconds): any { + const timeLeft = moment.duration(seconds, 'seconds'); + + return { + days: timeLeft.asDays().toFixed(0), + hours: timeLeft.hours(), + minutes: timeLeft.minutes(), + seconds: timeLeft.seconds() + }; + } +} diff --git a/src/@fuse/components/countdown/countdown.module.ts b/src/@fuse/components/countdown/countdown.module.ts new file mode 100644 index 0000000..0875c0a --- /dev/null +++ b/src/@fuse/components/countdown/countdown.module.ts @@ -0,0 +1,9 @@ +import { NgModule } from '@angular/core'; + +import { FuseCountdownComponent } from './countdown.component'; + +@NgModule({ + declarations: [FuseCountdownComponent], + exports: [FuseCountdownComponent] +}) +export class FuseCountdownModule {} diff --git a/src/@fuse/components/countdown/countdown.theme.scss b/src/@fuse/components/countdown/countdown.theme.scss new file mode 100644 index 0000000..e851416 --- /dev/null +++ b/src/@fuse/components/countdown/countdown.theme.scss @@ -0,0 +1,13 @@ +@mixin fuse-countdown-theme($theme) { + $foreground: map-get($theme, foreground); + + fuse-countdown { + .fuse-countdown { + .time { + .title { + color: map-get($foreground, secondary-text); + } + } + } + } +} diff --git a/src/@fuse/components/demo/demo-content/demo-content.component.html b/src/@fuse/components/demo/demo-content/demo-content.component.html new file mode 100644 index 0000000..071e6d3 --- /dev/null +++ b/src/@fuse/components/demo/demo-content/demo-content.component.html @@ -0,0 +1,107 @@ + +
+

Early Sunrise in Winter

+

Demo Content

+ +

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse tortor + nibh, convallis sed purus nec, auctor venenatis nisl. Suspendisse potenti. + Nullam sagittis nulla in diam finibus, sed pharetra velit vestibulum. + Suspendisse euismod in urna eu posuere. +

+ +
+

+ Nunc vel lacinia lorem. Nullam tincidunt sed purus eu placerat. Donec id + dictum erat. Etiam enim ex, dapibus et tortor id, posuere pretium est. + Maecenas fringilla ipsum vitae neque elementum, at eleifend ante + sollicitudin. Donec viverra augue dolor, a venenatis tellus consectetur + sit amet. +

+
+ John Doe +
+
+ +

+ Ut ornare sit amet velit vel congue. Ut nec tristique eros. Lorem ipsum + dolor sit amet, consectetur + adipiscing elit. Vivamus sed lorem quis nibh porta iaculis. + Vestibulum ut eleifend ante, at semper mi. Nam imperdiet est nisi, quis + hendrerit tellus convallis et. Morbi in luctus neque. Curabitur elementum ut + est et gravida. In hac habitasse platea dictumst. In et placerat eros, eu + tempor turpis. Curabitur ac felis finibus, elementum lectus vitae, venenatis + est. Integer mollis nisl a eros scelerisque varius. Etiam venenatis lectus + vel erat condimentum tristique vel vel mi. Nulla id euismod mi, et mollis + tellus. +

+ +

+ Orci varius natoque penatibus et magnis dis parturient montes, nascetur + ridiculus mus. Class aptent taciti sociosqu ad litora torquent per conubia + nostra, per inceptos himenaeos. Curabitur vitae sagittis odio. Suspendisse + ullamcorper nunc non pellentesque laoreet. Curabitur eu tortor id quam + pretium mattis. Proin ut quam velit. +

+ + + +

+ Nullam tincidunt sed purus eu placerat. Donec id dictum erat. Etiam enim + ex, dapibus et tortor id. +

+ +

+ Quisque sit amet risus enim. Aliquam sit amet interdum justo, at ultricies + sapien. Suspendisse et semper urna, in gravida eros. Quisque id nibh + iaculis, euismod urna sed, egestas nisi. Donec eros metus, congue a + imperdiet feugiat, sagittis nec ipsum. Quisque dapibus mollis felis non + tristique. +

+ +

+ Ut auctor, metus sed dapibus tempus, urna diam auctor odio, in malesuada + odio risus vitae nisi. Etiam blandit ante urna, vitae placerat massa mollis + in. Duis nec urna ac purus semper dictum ut eget justo. Aenean non sagittis + augue. Sed venenatis rhoncus enim eget ornare. + Donec viverra sed felis at venenatis. + Mauris aliquam fringilla nulla, sit amet congue felis dignissim at. +

+ +
    +
  • Orci varius
  • +
  • Magnis dis
  • +
  • Conubia nostra
  • +
  • Semper urna
  • +
  • Donec viverra
  • +
+ +

+ Quisque accumsan augue tempor ante mollis, sed placerat diam porttitor. + Vestibulum dignissim sem vel velit eleifend, non pellentesque quam + convallis. Pellentesque est dolor, dignissim ac tortor tristique, hendrerit + iaculis metus. Praesent pulvinar quam eu leo consectetur faucibus. + Vestibulum purus diam, gravida sagittis feugiat sit amet, tincidunt in + ligula. Sed semper vestibulum magna. Lorem ipsum dolor sit amet, consectetur + adipiscing elit. Suspendisse tortor nibh, convallis sed purus nec, auctor + venenatis nisl. Suspendisse potenti. +

+ +

+ Nullam sagittis nulla in diam finibus, sed pharetra velit vestibulum. + Suspendisse euismod in urna eu posuere. Etiam blandit nunc arcu, et + consectetur orci blandit a. Aliquam condimentum pharetra quam at ultricies. + Nunc vel lacinia lorem. Nullam tincidunt sed purus eu placerat. Donec id + dictum erat. Etiam enim ex, dapibus et tortor id, posuere pretium est. + Maecenas fringilla ipsum vitae neque elementum, at eleifend ante + sollicitudin. Donec viverra augue dolor, a venenatis tellus consectetur sit + amet. +

+
+ diff --git a/src/@fuse/components/demo/demo-content/demo-content.component.scss b/src/@fuse/components/demo/demo-content/demo-content.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/@fuse/components/demo/demo-content/demo-content.component.ts b/src/@fuse/components/demo/demo-content/demo-content.component.ts new file mode 100644 index 0000000..b36e98d --- /dev/null +++ b/src/@fuse/components/demo/demo-content/demo-content.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'fuse-demo-content', + templateUrl: './demo-content.component.html', + styleUrls: ['./demo-content.component.scss'] +}) +export class FuseDemoContentComponent { + /** + * Constructor + */ + constructor() {} +} diff --git a/src/@fuse/components/demo/demo-sidebar/demo-sidebar.component.html b/src/@fuse/components/demo/demo-sidebar/demo-sidebar.component.html new file mode 100644 index 0000000..5e34b9f --- /dev/null +++ b/src/@fuse/components/demo/demo-sidebar/demo-sidebar.component.html @@ -0,0 +1,99 @@ +
+ +

Sidebar Demo

+ + + Sidebar Item 1 + + + + + + Sidebar Item 2 + + + + + + Sidebar Item 3 + + + + + + Sidebar Item 4 + + + + + + Sidebar Item 5 + + + + + + Sidebar Item 6 + + + + + + Sidebar Item 7 + + + + + + Sidebar Item 8 + + + + + + Sidebar Item 9 + + + + + + Sidebar Item 10 + + + + + + Sidebar Item 11 + + + + + + Sidebar Item 12 + + + + + + Sidebar Item 13 + + + + + + Sidebar Item 14 + + + + + + Sidebar Item 15 + + + + + + Sidebar Item 16 + +
+
diff --git a/src/@fuse/components/demo/demo-sidebar/demo-sidebar.component.scss b/src/@fuse/components/demo/demo-sidebar/demo-sidebar.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/@fuse/components/demo/demo-sidebar/demo-sidebar.component.ts b/src/@fuse/components/demo/demo-sidebar/demo-sidebar.component.ts new file mode 100644 index 0000000..67c42e3 --- /dev/null +++ b/src/@fuse/components/demo/demo-sidebar/demo-sidebar.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'fuse-demo-sidebar', + templateUrl: './demo-sidebar.component.html', + styleUrls: ['./demo-sidebar.component.scss'] +}) +export class FuseDemoSidebarComponent { + /** + * Constructor + */ + constructor() {} +} diff --git a/src/@fuse/components/demo/demo.module.ts b/src/@fuse/components/demo/demo.module.ts new file mode 100644 index 0000000..678654e --- /dev/null +++ b/src/@fuse/components/demo/demo.module.ts @@ -0,0 +1,15 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { MatDividerModule } from '@angular/material/divider'; +import { MatListModule } from '@angular/material/list'; + +import { FuseDemoContentComponent } from './demo-content/demo-content.component'; +import { FuseDemoSidebarComponent } from './demo-sidebar/demo-sidebar.component'; + +@NgModule({ + declarations: [FuseDemoContentComponent, FuseDemoSidebarComponent], + imports: [RouterModule, MatDividerModule, MatListModule], + exports: [FuseDemoContentComponent, FuseDemoSidebarComponent] +}) +export class FuseDemoModule {} diff --git a/src/@fuse/components/highlight/highlight.component.scss b/src/@fuse/components/highlight/highlight.component.scss new file mode 100644 index 0000000..2064358 --- /dev/null +++ b/src/@fuse/components/highlight/highlight.component.scss @@ -0,0 +1,9 @@ +:host { + display: block; + width: 100%; + padding: 8px; + background: #263238; + cursor: text; + overflow: auto; + -webkit-overflow-scrolling: touch; +} diff --git a/src/@fuse/components/highlight/highlight.component.ts b/src/@fuse/components/highlight/highlight.component.ts new file mode 100644 index 0000000..c8a3155 --- /dev/null +++ b/src/@fuse/components/highlight/highlight.component.ts @@ -0,0 +1,147 @@ +import { + Component, + ContentChild, + ElementRef, + Input, + OnDestroy, + OnInit +} from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import * as Prism from 'prismjs/prism'; +import './prism-languages'; + +@Component({ + selector: 'fuse-highlight', + template: '', + styleUrls: ['./highlight.component.scss'] +}) +export class FuseHighlightComponent implements OnInit, OnDestroy { + // Source + @ContentChild('source', { static: true }) + source: ElementRef; + + // Lang + @Input('lang') + lang: string; + + // Path + @Input('path') + path: string; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {ElementRef} _elementRef + * @param {HttpClient} _httpClient + */ + constructor( + private _elementRef: ElementRef, + private _httpClient: HttpClient + ) { + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // If there is no language defined, return... + if (!this.lang) { + return; + } + + // If the path is defined... + if (this.path) { + // Get the source + this._httpClient + .get(this.path, { responseType: 'text' }) + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(response => { + // Highlight it + this.highlight(response); + }); + } + + // If the path is not defined and the source element exists... + if (!this.path && this.source) { + // Highlight it + this.highlight(this.source.nativeElement.value); + } + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Highlight the given source code + * + * @param sourceCode + */ + highlight(sourceCode): void { + // Split the source into lines + const sourceLines = sourceCode.split('\n'); + + // Remove the first and the last line of the source + // code if they are blank lines. This way, the html + // can be formatted properly while using fuse-highlight + // component + if (!sourceLines[0].trim()) { + sourceLines.shift(); + } + + if (!sourceLines[sourceLines.length - 1].trim()) { + sourceLines.pop(); + } + + // Find the first non-whitespace char index in + // the first line of the source code + const indexOfFirstChar = sourceLines[0].search(/\S|$/); + + // Generate the trimmed source + let source = ''; + + // Iterate through all the lines + sourceLines.forEach((line, index) => { + // Trim the beginning white space depending on the index + // and concat the source code + source = source + line.substr(indexOfFirstChar, line.length); + + // If it's not the last line... + if (index !== sourceLines.length - 1) { + // Add a line break at the end + source = source + '\n'; + } + }); + + // Generate the highlighted code + const highlightedCode = Prism.highlight(source, Prism.languages[this.lang]); + + // Replace the innerHTML of the component with the highlighted code + this._elementRef.nativeElement.innerHTML = + '
' +
+      highlightedCode +
+      '
'; + } +} diff --git a/src/@fuse/components/highlight/highlight.module.ts b/src/@fuse/components/highlight/highlight.module.ts new file mode 100644 index 0000000..6f96853 --- /dev/null +++ b/src/@fuse/components/highlight/highlight.module.ts @@ -0,0 +1,9 @@ +import { NgModule } from '@angular/core'; + +import { FuseHighlightComponent } from './highlight.component'; + +@NgModule({ + declarations: [FuseHighlightComponent], + exports: [FuseHighlightComponent] +}) +export class FuseHighlightModule {} diff --git a/src/@fuse/components/highlight/prism-languages.ts b/src/@fuse/components/highlight/prism-languages.ts new file mode 100644 index 0000000..3de7427 --- /dev/null +++ b/src/@fuse/components/highlight/prism-languages.ts @@ -0,0 +1,18 @@ +import 'prismjs/prism'; +import 'prismjs/components/prism-bash'; +import 'prismjs/components/prism-c'; +import 'prismjs/components/prism-cpp'; +import 'prismjs/components/prism-csharp'; +import 'prismjs/components/prism-css'; +import 'prismjs/components/prism-diff'; +import 'prismjs/components/prism-markup'; +import 'prismjs/components/prism-markup-templating'; +import 'prismjs/components/prism-java'; +import 'prismjs/components/prism-javascript'; +import 'prismjs/components/prism-json'; +import 'prismjs/components/prism-perl'; +import 'prismjs/components/prism-php'; +import 'prismjs/components/prism-python'; +import 'prismjs/components/prism-sass'; +import 'prismjs/components/prism-scss'; +import 'prismjs/components/prism-typescript'; diff --git a/src/@fuse/components/index.ts b/src/@fuse/components/index.ts new file mode 100644 index 0000000..44cb06a --- /dev/null +++ b/src/@fuse/components/index.ts @@ -0,0 +1,12 @@ +export * from './confirm-dialog/confirm-dialog.module'; +export * from './countdown/countdown.module'; +export * from './demo/demo.module'; +export * from './highlight/highlight.module'; +export * from './material-color-picker/material-color-picker.module'; +export * from './navigation/navigation.module'; +export * from './progress-bar/progress-bar.module'; +export * from './search-bar/search-bar.module'; +export * from './shortcuts/shortcuts.module'; +export * from './sidebar/sidebar.module'; +export * from './theme-options/theme-options.module'; +export * from './widget/widget.module'; diff --git a/src/@fuse/components/material-color-picker/material-color-picker.component.html b/src/@fuse/components/material-color-picker/material-color-picker.component.html new file mode 100644 index 0000000..b3149ef --- /dev/null +++ b/src/@fuse/components/material-color-picker/material-color-picker.component.html @@ -0,0 +1,93 @@ + + + +
+ + + + {{ selectedColor.palette }} {{ selectedColor.hue }} + + + + Select a Color + + + +
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+
diff --git a/src/@fuse/components/material-color-picker/material-color-picker.component.scss b/src/@fuse/components/material-color-picker/material-color-picker.component.scss new file mode 100644 index 0000000..d088a92 --- /dev/null +++ b/src/@fuse/components/material-color-picker/material-color-picker.component.scss @@ -0,0 +1,39 @@ +.fuse-material-color-picker-menu { + width: 245px; + + .mat-menu-content { + padding: 0; + + .views { + display: flex; + flex-direction: column; + min-height: 165px; + + .view { + overflow: hidden; + + .colors { + padding: 1px 0 0 0; + margin-left: -1px; + + .color { + width: 40px; + height: 40px; + margin: 0 0 1px 1px; + border-radius: 0; + cursor: pointer; + transition: border-radius 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); + + &:hover { + border-radius: 20%; + } + + &.selected { + border-radius: 50% !important; + } + } + } + } + } + } +} diff --git a/src/@fuse/components/material-color-picker/material-color-picker.component.ts b/src/@fuse/components/material-color-picker/material-color-picker.component.ts new file mode 100644 index 0000000..c7855f7 --- /dev/null +++ b/src/@fuse/components/material-color-picker/material-color-picker.component.ts @@ -0,0 +1,272 @@ +import { + Component, + EventEmitter, + forwardRef, + Input, + Output, + ViewEncapsulation +} from '@angular/core'; + +import { fuseAnimations } from '../../animations'; +import { MatColors } from '../../mat-colors'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; + +export const FUSE_MATERIAL_COLOR_PICKER_VALUE_ACCESSOR: any = { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => FuseMaterialColorPickerComponent), + multi: true +}; + +@Component({ + selector: 'fuse-material-color-picker', + templateUrl: './material-color-picker.component.html', + styleUrls: ['./material-color-picker.component.scss'], + animations: fuseAnimations, + encapsulation: ViewEncapsulation.None, + providers: [FUSE_MATERIAL_COLOR_PICKER_VALUE_ACCESSOR] +}) +export class FuseMaterialColorPickerComponent implements ControlValueAccessor { + colors: any; + hues: string[]; + view: string; + selectedColor: any; + selectedPalette: string; + selectedHue: string; + + // Color changed + @Output() + colorChanged: EventEmitter; + + // Private + private _color: string; + private _modelChange: (value: any) => void; + private _modelTouched: (value: any) => void; + + /** + * Constructor + */ + constructor() { + // Set the defaults + this.colorChanged = new EventEmitter(); + this.colors = MatColors.all; + this.hues = [ + '50', + '100', + '200', + '300', + '400', + '500', + '600', + '700', + '800', + '900', + 'A100', + 'A200', + 'A400', + 'A700' + ]; + this.selectedHue = '500'; + this.view = 'palettes'; + + // Set the private defaults + this._color = ''; + this._modelChange = () => {}; + this._modelTouched = () => {}; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Selected class + * + * @param value + */ + @Input() + set color(value) { + if (!value || value === '' || this._color === value) { + return; + } + + // Split the color value (red-400, blue-500, fuse-navy-700 etc.) + const colorParts = value.split('-'); + + // Take the very last part as the selected hue value + this.selectedHue = colorParts[colorParts.length - 1]; + + // Remove the last part + colorParts.pop(); + + // Rejoin the remaining parts as the selected palette name + this.selectedPalette = colorParts.join('-'); + + // Store the color value + this._color = value; + } + + get color(): string { + return this._color; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Control Value Accessor implementation + // ----------------------------------------------------------------------------------------------------- + + /** + * Register on change function + * + * @param fn + */ + registerOnChange(fn: any): void { + this._modelChange = fn; + } + + /** + * Register on touched function + * + * @param fn + */ + registerOnTouched(fn: any): void { + this._modelTouched = fn; + } + + /** + * Write value to the view from model + * + * @param color + */ + writeValue(color: any): void { + // Return if null + if (!color) { + return; + } + + // Set the color + this.color = color; + + // Update the selected color + this.updateSelectedColor(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Select palette + * + * @param event + * @param palette + */ + selectPalette(event, palette): void { + // Stop propagation + event.stopPropagation(); + + // Go to 'hues' view + this.view = 'hues'; + + // Update the selected palette + this.selectedPalette = palette; + + // Update the selected color + this.updateSelectedColor(); + } + + /** + * Select hue + * + * @param event + * @param hue + */ + selectHue(event, hue): void { + // Stop propagation + event.stopPropagation(); + + // Update the selected huse + this.selectedHue = hue; + + // Update the selected color + this.updateSelectedColor(); + } + + /** + * Remove color + * + * @param event + */ + removeColor(event): void { + // Stop propagation + event.stopPropagation(); + + // Return to the 'palettes' view + this.view = 'palettes'; + + // Clear the selected palette and hue + this.selectedPalette = ''; + this.selectedHue = ''; + + // Update the selected color + this.updateSelectedColor(); + } + + /** + * Update selected color + */ + updateSelectedColor(): void { + if ( + this.selectedColor && + this.selectedColor.palette === this.selectedPalette && + this.selectedColor.hue === this.selectedHue + ) { + return; + } + + // Set the selected color object + this.selectedColor = { + palette: this.selectedPalette, + hue: this.selectedHue, + class: this.selectedPalette + '-' + this.selectedHue, + bg: + this.selectedPalette === '' + ? '' + : MatColors.getColor(this.selectedPalette)[this.selectedHue], + fg: + this.selectedPalette === '' + ? '' + : MatColors.getColor(this.selectedPalette).contrast[this.selectedHue] + }; + + // Emit the color changed event + this.colorChanged.emit(this.selectedColor); + + // Mark the model as touched + this._modelTouched(this.selectedColor.class); + + // Update the model + this._modelChange(this.selectedColor.class); + } + + /** + * Go to palettes view + * + * @param event + */ + goToPalettesView(event): void { + // Stop propagation + event.stopPropagation(); + + this.view = 'palettes'; + } + + /** + * On menu open + */ + onMenuOpen(): void { + if (this.selectedPalette === '') { + this.view = 'palettes'; + } else { + this.view = 'hues'; + } + } +} diff --git a/src/@fuse/components/material-color-picker/material-color-picker.module.ts b/src/@fuse/components/material-color-picker/material-color-picker.module.ts new file mode 100644 index 0000000..16c43cb --- /dev/null +++ b/src/@fuse/components/material-color-picker/material-color-picker.module.ts @@ -0,0 +1,29 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatTooltipModule } from '@angular/material/tooltip'; + +import { FusePipesModule } from '../../pipes/pipes.module'; + +import { FuseMaterialColorPickerComponent } from './material-color-picker.component'; + +@NgModule({ + declarations: [FuseMaterialColorPickerComponent], + imports: [ + CommonModule, + + FlexLayoutModule, + + MatButtonModule, + MatIconModule, + MatMenuModule, + MatTooltipModule, + + FusePipesModule + ], + exports: [FuseMaterialColorPickerComponent] +}) +export class FuseMaterialColorPickerModule {} diff --git a/src/@fuse/components/material-color-picker/material-color-picker.theme.scss b/src/@fuse/components/material-color-picker/material-color-picker.theme.scss new file mode 100644 index 0000000..622e795 --- /dev/null +++ b/src/@fuse/components/material-color-picker/material-color-picker.theme.scss @@ -0,0 +1,11 @@ +@mixin fuse-material-color-picker-theme($theme) { + $background: map-get($theme, background); + + .fuse-material-color-picker-menu { + .mat-menu-content { + .views { + background: #303030; + } + } + } +} diff --git a/src/@fuse/components/navigation/horizontal/collapsable/collapsable.component.html b/src/@fuse/components/navigation/horizontal/collapsable/collapsable.component.html new file mode 100644 index 0000000..bd962aa --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/collapsable/collapsable.component.html @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ item.icon }} + {{ + item.title + }} + + {{ item.badge.title }} + + keyboard_arrow_right + + +
+
+ + + + + +
+
+
diff --git a/src/@fuse/components/navigation/horizontal/collapsable/collapsable.component.scss b/src/@fuse/components/navigation/horizontal/collapsable/collapsable.component.scss new file mode 100644 index 0000000..dc9093b --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/collapsable/collapsable.component.scss @@ -0,0 +1,2 @@ +:host { +} diff --git a/src/@fuse/components/navigation/horizontal/collapsable/collapsable.component.ts b/src/@fuse/components/navigation/horizontal/collapsable/collapsable.component.ts new file mode 100644 index 0000000..f06accd --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/collapsable/collapsable.component.ts @@ -0,0 +1,84 @@ +import { + Component, + HostBinding, + HostListener, + Input, + OnDestroy, + OnInit +} from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { fuseAnimations } from '../../../../animations'; +import { FuseConfigService } from '../../../../services/config.service'; + +@Component({ + selector: 'fuse-nav-horizontal-collapsable', + templateUrl: './collapsable.component.html', + styleUrls: ['./collapsable.component.scss'], + animations: fuseAnimations +}) +export class FuseNavHorizontalCollapsableComponent + implements OnInit, OnDestroy { + fuseConfig: any; + isOpen = false; + + @HostBinding('class') + classes = 'nav-collapsable nav-item'; + + @Input() + item: any; + + // Private + private _unsubscribeAll: Subject; + + constructor(private _fuseConfigService: FuseConfigService) { + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Subscribe to config changes + this._fuseConfigService.config + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(config => { + this.fuseConfig = config; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Open + */ + @HostListener('mouseenter') + open(): void { + this.isOpen = true; + } + + /** + * Close + */ + @HostListener('mouseleave') + close(): void { + this.isOpen = false; + } +} diff --git a/src/@fuse/components/navigation/horizontal/item/item.component.html b/src/@fuse/components/navigation/horizontal/item/item.component.html new file mode 100644 index 0000000..dfadeb5 --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/item/item.component.html @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ item.icon }} + {{ + item.title + }} + + {{ item.badge.title }} + + + diff --git a/src/@fuse/components/navigation/horizontal/item/item.component.scss b/src/@fuse/components/navigation/horizontal/item/item.component.scss new file mode 100644 index 0000000..dc9093b --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/item/item.component.scss @@ -0,0 +1,2 @@ +:host { +} diff --git a/src/@fuse/components/navigation/horizontal/item/item.component.ts b/src/@fuse/components/navigation/horizontal/item/item.component.ts new file mode 100644 index 0000000..3ace371 --- /dev/null +++ b/src/@fuse/components/navigation/horizontal/item/item.component.ts @@ -0,0 +1,19 @@ +import { Component, HostBinding, Input } from '@angular/core'; + +@Component({ + selector: 'fuse-nav-horizontal-item', + templateUrl: './item.component.html', + styleUrls: ['./item.component.scss'] +}) +export class FuseNavHorizontalItemComponent { + @HostBinding('class') + classes = 'nav-item'; + + @Input() + item: any; + + /** + * Constructor + */ + constructor() {} +} diff --git a/src/@fuse/components/navigation/navigation.component.html b/src/@fuse/components/navigation/navigation.component.html new file mode 100644 index 0000000..25c9125 --- /dev/null +++ b/src/@fuse/components/navigation/navigation.component.html @@ -0,0 +1,45 @@ + diff --git a/src/@fuse/components/navigation/navigation.component.scss b/src/@fuse/components/navigation/navigation.component.scss new file mode 100644 index 0000000..ae7d3f8 --- /dev/null +++ b/src/@fuse/components/navigation/navigation.component.scss @@ -0,0 +1,12 @@ +@import 'src/@fuse/scss/fuse'; + +fuse-navigation { + display: flex; + flex: 1 0 auto; + + > .nav { + margin: 0; + padding: 0; + width: 100%; + } +} diff --git a/src/@fuse/components/navigation/navigation.component.ts b/src/@fuse/components/navigation/navigation.component.ts new file mode 100644 index 0000000..1e9fcc6 --- /dev/null +++ b/src/@fuse/components/navigation/navigation.component.ts @@ -0,0 +1,79 @@ +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + Input, + OnInit, + ViewEncapsulation +} from '@angular/core'; +import { merge, Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { FuseNavigationService } from './navigation.service'; + +@Component({ + selector: 'fuse-navigation', + templateUrl: './navigation.component.html', + styleUrls: ['./navigation.component.scss'], + encapsulation: ViewEncapsulation.None, + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class FuseNavigationComponent implements OnInit { + @Input() + layout = 'vertical'; + + @Input() + navigation: any; + + // Private + private _unsubscribeAll: Subject; + + /** + * + * @param {ChangeDetectorRef} _changeDetectorRef + * @param {FuseNavigationService} _fuseNavigationService + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseNavigationService: FuseNavigationService + ) { + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Load the navigation either from the input or from the service + this.navigation = + this.navigation || this._fuseNavigationService.getCurrentNavigation(); + + // Subscribe to the current navigation changes + this._fuseNavigationService.onNavigationChanged + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(() => { + // Load the navigation + this.navigation = this._fuseNavigationService.getCurrentNavigation(); + + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + + // Subscribe to navigation item + merge( + this._fuseNavigationService.onNavigationItemAdded, + this._fuseNavigationService.onNavigationItemUpdated, + this._fuseNavigationService.onNavigationItemRemoved + ) + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(() => { + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } +} diff --git a/src/@fuse/components/navigation/navigation.module.ts b/src/@fuse/components/navigation/navigation.module.ts new file mode 100644 index 0000000..42bda60 --- /dev/null +++ b/src/@fuse/components/navigation/navigation.module.ts @@ -0,0 +1,36 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { MatRippleModule } from '@angular/material/core'; +import { MatIconModule } from '@angular/material/icon'; + +import { TranslateModule } from '@ngx-translate/core'; + +import { FuseNavigationComponent } from './navigation.component'; +import { FuseNavVerticalItemComponent } from './vertical/item/item.component'; +import { FuseNavVerticalCollapsableComponent } from './vertical/collapsable/collapsable.component'; +import { FuseNavVerticalGroupComponent } from './vertical/group/group.component'; +import { FuseNavHorizontalItemComponent } from './horizontal/item/item.component'; +import { FuseNavHorizontalCollapsableComponent } from './horizontal/collapsable/collapsable.component'; + +@NgModule({ + imports: [ + CommonModule, + RouterModule, + + MatIconModule, + MatRippleModule, + + TranslateModule.forChild() + ], + exports: [FuseNavigationComponent], + declarations: [ + FuseNavigationComponent, + FuseNavVerticalGroupComponent, + FuseNavVerticalItemComponent, + FuseNavVerticalCollapsableComponent, + FuseNavHorizontalItemComponent, + FuseNavHorizontalCollapsableComponent + ] +}) +export class FuseNavigationModule {} diff --git a/src/@fuse/components/navigation/navigation.service.ts b/src/@fuse/components/navigation/navigation.service.ts new file mode 100644 index 0000000..0430484 --- /dev/null +++ b/src/@fuse/components/navigation/navigation.service.ts @@ -0,0 +1,392 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject, Observable, Subject } from 'rxjs'; +import * as _ from 'lodash'; + +import { FuseNavigationItem } from '../../types'; + +@Injectable({ + providedIn: 'root' +}) +export class FuseNavigationService { + onItemCollapsed: Subject; + onItemCollapseToggled: Subject; + + // Private + private _onNavigationChanged: BehaviorSubject; + private _onNavigationRegistered: BehaviorSubject; + private _onNavigationUnregistered: BehaviorSubject; + private _onNavigationItemAdded: BehaviorSubject; + private _onNavigationItemUpdated: BehaviorSubject; + private _onNavigationItemRemoved: BehaviorSubject; + + private _currentNavigationKey: string; + private _registry: { [key: string]: any } = {}; + + /** + * Constructor + */ + constructor() { + // Set the defaults + this.onItemCollapsed = new Subject(); + this.onItemCollapseToggled = new Subject(); + + // Set the private defaults + this._currentNavigationKey = null; + this._onNavigationChanged = new BehaviorSubject(null); + this._onNavigationRegistered = new BehaviorSubject(null); + this._onNavigationUnregistered = new BehaviorSubject(null); + this._onNavigationItemAdded = new BehaviorSubject(null); + this._onNavigationItemUpdated = new BehaviorSubject(null); + this._onNavigationItemRemoved = new BehaviorSubject(null); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Get onNavigationChanged + * + * @returns {Observable} + */ + get onNavigationChanged(): Observable { + return this._onNavigationChanged.asObservable(); + } + + /** + * Get onNavigationRegistered + * + * @returns {Observable} + */ + get onNavigationRegistered(): Observable { + return this._onNavigationRegistered.asObservable(); + } + + /** + * Get onNavigationUnregistered + * + * @returns {Observable} + */ + get onNavigationUnregistered(): Observable { + return this._onNavigationUnregistered.asObservable(); + } + + /** + * Get onNavigationItemAdded + * + * @returns {Observable} + */ + get onNavigationItemAdded(): Observable { + return this._onNavigationItemAdded.asObservable(); + } + + /** + * Get onNavigationItemUpdated + * + * @returns {Observable} + */ + get onNavigationItemUpdated(): Observable { + return this._onNavigationItemUpdated.asObservable(); + } + + /** + * Get onNavigationItemRemoved + * + * @returns {Observable} + */ + get onNavigationItemRemoved(): Observable { + return this._onNavigationItemRemoved.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Register the given navigation + * with the given key + * + * @param key + * @param navigation + */ + register(key, navigation): void { + // Check if the key already being used + if (this._registry[key]) { + console.error( + `The navigation with the key '${key}' already exists. Either unregister it first or use a unique key.` + ); + + return; + } + + // Add to the registry + this._registry[key] = navigation; + + // Notify the subject + this._onNavigationRegistered.next([key, navigation]); + } + + /** + * Unregister the navigation from the registry + * @param key + */ + unregister(key): void { + // Check if the navigation exists + if (!this._registry[key]) { + console.warn( + `The navigation with the key '${key}' doesn't exist in the registry.` + ); + } + + // Unregister the sidebar + delete this._registry[key]; + + // Notify the subject + this._onNavigationUnregistered.next(key); + } + + /** + * Get navigation from registry by key + * + * @param key + * @returns {any} + */ + getNavigation(key): any { + // Check if the navigation exists + if (!this._registry[key]) { + console.warn( + `The navigation with the key '${key}' doesn't exist in the registry.` + ); + + return; + } + + // Return the sidebar + return this._registry[key]; + } + + /** + * Get flattened navigation array + * + * @param navigation + * @param flatNavigation + * @returns {any[]} + */ + getFlatNavigation( + navigation, + flatNavigation: FuseNavigationItem[] = [] + ): any { + for (const item of navigation) { + if (item.type === 'item') { + flatNavigation.push(item); + + continue; + } + + if (item.type === 'collapsable' || item.type === 'group') { + if (item.children) { + this.getFlatNavigation(item.children, flatNavigation); + } + } + } + + return flatNavigation; + } + + /** + * Get the current navigation + * + * @returns {any} + */ + getCurrentNavigation(): any { + if (!this._currentNavigationKey) { + console.warn(`The current navigation is not set.`); + + return; + } + + return this.getNavigation(this._currentNavigationKey); + } + + /** + * Set the navigation with the key + * as the current navigation + * + * @param key + */ + setCurrentNavigation(key): void { + // Check if the sidebar exists + if (!this._registry[key]) { + console.warn( + `The navigation with the key '${key}' doesn't exist in the registry.` + ); + + return; + } + + // Set the current navigation key + this._currentNavigationKey = key; + + // Notify the subject + this._onNavigationChanged.next(key); + } + + /** + * Get navigation item by id from the + * current navigation + * + * @param id + * @param {any} navigation + * @returns {any | boolean} + */ + getNavigationItem(id, navigation = null): any | boolean { + if (!navigation) { + navigation = this.getCurrentNavigation(); + } + + for (const item of navigation) { + if (item.id === id) { + return item; + } + + if (item.children) { + const childItem = this.getNavigationItem(id, item.children); + + if (childItem) { + return childItem; + } + } + } + + return false; + } + + /** + * Get the parent of the navigation item + * with the id + * + * @param id + * @param {any} navigation + * @param parent + */ + getNavigationItemParent(id, navigation = null, parent = null): any { + if (!navigation) { + navigation = this.getCurrentNavigation(); + parent = navigation; + } + + for (const item of navigation) { + if (item.id === id) { + return parent; + } + + if (item.children) { + const childItem = this.getNavigationItemParent(id, item.children, item); + + if (childItem) { + return childItem; + } + } + } + + return false; + } + + /** + * Add a navigation item to the specified location + * + * @param item + * @param id + */ + addNavigationItem(item, id): void { + // Get the current navigation + const navigation: any[] = this.getCurrentNavigation(); + + // Add to the end of the navigation + if (id === 'end') { + navigation.push(item); + + // Trigger the observable + this._onNavigationItemAdded.next(true); + + return; + } + + // Add to the start of the navigation + if (id === 'start') { + navigation.unshift(item); + + // Trigger the observable + this._onNavigationItemAdded.next(true); + + return; + } + + // Add it to a specific location + const parent: any = this.getNavigationItem(id); + + if (parent) { + // Check if parent has a children entry, + // and add it if it doesn't + if (!parent.children) { + parent.children = []; + } + + // Add the item + parent.children.push(item); + } + + // Trigger the observable + this._onNavigationItemAdded.next(true); + } + + /** + * Update navigation item with the given id + * + * @param id + * @param properties + */ + updateNavigationItem(id, properties): void { + // Get the navigation item + const navigationItem = this.getNavigationItem(id); + + // If there is no navigation with the give id, return + if (!navigationItem) { + return; + } + + // Merge the navigation properties + _.merge(navigationItem, properties); + + // Trigger the observable + this._onNavigationItemUpdated.next(true); + } + + /** + * Remove navigation item with the given id + * + * @param id + */ + removeNavigationItem(id): void { + const item = this.getNavigationItem(id); + + // Return, if there is not such an item + if (!item) { + return; + } + + // Get the parent of the item + let parent = this.getNavigationItemParent(id); + + // This check is required because of the first level + // of the navigation, since the first level is not + // inside the 'children' array + parent = parent.children || parent; + + // Remove the item + parent.splice(parent.indexOf(item), 1); + + // Trigger the observable + this._onNavigationItemRemoved.next(true); + } +} diff --git a/src/@fuse/components/navigation/vertical/collapsable/collapsable.component.html b/src/@fuse/components/navigation/vertical/collapsable/collapsable.component.html new file mode 100644 index 0000000..ac3ca68 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/collapsable/collapsable.component.html @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ item.icon }} + {{ + item.title + }} + + {{ item.badge.title }} + + keyboard_arrow_right + + +
+ + + + + +
+
diff --git a/src/@fuse/components/navigation/vertical/collapsable/collapsable.component.scss b/src/@fuse/components/navigation/vertical/collapsable/collapsable.component.scss new file mode 100644 index 0000000..9e5aa7b --- /dev/null +++ b/src/@fuse/components/navigation/vertical/collapsable/collapsable.component.scss @@ -0,0 +1,35 @@ +:host { + .folded:not(.unfolded) & { + .nav-link { + > span { + opacity: 0; + transition: opacity 200ms ease; + } + } + + &.open { + .children { + display: none !important; + } + } + } + + .nav-link { + .collapsable-arrow { + transition: transform 0.3s ease-in-out, opacity 0.25s ease-in-out 0.1s; + transform: rotate(0); + } + } + + > .children { + overflow: hidden; + } + + &.open { + > .nav-link { + .collapsable-arrow { + transform: rotate(90deg); + } + } + } +} diff --git a/src/@fuse/components/navigation/vertical/collapsable/collapsable.component.ts b/src/@fuse/components/navigation/vertical/collapsable/collapsable.component.ts new file mode 100644 index 0000000..e4544d8 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/collapsable/collapsable.component.ts @@ -0,0 +1,240 @@ +import { + ChangeDetectorRef, + Component, + HostBinding, + Input, + OnDestroy, + OnInit +} from '@angular/core'; +import { NavigationEnd, Router } from '@angular/router'; +import { merge, Subject } from 'rxjs'; +import { filter, takeUntil } from 'rxjs/operators'; + +import { FuseNavigationItem } from '../../../../types'; +import { fuseAnimations } from '../../../../animations'; +import { FuseNavigationService } from '../../navigation.service'; + +@Component({ + selector: 'fuse-nav-vertical-collapsable', + templateUrl: './collapsable.component.html', + styleUrls: ['./collapsable.component.scss'], + animations: fuseAnimations +}) +export class FuseNavVerticalCollapsableComponent implements OnInit, OnDestroy { + @Input() + item: FuseNavigationItem; + + @HostBinding('class') + classes = 'nav-collapsable nav-item'; + + @HostBinding('class.open') + public isOpen = false; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {ChangeDetectorRef} _changeDetectorRef + * @param {FuseNavigationService} _fuseNavigationService + * @param {Router} _router + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseNavigationService: FuseNavigationService, + private _router: Router + ) { + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Listen for router events + this._router.events + .pipe( + filter(event => event instanceof NavigationEnd), + takeUntil(this._unsubscribeAll) + ) + .subscribe((event: NavigationEnd) => { + // Check if the url can be found in + // one of the children of this item + if (this.isUrlInChildren(this.item, event.urlAfterRedirects)) { + this.expand(); + } else { + this.collapse(); + } + }); + + // Listen for collapsing of any navigation item + this._fuseNavigationService.onItemCollapsed + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(clickedItem => { + if (clickedItem && clickedItem.children) { + // Check if the clicked item is one + // of the children of this item + if (this.isChildrenOf(this.item, clickedItem)) { + return; + } + + // Check if the url can be found in + // one of the children of this item + if (this.isUrlInChildren(this.item, this._router.url)) { + return; + } + + // If the clicked item is not this item, collapse... + if (this.item !== clickedItem) { + this.collapse(); + } + } + }); + + // Check if the url can be found in + // one of the children of this item + if (this.isUrlInChildren(this.item, this._router.url)) { + this.expand(); + } else { + this.collapse(); + } + + // Subscribe to navigation item + merge( + this._fuseNavigationService.onNavigationItemAdded, + this._fuseNavigationService.onNavigationItemUpdated, + this._fuseNavigationService.onNavigationItemRemoved + ) + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(() => { + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle collapse + * + * @param ev + */ + toggleOpen(ev): void { + ev.preventDefault(); + + this.isOpen = !this.isOpen; + + // Navigation collapse toggled... + this._fuseNavigationService.onItemCollapsed.next(this.item); + this._fuseNavigationService.onItemCollapseToggled.next(); + } + + /** + * Expand the collapsable navigation + */ + expand(): void { + if (this.isOpen) { + return; + } + + this.isOpen = true; + + // Mark for check + this._changeDetectorRef.markForCheck(); + + this._fuseNavigationService.onItemCollapseToggled.next(); + } + + /** + * Collapse the collapsable navigation + */ + collapse(): void { + if (!this.isOpen) { + return; + } + + this.isOpen = false; + + // Mark for check + this._changeDetectorRef.markForCheck(); + + this._fuseNavigationService.onItemCollapseToggled.next(); + } + + /** + * Check if the given parent has the + * given item in one of its children + * + * @param parent + * @param item + * @returns {boolean} + */ + isChildrenOf(parent, item): boolean { + const children = parent.children; + + if (!children) { + return false; + } + + if (children.indexOf(item) > -1) { + return true; + } + + for (const child of children) { + if (child.children) { + if (this.isChildrenOf(child, item)) { + return true; + } + } + } + + return false; + } + + /** + * Check if the given url can be found + * in one of the given parent's children + * + * @param parent + * @param url + * @returns {boolean} + */ + isUrlInChildren(parent, url): boolean { + const children = parent.children; + + if (!children) { + return false; + } + + for (const child of children) { + if (child.children) { + if (this.isUrlInChildren(child, url)) { + return true; + } + } + + if (child.url === url || url.includes(child.url)) { + return true; + } + } + + return false; + } +} diff --git a/src/@fuse/components/navigation/vertical/group/group.component.html b/src/@fuse/components/navigation/vertical/group/group.component.html new file mode 100644 index 0000000..0a95e15 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/group/group.component.html @@ -0,0 +1,22 @@ + +
+ {{ item.title }} +
+ +
+ + + + + +
+
diff --git a/src/@fuse/components/navigation/vertical/group/group.component.scss b/src/@fuse/components/navigation/vertical/group/group.component.scss new file mode 100644 index 0000000..7ff80ff --- /dev/null +++ b/src/@fuse/components/navigation/vertical/group/group.component.scss @@ -0,0 +1,21 @@ +:host { + .folded:not(.unfolded) & { + > .group-title { + align-items: center; + + > span { + opacity: 0; + transition: opacity 200ms ease; + } + + &:before { + content: ''; + display: block; + position: absolute; + min-width: 1.6rem; + border-top: 2px solid; + opacity: 0.2; + } + } + } +} diff --git a/src/@fuse/components/navigation/vertical/group/group.component.ts b/src/@fuse/components/navigation/vertical/group/group.component.ts new file mode 100644 index 0000000..89d21b1 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/group/group.component.ts @@ -0,0 +1,76 @@ +import { + ChangeDetectorRef, + Component, + HostBinding, + Input, + OnDestroy, + OnInit +} from '@angular/core'; +import { merge, Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { FuseNavigationItem } from '../../../../types'; +import { FuseNavigationService } from '../../navigation.service'; + +@Component({ + selector: 'fuse-nav-vertical-group', + templateUrl: './group.component.html', + styleUrls: ['./group.component.scss'] +}) +export class FuseNavVerticalGroupComponent implements OnInit, OnDestroy { + @HostBinding('class') + classes = 'nav-group nav-item'; + + @Input() + item: FuseNavigationItem; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + */ + + /** + * + * @param {ChangeDetectorRef} _changeDetectorRef + * @param {FuseNavigationService} _fuseNavigationService + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseNavigationService: FuseNavigationService + ) { + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Subscribe to navigation item + merge( + this._fuseNavigationService.onNavigationItemAdded, + this._fuseNavigationService.onNavigationItemUpdated, + this._fuseNavigationService.onNavigationItemRemoved + ) + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(() => { + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/@fuse/components/navigation/vertical/item/item.component.html b/src/@fuse/components/navigation/vertical/item/item.component.html new file mode 100644 index 0000000..dfadeb5 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/item/item.component.html @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ item.icon }} + {{ + item.title + }} + + {{ item.badge.title }} + + + diff --git a/src/@fuse/components/navigation/vertical/item/item.component.scss b/src/@fuse/components/navigation/vertical/item/item.component.scss new file mode 100644 index 0000000..c4b3902 --- /dev/null +++ b/src/@fuse/components/navigation/vertical/item/item.component.scss @@ -0,0 +1,11 @@ +:host { + .folded:not(.unfolded) & { + .nav-link { + > .nav-link-title, + > .nav-link-badge { + opacity: 0; + transition: opacity 200ms ease; + } + } + } +} diff --git a/src/@fuse/components/navigation/vertical/item/item.component.ts b/src/@fuse/components/navigation/vertical/item/item.component.ts new file mode 100644 index 0000000..0159e3b --- /dev/null +++ b/src/@fuse/components/navigation/vertical/item/item.component.ts @@ -0,0 +1,76 @@ +import { + ChangeDetectorRef, + Component, + HostBinding, + Input, + OnDestroy, + OnInit +} from '@angular/core'; +import { merge, Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { FuseNavigationItem } from '../../../../types'; +import { FuseNavigationService } from '../../navigation.service'; + +@Component({ + selector: 'fuse-nav-vertical-item', + templateUrl: './item.component.html', + styleUrls: ['./item.component.scss'] +}) +export class FuseNavVerticalItemComponent implements OnInit, OnDestroy { + @HostBinding('class') + classes = 'nav-item'; + + @Input() + item: FuseNavigationItem; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + */ + + /** + * + * @param {ChangeDetectorRef} _changeDetectorRef + * @param {FuseNavigationService} _fuseNavigationService + */ + constructor( + private _changeDetectorRef: ChangeDetectorRef, + private _fuseNavigationService: FuseNavigationService + ) { + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Subscribe to navigation item + merge( + this._fuseNavigationService.onNavigationItemAdded, + this._fuseNavigationService.onNavigationItemUpdated, + this._fuseNavigationService.onNavigationItemRemoved + ) + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(() => { + // Mark for check + this._changeDetectorRef.markForCheck(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/@fuse/components/progress-bar/progress-bar.component.html b/src/@fuse/components/progress-bar/progress-bar.component.html new file mode 100644 index 0000000..1cdbd97 --- /dev/null +++ b/src/@fuse/components/progress-bar/progress-bar.component.html @@ -0,0 +1,8 @@ + + + diff --git a/src/@fuse/components/progress-bar/progress-bar.component.scss b/src/@fuse/components/progress-bar/progress-bar.component.scss new file mode 100644 index 0000000..cf3cd07 --- /dev/null +++ b/src/@fuse/components/progress-bar/progress-bar.component.scss @@ -0,0 +1,16 @@ +@import 'src/@fuse/scss/fuse'; + +fuse-progress-bar { + position: absolute; + top: 0; + left: 0; + right: 0; + width: 100%; + z-index: 99998; + + mat-progress-bar { + .mat-progress-bar-buffer { + background-color: #c5c6cb !important; + } + } +} diff --git a/src/@fuse/components/progress-bar/progress-bar.component.ts b/src/@fuse/components/progress-bar/progress-bar.component.ts new file mode 100644 index 0000000..60cd172 --- /dev/null +++ b/src/@fuse/components/progress-bar/progress-bar.component.ts @@ -0,0 +1,85 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { FuseProgressBarService } from './progress-bar.service'; + +@Component({ + selector: 'fuse-progress-bar', + templateUrl: './progress-bar.component.html', + styleUrls: ['./progress-bar.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class FuseProgressBarComponent implements OnInit, OnDestroy { + bufferValue: number; + mode: 'determinate' | 'indeterminate' | 'buffer' | 'query'; + value: number; + visible: boolean; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {FuseProgressBarService} _fuseProgressBarService + */ + constructor(private _fuseProgressBarService: FuseProgressBarService) { + // Set the defaults + + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Subscribe to the progress bar service properties + + // Buffer value + this._fuseProgressBarService.bufferValue + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(bufferValue => { + this.bufferValue = bufferValue; + }); + + // Mode + this._fuseProgressBarService.mode + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(mode => { + this.mode = mode; + }); + + // Value + this._fuseProgressBarService.value + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(value => { + this.value = value; + }); + + // Visible + this._fuseProgressBarService.visible + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(visible => { + this.visible = visible; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- +} diff --git a/src/@fuse/components/progress-bar/progress-bar.module.ts b/src/@fuse/components/progress-bar/progress-bar.module.ts new file mode 100644 index 0000000..43e2fc3 --- /dev/null +++ b/src/@fuse/components/progress-bar/progress-bar.module.ts @@ -0,0 +1,23 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; + +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; + +import { FuseProgressBarComponent } from './progress-bar.component'; + +@NgModule({ + declarations: [FuseProgressBarComponent], + imports: [ + CommonModule, + RouterModule, + + MatButtonModule, + MatIconModule, + MatProgressBarModule + ], + exports: [FuseProgressBarComponent] +}) +export class FuseProgressBarModule {} diff --git a/src/@fuse/components/progress-bar/progress-bar.service.ts b/src/@fuse/components/progress-bar/progress-bar.service.ts new file mode 100644 index 0000000..a797c26 --- /dev/null +++ b/src/@fuse/components/progress-bar/progress-bar.service.ts @@ -0,0 +1,130 @@ +import { Injectable } from '@angular/core'; +import { + NavigationCancel, + NavigationEnd, + NavigationError, + NavigationStart, + Router +} from '@angular/router'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { filter } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class FuseProgressBarService { + // Private + private _bufferValue: BehaviorSubject; + private _mode: BehaviorSubject; + private _value: BehaviorSubject; + private _visible: BehaviorSubject; + + /** + * Constructor + * + * @param {Router} _router + */ + constructor(private _router: Router) { + // Initialize the service + this._init(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Buffer value + */ + get bufferValue(): Observable { + return this._bufferValue.asObservable(); + } + + setBufferValue(value: number): void { + this._bufferValue.next(value); + } + + /** + * Mode + */ + get mode(): Observable { + return this._mode.asObservable(); + } + + setMode(value: 'determinate' | 'indeterminate' | 'buffer' | 'query'): void { + this._mode.next(value); + } + + /** + * Value + */ + get value(): Observable { + return this._value.asObservable(); + } + + setValue(value: number): void { + this._value.next(value); + } + + /** + * Visible + */ + get visible(): Observable { + return this._visible.asObservable(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Initialize + * + * @private + */ + private _init(): void { + // Initialize the behavior subjects + this._bufferValue = new BehaviorSubject(0); + this._mode = new BehaviorSubject('indeterminate'); + this._value = new BehaviorSubject(0); + this._visible = new BehaviorSubject(false); + + // Subscribe to the router events to show/hide the loading bar + this._router.events + .pipe(filter(event => event instanceof NavigationStart)) + .subscribe(() => { + this.show(); + }); + + this._router.events + .pipe( + filter( + event => + event instanceof NavigationEnd || + event instanceof NavigationError || + event instanceof NavigationCancel + ) + ) + .subscribe(() => { + this.hide(); + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Show the progress bar + */ + show(): void { + this._visible.next(true); + } + + /** + * Hide the progress bar + */ + hide(): void { + this._visible.next(false); + } +} diff --git a/src/@fuse/components/search-bar/search-bar.component.html b/src/@fuse/components/search-bar/search-bar.component.html new file mode 100644 index 0000000..5fe307c --- /dev/null +++ b/src/@fuse/components/search-bar/search-bar.component.html @@ -0,0 +1,33 @@ + diff --git a/src/@fuse/components/search-bar/search-bar.component.scss b/src/@fuse/components/search-bar/search-bar.component.scss new file mode 100644 index 0000000..17be3f8 --- /dev/null +++ b/src/@fuse/components/search-bar/search-bar.component.scss @@ -0,0 +1,88 @@ +@import 'src/@fuse/scss/fuse'; + +:host { + .fuse-search-bar { + display: flex; + flex: 0 1 auto; + min-width: 64px; + height: 64px; + font-size: 13px; + + @include media-breakpoint('xs') { + height: 56px; + } + + .fuse-search-bar-content { + display: flex; + flex: 1 1 auto; + align-items: center; + justify-content: flex-start; + + .fuse-search-bar-expander, + .fuse-search-bar-collapser { + cursor: pointer; + padding: 0 20px; + margin: 0; + width: 64px !important; + height: 64px !important; + line-height: 64px !important; + + @include media-breakpoint('xs') { + height: 56px !important; + line-height: 56px !important; + } + } + + .fuse-search-bar-loader { + width: 64px !important; + height: 64px !important; + line-height: 64px !important; + + @include media-breakpoint('xs') { + height: 56px !important; + line-height: 56px !important; + } + } + + .fuse-search-bar-collapser { + display: none; + } + + #fuse-search-bar-input { + display: none; + flex: 1 0 auto; + min-height: 64px; + font-size: 16px; + background-color: transparent; + color: currentColor; + } + } + + &.expanded { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 10; + + .fuse-search-bar-content { + #fuse-search-bar-input { + display: flex; + } + + .fuse-search-bar-collapser { + display: flex; + } + } + } + } + + body { + &.fuse-search-bar-expanded { + #toolbar { + z-index: 999 !important; + } + } + } +} diff --git a/src/@fuse/components/search-bar/search-bar.component.ts b/src/@fuse/components/search-bar/search-bar.component.ts new file mode 100644 index 0000000..69176ad --- /dev/null +++ b/src/@fuse/components/search-bar/search-bar.component.ts @@ -0,0 +1,93 @@ +import { + Component, + EventEmitter, + OnDestroy, + OnInit, + Output +} from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { FuseConfigService } from '../../services/config.service'; + +@Component({ + selector: 'fuse-search-bar', + templateUrl: './search-bar.component.html', + styleUrls: ['./search-bar.component.scss'] +}) +export class FuseSearchBarComponent implements OnInit, OnDestroy { + collapsed: boolean; + fuseConfig: any; + + @Output() + input: EventEmitter; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {FuseConfigService} _fuseConfigService + */ + constructor(private _fuseConfigService: FuseConfigService) { + // Set the defaults + this.input = new EventEmitter(); + this.collapsed = true; + + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Subscribe to config changes + this._fuseConfigService.config + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(config => { + this.fuseConfig = config; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Collapse + */ + collapse(): void { + this.collapsed = true; + } + + /** + * Expand + */ + expand(): void { + this.collapsed = false; + } + + /** + * Search + * + * @param event + */ + search(event): void { + this.input.emit(event.target.value); + } +} diff --git a/src/@fuse/components/search-bar/search-bar.module.ts b/src/@fuse/components/search-bar/search-bar.module.ts new file mode 100644 index 0000000..c898dba --- /dev/null +++ b/src/@fuse/components/search-bar/search-bar.module.ts @@ -0,0 +1,15 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; + +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; + +import { FuseSearchBarComponent } from './search-bar.component'; + +@NgModule({ + declarations: [FuseSearchBarComponent], + imports: [CommonModule, RouterModule, MatButtonModule, MatIconModule], + exports: [FuseSearchBarComponent] +}) +export class FuseSearchBarModule {} diff --git a/src/@fuse/components/search-bar/search-bar.theme.scss b/src/@fuse/components/search-bar/search-bar.theme.scss new file mode 100644 index 0000000..be88c5b --- /dev/null +++ b/src/@fuse/components/search-bar/search-bar.theme.scss @@ -0,0 +1,9 @@ +@mixin fuse-search-bar-theme($theme) { + $background: map-get($theme, background); + + .fuse-search-bar { + &.expanded { + background-color: map-get($background, background); + } + } +} diff --git a/src/@fuse/components/shortcuts/shortcuts.component.html b/src/@fuse/components/shortcuts/shortcuts.component.html new file mode 100644 index 0000000..bb06347 --- /dev/null +++ b/src/@fuse/components/shortcuts/shortcuts.component.html @@ -0,0 +1,159 @@ +
+
+ +
+ +
+ + + + + + + + + + + +
+ + {{ shortcutItem.icon }} + + + + {{ shortcutItem.title.substr(0, 1).toUpperCase() }} + + +

{{ shortcutItem.title }}

+ + star +
+
+ + +

+ No shortcuts yet! +

+
+
+ + + +
+ + {{ navigationItem.icon }} + + + + {{ navigationItem.title.substr(0, 1).toUpperCase() }} + + +

{{ navigationItem.title }}

+ + star +
+
+
+
+
+
diff --git a/src/@fuse/components/shortcuts/shortcuts.component.scss b/src/@fuse/components/shortcuts/shortcuts.component.scss new file mode 100644 index 0000000..f138a44 --- /dev/null +++ b/src/@fuse/components/shortcuts/shortcuts.component.scss @@ -0,0 +1,27 @@ +@import 'src/@fuse/scss/fuse'; + +:host { + @include media-breakpoint('lt-md') { + #fuse-shortcuts { + &.show-mobile-panel { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 99; + padding: 0 8px; + + .shortcuts { + display: flex !important; + flex: 1; + height: 100%; + + > div { + flex: 1 1 auto !important; + } + } + } + } + } +} diff --git a/src/@fuse/components/shortcuts/shortcuts.component.ts b/src/@fuse/components/shortcuts/shortcuts.component.ts new file mode 100644 index 0000000..00fe430 --- /dev/null +++ b/src/@fuse/components/shortcuts/shortcuts.component.ts @@ -0,0 +1,239 @@ +import { + AfterViewInit, + Component, + ElementRef, + Input, + OnDestroy, + OnInit, + Renderer2, + ViewChild +} from '@angular/core'; +import { MediaObserver } from '@angular/flex-layout'; +import { CookieService } from 'ngx-cookie-service'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { FuseMatchMediaService } from '../../services/match-media.service'; +import { FuseNavigationService } from '../navigation/navigation.service'; + +@Component({ + selector: 'fuse-shortcuts', + templateUrl: './shortcuts.component.html', + styleUrls: ['./shortcuts.component.scss'] +}) +export class FuseShortcutsComponent + implements OnInit, AfterViewInit, OnDestroy { + shortcutItems: any[]; + navigationItems: any[]; + filteredNavigationItems: any[]; + searching: boolean; + mobileShortcutsPanelActive: boolean; + + @Input() + navigation: any; + + @ViewChild('searchInput', { static: false }) + searchInputField; + + @ViewChild('shortcuts', { static: false }) + shortcutsEl: ElementRef; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {CookieService} _cookieService + * @param {FuseMatchMediaService} _fuseMatchMediaService + * @param {FuseNavigationService} _fuseNavigationService + * @param {MediaObserver} _mediaObserver + * @param {Renderer2} _renderer + */ + constructor( + private _cookieService: CookieService, + private _fuseMatchMediaService: FuseMatchMediaService, + private _fuseNavigationService: FuseNavigationService, + private _mediaObserver: MediaObserver, + private _renderer: Renderer2 + ) { + // Set the defaults + this.shortcutItems = []; + this.searching = false; + this.mobileShortcutsPanelActive = false; + + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Get the navigation items and flatten them + this.filteredNavigationItems = this.navigationItems = this._fuseNavigationService.getFlatNavigation( + this.navigation + ); + + if (this._cookieService.check('FUSE2.shortcuts')) { + this.shortcutItems = JSON.parse( + this._cookieService.get('FUSE2.shortcuts') + ); + } else { + // User's shortcut items + this.shortcutItems = [ + { + title: 'Calendar', + type: 'item', + icon: 'today', + url: '/apps/calendar' + }, + { + title: 'Mail', + type: 'item', + icon: 'email', + url: '/apps/mail' + }, + { + title: 'Contacts', + type: 'item', + icon: 'account_box', + url: '/apps/contacts' + }, + { + title: 'To-Do', + type: 'item', + icon: 'check_box', + url: '/apps/todo' + } + ]; + } + } + + ngAfterViewInit(): void { + // Subscribe to media changes + this._fuseMatchMediaService.onMediaChange + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(() => { + if (this._mediaObserver.isActive('gt-sm')) { + this.hideMobileShortcutsPanel(); + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Search + * + * @param event + */ + search(event): void { + const value = event.target.value.toLowerCase(); + + if (value === '') { + this.searching = false; + this.filteredNavigationItems = this.navigationItems; + + return; + } + + this.searching = true; + + this.filteredNavigationItems = this.navigationItems.filter( + navigationItem => { + return navigationItem.title.toLowerCase().includes(value); + } + ); + } + + /** + * Toggle shortcut + * + * @param event + * @param itemToToggle + */ + toggleShortcut(event, itemToToggle): void { + event.stopPropagation(); + + for (let i = 0; i < this.shortcutItems.length; i++) { + if (this.shortcutItems[i].url === itemToToggle.url) { + this.shortcutItems.splice(i, 1); + + // Save to the cookies + this._cookieService.set( + 'FUSE2.shortcuts', + JSON.stringify(this.shortcutItems) + ); + + return; + } + } + + this.shortcutItems.push(itemToToggle); + + // Save to the cookies + this._cookieService.set( + 'FUSE2.shortcuts', + JSON.stringify(this.shortcutItems) + ); + } + + /** + * Is in shortcuts? + * + * @param navigationItem + * @returns {any} + */ + isInShortcuts(navigationItem): any { + return this.shortcutItems.find(item => { + return item.url === navigationItem.url; + }); + } + + /** + * On menu open + */ + onMenuOpen(): void { + setTimeout(() => { + this.searchInputField.nativeElement.focus(); + }); + } + + /** + * Show mobile shortcuts + */ + showMobileShortcutsPanel(): void { + this.mobileShortcutsPanelActive = true; + this._renderer.addClass( + this.shortcutsEl.nativeElement, + 'show-mobile-panel' + ); + } + + /** + * Hide mobile shortcuts + */ + hideMobileShortcutsPanel(): void { + this.mobileShortcutsPanelActive = false; + this._renderer.removeClass( + this.shortcutsEl.nativeElement, + 'show-mobile-panel' + ); + } +} diff --git a/src/@fuse/components/shortcuts/shortcuts.module.ts b/src/@fuse/components/shortcuts/shortcuts.module.ts new file mode 100644 index 0000000..eb197e1 --- /dev/null +++ b/src/@fuse/components/shortcuts/shortcuts.module.ts @@ -0,0 +1,37 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatFormFieldModule } from '@angular/material/form-field'; +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 { MatTooltipModule } from '@angular/material/tooltip'; +import { CookieService } from 'ngx-cookie-service'; + +import { FuseShortcutsComponent } from './shortcuts.component'; + +@NgModule({ + declarations: [FuseShortcutsComponent], + imports: [ + CommonModule, + RouterModule, + + FlexLayoutModule, + + MatButtonModule, + MatDividerModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatListModule, + MatTooltipModule + ], + exports: [FuseShortcutsComponent], + providers: [CookieService] +}) +export class FuseShortcutsModule {} diff --git a/src/@fuse/components/shortcuts/shortcuts.theme.scss b/src/@fuse/components/shortcuts/shortcuts.theme.scss new file mode 100644 index 0000000..b83f615 --- /dev/null +++ b/src/@fuse/components/shortcuts/shortcuts.theme.scss @@ -0,0 +1,9 @@ +@mixin fuse-shortcuts-theme($theme) { + $background: map-get($theme, background); + + #fuse-shortcuts { + &.show-mobile-panel { + background-color: map-get($background, background); + } + } +} diff --git a/src/@fuse/components/sidebar/sidebar.component.html b/src/@fuse/components/sidebar/sidebar.component.html new file mode 100644 index 0000000..b391af1 --- /dev/null +++ b/src/@fuse/components/sidebar/sidebar.component.html @@ -0,0 +1 @@ + diff --git a/src/@fuse/components/sidebar/sidebar.component.scss b/src/@fuse/components/sidebar/sidebar.component.scss new file mode 100644 index 0000000..c3a97de --- /dev/null +++ b/src/@fuse/components/sidebar/sidebar.component.scss @@ -0,0 +1,65 @@ +@import 'src/@fuse/scss/fuse'; + +fuse-sidebar { + display: flex; + flex-direction: column; + flex: 1 0 auto; + position: absolute; + top: 0; + bottom: 0; + overflow-x: hidden; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + width: 280px; + min-width: 280px; + max-width: 280px; + z-index: 1000; + box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.35); + + @include media-breakpoint('xs') { + min-width: 0 !important; + max-width: 80vw !important; + width: 80vw !important; + } + + &.left-positioned { + left: 0; + transform: translateX(-100%); + } + + &.right-positioned { + right: 0; + transform: translateX(100%); + } + + &.open { + transform: translateX(0); + } + + &.locked-open { + position: relative !important; + transform: translateX(0) !important; + } + + &.folded { + position: absolute !important; + top: 0; + bottom: 0; + } + + &.animations-enabled { + transition-property: transform, width, min-width, max-width; + transition-duration: 150ms; + transition-timing-function: ease-in-out; + } +} + +.fuse-sidebar-overlay { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 999; + opacity: 0; +} diff --git a/src/@fuse/components/sidebar/sidebar.component.ts b/src/@fuse/components/sidebar/sidebar.component.ts new file mode 100644 index 0000000..e0aa72e --- /dev/null +++ b/src/@fuse/components/sidebar/sidebar.component.ts @@ -0,0 +1,803 @@ +import { + ChangeDetectorRef, + Component, + ElementRef, + EventEmitter, + HostBinding, + HostListener, + Input, + OnDestroy, + OnInit, + Output, + Renderer2, + ViewEncapsulation +} from '@angular/core'; +import { + animate, + AnimationBuilder, + AnimationPlayer, + style +} from '@angular/animations'; +import { MediaObserver } from '@angular/flex-layout'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { FuseSidebarService } from './sidebar.service'; +import { FuseMatchMediaService } from '../../services/match-media.service'; +import { FuseConfigService } from '../../services/config.service'; + +@Component({ + selector: 'fuse-sidebar', + templateUrl: './sidebar.component.html', + styleUrls: ['./sidebar.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class FuseSidebarComponent implements OnInit, OnDestroy { + // Name + @Input() + name: string; + + // Key + @Input() + key: string; + + // Position + @Input() + position: 'left' | 'right'; + + // Open + @HostBinding('class.open') + opened: boolean; + + // Locked Open + @Input() + lockedOpen: string; + + // isLockedOpen + @HostBinding('class.locked-open') + isLockedOpen: boolean; + + // Folded width + @Input() + foldedWidth: number; + + // Folded auto trigger on hover + @Input() + foldedAutoTriggerOnHover: boolean; + + // Folded unfolded + @HostBinding('class.unfolded') + unfolded: boolean; + + // Invisible overlay + @Input() + invisibleOverlay: boolean; + + // Folded changed + @Output() + foldedChanged: EventEmitter; + + // Opened changed + @Output() + openedChanged: EventEmitter; + + // Private + private _folded: boolean; + private _fuseConfig: any; + private _wasActive: boolean; + private _wasFolded: boolean; + private _backdrop: HTMLElement | null = null; + private _player: AnimationPlayer; + private _unsubscribeAll: Subject; + + @HostBinding('class.animations-enabled') + private _animationsEnabled: boolean; + + /** + * Constructor + * + * @param {AnimationBuilder} _animationBuilder + * @param {ChangeDetectorRef} _changeDetectorRef + * @param {ElementRef} _elementRef + * @param {FuseConfigService} _fuseConfigService + * @param {FuseMatchMediaService} _fuseMatchMediaService + * @param {FuseSidebarService} _fuseSidebarService + * @param {MediaObserver} _mediaObserver + * @param {Renderer2} _renderer + */ + constructor( + private _animationBuilder: AnimationBuilder, + private _changeDetectorRef: ChangeDetectorRef, + private _elementRef: ElementRef, + private _fuseConfigService: FuseConfigService, + private _fuseMatchMediaService: FuseMatchMediaService, + private _fuseSidebarService: FuseSidebarService, + private _mediaObserver: MediaObserver, + private _renderer: Renderer2 + ) { + // Set the defaults + this.foldedAutoTriggerOnHover = true; + this.foldedWidth = 64; + this.foldedChanged = new EventEmitter(); + this.openedChanged = new EventEmitter(); + this.opened = false; + this.position = 'left'; + this.invisibleOverlay = false; + + // Set the private defaults + this._animationsEnabled = false; + this._folded = false; + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Folded + * + * @param {boolean} value + */ + @Input() + set folded(value: boolean) { + // Set the folded + this._folded = value; + + // Return if the sidebar is closed + if (!this.opened) { + return; + } + + // Programmatically add/remove padding to the element + // that comes after or before based on the position + let sibling, styleRule; + + const styleValue = this.foldedWidth + 'px'; + + // Get the sibling and set the style rule + if (this.position === 'left') { + sibling = this._elementRef.nativeElement.nextElementSibling; + styleRule = 'padding-left'; + } else { + sibling = this._elementRef.nativeElement.previousElementSibling; + styleRule = 'padding-right'; + } + + // If there is no sibling, return... + if (!sibling) { + return; + } + + // If folded... + if (value) { + // Fold the sidebar + this.fold(); + + // Set the folded width + this._renderer.setStyle( + this._elementRef.nativeElement, + 'width', + styleValue + ); + this._renderer.setStyle( + this._elementRef.nativeElement, + 'min-width', + styleValue + ); + this._renderer.setStyle( + this._elementRef.nativeElement, + 'max-width', + styleValue + ); + + // Set the style and class + this._renderer.setStyle(sibling, styleRule, styleValue); + this._renderer.addClass(this._elementRef.nativeElement, 'folded'); + } + // If unfolded... + else { + // Unfold the sidebar + this.unfold(); + + // Remove the folded width + this._renderer.removeStyle(this._elementRef.nativeElement, 'width'); + this._renderer.removeStyle(this._elementRef.nativeElement, 'min-width'); + this._renderer.removeStyle(this._elementRef.nativeElement, 'max-width'); + + // Remove the style and class + this._renderer.removeStyle(sibling, styleRule); + this._renderer.removeClass(this._elementRef.nativeElement, 'folded'); + } + + // Emit the 'foldedChanged' event + this.foldedChanged.emit(this.folded); + } + + get folded(): boolean { + return this._folded; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Subscribe to config changes + this._fuseConfigService.config + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(config => { + this._fuseConfig = config; + }); + + // Register the sidebar + this._fuseSidebarService.register(this.name, this); + + // Setup visibility + this._setupVisibility(); + + // Setup position + this._setupPosition(); + + // Setup lockedOpen + this._setupLockedOpen(); + + // Setup folded + this._setupFolded(); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // If the sidebar is folded, unfold it to revert modifications + if (this.folded) { + this.unfold(); + } + + // Unregister the sidebar + this._fuseSidebarService.unregister(this.name); + + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Setup the visibility of the sidebar + * + * @private + */ + private _setupVisibility(): void { + // Remove the existing box-shadow + this._renderer.setStyle( + this._elementRef.nativeElement, + 'box-shadow', + 'none' + ); + + // Make the sidebar invisible + this._renderer.setStyle( + this._elementRef.nativeElement, + 'visibility', + 'hidden' + ); + } + + /** + * Setup the sidebar position + * + * @private + */ + private _setupPosition(): void { + // Add the correct class name to the sidebar + // element depending on the position attribute + if (this.position === 'right') { + this._renderer.addClass( + this._elementRef.nativeElement, + 'right-positioned' + ); + } else { + this._renderer.addClass( + this._elementRef.nativeElement, + 'left-positioned' + ); + } + } + + /** + * Setup the lockedOpen handler + * + * @private + */ + private _setupLockedOpen(): void { + // Return if the lockedOpen wasn't set + if (!this.lockedOpen) { + // Return + return; + } + + // Set the wasActive for the first time + this._wasActive = false; + + // Set the wasFolded + this._wasFolded = this.folded; + + // Show the sidebar + this._showSidebar(); + + // Act on every media change + this._fuseMatchMediaService.onMediaChange + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(() => { + // Get the active status + const isActive = this._mediaObserver.isActive(this.lockedOpen); + + // If the both status are the same, don't act + if (this._wasActive === isActive) { + return; + } + + // Activate the lockedOpen + if (isActive) { + // Set the lockedOpen status + this.isLockedOpen = true; + + // Show the sidebar + this._showSidebar(); + + // Force the the opened status to true + this.opened = true; + + // Emit the 'openedChanged' event + this.openedChanged.emit(this.opened); + + // If the sidebar was folded, forcefully fold it again + if (this._wasFolded) { + // Enable the animations + this._enableAnimations(); + + // Fold + this.folded = true; + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + // Hide the backdrop if any exists + this._hideBackdrop(); + } + // De-Activate the lockedOpen + else { + // Set the lockedOpen status + this.isLockedOpen = false; + + // Unfold the sidebar in case if it was folded + this.unfold(); + + // Force the the opened status to close + this.opened = false; + + // Emit the 'openedChanged' event + this.openedChanged.emit(this.opened); + + // Hide the sidebar + this._hideSidebar(); + } + + // Store the new active status + this._wasActive = isActive; + }); + } + + /** + * Setup the initial folded status + * + * @private + */ + private _setupFolded(): void { + // Return, if sidebar is not folded + if (!this.folded) { + return; + } + + // Return if the sidebar is closed + if (!this.opened) { + return; + } + + // Programmatically add/remove padding to the element + // that comes after or before based on the position + let sibling, styleRule; + + const styleValue = this.foldedWidth + 'px'; + + // Get the sibling and set the style rule + if (this.position === 'left') { + sibling = this._elementRef.nativeElement.nextElementSibling; + styleRule = 'padding-left'; + } else { + sibling = this._elementRef.nativeElement.previousElementSibling; + styleRule = 'padding-right'; + } + + // If there is no sibling, return... + if (!sibling) { + return; + } + + // Fold the sidebar + this.fold(); + + // Set the folded width + this._renderer.setStyle( + this._elementRef.nativeElement, + 'width', + styleValue + ); + this._renderer.setStyle( + this._elementRef.nativeElement, + 'min-width', + styleValue + ); + this._renderer.setStyle( + this._elementRef.nativeElement, + 'max-width', + styleValue + ); + + // Set the style and class + this._renderer.setStyle(sibling, styleRule, styleValue); + this._renderer.addClass(this._elementRef.nativeElement, 'folded'); + } + + /** + * Show the backdrop + * + * @private + */ + private _showBackdrop(): void { + // Create the backdrop element + this._backdrop = this._renderer.createElement('div'); + + // Add a class to the backdrop element + this._backdrop.classList.add('fuse-sidebar-overlay'); + + // Add a class depending on the invisibleOverlay option + if (this.invisibleOverlay) { + this._backdrop.classList.add('fuse-sidebar-overlay-invisible'); + } + + // Append the backdrop to the parent of the sidebar + this._renderer.appendChild( + this._elementRef.nativeElement.parentElement, + this._backdrop + ); + + // Create the enter animation and attach it to the player + this._player = this._animationBuilder + .build([animate('300ms ease', style({ opacity: 1 }))]) + .create(this._backdrop); + + // Play the animation + this._player.play(); + + // Add an event listener to the overlay + this._backdrop.addEventListener('click', () => { + this.close(); + }); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Hide the backdrop + * + * @private + */ + private _hideBackdrop(): void { + if (!this._backdrop) { + return; + } + + // Create the leave animation and attach it to the player + this._player = this._animationBuilder + .build([animate('300ms ease', style({ opacity: 0 }))]) + .create(this._backdrop); + + // Play the animation + this._player.play(); + + // Once the animation is done... + this._player.onDone(() => { + // If the backdrop still exists... + if (this._backdrop) { + // Remove the backdrop + this._backdrop.parentNode.removeChild(this._backdrop); + this._backdrop = null; + } + }); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Change some properties of the sidebar + * and make it visible + * + * @private + */ + private _showSidebar(): void { + // Remove the box-shadow style + this._renderer.removeStyle(this._elementRef.nativeElement, 'box-shadow'); + + // Make the sidebar invisible + this._renderer.removeStyle(this._elementRef.nativeElement, 'visibility'); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Change some properties of the sidebar + * and make it invisible + * + * @private + */ + private _hideSidebar(delay = true): void { + const delayAmount = delay ? 300 : 0; + + // Add a delay so close animation can play + setTimeout(() => { + // Remove the box-shadow + this._renderer.setStyle( + this._elementRef.nativeElement, + 'box-shadow', + 'none' + ); + + // Make the sidebar invisible + this._renderer.setStyle( + this._elementRef.nativeElement, + 'visibility', + 'hidden' + ); + }, delayAmount); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Enable the animations + * + * @private + */ + private _enableAnimations(): void { + // Return if animations already enabled + if (this._animationsEnabled) { + return; + } + + // Enable the animations + this._animationsEnabled = true; + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Open the sidebar + */ + open(): void { + if (this.opened || this.isLockedOpen) { + return; + } + + // Enable the animations + this._enableAnimations(); + + // Show the sidebar + this._showSidebar(); + + // Show the backdrop + this._showBackdrop(); + + // Set the opened status + this.opened = true; + + // Emit the 'openedChanged' event + this.openedChanged.emit(this.opened); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Close the sidebar + */ + close(): void { + if (!this.opened || this.isLockedOpen) { + return; + } + + // Enable the animations + this._enableAnimations(); + + // Hide the backdrop + this._hideBackdrop(); + + // Set the opened status + this.opened = false; + + // Emit the 'openedChanged' event + this.openedChanged.emit(this.opened); + + // Hide the sidebar + this._hideSidebar(); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Toggle open/close the sidebar + */ + toggleOpen(): void { + if (this.opened) { + this.close(); + } else { + this.open(); + } + } + + /** + * Mouseenter + */ + @HostListener('mouseenter') + onMouseEnter(): void { + // Only work if the auto trigger is enabled + if (!this.foldedAutoTriggerOnHover) { + return; + } + + this.unfoldTemporarily(); + } + + /** + * Mouseleave + */ + @HostListener('mouseleave') + onMouseLeave(): void { + // Only work if the auto trigger is enabled + if (!this.foldedAutoTriggerOnHover) { + return; + } + + this.foldTemporarily(); + } + + /** + * Fold the sidebar permanently + */ + fold(): void { + // Only work if the sidebar is not folded + if (this.folded) { + return; + } + + // Enable the animations + this._enableAnimations(); + + // Fold + this.folded = true; + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Unfold the sidebar permanently + */ + unfold(): void { + // Only work if the sidebar is folded + if (!this.folded) { + return; + } + + // Enable the animations + this._enableAnimations(); + + // Unfold + this.folded = false; + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Toggle the sidebar fold/unfold permanently + */ + toggleFold(): void { + if (this.folded) { + this.unfold(); + } else { + this.fold(); + } + } + + /** + * Fold the temporarily unfolded sidebar back + */ + foldTemporarily(): void { + // Only work if the sidebar is folded + if (!this.folded) { + return; + } + + // Enable the animations + this._enableAnimations(); + + // Fold the sidebar back + this.unfolded = false; + + // Set the folded width + const styleValue = this.foldedWidth + 'px'; + + this._renderer.setStyle( + this._elementRef.nativeElement, + 'width', + styleValue + ); + this._renderer.setStyle( + this._elementRef.nativeElement, + 'min-width', + styleValue + ); + this._renderer.setStyle( + this._elementRef.nativeElement, + 'max-width', + styleValue + ); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } + + /** + * Unfold the sidebar temporarily + */ + unfoldTemporarily(): void { + // Only work if the sidebar is folded + if (!this.folded) { + return; + } + + // Enable the animations + this._enableAnimations(); + + // Unfold the sidebar temporarily + this.unfolded = true; + + // Remove the folded width + this._renderer.removeStyle(this._elementRef.nativeElement, 'width'); + this._renderer.removeStyle(this._elementRef.nativeElement, 'min-width'); + this._renderer.removeStyle(this._elementRef.nativeElement, 'max-width'); + + // Mark for check + this._changeDetectorRef.markForCheck(); + } +} diff --git a/src/@fuse/components/sidebar/sidebar.module.ts b/src/@fuse/components/sidebar/sidebar.module.ts new file mode 100644 index 0000000..c92c858 --- /dev/null +++ b/src/@fuse/components/sidebar/sidebar.module.ts @@ -0,0 +1,9 @@ +import { NgModule } from '@angular/core'; + +import { FuseSidebarComponent } from './sidebar.component'; + +@NgModule({ + declarations: [FuseSidebarComponent], + exports: [FuseSidebarComponent] +}) +export class FuseSidebarModule {} diff --git a/src/@fuse/components/sidebar/sidebar.service.ts b/src/@fuse/components/sidebar/sidebar.service.ts new file mode 100644 index 0000000..9dd4570 --- /dev/null +++ b/src/@fuse/components/sidebar/sidebar.service.ts @@ -0,0 +1,73 @@ +import { Injectable } from '@angular/core'; + +import { FuseSidebarComponent } from './sidebar.component'; + +@Injectable({ + providedIn: 'root' +}) +export class FuseSidebarService { + // Private + private _registry: { [key: string]: FuseSidebarComponent } = {}; + + /** + * Constructor + */ + constructor() {} + + /** + * Add the sidebar to the registry + * + * @param key + * @param sidebar + */ + register(key, sidebar): void { + // Check if the key already being used + if (this._registry[key]) { + console.error( + `The sidebar with the key '${key}' already exists. Either unregister it first or use a unique key.` + ); + + return; + } + + // Add to the registry + this._registry[key] = sidebar; + } + + /** + * Remove the sidebar from the registry + * + * @param key + */ + unregister(key): void { + // Check if the sidebar exists + if (!this._registry[key]) { + console.warn( + `The sidebar with the key '${key}' doesn't exist in the registry.` + ); + } + + // Unregister the sidebar + delete this._registry[key]; + } + + /** + * Return the sidebar with the given key + * + * @param key + * @returns {FuseSidebarComponent} + */ + getSidebar(key): FuseSidebarComponent { + // Check if the sidebar exists + if (!this._registry[key]) { + console.warn( + `The sidebar with the key '${key}' doesn't exist in the registry.` + ); + + return; + } + + // Return the sidebar + return this._registry[key]; + } +} diff --git a/src/@fuse/components/sidebar/sidebar.theme.scss b/src/@fuse/components/sidebar/sidebar.theme.scss new file mode 100644 index 0000000..b3c1b37 --- /dev/null +++ b/src/@fuse/components/sidebar/sidebar.theme.scss @@ -0,0 +1,15 @@ +@mixin fuse-sidebar-theme($theme) { + $background: map-get($theme, background); + + fuse-sidebar { + background: map-get($background, background); + } + + .fuse-sidebar-overlay { + background-color: rgba(0, 0, 0, 0.6); + + &.fuse-sidebar-overlay-invisible { + background-color: transparent; + } + } +} diff --git a/src/@fuse/components/theme-options/theme-options.component.html b/src/@fuse/components/theme-options/theme-options.component.html new file mode 100644 index 0000000..675338d --- /dev/null +++ b/src/@fuse/components/theme-options/theme-options.component.html @@ -0,0 +1,545 @@ +
+ +
+ + Theme Options + + + +
+ +
+ + +
+ +

Color themes

+ + + Default Light + Yellow Light + Blue-Gray Dark + Pink Dark + + +
+ + +
+ +

Layout Styles

+ + + + + Vertical Layout #1 + + + + Vertical Layout #2 + + + + Vertical Layout #3 + + + + Horizontal Layout #1 + + + + + + + + + + + +
+ +

Layout Width

+ + Fullwidth + Boxed + + +
+ + +
+ +

Navbar

+ + + Hide + + + + Folded + + +

Position:

+ + Left + Right + + +

Variant:

+ + Style 1 + Style 2 + + +

Primary background:

+ + + +

Secondary background:

+ + + +
+ + +
+ +

Toolbar

+ + + Hide + + +

Position:

+ + Above + Below Static + Below Fixed + + + + Use custom background color + + +

Background color:

+ + + +
+ + +
+ +

Footer

+ + + Hide + + +

Position:

+ + Above + Below Static + Below Fixed + + + + Use custom background color + + +

Color:

+ + + +
+ + +
+ +

Side Panel

+ + + Hide + + +

Position:

+ + Left + Right + + +
+ +
+ + + + + +
+ +

Layout Width

+ + Fullwidth + Boxed + + +
+ + +
+ +

Navbar

+ + + Hide + + + + Folded + + +

Position:

+ + Left + Right + + +

Variant:

+ + Style 1 + Style 2 + + +

Primary background:

+ + + +

Secondary background:

+ + + +
+ + +
+ +

Toolbar

+ + + Hide + + +

Position:

+ + Above Static + Above Fixed + Below + + + + Use custom background color + + +

Background color:

+ + + +
+ + +
+ +

Footer

+ + + Hide + + +

Position:

+ + Above Static + Above Fixed + Below + + + + Use custom background color + + +

Background color:

+ + + +
+ + +
+ +

Side Panel

+ + + Hide + + +

Position:

+ + Left + Right + + +
+ +
+ + + + + +
+ +

Layout Width

+ + Fullwidth + Boxed + + +
+ + +
+ +

Navbar

+ + + Hide + + + + Folded + + +

Position:

+ + Left + Right + + +

Variant:

+ + Style 1 + Style 2 + + +

Primary background:

+ + + +

Secondary background:

+ + + +
+ + +
+ +

Toolbar

+ + + Hide + + +

Position:

+ + Above Static + Above Fixed + + + + Use custom background color + + +

Background color:

+ + + +
+ + +
+ +

Footer

+ + + Hide + + +

Position:

+ + Above Static + Above Fixed + + + + Use custom background color + + +

Background color:

+ + + +
+ + +
+ +

Side Panel

+ + + Hide + + +

Position:

+ + Left + Right + + +
+ +
+ + + + + +
+ +

Layout Width

+ + Fullwidth + Boxed + + +
+ + +
+ +

Navbar

+ + + Hide + + +

Position:

+ + Top + + +

Variant (Vertical):

+ + Style 1 + Style 2 + + +

Primary background:

+ + + +

Secondary background (Vertical):

+ + + +
+ + +
+ +

Toolbar

+ + + Hide + + +

Position:

+ + Above + Below + + + + Use custom background color + + +

Background color:

+ + + +
+ + +
+ +

Footer

+ + + Hide + + +

Position:

+ + Above Fixed + Above Static + + + + Use custom background color + + +

Background color:

+ + + +
+ + +
+ +

Side Panel

+ + + Hide + + +

Position:

+ + Left + Right + + +
+ +
+ +
+ +
+ + +
+ +

Custom scrollbars

+ + + Enable custom scrollbars + + +
+ +
+ +
\ No newline at end of file diff --git a/src/@fuse/components/theme-options/theme-options.component.scss b/src/@fuse/components/theme-options/theme-options.component.scss new file mode 100644 index 0000000..ba9e977 --- /dev/null +++ b/src/@fuse/components/theme-options/theme-options.component.scss @@ -0,0 +1,75 @@ +@import 'src/@fuse/scss/fuse'; + +@keyframes rotating { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +fuse-theme-options { + display: flex; + overflow: hidden; + + .theme-options-panel { + display: flex; + flex-direction: column; + flex: 1 0 auto; + padding: 40px 24px 24px 24px; + overflow: auto; + -webkit-overflow-scrolling: touch; + + .header { + display: flex; + flex: 0 1 auto; + margin-bottom: 32px; + align-items: center; + justify-content: space-between; + + .title { + font-size: 20px; + font-weight: 600; + padding-left: 4px; + } + } + + form { + display: flex; + flex: 1 1 auto; + flex-direction: column; + + .group { + display: flex; + flex: 1 0 auto; + flex-direction: column; + position: relative; + border-radius: 2px; + padding: 28px 16px 8px 16px; + margin: 16px 0; + + h2 { + position: absolute; + top: -11px; + left: 8px; + margin: 0; + padding: 0 8px; + font-size: 16px; + font-weight: 600; + } + + h3 { + font-size: 14px; + font-weight: 600; + margin: 24px 0 16px 0; + padding: 0; + + &:first-of-type { + margin-top: 0; + } + } + } + } + } +} diff --git a/src/@fuse/components/theme-options/theme-options.component.ts b/src/@fuse/components/theme-options/theme-options.component.ts new file mode 100644 index 0000000..fa36217 --- /dev/null +++ b/src/@fuse/components/theme-options/theme-options.component.ts @@ -0,0 +1,336 @@ +import { + Component, + HostBinding, + Inject, + OnDestroy, + OnInit, + Renderer2, + ViewEncapsulation +} from '@angular/core'; +import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; +import { DOCUMENT } from '@angular/common'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { fuseAnimations } from '../../animations'; +import { FuseConfigService } from '../../services/config.service'; +import { FuseNavigationService } from '../../components/navigation/navigation.service'; +import { FuseSidebarService } from '../../components/sidebar/sidebar.service'; + +@Component({ + selector: 'fuse-theme-options', + templateUrl: './theme-options.component.html', + styleUrls: ['./theme-options.component.scss'], + encapsulation: ViewEncapsulation.None, + animations: fuseAnimations +}) +export class FuseThemeOptionsComponent implements OnInit, OnDestroy { + fuseConfig: any; + form: FormGroup; + + @HostBinding('class.bar-closed') + barClosed: boolean; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {DOCUMENT} document + * @param {FormBuilder} _formBuilder + * @param {FuseConfigService} _fuseConfigService + * @param {FuseNavigationService} _fuseNavigationService + * @param {FuseSidebarService} _fuseSidebarService + * @param {Renderer2} _renderer + */ + constructor( + @Inject(DOCUMENT) private document: any, + private _formBuilder: FormBuilder, + private _fuseConfigService: FuseConfigService, + private _fuseNavigationService: FuseNavigationService, + private _fuseSidebarService: FuseSidebarService, + private _renderer: Renderer2 + ) { + // Set the defaults + this.barClosed = true; + + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Build the config form + // noinspection TypeScriptValidateTypes + this.form = this._formBuilder.group({ + colorTheme: new FormControl(), + customScrollbars: new FormControl(), + layout: this._formBuilder.group({ + style: new FormControl(), + width: new FormControl(), + navbar: this._formBuilder.group({ + primaryBackground: new FormControl(), + secondaryBackground: new FormControl(), + folded: new FormControl(), + hidden: new FormControl(), + position: new FormControl(), + variant: new FormControl() + }), + toolbar: this._formBuilder.group({ + background: new FormControl(), + customBackgroundColor: new FormControl(), + hidden: new FormControl(), + position: new FormControl() + }), + footer: this._formBuilder.group({ + background: new FormControl(), + customBackgroundColor: new FormControl(), + hidden: new FormControl(), + position: new FormControl() + }), + sidepanel: this._formBuilder.group({ + hidden: new FormControl(), + position: new FormControl() + }) + }) + }); + + // Subscribe to the config changes + this._fuseConfigService.config + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(config => { + // Update the stored config + this.fuseConfig = config; + + // Set the config form values without emitting an event + // so that we don't end up with an infinite loop + this.form.setValue(config, { emitEvent: false }); + }); + + // Subscribe to the specific form value changes (layout.style) + this.form + .get('layout.style') + .valueChanges.pipe(takeUntil(this._unsubscribeAll)) + .subscribe(value => { + // Reset the form values based on the + // selected layout style + this._resetFormValues(value); + }); + + // Subscribe to the form value changes + this.form.valueChanges + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(config => { + // Update the config + this._fuseConfigService.config = config; + }); + + // Add customize nav item that opens the bar programmatically + const customFunctionNavItem = { + id: 'custom-function', + title: 'Custom Function', + type: 'group', + icon: 'settings', + children: [ + { + id: 'customize', + title: 'Customize', + type: 'item', + icon: 'settings', + function: () => { + this.toggleSidebarOpen('themeOptionsPanel'); + } + } + ] + }; + + this._fuseNavigationService.addNavigationItem(customFunctionNavItem, 'end'); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + + // Remove the custom function menu + this._fuseNavigationService.removeNavigationItem('custom-function'); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Reset the form values based on the + * selected layout style + * + * @param value + * @private + */ + private _resetFormValues(value): void { + switch (value) { + // Vertical Layout #1 + case 'vertical-layout-1': { + this.form.patchValue({ + layout: { + width: 'fullwidth', + navbar: { + primaryBackground: 'fuse-navy-700', + secondaryBackground: 'fuse-navy-900', + folded: false, + hidden: false, + position: 'left', + variant: 'vertical-style-1' + }, + toolbar: { + background: 'fuse-white-500', + customBackgroundColor: false, + hidden: false, + position: 'below-static' + }, + footer: { + background: 'fuse-navy-900', + customBackgroundColor: true, + hidden: false, + position: 'below-static' + }, + sidepanel: { + hidden: false, + position: 'right' + } + } + }); + + break; + } + + // Vertical Layout #2 + case 'vertical-layout-2': { + this.form.patchValue({ + layout: { + width: 'fullwidth', + navbar: { + primaryBackground: 'fuse-navy-700', + secondaryBackground: 'fuse-navy-900', + folded: false, + hidden: false, + position: 'left', + variant: 'vertical-style-1' + }, + toolbar: { + background: 'fuse-white-500', + customBackgroundColor: false, + hidden: false, + position: 'below' + }, + footer: { + background: 'fuse-navy-900', + customBackgroundColor: true, + hidden: false, + position: 'below' + }, + sidepanel: { + hidden: false, + position: 'right' + } + } + }); + + break; + } + + // Vertical Layout #3 + case 'vertical-layout-3': { + this.form.patchValue({ + layout: { + width: 'fullwidth', + navbar: { + primaryBackground: 'fuse-navy-700', + secondaryBackground: 'fuse-navy-900', + folded: false, + hidden: false, + position: 'left', + layout: 'vertical-style-1' + }, + toolbar: { + background: 'fuse-white-500', + customBackgroundColor: false, + hidden: false, + position: 'above-static' + }, + footer: { + background: 'fuse-navy-900', + customBackgroundColor: true, + hidden: false, + position: 'above-static' + }, + sidepanel: { + hidden: false, + position: 'right' + } + } + }); + + break; + } + + // Horizontal Layout #1 + case 'horizontal-layout-1': { + this.form.patchValue({ + layout: { + width: 'fullwidth', + navbar: { + primaryBackground: 'fuse-navy-700', + secondaryBackground: 'fuse-navy-900', + folded: false, + hidden: false, + position: 'top', + variant: 'vertical-style-1' + }, + toolbar: { + background: 'fuse-white-500', + customBackgroundColor: false, + hidden: false, + position: 'above' + }, + footer: { + background: 'fuse-navy-900', + customBackgroundColor: true, + hidden: false, + position: 'above-fixed' + }, + sidepanel: { + hidden: false, + position: 'right' + } + } + }); + + break; + } + } + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle sidebar open + * + * @param key + */ + toggleSidebarOpen(key): void { + this._fuseSidebarService.getSidebar(key).toggleOpen(); + } +} diff --git a/src/@fuse/components/theme-options/theme-options.module.ts b/src/@fuse/components/theme-options/theme-options.module.ts new file mode 100644 index 0000000..72f1c76 --- /dev/null +++ b/src/@fuse/components/theme-options/theme-options.module.ts @@ -0,0 +1,46 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatOptionModule } from '@angular/material/core'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; + +import { FuseDirectivesModule } from '../../directives/directives'; +import { FuseMaterialColorPickerModule } from '../material-color-picker/material-color-picker.module'; +import { FuseSidebarModule } from '../sidebar/sidebar.module'; + +import { FuseThemeOptionsComponent } from './theme-options.component'; + +@NgModule({ + declarations: [FuseThemeOptionsComponent], + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + + FlexLayoutModule, + + MatButtonModule, + MatCheckboxModule, + MatDividerModule, + MatFormFieldModule, + MatIconModule, + MatOptionModule, + MatRadioModule, + MatSelectModule, + MatSlideToggleModule, + + FuseDirectivesModule, + FuseMaterialColorPickerModule, + FuseSidebarModule + ], + exports: [FuseThemeOptionsComponent] +}) +export class FuseThemeOptionsModule {} diff --git a/src/@fuse/components/theme-options/theme-options.theme.scss b/src/@fuse/components/theme-options/theme-options.theme.scss new file mode 100644 index 0000000..5a84b48 --- /dev/null +++ b/src/@fuse/components/theme-options/theme-options.theme.scss @@ -0,0 +1,23 @@ +@mixin fuse-theme-options-theme($theme) { + $background: map-get($theme, background); + $foreground: map-get($theme, foreground); + + fuse-theme-options { + .theme-options-panel { + form { + .group { + border: 1px solid map-get($foreground, divider); + + h2 { + background: map-get($background, background); + color: map-get($foreground, secondary-text); + } + + h3 { + color: map-get($foreground, secondary-text); + } + } + } + } + } +} diff --git a/src/@fuse/components/widget/widget-toggle.directive.ts b/src/@fuse/components/widget/widget-toggle.directive.ts new file mode 100644 index 0000000..65fe81d --- /dev/null +++ b/src/@fuse/components/widget/widget-toggle.directive.ts @@ -0,0 +1,13 @@ +import { Directive, ElementRef } from '@angular/core'; + +@Directive({ + selector: '[fuseWidgetToggle]' +}) +export class FuseWidgetToggleDirective { + /** + * Constructor + * + * @param {ElementRef} elementRef + */ + constructor(public elementRef: ElementRef) {} +} diff --git a/src/@fuse/components/widget/widget.component.html b/src/@fuse/components/widget/widget.component.html new file mode 100644 index 0000000..6dbc743 --- /dev/null +++ b/src/@fuse/components/widget/widget.component.html @@ -0,0 +1 @@ + diff --git a/src/@fuse/components/widget/widget.component.scss b/src/@fuse/components/widget/widget.component.scss new file mode 100644 index 0000000..3032026 --- /dev/null +++ b/src/@fuse/components/widget/widget.component.scss @@ -0,0 +1,87 @@ +fuse-widget { + display: block; + position: relative; + perspective: 3000px; + padding: 12px; + + > div { + position: relative; + transform-style: preserve-3d; + transition: transform 1s; + } + + > .fuse-widget-front { + display: flex; + flex-direction: column; + flex: 1 1 auto; + position: relative; + overflow: hidden; + visibility: visible; + width: 100%; + opacity: 1; + z-index: 10; + border-radius: 8px; + transition: transform 0.5s ease-out 0s, visibility 0s ease-in 0.2s, + opacity 0s ease-in 0.2s; + transform: rotateY(0deg); + backface-visibility: hidden; + border: 1px solid; + } + + > .fuse-widget-back { + display: block; + position: absolute; + top: 12px; + right: 12px; + bottom: 12px; + left: 12px; + overflow: hidden; + visibility: hidden; + opacity: 0; + z-index: 10; + border-radius: 8px; + transition: transform 0.5s ease-out 0s, visibility 0s ease-in 0.2s, + opacity 0s ease-in 0.2s; + transform: rotateY(180deg); + backface-visibility: hidden; + border: 1px solid; + + [fuseWidgetToggle] { + position: absolute; + top: 0; + right: 0; + } + } + + &.flipped { + > .fuse-widget-front { + visibility: hidden; + opacity: 0; + transform: rotateY(180deg); + } + + > .fuse-widget-back { + display: block; + visibility: visible; + opacity: 1; + transform: rotateY(360deg); + } + } + + .mat-form-field { + &.mat-form-field-type-mat-select { + .mat-form-field-wrapper { + padding: 16px 0; + + .mat-form-field-infix { + border: none; + padding: 0; + } + } + + .mat-form-field-underline { + display: none; + } + } + } +} diff --git a/src/@fuse/components/widget/widget.component.ts b/src/@fuse/components/widget/widget.component.ts new file mode 100644 index 0000000..7278799 --- /dev/null +++ b/src/@fuse/components/widget/widget.component.ts @@ -0,0 +1,68 @@ +import { + AfterContentInit, + Component, + ContentChildren, + ElementRef, + HostBinding, + QueryList, + Renderer2, + ViewEncapsulation +} from '@angular/core'; +import { FuseWidgetToggleDirective } from './widget-toggle.directive'; + +@Component({ + selector: 'fuse-widget', + templateUrl: './widget.component.html', + styleUrls: ['./widget.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class FuseWidgetComponent implements AfterContentInit { + @HostBinding('class.flipped') + flipped = false; + + @ContentChildren(FuseWidgetToggleDirective, { descendants: true }) + toggleButtons: QueryList; + + /** + * Constructor + * + * @param {ElementRef} _elementRef + * @param {Renderer2} _renderer + */ + constructor(private _elementRef: ElementRef, private _renderer: Renderer2) {} + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * After content init + */ + ngAfterContentInit(): void { + // Listen for the flip button click + setTimeout(() => { + this.toggleButtons.forEach(flipButton => { + this._renderer.listen( + flipButton.elementRef.nativeElement, + 'click', + event => { + event.preventDefault(); + event.stopPropagation(); + this.toggle(); + } + ); + }); + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle the flipped status + */ + toggle(): void { + this.flipped = !this.flipped; + } +} diff --git a/src/@fuse/components/widget/widget.module.ts b/src/@fuse/components/widget/widget.module.ts new file mode 100644 index 0000000..1edcc91 --- /dev/null +++ b/src/@fuse/components/widget/widget.module.ts @@ -0,0 +1,10 @@ +import { NgModule } from '@angular/core'; + +import { FuseWidgetComponent } from './widget.component'; +import { FuseWidgetToggleDirective } from './widget-toggle.directive'; + +@NgModule({ + declarations: [FuseWidgetComponent, FuseWidgetToggleDirective], + exports: [FuseWidgetComponent, FuseWidgetToggleDirective] +}) +export class FuseWidgetModule {} diff --git a/src/@fuse/components/widget/widget.theme.scss b/src/@fuse/components/widget/widget.theme.scss new file mode 100644 index 0000000..08caafe --- /dev/null +++ b/src/@fuse/components/widget/widget.theme.scss @@ -0,0 +1,12 @@ +@mixin fuse-widget-theme($theme) { + $background: map-get($theme, background); + $foreground: map-get($theme, foreground); + + fuse-widget { + > .fuse-widget-front, + > .fuse-widget-back { + background: map-get($background, card); + border-color: map-get($foreground, divider); + } + } +} diff --git a/src/@fuse/directives/directives.ts b/src/@fuse/directives/directives.ts new file mode 100644 index 0000000..2e255f5 --- /dev/null +++ b/src/@fuse/directives/directives.ts @@ -0,0 +1,28 @@ +import { NgModule } from '@angular/core'; + +import { FuseIfOnDomDirective } from './fuse-if-on-dom/fuse-if-on-dom.directive'; +import { FuseInnerScrollDirective } from './fuse-inner-scroll/fuse-inner-scroll.directive'; +import { FusePerfectScrollbarDirective } from './fuse-perfect-scrollbar/fuse-perfect-scrollbar.directive'; +import { + FuseMatSidenavHelperDirective, + FuseMatSidenavTogglerDirective +} from './fuse-mat-sidenav/fuse-mat-sidenav.directive'; + +@NgModule({ + declarations: [ + FuseIfOnDomDirective, + FuseInnerScrollDirective, + FuseMatSidenavHelperDirective, + FuseMatSidenavTogglerDirective, + FusePerfectScrollbarDirective + ], + imports: [], + exports: [ + FuseIfOnDomDirective, + FuseInnerScrollDirective, + FuseMatSidenavHelperDirective, + FuseMatSidenavTogglerDirective, + FusePerfectScrollbarDirective + ] +}) +export class FuseDirectivesModule {} diff --git a/src/@fuse/directives/fuse-if-on-dom/fuse-if-on-dom.directive.ts b/src/@fuse/directives/fuse-if-on-dom/fuse-if-on-dom.directive.ts new file mode 100644 index 0000000..5b5135e --- /dev/null +++ b/src/@fuse/directives/fuse-if-on-dom/fuse-if-on-dom.directive.ts @@ -0,0 +1,55 @@ +import { + AfterContentChecked, + Directive, + ElementRef, + TemplateRef, + ViewContainerRef +} from '@angular/core'; + +@Directive({ + selector: '[fuseIfOnDom]' +}) +export class FuseIfOnDomDirective implements AfterContentChecked { + isCreated: boolean; + + /** + * Constructor + * + * @param {ElementRef} _elementRef + * @param {TemplateRef} _templateRef + * @param {ViewContainerRef} _viewContainerRef + */ + constructor( + private _elementRef: ElementRef, + private _templateRef: TemplateRef, + private _viewContainerRef: ViewContainerRef + ) { + // Set the defaults + this.isCreated = false; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * After content checked + */ + ngAfterContentChecked(): void { + if ( + document.body.contains(this._elementRef.nativeElement) && + !this.isCreated + ) { + setTimeout(() => { + this._viewContainerRef.createEmbeddedView(this._templateRef); + }, 300); + this.isCreated = true; + } else if ( + this.isCreated && + !document.body.contains(this._elementRef.nativeElement) + ) { + this._viewContainerRef.clear(); + this.isCreated = false; + } + } +} diff --git a/src/@fuse/directives/fuse-inner-scroll/fuse-inner-scroll.directive.ts b/src/@fuse/directives/fuse-inner-scroll/fuse-inner-scroll.directive.ts new file mode 100644 index 0000000..7d58720 --- /dev/null +++ b/src/@fuse/directives/fuse-inner-scroll/fuse-inner-scroll.directive.ts @@ -0,0 +1,108 @@ +import { + Directive, + ElementRef, + OnDestroy, + OnInit, + Renderer2 +} from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { FuseMatchMediaService } from '../../services/match-media.service'; + +@Directive({ + selector: '.inner-scroll' +}) +export class FuseInnerScrollDirective implements OnInit, OnDestroy { + // Private + private _parent: any; + private _grandParent: any; + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {ElementRef} _elementRef + * @param {FuseMatchMediaService} _fuseMediaMatchService + * @param {Renderer2} _renderer + */ + constructor( + private _elementRef: ElementRef, + private _fuseMediaMatchService: FuseMatchMediaService, + private _renderer: Renderer2 + ) { + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Get the parent + this._parent = this._renderer.parentNode(this._elementRef.nativeElement); + + // Return, if there is no parent + if (!this._parent) { + return; + } + + // Get the grand parent + this._grandParent = this._renderer.parentNode(this._parent); + + // Register to the media query changes + this._fuseMediaMatchService.onMediaChange + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(alias => { + if (alias === 'xs') { + this._removeClass(); + } else { + this._addClass(); + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Return, if there is no parent + if (!this._parent) { + return; + } + + // Remove the class + this._removeClass(); + + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Add the class name + * + * @private + */ + private _addClass(): void { + // Add the inner-scroll class + this._renderer.addClass(this._grandParent, 'inner-scroll'); + } + + /** + * Remove the class name + * @private + */ + private _removeClass(): void { + // Remove the inner-scroll class + this._renderer.removeClass(this._grandParent, 'inner-scroll'); + } +} diff --git a/src/@fuse/directives/fuse-mat-sidenav/fuse-mat-sidenav.directive.ts b/src/@fuse/directives/fuse-mat-sidenav/fuse-mat-sidenav.directive.ts new file mode 100644 index 0000000..be9a7cd --- /dev/null +++ b/src/@fuse/directives/fuse-mat-sidenav/fuse-mat-sidenav.directive.ts @@ -0,0 +1,138 @@ +import { + Directive, + Input, + OnInit, + HostListener, + OnDestroy, + HostBinding +} from '@angular/core'; +import { MatSidenav } from '@angular/material/sidenav'; +import { MediaObserver } from '@angular/flex-layout'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { FuseMatchMediaService } from '../../services/match-media.service'; +import { FuseMatSidenavHelperService } from '../fuse-mat-sidenav/fuse-mat-sidenav.service'; + +@Directive({ + selector: '[fuseMatSidenavHelper]' +}) +export class FuseMatSidenavHelperDirective implements OnInit, OnDestroy { + @HostBinding('class.mat-is-locked-open') + isLockedOpen: boolean; + + @Input() + fuseMatSidenavHelper: string; + + @Input() + matIsLockedOpen: string; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {FuseMatchMediaService} _fuseMatchMediaService + * @param {FuseMatSidenavHelperService} _fuseMatSidenavHelperService + * @param {MatSidenav} _matSidenav + * @param {MediaObserver} _mediaObserver + */ + constructor( + private _fuseMatchMediaService: FuseMatchMediaService, + private _fuseMatSidenavHelperService: FuseMatSidenavHelperService, + private _matSidenav: MatSidenav, + private _mediaObserver: MediaObserver + ) { + // Set the defaults + this.isLockedOpen = true; + + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Register the sidenav to the service + this._fuseMatSidenavHelperService.setSidenav( + this.fuseMatSidenavHelper, + this._matSidenav + ); + + if ( + this.matIsLockedOpen && + this._mediaObserver.isActive(this.matIsLockedOpen) + ) { + this.isLockedOpen = true; + this._matSidenav.mode = 'side'; + this._matSidenav.toggle(true); + } else { + this.isLockedOpen = false; + this._matSidenav.mode = 'over'; + this._matSidenav.toggle(false); + } + + this._fuseMatchMediaService.onMediaChange + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(() => { + if ( + this.matIsLockedOpen && + this._mediaObserver.isActive(this.matIsLockedOpen) + ) { + this.isLockedOpen = true; + this._matSidenav.mode = 'side'; + this._matSidenav.toggle(true); + } else { + this.isLockedOpen = false; + this._matSidenav.mode = 'over'; + this._matSidenav.toggle(false); + } + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} + +@Directive({ + selector: '[fuseMatSidenavToggler]' +}) +export class FuseMatSidenavTogglerDirective { + @Input() + fuseMatSidenavToggler: string; + + /** + * Constructor + * + * @param {FuseMatSidenavHelperService} _fuseMatSidenavHelperService + */ + constructor( + private _fuseMatSidenavHelperService: FuseMatSidenavHelperService + ) {} + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * On click + */ + @HostListener('click') + onClick(): void { + this._fuseMatSidenavHelperService + .getSidenav(this.fuseMatSidenavToggler) + .toggle(); + } +} diff --git a/src/@fuse/directives/fuse-mat-sidenav/fuse-mat-sidenav.service.ts b/src/@fuse/directives/fuse-mat-sidenav/fuse-mat-sidenav.service.ts new file mode 100644 index 0000000..bd39367 --- /dev/null +++ b/src/@fuse/directives/fuse-mat-sidenav/fuse-mat-sidenav.service.ts @@ -0,0 +1,40 @@ +import { Injectable } from '@angular/core'; +import { MatSidenav } from '@angular/material/sidenav'; + +@Injectable({ + providedIn: 'root' +}) +export class FuseMatSidenavHelperService { + sidenavInstances: MatSidenav[]; + + /** + * Constructor + */ + constructor() { + this.sidenavInstances = []; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Set sidenav + * + * @param id + * @param instance + */ + setSidenav(id, instance): void { + this.sidenavInstances[id] = instance; + } + + /** + * Get sidenav + * + * @param id + * @returns {any} + */ + getSidenav(id): any { + return this.sidenavInstances[id]; + } +} diff --git a/src/@fuse/directives/fuse-perfect-scrollbar/fuse-perfect-scrollbar.directive.ts b/src/@fuse/directives/fuse-perfect-scrollbar/fuse-perfect-scrollbar.directive.ts new file mode 100644 index 0000000..b6a88e9 --- /dev/null +++ b/src/@fuse/directives/fuse-perfect-scrollbar/fuse-perfect-scrollbar.directive.ts @@ -0,0 +1,508 @@ +import { + AfterViewInit, + Directive, + ElementRef, + HostListener, + Input, + OnDestroy, + OnInit +} from '@angular/core'; +import { NavigationEnd, Router } from '@angular/router'; +import { Platform } from '@angular/cdk/platform'; +import { fromEvent, Subject } from 'rxjs'; +import { debounceTime, filter, takeUntil } from 'rxjs/operators'; +import PerfectScrollbar from 'perfect-scrollbar'; +import * as _ from 'lodash'; +import { + FusePerfectScrollbarGeometry, + FusePerfectScrollbarPosition +} from './fuse-perfect-scrollbar.interfaces'; +import { FuseConfigService } from '../../services/config.service'; + +@Directive({ + selector: '[fusePerfectScrollbar]' +}) +export class FusePerfectScrollbarDirective + implements OnInit, AfterViewInit, OnDestroy { + isInitialized: boolean; + isMobile: boolean; + ps: PerfectScrollbar | any; + + // Private + private _animation: number | null; + private _enabled: boolean | ''; + private _debouncedUpdate: any; + private _options: any; + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {ElementRef} elementRef + * @param {FuseConfigService} _fuseConfigService + * @param {Platform} _platform + * @param {Router} _router + */ + constructor( + public elementRef: ElementRef, + private _fuseConfigService: FuseConfigService, + private _platform: Platform, + private _router: Router + ) { + // Set the defaults + this.isInitialized = false; + this.isMobile = false; + + // Set the private defaults + this._animation = null; + this._enabled = false; + this._debouncedUpdate = _.debounce(this.update, 150); + this._options = { + updateOnRouteChange: false + }; + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Perfect Scrollbar options + * + * @param value + */ + @Input() + set fusePerfectScrollbarOptions(value) { + // Merge the options + this._options = _.merge({}, this._options, value); + + // Destroy and re-init the PerfectScrollbar to update its options + setTimeout(() => { + this._destroy(); + }); + + setTimeout(() => { + this._init(); + }); + } + + get fusePerfectScrollbarOptions(): any { + // Return the options + return this._options; + } + + /** + * Is enabled + * + * @param {boolean | ""} value + */ + @Input('fusePerfectScrollbar') + set enabled(value: boolean | '') { + // If nothing is provided with the directive (empty string), + // we will take that as a true + if (value === '') { + value = true; + } + + // Return, if both values are the same + if (this.enabled === value) { + return; + } + + // Store the value + this._enabled = value; + + // If enabled... + if (this.enabled) { + // Init the directive + this._init(); + } else { + // Otherwise destroy it + this._destroy(); + } + } + + get enabled(): boolean | '' { + // Return the enabled status + return this._enabled; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Subscribe to window resize event + fromEvent(window, 'resize') + .pipe( + takeUntil(this._unsubscribeAll), + debounceTime(150) + ) + .subscribe(() => { + // Update the PerfectScrollbar + this.update(); + }); + } + + /** + * After view init + */ + ngAfterViewInit(): void { + // Check if scrollbars enabled or not from the main config + this._fuseConfigService.config + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(settings => { + this.enabled = settings.customScrollbars; + }); + + // Scroll to the top on every route change + if (this.fusePerfectScrollbarOptions.updateOnRouteChange) { + this._router.events + .pipe( + takeUntil(this._unsubscribeAll), + filter(event => event instanceof NavigationEnd) + ) + .subscribe(() => { + setTimeout(() => { + this.scrollToTop(); + this.update(); + }, 0); + }); + } + } + + /** + * On destroy + */ + ngOnDestroy(): void { + this._destroy(); + + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Initialize + * + * @private + */ + _init(): void { + // Return, if already initialized + if (this.isInitialized) { + return; + } + + // Check if is mobile + if (this._platform.ANDROID || this._platform.IOS) { + this.isMobile = true; + } + + // Return if it's mobile + if (this.isMobile) { + // Return... + return; + } + + // Set as initialized + this.isInitialized = true; + + // Initialize the perfect-scrollbar + this.ps = new PerfectScrollbar(this.elementRef.nativeElement, { + ...this.fusePerfectScrollbarOptions + }); + + // Unbind 'keydown' events of PerfectScrollbar since it causes an extremely + // high CPU usage on Angular Material inputs. + // Loop through all the event elements of this PerfectScrollbar instance + this.ps.event.eventElements.forEach(eventElement => { + // If we hit to the element with a 'keydown' event... + if (typeof eventElement.handlers['keydown'] !== 'undefined') { + // Unbind it + eventElement.element.removeEventListener( + 'keydown', + eventElement.handlers['keydown'][0] + ); + } + }); + } + + /** + * Destroy + * + * @private + */ + _destroy(): void { + if (!this.isInitialized || !this.ps) { + return; + } + + // Destroy the perfect-scrollbar + this.ps.destroy(); + + // Clean up + this.ps = null; + this.isInitialized = false; + } + + /** + * Update scrollbars on window resize + * + * @private + */ + @HostListener('window:resize') + _updateOnResize(): void { + this._debouncedUpdate(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Document click + * + * @param {Event} event + */ + @HostListener('document:click', ['$event']) + documentClick(event: Event): void { + if (!this.isInitialized || !this.ps) { + return; + } + + // Update the scrollbar on document click.. + // This isn't the most elegant solution but there is no other way + // of knowing when the contents of the scrollable container changes. + // Therefore, we update scrollbars on every document click. + this.ps.update(); + } + + /** + * Update the scrollbar + */ + update(): void { + if (!this.isInitialized) { + return; + } + + // Update the perfect-scrollbar + this.ps.update(); + } + + /** + * Destroy the scrollbar + */ + destroy(): void { + this.ngOnDestroy(); + } + + /** + * Returns the geometry of the scrollable element + * + * @param prefix + */ + geometry(prefix: string = 'scroll'): FusePerfectScrollbarGeometry { + return new FusePerfectScrollbarGeometry( + this.elementRef.nativeElement[prefix + 'Left'], + this.elementRef.nativeElement[prefix + 'Top'], + this.elementRef.nativeElement[prefix + 'Width'], + this.elementRef.nativeElement[prefix + 'Height'] + ); + } + + /** + * Returns the position of the scrollable element + * + * @param absolute + */ + position(absolute: boolean = false): FusePerfectScrollbarPosition { + if (!absolute && this.ps) { + return new FusePerfectScrollbarPosition( + this.ps.reach.x || 0, + this.ps.reach.y || 0 + ); + } else { + return new FusePerfectScrollbarPosition( + this.elementRef.nativeElement.scrollLeft, + this.elementRef.nativeElement.scrollTop + ); + } + } + + /** + * Scroll to + * + * @param x + * @param y + * @param speed + */ + scrollTo(x: number, y?: number, speed?: number): void { + if (y == null && speed == null) { + this.animateScrolling('scrollTop', x, speed); + } else { + if (x != null) { + this.animateScrolling('scrollLeft', x, speed); + } + + if (y != null) { + this.animateScrolling('scrollTop', y, speed); + } + } + } + + /** + * Scroll to X + * + * @param {number} x + * @param {number} speed + */ + scrollToX(x: number, speed?: number): void { + this.animateScrolling('scrollLeft', x, speed); + } + + /** + * Scroll to Y + * + * @param {number} y + * @param {number} speed + */ + scrollToY(y: number, speed?: number): void { + this.animateScrolling('scrollTop', y, speed); + } + + /** + * Scroll to top + * + * @param {number} offset + * @param {number} speed + */ + scrollToTop(offset?: number, speed?: number): void { + this.animateScrolling('scrollTop', offset || 0, speed); + } + + /** + * Scroll to left + * + * @param {number} offset + * @param {number} speed + */ + scrollToLeft(offset?: number, speed?: number): void { + this.animateScrolling('scrollLeft', offset || 0, speed); + } + + /** + * Scroll to right + * + * @param {number} offset + * @param {number} speed + */ + scrollToRight(offset?: number, speed?: number): void { + const left = + this.elementRef.nativeElement.scrollWidth - + this.elementRef.nativeElement.clientWidth; + this.animateScrolling('scrollLeft', left - (offset || 0), speed); + } + + /** + * Scroll to bottom + * + * @param {number} offset + * @param {number} speed + */ + scrollToBottom(offset?: number, speed?: number): void { + const top = + this.elementRef.nativeElement.scrollHeight - + this.elementRef.nativeElement.clientHeight; + this.animateScrolling('scrollTop', top - (offset || 0), speed); + } + + /** + * Scroll to element + * + * @param qs + * @param offset + * @param speed + */ + scrollToElement(qs: string, offset?: number, speed?: number): void { + const element = this.elementRef.nativeElement.querySelector(qs); + + if (!element) { + return; + } + + const elementPos = element.getBoundingClientRect(); + const scrollerPos = this.elementRef.nativeElement.getBoundingClientRect(); + + if (this.elementRef.nativeElement.classList.contains('ps--active-x')) { + const currentPos = this.elementRef.nativeElement['scrollLeft']; + const position = elementPos.left - scrollerPos.left + currentPos; + + this.animateScrolling('scrollLeft', position + (offset || 0), speed); + } + + if (this.elementRef.nativeElement.classList.contains('ps--active-y')) { + const currentPos = this.elementRef.nativeElement['scrollTop']; + const position = elementPos.top - scrollerPos.top + currentPos; + + this.animateScrolling('scrollTop', position + (offset || 0), speed); + } + } + + /** + * Animate scrolling + * + * @param target + * @param value + * @param speed + */ + animateScrolling(target: string, value: number, speed?: number): void { + if (this._animation) { + window.cancelAnimationFrame(this._animation); + this._animation = null; + } + + if (!speed || typeof window === 'undefined') { + this.elementRef.nativeElement[target] = value; + } else if (value !== this.elementRef.nativeElement[target]) { + let newValue = 0; + let scrollCount = 0; + + let oldTimestamp = performance.now(); + let oldValue = this.elementRef.nativeElement[target]; + + const cosParameter = (oldValue - value) / 2; + + const step = (newTimestamp: number) => { + scrollCount += Math.PI / (speed / (newTimestamp - oldTimestamp)); + newValue = Math.round( + value + cosParameter + cosParameter * Math.cos(scrollCount) + ); + + // Only continue animation if scroll position has not changed + if (this.elementRef.nativeElement[target] === oldValue) { + if (scrollCount >= Math.PI) { + this.animateScrolling(target, value, 0); + } else { + this.elementRef.nativeElement[target] = newValue; + + // On a zoomed out page the resulting offset may differ + oldValue = this.elementRef.nativeElement[target]; + oldTimestamp = newTimestamp; + + this._animation = window.requestAnimationFrame(step); + } + } + }; + + window.requestAnimationFrame(step); + } + } +} diff --git a/src/@fuse/directives/fuse-perfect-scrollbar/fuse-perfect-scrollbar.interfaces.ts b/src/@fuse/directives/fuse-perfect-scrollbar/fuse-perfect-scrollbar.interfaces.ts new file mode 100644 index 0000000..993522b --- /dev/null +++ b/src/@fuse/directives/fuse-perfect-scrollbar/fuse-perfect-scrollbar.interfaces.ts @@ -0,0 +1,24 @@ +export class FusePerfectScrollbarGeometry { + public x: number; + public y: number; + + public w: number; + public h: number; + + constructor(x: number, y: number, w: number, h: number) { + this.x = x; + this.y = y; + this.w = w; + this.h = h; + } +} + +export class FusePerfectScrollbarPosition { + public x: number | 'start' | 'end'; + public y: number | 'start' | 'end'; + + constructor(x: number | 'start' | 'end', y: number | 'start' | 'end') { + this.x = x; + this.y = y; + } +} diff --git a/src/@fuse/fuse.module.ts b/src/@fuse/fuse.module.ts new file mode 100644 index 0000000..8bb7b2a --- /dev/null +++ b/src/@fuse/fuse.module.ts @@ -0,0 +1,32 @@ +import { + ModuleWithProviders, + NgModule, + Optional, + SkipSelf +} from '@angular/core'; + +import { FUSE_CONFIG } from './services/config.service'; +import { FuseConfig } from './types'; + +@NgModule() +export class FuseModule { + constructor(@Optional() @SkipSelf() parentModule: FuseModule) { + if (parentModule) { + throw new Error( + 'FuseModule is already loaded. Import it in the AppModule only!' + ); + } + } + + static forRoot(config: FuseConfig): ModuleWithProviders { + return { + ngModule: FuseModule, + providers: [ + { + provide: FUSE_CONFIG, + useValue: config + } + ] + }; + } +} diff --git a/src/@fuse/mat-colors/index.ts b/src/@fuse/mat-colors/index.ts new file mode 100644 index 0000000..35dfb8b --- /dev/null +++ b/src/@fuse/mat-colors/index.ts @@ -0,0 +1,973 @@ +const black87 = 'rgba(black, 0.87)'; +const white87 = 'rgba(white, 0.87)'; +const black12 = 'rgba(black, 0.12)'; +const white12 = 'rgba(white, 0.12)'; +const black6 = 'rgba(black, 0.06)'; +const white6 = 'rgba(white, 0.06)'; + +const matColors = { + red: { + 50: '#ffebee', + 100: '#ffcdd2', + 200: '#ef9a9a', + 300: '#e57373', + 400: '#ef5350', + 500: '#f44336', + 600: '#e53935', + 700: '#d32f2f', + 800: '#c62828', + 900: '#b71c1c', + A100: '#ff8a80', + A200: '#ff5252', + A400: '#ff1744', + A700: '#d50000', + contrast: { + 50: black87, + 100: black87, + 200: black87, + 300: black87, + 400: black87, + 500: 'white', + 600: 'white', + 700: 'white', + 800: white87, + 900: white87, + A100: black87, + A200: 'white', + A400: 'white', + A700: 'white' + } + }, + + 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: black87, + 100: black87, + 200: black87, + 300: black87, + 400: black87, + 500: 'white', + 600: 'white', + 700: white87, + 800: white87, + 900: white87, + A100: black87, + A200: 'white', + A400: 'white', + A700: 'white' + } + }, + + purple: { + 50: '#f3e5f5', + 100: '#e1bee7', + 200: '#ce93d8', + 300: '#ba68c8', + 400: '#ab47bc', + 500: '#9c27b0', + 600: '#8e24aa', + 700: '#7b1fa2', + 800: '#6a1b9a', + 900: '#4a148c', + A100: '#ea80fc', + A200: '#e040fb', + A400: '#d500f9', + A700: '#aa00ff', + contrast: { + 50: black87, + 100: black87, + 200: black87, + 300: 'white', + 400: 'white', + 500: white87, + 600: white87, + 700: white87, + 800: white87, + 900: white87, + A100: black87, + A200: 'white', + A400: 'white', + A700: 'white' + } + }, + + '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: black87, + 100: black87, + 200: black87, + 300: 'white', + 400: 'white', + 500: white87, + 600: white87, + 700: white87, + 800: white87, + 900: white87, + A100: black87, + A200: 'white', + A400: white87, + A700: white87 + } + }, + + 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: black87, + 100: black87, + 200: black87, + 300: 'white', + 400: 'white', + 500: white87, + 600: white87, + 700: white87, + 800: white87, + 900: white87, + A100: black87, + A200: 'white', + A400: 'white', + A700: white87 + } + }, + + blue: { + 50: '#e3f2fd', + 100: '#bbdefb', + 200: '#90caf9', + 300: '#64b5f6', + 400: '#42a5f5', + 500: '#2196f3', + 600: '#1e88e5', + 700: '#1976d2', + 800: '#1565c0', + 900: '#0d47a1', + A100: '#82b1ff', + A200: '#448aff', + A400: '#2979ff', + A700: '#2962ff', + contrast: { + 50: black87, + 100: black87, + 200: black87, + 300: black87, + 400: black87, + 500: 'white', + 600: 'white', + 700: 'white', + 800: white87, + 900: white87, + A100: black87, + A200: 'white', + A400: 'white', + A700: 'white' + } + }, + + '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: black87, + 100: black87, + 200: black87, + 300: black87, + 400: black87, + 500: 'white', + 600: 'white', + 700: 'white', + 800: 'white', + 900: white87, + A100: black87, + A200: black87, + A400: black87, + 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: black87, + 100: black87, + 200: black87, + 300: black87, + 400: black87, + 500: 'white', + 600: 'white', + 700: 'white', + 800: 'white', + 900: white87, + A100: black87, + A200: black87, + A400: black87, + A700: black87 + } + }, + + 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: black87, + 100: black87, + 200: black87, + 300: black87, + 400: black87, + 500: 'white', + 600: 'white', + 700: 'white', + 800: white87, + 900: white87, + A100: black87, + A200: black87, + A400: black87, + A700: black87 + } + }, + + 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: black87, + 100: black87, + 200: black87, + 300: black87, + 400: black87, + 500: 'white', + 600: 'white', + 700: 'white', + 800: white87, + 900: white87, + A100: black87, + A200: black87, + A400: black87, + A700: black87 + } + }, + + '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: black87, + 100: black87, + 200: black87, + 300: black87, + 400: black87, + 500: black87, + 600: black87, + 700: black87, + 800: 'white', + 900: 'white', + A100: black87, + A200: black87, + A400: black87, + A700: black87 + } + }, + + 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: black87, + 100: black87, + 200: black87, + 300: black87, + 400: black87, + 500: black87, + 600: black87, + 700: black87, + 800: black87, + 900: 'white', + A100: black87, + A200: black87, + A400: black87, + A700: black87 + } + }, + + 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: black87, + 100: black87, + 200: black87, + 300: black87, + 400: black87, + 500: black87, + 600: black87, + 700: black87, + 800: black87, + 900: black87, + A100: black87, + A200: black87, + A400: black87, + A700: black87 + } + }, + + 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: black87, + 100: black87, + 200: black87, + 300: black87, + 400: black87, + 500: black87, + 600: black87, + 700: black87, + 800: black87, + 900: black87, + A100: black87, + A200: black87, + A400: black87, + A700: black87 + } + }, + + orange: { + 50: '#fff3e0', + 100: '#ffe0b2', + 200: '#ffcc80', + 300: '#ffb74d', + 400: '#ffa726', + 500: '#ff9800', + 600: '#fb8c00', + 700: '#f57c00', + 800: '#ef6c00', + 900: '#e65100', + A100: '#ffd180', + A200: '#ffab40', + A400: '#ff9100', + A700: '#ff6d00', + contrast: { + 50: black87, + 100: black87, + 200: black87, + 300: black87, + 400: black87, + 500: black87, + 600: black87, + 700: black87, + 800: 'white', + 900: 'white', + A100: black87, + A200: black87, + A400: black87, + A700: 'black' + } + }, + + '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: black87, + 100: black87, + 200: black87, + 300: black87, + 400: black87, + 500: 'white', + 600: 'white', + 700: 'white', + 800: 'white', + 900: 'white', + A100: black87, + A200: black87, + 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: black87, + 100: black87, + 200: black87, + 300: 'white', + 400: 'white', + 500: white87, + 600: white87, + 700: white87, + 800: white87, + 900: white87, + A100: black87, + A200: black87, + A400: 'white', + A700: white87 + } + }, + + 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: black87, + 50: black87, + 100: black87, + 200: black87, + 300: black87, + 400: black87, + 500: black87, + 600: white87, + 700: white87, + 800: white87, + 900: white87, + 1000: white87, + A100: black87, + A200: black87, + A400: black87, + A700: white87 + } + }, + + '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: black87, + 100: black87, + 200: black87, + 300: black87, + 400: 'white', + 500: 'white', + 600: white87, + 700: white87, + 800: white87, + 900: white87, + A100: black87, + A200: black87, + A400: 'white', + A700: white87 + } + }, + + 'fuse-navy': { + 50: '#ECECEE', + 100: '#C5C6CB', + 200: '#9EA1A9', + 300: '#7D818C', + 400: '#5C616F', + 500: '#3C4252', + 600: '#353A48', + 700: '#2D323E', + 800: '#262933', + 900: '#1E2129', + A100: '#C5C6CB', + A200: '#9EA1A9', + A400: '#5C616F', + A700: '#2D323E', + contrast: { + 50: black87, + 100: black87, + 200: black87, + 300: 'white', + 400: 'white', + 500: white87, + 600: white87, + 700: white87, + 800: white87, + 900: white87, + A100: black87, + A200: white87, + A400: white87, + A700: white87 + } + }, + + 'fuse-white': { + 500: 'white', + contrast: { + 500: black87 + } + }, + + 'fuse-black': { + 500: 'black', + contrast: { + 500: 'white' + } + } +}; + +// tslint:disable-next-line +const matPresetColors = [ + '#ffebee', + '#ffcdd2', + '#ef9a9a', + '#e57373', + '#ef5350', + '#f44336', + '#e53935', + '#d32f2f', + '#c62828', + '#b71c1c', + '#ff8a80', + '#ff5252', + '#ff1744', + '#d50000', + '#fce4ec', + '#f8bbd0', + '#f48fb1', + '#f06292', + '#ec407a', + '#e91e63', + '#d81b60', + '#c2185b', + '#ad1457', + '#880e4f', + '#ff80ab', + '#ff4081', + '#f50057', + '#c51162', + '#f3e5f5', + '#e1bee7', + '#ce93d8', + '#ba68c8', + '#ab47bc', + '#9c27b0', + '#8e24aa', + '#7b1fa2', + '#6a1b9a', + '#4a148c', + '#ea80fc', + '#e040fb', + '#d500f9', + '#aa00ff', + '#ede7f6', + '#d1c4e9', + '#b39ddb', + '#9575cd', + '#7e57c2', + '#673ab7', + '#5e35b1', + '#512da8', + '#4527a0', + '#311b92', + '#b388ff', + '#7c4dff', + '#651fff', + '#6200ea', + '#e8eaf6', + '#c5cae9', + '#9fa8da', + '#7986cb', + '#5c6bc0', + '#3f51b5', + '#3949ab', + '#303f9f', + '#283593', + '#1a237e', + '#8c9eff', + '#536dfe', + '#3d5afe', + '#304ffe', + '#e3f2fd', + '#bbdefb', + '#90caf9', + '#64b5f6', + '#42a5f5', + '#2196f3', + '#1e88e5', + '#1976d2', + '#1565c0', + '#0d47a1', + '#82b1ff', + '#448aff', + '#2979ff', + '#2962ff', + '#e1f5fe', + '#b3e5fc', + '#81d4fa', + '#4fc3f7', + '#29b6f6', + '#03a9f4', + '#039be5', + '#0288d1', + '#0277bd', + '#01579b', + '#80d8ff', + '#40c4ff', + '#00b0ff', + '#0091ea', + '#e0f7fa', + '#b2ebf2', + '#80deea', + '#4dd0e1', + '#26c6da', + '#00bcd4', + '#00acc1', + '#0097a7', + '#00838f', + '#006064', + '#84ffff', + '#18ffff', + '#00e5ff', + '#00b8d4', + '#e0f2f1', + '#b2dfdb', + '#80cbc4', + '#4db6ac', + '#26a69a', + '#009688', + '#00897b', + '#00796b', + '#00695c', + '#004d40', + '#a7ffeb', + '#64ffda', + '#1de9b6', + '#00bfa5', + '#e8f5e9', + '#c8e6c9', + '#a5d6a7', + '#81c784', + '#66bb6a', + '#4caf50', + '#43a047', + '#388e3c', + '#2e7d32', + '#1b5e20', + '#b9f6ca', + '#69f0ae', + '#00e676', + '#00c853', + '#f1f8e9', + '#dcedc8', + '#c5e1a5', + '#aed581', + '#9ccc65', + '#8bc34a', + '#7cb342', + '#689f38', + '#558b2f', + '#33691e', + '#ccff90', + '#b2ff59', + '#76ff03', + '#64dd17', + '#f9fbe7', + '#f0f4c3', + '#e6ee9c', + '#dce775', + '#d4e157', + '#cddc39', + '#c0ca33', + '#afb42b', + '#9e9d24', + '#827717', + '#f4ff81', + '#eeff41', + '#c6ff00', + '#aeea00', + '#fffde7', + '#fff9c4', + '#fff59d', + '#fff176', + '#ffee58', + '#ffeb3b', + '#fdd835', + '#fbc02d', + '#f9a825', + '#f57f17', + '#ffff8d', + '#ffff00', + '#ffea00', + '#ffd600', + '#fff8e1', + '#ffecb3', + '#ffe082', + '#ffd54f', + '#ffca28', + '#ffc107', + '#ffb300', + '#ffa000', + '#ff8f00', + '#ff6f00', + '#ffe57f', + '#ffd740', + '#ffc400', + '#ffab00', + '#fff3e0', + '#ffe0b2', + '#ffcc80', + '#ffb74d', + '#ffa726', + '#ff9800', + '#fb8c00', + '#f57c00', + '#ef6c00', + '#e65100', + '#ffd180', + '#ffab40', + '#ff9100', + '#ff6d00', + '#fbe9e7', + '#ffccbc', + '#ffab91', + '#ff8a65', + '#ff7043', + '#ff5722', + '#f4511e', + '#e64a19', + '#d84315', + '#bf360c', + '#ff9e80', + '#ff6e40', + '#ff3d00', + '#dd2c00', + '#efebe9', + '#d7ccc8', + '#bcaaa4', + '#a1887f', + '#8d6e63', + '#795548', + '#6d4c41', + '#5d4037', + '#4e342e', + '#3e2723', + '#d7ccc8', + '#bcaaa4', + '#8d6e63', + '#5d4037', + '#fafafa', + '#f5f5f5', + '#eeeeee', + '#e0e0e0', + '#bdbdbd', + '#9e9e9e', + '#757575', + '#616161', + '#424242', + '#212121', + '#ffffff', + '#eeeeee', + '#bdbdbd', + '#616161', + '#eceff1', + '#cfd8dc', + '#b0bec5', + '#90a4ae', + '#78909c', + '#607d8b', + '#546e7a', + '#455a64', + '#37474f', + '#263238', + '#cfd8dc', + '#b0bec5', + '#78909c', + '#455a64' +]; + +/** + // Color palettes from the Material Design spec. + // See https://www.google.com/design/spec/style/color.html + */ +export class MatColors { + public static all = matColors; + public static presets = matPresetColors; + + public static getColor(colorName): any { + if (matColors[colorName]) { + return matColors[colorName]; + } + + return false; + } +} diff --git a/src/@fuse/pipes/camelCaseToDash.pipe.ts b/src/@fuse/pipes/camelCaseToDash.pipe.ts new file mode 100644 index 0000000..8d7ca9e --- /dev/null +++ b/src/@fuse/pipes/camelCaseToDash.pipe.ts @@ -0,0 +1,17 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ name: 'camelCaseToDash' }) +export class CamelCaseToDashPipe implements PipeTransform { + /** + * Transform + * + * @param {string} value + * @param {any[]} args + * @returns {string} + */ + transform(value: string, args: any[] = []): string { + return value + ? String(value).replace(/([A-Z])/g, g => `-${g[0].toLowerCase()}`) + : ''; + } +} diff --git a/src/@fuse/pipes/filter.pipe.ts b/src/@fuse/pipes/filter.pipe.ts new file mode 100644 index 0000000..fbdd990 --- /dev/null +++ b/src/@fuse/pipes/filter.pipe.ts @@ -0,0 +1,17 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { FuseUtils } from '../utils'; + +@Pipe({ name: 'filter' }) +export class FilterPipe implements PipeTransform { + /** + * Transform + * + * @param {any[]} mainArr + * @param {string} searchText + * @param {string} property + * @returns {any} + */ + transform(mainArr: any[], searchText: string, property: string): any { + return FuseUtils.filterArrayByString(mainArr, searchText); + } +} diff --git a/src/@fuse/pipes/getById.pipe.ts b/src/@fuse/pipes/getById.pipe.ts new file mode 100644 index 0000000..627a493 --- /dev/null +++ b/src/@fuse/pipes/getById.pipe.ts @@ -0,0 +1,29 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'getById', + pure: false +}) +export class GetByIdPipe implements PipeTransform { + /** + * Transform + * + * @param {any[]} value + * @param {number} id + * @param {string} property + * @returns {any} + */ + transform(value: any[], id: number, property: string): any { + const foundItem = value.find(item => { + if (item.id !== undefined) { + return item.id === id; + } + + return false; + }); + + if (foundItem) { + return foundItem[property]; + } + } +} diff --git a/src/@fuse/pipes/htmlToPlaintext.pipe.ts b/src/@fuse/pipes/htmlToPlaintext.pipe.ts new file mode 100644 index 0000000..e834104 --- /dev/null +++ b/src/@fuse/pipes/htmlToPlaintext.pipe.ts @@ -0,0 +1,15 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ name: 'htmlToPlaintext' }) +export class HtmlToPlaintextPipe implements PipeTransform { + /** + * Transform + * + * @param {string} value + * @param {any[]} args + * @returns {string} + */ + transform(value: string, args: any[] = []): string { + return value ? String(value).replace(/<[^>]+>/gm, '') : ''; + } +} diff --git a/src/@fuse/pipes/keys.pipe.ts b/src/@fuse/pipes/keys.pipe.ts new file mode 100644 index 0000000..b7359be --- /dev/null +++ b/src/@fuse/pipes/keys.pipe.ts @@ -0,0 +1,26 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ name: 'keys' }) +export class KeysPipe implements PipeTransform { + /** + * Transform + * + * @param value + * @param {string[]} args + * @returns {any} + */ + transform(value: any, args: string[]): any { + const keys: any[] = []; + + for (const key in value) { + if (value.hasOwnProperty(key)) { + keys.push({ + key: key, + value: value[key] + }); + } + } + + return keys; + } +} diff --git a/src/@fuse/pipes/pipes.module.ts b/src/@fuse/pipes/pipes.module.ts new file mode 100644 index 0000000..4067bb9 --- /dev/null +++ b/src/@fuse/pipes/pipes.module.ts @@ -0,0 +1,26 @@ +import { NgModule } from '@angular/core'; + +import { KeysPipe } from './keys.pipe'; +import { GetByIdPipe } from './getById.pipe'; +import { HtmlToPlaintextPipe } from './htmlToPlaintext.pipe'; +import { FilterPipe } from './filter.pipe'; +import { CamelCaseToDashPipe } from './camelCaseToDash.pipe'; + +@NgModule({ + declarations: [ + KeysPipe, + GetByIdPipe, + HtmlToPlaintextPipe, + FilterPipe, + CamelCaseToDashPipe + ], + imports: [], + exports: [ + KeysPipe, + GetByIdPipe, + HtmlToPlaintextPipe, + FilterPipe, + CamelCaseToDashPipe + ] +}) +export class FusePipesModule {} diff --git a/src/@fuse/scss/core.scss b/src/@fuse/scss/core.scss new file mode 100644 index 0000000..39fd914 --- /dev/null +++ b/src/@fuse/scss/core.scss @@ -0,0 +1,37 @@ +// This file meant to be imported only once! Use fuse.scss to access +// to the core Fuse and Angular Material mixins + +// ngx-datatable +@import '~@swimlane/ngx-datatable/release/themes/material'; + +// Perfect scrollbar +@import '~perfect-scrollbar/css/perfect-scrollbar'; + +// Fuse +@import 'fuse'; + +// Theme +@import 'theme'; + +// Include core Angular Material styles +@include mat-core(); + +// Partials +@import 'partials/normalize'; +@import 'partials/scrollbars'; +@import 'partials/helpers'; +@import 'partials/general'; +@import 'partials/icons'; +@import 'partials/colors'; +@import 'partials/material'; +@import 'partials/angular-material-fix'; +@import 'partials/typography'; +@import 'partials/docs'; +@import 'partials/page-layouts'; +@import 'partials/cards'; +@import 'partials/navigation'; +@import 'partials/forms'; +@import 'partials/print'; + +// Plugins +@import 'partials/plugins/plugins'; diff --git a/src/@fuse/scss/fuse.scss b/src/@fuse/scss/fuse.scss new file mode 100644 index 0000000..05b3d33 --- /dev/null +++ b/src/@fuse/scss/fuse.scss @@ -0,0 +1,5 @@ +// Material theming tools +@import '~@angular/material/theming'; + +// Breakpoint mixins +@import 'partials/breakpoints'; diff --git a/src/@fuse/scss/partials/_angular-material-fix.scss b/src/@fuse/scss/partials/_angular-material-fix.scss new file mode 100644 index 0000000..940ac6e --- /dev/null +++ b/src/@fuse/scss/partials/_angular-material-fix.scss @@ -0,0 +1,107 @@ +// Fix: "Remove the cdk-global-scrollblock effects from the HTML" +// Fuse already blocks the body scroll so it doesn't need this feature. We are disabling it +// because on Windows, it causes a scrollbar to show up. +html { + &.cdk-global-scrollblock { + position: relative !important; + overflow: hidden !important; + } +} + +// Fix: "Inconsistent button heights due to inconsistent line heights" +button { + .mat-button-wrapper { + line-height: normal; + } +} + +.mat-icon { + // Fix: "Font-weight config affecting the icons" + font-weight: 400 !important; + + // Fix: "Inconsistent positioning on custom font icons" + line-height: 1; +} + +// Fix: "Icon button ripple radius is not correct on Edge & Safari" +.mat-icon-button { + .mat-button-ripple { + border-radius: 50%; + } +} + +// Fix: "Smooth scrolling for iOS" +.mat-dialog-container { + -webkit-overflow-scrolling: touch; +} + +// Fix: "Inconsistent font sizes across elements" +.mat-checkbox { + font-size: 16px; +} + +.mat-radio-button { + font-size: 16px; +} + +// Fix: "Input underlines has wrong color opacity value" +.mat-form-field-underline { + background-color: rgba(0, 0, 0, 0.12); +} + +.mat-form-field { + // Fix: "Table-cell and inline-table in mat-select" + &.mat-form-field-type-mat-select { + .mat-form-field-infix { + display: inline-flex; + width: auto; + + .mat-select-trigger { + display: inline-flex; + align-items: center; + width: 100%; + + .mat-select-value { + display: flex; + max-width: none; + margin-right: 8px; + } + + .mat-select-arrow-wrapper { + display: inline-flex; + } + } + } + } +} + +// Fix: Stepper icons are broken due to Fuse's icon helpers +mat-horizontal-stepper, +mat-vertical-stepper { + mat-step-header { + mat-icon { + height: 16px !important; + width: 16px !important; + min-width: 0 !important; + min-height: 0 !important; + color: inherit !important; + } + } +} + +mat-vertical-stepper { + padding: 16px 0; +} + +// Fix: Chip remove icon is broken due to Fuse's icon helpers +mat-chip { + mat-icon { + min-width: 0 !important; + min-height: 0 !important; + } +} + +// Fix: Mat-card-image requires a bigger width than 100% +.mat-card-image { + max-width: none !important; +} diff --git a/src/@fuse/scss/partials/_breakpoints.scss b/src/@fuse/scss/partials/_breakpoints.scss new file mode 100644 index 0000000..306c8eb --- /dev/null +++ b/src/@fuse/scss/partials/_breakpoints.scss @@ -0,0 +1,37 @@ +// Media step breakpoint mixin based on Angular Material lib +$breakpoints: ( + xs: 'screen and (max-width: 599px)', + sm: 'screen and (min-width: 600px) and (max-width: 959px)', + md: 'screen and (min-width: 960px) and (max-width: 1279px)', + lg: 'screen and (min-width: 1280px) and (max-width: 1919px)', + xl: 'screen and (min-width: 1920px) and (max-width: 5000px)', + lt-sm: 'screen and (max-width: 599px)', + lt-md: 'screen and (max-width: 959px)', + lt-lg: 'screen and (max-width: 1279px)', + lt-xl: 'screen and (max-width: 1919px)', + gt-xs: 'screen and (min-width: 600px)', + gt-sm: 'screen and (min-width: 960px)', + gt-md: 'screen and (min-width: 1280px)', + gt-lg: 'screen and (min-width: 1920px)' +) !default; + +// Re-map the breakpoints for the helper classes +$helper-breakpoints: ( + xs: null, + sm: 'gt-xs', + md: 'gt-sm', + lg: 'gt-md', + xl: 'gt-lg' +); + +@mixin media-breakpoint($breakpointName) { + $mediaQuery: map-get($breakpoints, $breakpointName); + + @if ($mediaQuery == null) { + @content; + } @else { + @media #{$mediaQuery} { + @content; + } + } +} diff --git a/src/@fuse/scss/partials/_cards.scss b/src/@fuse/scss/partials/_cards.scss new file mode 100644 index 0000000..88d0417 --- /dev/null +++ b/src/@fuse/scss/partials/_cards.scss @@ -0,0 +1,75 @@ +// ----------------------------------------------------------------------------------------------------- +// @ Theming +// ----------------------------------------------------------------------------------------------------- +@mixin cards-theme($theme) { + $background: map-get($theme, background); + $foreground: map-get($theme, foreground); + + .fuse-card { + background: map-get($background, card); + border-color: map-get($foreground, divider); + + .card-divider { + border-top: 1px solid map-get($foreground, divider); + } + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Cards +// ----------------------------------------------------------------------------------------------------- +.fuse-card { + max-width: 320px; + min-width: 320px; + border-radius: 8px; + border: 1px solid; + + &.variable-width { + min-width: 0; + } + + &.auto-width { + min-width: 0; + max-width: none; + } + + // Buttons + .mat-button { + min-width: 0 !important; + padding: 0 8px !important; + } + + // Button Toggle Group + .mat-button-toggle-group, + .mat-button-toggle-standalone { + box-shadow: none !important; + } + + // Tabs + .mat-tab-labels { + justify-content: center; + } + + .mat-tab-label { + min-width: 0 !important; + } + + // Divider + .card-divider { + margin: 16px; + + &.full-width { + margin: 0; + } + } + + // Expand Area + .card-expand-area { + overflow: hidden; + + .card-expanded-content { + padding: 8px 16px 16px 16px; + line-height: 1.75; + } + } +} diff --git a/src/@fuse/scss/partials/_colors.scss b/src/@fuse/scss/partials/_colors.scss new file mode 100644 index 0000000..22df332 --- /dev/null +++ b/src/@fuse/scss/partials/_colors.scss @@ -0,0 +1,393 @@ +// ----------------------------------------------------------------------------------------------------- +// @ Theming +// ----------------------------------------------------------------------------------------------------- +@mixin colors-theme($theme) { + $is-dark: map-get($theme, is-dark); + $background: map-get($theme, background); + $foreground: map-get($theme, foreground); + + // Base colors + & { + color: map-get($foreground, text); + + // If it's a light theme, use a darker background + // color other than the default #fafafa + @if ($is-dark) { + background: map-get($background, background); + } @else { + background: #f5f5f5; + } + } + + .secondary-text { + color: map-get($foreground, secondary-text); + } + + .icon, + i { + color: map-get($foreground, icon); + } + + .hint-text { + color: map-get($foreground, hint-text); + } + + .disabled-text { + color: map-get($foreground, disabled-text); + } + + .fade-text, + .divider { + color: map-get($foreground, divider); + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Material colors map +// ----------------------------------------------------------------------------------------------------- +$matPalettes: ( + 'red': $mat-red, + 'pink': $mat-pink, + 'purple': $mat-purple, + 'deep-purple': $mat-deep-purple, + 'indigo': $mat-indigo, + 'blue': $mat-blue, + 'light-blue': $mat-light-blue, + 'cyan': $mat-cyan, + 'teal': $mat-teal, + 'green': $mat-green, + 'light-green': $mat-light-green, + 'lime': $mat-lime, + 'yellow': $mat-yellow, + 'amber': $mat-amber, + 'orange': $mat-orange, + 'deep-orange': $mat-deep-orange, + 'brown': $mat-brown, + 'grey': $mat-grey, + 'blue-grey': $mat-blue-grey +); + +// Material color hues list +$matHues: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, A100, A200, A400, + A700; + +// ----------------------------------------------------------------------------------------------------- +// @ Text color levels generator +// ----------------------------------------------------------------------------------------------------- +@mixin generate-text-color-levels($classes, $contrast) { + // If the contrast is dark... + @if ($contrast == 'dark') { + // Put down the color classes + #{$classes} { + i, + .icon { + color: rgba(0, 0, 0, 0.54); + } + + &.secondary-text, + .secondary-text { + color: rgba(0, 0, 0, 0.54) !important; + } + + &.hint-text, + .hint-text, + &.disabled-text, + .disabled-text { + color: rgba(0, 0, 0, 0.38) !important; + } + + &.divider, + .divider { + color: rgba(0, 0, 0, 0.12) !important; + } + + .mat-ripple-element { + background: rgba(0, 0, 0, 0.1); + } + + .adaptive-border-color { + border-color: rgba(0, 0, 0, 0.12); + } + } + } + // If the base text color is white... + @else { + // Put down the color classes + #{$classes} { + i, + .icon { + color: rgba(255, 255, 255, 1); + } + + &.secondary-text, + .secondary-text { + color: rgba(255, 255, 255, 0.7) !important; + } + + &.hint-text, + .hint-text, + &.disabled-text, + .disabled-text { + color: rgba(255, 255, 255, 0.5) !important; + } + + &.divider, + .divider { + color: rgba(255, 255, 255, 0.12) !important; + } + + .mat-ripple-element { + background: rgba(255, 255, 255, 0.1); + } + + .adaptive-border-color { + border-color: rgba(255, 255, 255, 0.12); + } + } + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Material element colors generator +// ----------------------------------------------------------------------------------------------------- +@mixin generate-material-element-colors($classes, $contrast) { + // If the contrast color is light... + $fuseForeground: ( + base: white, + text: white, + hint-text: rgba(white, 0.5), + divider: rgba(white, 0.12) + ); + + // If the contrast color is dark... + @if ($contrast == 'dark') { + $fuseForeground: ( + base: black, + hint-text: rgba(black, 0.38), + divider: rgba(black, 0.12) + ); + } + + // Put down the color classes + #{$classes} { + // Native Input + input[type='text'] { + color: map-get($fuseForeground, base); + } + + // Input + .mat-form-field-label { + color: map-get($fuseForeground, hint-text); + } + + .mat-form-field-underline { + background-color: map-get($fuseForeground, divider); + } + + // Select + .mat-select-trigger, + .mat-select-arrow { + color: map-get($fuseForeground, hint-text); + } + + .mat-select-underline { + background-color: map-get($fuseForeground, divider); + } + + .mat-select-disabled .mat-select-value, + .mat-select-arrow, + .mat-select-trigger { + color: map-get($fuseForeground, hint-text); + } + + .mat-select-content, + .mat-select-panel-done-animating { + //background: map-get($background, card); + } + + .mat-select-value { + color: map-get($fuseForeground, text); + } + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Color classes generator +// ----------------------------------------------------------------------------------------------------- +@mixin generate-color-classes($colorName, $color, $contrastColor, $hue) { + .#{$colorName}#{$hue}-bg { + background-color: $color !important; + } + + .#{$colorName}#{$hue} { + background-color: $color !important; + color: $contrastColor !important; + + &[disabled] { + background-color: rgba($color, 0.12) !important; + color: rgba($contrastColor, 0.26) !important; + } + } + + .#{$colorName}#{$hue}-fg { + color: $color !important; + } + + .#{$colorName}#{$hue}-border { + border-color: $color !important; + } + + .#{$colorName}#{$hue}-border-top { + border-top-color: $color !important; + } + + .#{$colorName}#{$hue}-border-right { + border-right-color: $color !important; + } + + .#{$colorName}#{$hue}-border-bottom { + border-bottom-color: $color !important; + } + + .#{$colorName}#{$hue}-border-left { + border-left-color: $color !important; + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Fuse color classes +// ----------------------------------------------------------------------------------------------------- +@mixin fuse-color-classes($palettes) { + // Define contrast lists + $light-contrasting-classes: (); + $dark-contrasting-classes: (); + + // Generate the color classes... + @each $paletteName, $palette in $palettes { + // Get the contrasts map + $contrasts: map-get($palette, 'contrast'); + + @each $hue in $matHues { + // Get the color and the contrasting color + $color: map-get($palette, $hue); + $contrast: map-get($contrasts, $hue); + + @if ($color != null and $contrast != null) { + // Generate color classes + @include generate-color-classes( + $paletteName, + $color, + $contrast, + '-#{$hue}' + ); + + // If the contrast color is dark + @if (rgba(black, 1) == rgba($contrast, 1)) { + $dark-contrasting-classes: append( + $dark-contrasting-classes, + unquote('.#{$paletteName}-#{$hue}'), + 'comma' + ); + } + // if the contrast color is light + @else { + $light-contrasting-classes: append( + $light-contrasting-classes, + unquote('.#{$paletteName}-#{$hue}'), + 'comma' + ); + } + + // Run the generator one more time for default values (500) + // if we are not working with primary, accent or warn palettes + @if ( + $hue == + 500 and + $paletteName != + 'primary' and + $paletteName != + 'accent' and + $paletteName != + 'warn' + ) { + // Generate color classes + @include generate-color-classes($paletteName, $color, $contrast, ''); + + // Add color to the correct list depending on the contrasting color + + // If the contrast color is dark + @if (rgba(black, 1) == rgba($contrast, 1)) { + $dark-contrasting-classes: append( + $dark-contrasting-classes, + unquote('.#{$paletteName}'), + 'comma' + ); + } + // if the contrast color is light + @else { + $light-contrasting-classes: append( + $light-contrasting-classes, + unquote('.#{$paletteName}'), + 'comma' + ); + } + } + } + } + + // Run the generator again for the selected default hue values for + // primary, accent and warn palettes + // + // We are doing this because the default hue value can be changed + // by the user when the Material theme being generated. + @if ( + $paletteName == + 'primary' or + $paletteName == + 'accent' or + $paletteName == + 'warn' + ) { + // Get the color and the contrasting color for the selected + // default hue + $color: map-get($palette, 'default'); + $contrast: map-get($palette, 'default-contrast'); + + // Generate color classes + @include generate-color-classes($paletteName, $color, $contrast, ''); + + // Add color to the correct list depending on the contrasting color + + // If the contrast color is dark + @if (rgba(black, 1) == rgba($contrast, 1)) { + $dark-contrasting-classes: append( + $dark-contrasting-classes, + unquote('.#{$paletteName}'), + 'comma' + ); + } + // if the contrast color is light + @else { + $light-contrasting-classes: append( + $light-contrasting-classes, + unquote('.#{$paletteName}'), + 'comma' + ); + } + } + } + + // Generate contrasting colors + @include generate-text-color-levels($dark-contrasting-classes, 'dark'); + @include generate-text-color-levels($light-contrasting-classes, 'light'); + @include generate-material-element-colors($dark-contrasting-classes, 'dark'); + @include generate-material-element-colors( + $light-contrasting-classes, + 'light' + ); +} + +// ----------------------------------------------------------------------------------------------------- +// @ Generate Fuse color classes for default Material palettes +// ----------------------------------------------------------------------------------------------------- +@include fuse-color-classes($matPalettes); diff --git a/src/@fuse/scss/partials/_docs.scss b/src/@fuse/scss/partials/_docs.scss new file mode 100644 index 0000000..a58ea96 --- /dev/null +++ b/src/@fuse/scss/partials/_docs.scss @@ -0,0 +1,41 @@ +.docs { + font-size: 16px; + + > .content { + max-width: 980px; + + > .main-title { + &:first-child { + margin-top: 0; + } + } + } + + .main-title { + display: flex; + margin-top: 72px; + font-size: 24px; + } + + .section-title { + display: inline-flex; + font-size: 18px; + margin-top: 24px; + border-bottom: 1px solid #f44336; + color: #f44336; + } + + ol, + ul { + padding-left: 24px; + + li { + margin-bottom: 12px; + line-height: 1.7; + } + } + + p { + line-height: 1.7; + } +} diff --git a/src/@fuse/scss/partials/_forms.scss b/src/@fuse/scss/partials/_forms.scss new file mode 100644 index 0000000..b558aaf --- /dev/null +++ b/src/@fuse/scss/partials/_forms.scss @@ -0,0 +1,15 @@ +button, +input[type='email'], +input[type='tel'], +input[type='text'], +input[type='password'], +input[type='image'], +input[type='submit'], +input[type='button'], +input[type='search'], +textarea { + appearance: none; + -moz-appearance: none; + -webkit-appearance: none; + outline: none; +} diff --git a/src/@fuse/scss/partials/_general.scss b/src/@fuse/scss/partials/_general.scss new file mode 100644 index 0000000..c643d73 --- /dev/null +++ b/src/@fuse/scss/partials/_general.scss @@ -0,0 +1,70 @@ +// ----------------------------------------------------------------------------------------------------- +// @ Body scroll lock +// ----------------------------------------------------------------------------------------------------- +html, +body { + display: flex; + flex: 1 0 auto; + width: 100%; + height: 100%; + max-height: 100%; + min-height: 100%; + margin: 0; + padding: 0; + overflow: hidden; +} + +// ----------------------------------------------------------------------------------------------------- +// @ Boxed body +// ----------------------------------------------------------------------------------------------------- +body { + // Boxed + &.boxed { + max-width: 1200px; + margin: 0 auto; + + @include mat-elevation(8); + } +} + +/*----------------------------------------------------------------*/ +/* @ Text rendering & box sizing +/*----------------------------------------------------------------*/ +* { + text-rendering: optimizeLegibility; + -o-text-rendering: optimizeLegibility; + -ms-text-rendering: optimizeLegibility; + -moz-text-rendering: optimizeLegibility; + -webkit-text-rendering: optimizeLegibility; + -webkit-tap-highlight-color: transparent; + box-sizing: border-box; + + &:before, + &:after { + box-sizing: border-box; + } + + // Remove focus outline + &:focus { + outline: none; + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Responsive images +// ----------------------------------------------------------------------------------------------------- + +img { + max-width: 100%; + height: auto; + vertical-align: top; + border: none; +} + +// ----------------------------------------------------------------------------------------------------- +// @ Input +// ----------------------------------------------------------------------------------------------------- +input { + border: none; + padding: 0 16px; +} diff --git a/src/@fuse/scss/partials/_helpers.scss b/src/@fuse/scss/partials/_helpers.scss new file mode 100644 index 0000000..8822eea --- /dev/null +++ b/src/@fuse/scss/partials/_helpers.scss @@ -0,0 +1,236 @@ +// ----------------------------------------------------------------------------------------------------- +// @ Position helpers +// ----------------------------------------------------------------------------------------------------- +@each $breakpoint, $materialBreakpoint in $helper-breakpoints { + @include media-breakpoint($materialBreakpoint) { + $infix: if($materialBreakpoint == null, '', '-#{$breakpoint}'); + + .position#{$infix}-relative { + position: relative; + } + + .position#{$infix}-absolute { + position: absolute; + } + + .position#{$infix}-static { + position: static; + } + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Absolute position alignment helpers +// ----------------------------------------------------------------------------------------------------- +@each $breakpoint, $materialBreakpoint in $helper-breakpoints { + @include media-breakpoint($materialBreakpoint) { + $infix: if($materialBreakpoint == null, '', '-#{$breakpoint}'); + + .align#{$infix}-top { + top: 0; + } + + .align#{$infix}-right { + right: 0; + } + + .align#{$infix}-bottom { + bottom: 0; + } + + .align#{$infix}-left { + left: 0; + } + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Size helpers +// ----------------------------------------------------------------------------------------------------- +@each $prop, $abbrev in (height: h, width: w) { + @for $index from 0 through 180 { + $size: $index * 4; + $length: #{$size}px; + + .#{$abbrev}-#{$size} { + #{$prop}: $length !important; + min-#{$prop}: $length !important; + max-#{$prop}: $length !important; + } + } + + // Percentage + @for $i from 0 through 20 { + $i-p: 5 * $i; + $size-p: 5% * $i; + + .#{$abbrev}-#{$i-p}-p { + #{$prop}: $size-p !important; + } + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Spacing helpers +// ----------------------------------------------------------------------------------------------------- +@each $breakpoint, $materialBreakpoint in $helper-breakpoints { + @include media-breakpoint($materialBreakpoint) { + $infix: if($materialBreakpoint == null, '', '-#{$breakpoint}'); + + @each $prop, $abbrev in (margin: m, padding: p) { + @for $index from 0 through 64 { + $size: $index * 4; + $length: #{$size}px; + + .#{$abbrev}#{$infix}-#{$size} { + #{$prop}: $length !important; + } + } + + @for $index from 0 through 64 { + $size: $index * 4; + $length: #{$size}px; + + .#{$abbrev}x#{$infix}-#{$size} { + #{$prop}-right: $length !important; + #{$prop}-left: $length !important; + } + + .#{$abbrev}y#{$infix}-#{$size} { + #{$prop}-top: $length !important; + #{$prop}-bottom: $length !important; + } + } + + @for $index from 0 through 64 { + $size: $index * 4; + $length: #{$size}px; + + .#{$abbrev}t#{$infix}-#{$size} { + #{$prop}-top: $length !important; + } + + .#{$abbrev}r#{$infix}-#{$size} { + #{$prop}-right: $length !important; + } + + .#{$abbrev}b#{$infix}-#{$size} { + #{$prop}-bottom: $length !important; + } + + .#{$abbrev}l#{$infix}-#{$size} { + #{$prop}-left: $length !important; + } + } + + @if ($abbrev == m) { + // Some special margin utils for flex alignments + .m#{$infix}-auto { + margin: auto !important; + } + + .mt#{$infix}-auto { + margin-top: auto !important; + } + + .mr#{$infix}-auto { + margin-right: auto !important; + } + + .mb#{$infix}-auto { + margin-bottom: auto !important; + } + + .ml#{$infix}-auto { + margin-left: auto !important; + } + + .mx#{$infix}-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my#{$infix}-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + } + } + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Border helpers +// ----------------------------------------------------------------------------------------------------- +$border-style: 1px solid rgba(0, 0, 0, 0.12); + +.border, +.b { + border: $border-style; +} + +.border-top, +.bt { + border-top: $border-style; +} + +.border-right, +.br { + border-right: $border-style; +} + +.border-bottom, +.bb { + border-bottom: $border-style; +} + +.border-left, +.bl { + border-left: $border-style; +} + +.border-horizontal, +.bx { + border-left: $border-style; + border-right: $border-style; +} + +.border-vertical, +.by { + border-top: $border-style; + border-bottom: $border-style; +} + +// ----------------------------------------------------------------------------------------------------- +// @ Border radius helpers +// ----------------------------------------------------------------------------------------------------- +.border-radius-100 { + border-radius: 100%; +} + +.border-radius-2 { + border-radius: 2px; +} + +.border-radius-4 { + border-radius: 4px; +} + +.border-radius-8 { + border-radius: 8px; +} + +.border-radius-16 { + border-radius: 16px; +} + +// ----------------------------------------------------------------------------------------------------- +// @ Cursor helpers +// ----------------------------------------------------------------------------------------------------- +.cursor-pointer { + cursor: pointer; +} + +.cursor-default { + cursor: default; +} diff --git a/src/@fuse/scss/partials/_icons.scss b/src/@fuse/scss/partials/_icons.scss new file mode 100644 index 0000000..02f7c06 --- /dev/null +++ b/src/@fuse/scss/partials/_icons.scss @@ -0,0 +1,26 @@ +i, +mat-icon { + font-size: 24px; + width: 24px; + height: 24px; + min-width: 24px; + min-height: 24px; + line-height: 24px; + + @each $breakpoint, $materialBreakpoint in $helper-breakpoints { + @include media-breakpoint($materialBreakpoint) { + $infix: if($materialBreakpoint == null, '', '-#{$breakpoint}'); + + @for $size from 2 through 128 { + &.s#{$infix}-#{$size * 2} { + font-size: #{($size * 2) + 'px'} !important; + width: #{($size * 2) + 'px'} !important; + height: #{($size * 2) + 'px'} !important; + min-width: #{($size * 2) + 'px'} !important; + min-height: #{($size * 2) + 'px'} !important; + line-height: #{($size * 2) + 'px'} !important; + } + } + } + } +} diff --git a/src/@fuse/scss/partials/_material.scss b/src/@fuse/scss/partials/_material.scss new file mode 100644 index 0000000..7f6590e --- /dev/null +++ b/src/@fuse/scss/partials/_material.scss @@ -0,0 +1,562 @@ +// ----------------------------------------------------------------------------------------------------- +// @ Theming +// ----------------------------------------------------------------------------------------------------- +@mixin material-theme($theme) { + $background: map-get($theme, background); + $foreground: map-get($theme, foreground); + + // ----------------------------------------------------------------------------------------------------- + // @ Avatar + // ----------------------------------------------------------------------------------------------------- + .avatar { + color: map-get($foreground, text); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Forms + // ----------------------------------------------------------------------------------------------------- + .form-wrapper { + background-color: map-get($background, card); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Navigation - Simple + // ----------------------------------------------------------------------------------------------------- + .navigation-simple { + .item { + &.selected { + background-color: map-get($background, hover); + } + } + + .subheader { + border-top: 1px solid map-get($foreground, divider); + } + } + + // ----------------------------------------------------------------------------------------------------- + // @ Pagination - Simple + // ----------------------------------------------------------------------------------------------------- + .simple-pagination { + background: map-get($background, card); + + .pagination-item { + color: map-get($foreground, secondary-text); + + &:hover { + color: map-get($foreground, text); + } + + &.disabled { + color: map-get($foreground, disabled-text); + } + } + } + + // ----------------------------------------------------------------------------------------------------- + // @ Price tables + // ----------------------------------------------------------------------------------------------------- + .price-tables { + .price-table { + background: map-get($background, card); + + &.style-1 { + .price { + .currency { + color: map-get($foreground, secondary-text); + } + + .period { + color: map-get($foreground, secondary-text); + } + } + } + + &.style-2 { + .price { + .currency { + color: map-get($foreground, secondary-text); + } + } + + .period { + color: map-get($foreground, secondary-text); + } + } + + &.style-3 { + .package-type { + .subtitle { + color: map-get($foreground, secondary-text); + } + } + + .terms { + color: map-get($foreground, secondary-text); + } + + .note { + color: map-get($foreground, secondary-text); + } + } + } + } + + // ------------------------------------------------------------------------------------------------- + // @ Table - Simple + // ------------------------------------------------------------------------------------------------- + .simple-table-container { + background: map-get($background, card); + } + + table { + &.simple { + thead { + tr { + th { + color: map-get($foreground, secondary-text); + border-bottom: 1px solid map-get($foreground, divider); + } + } + } + + tbody { + tr { + td { + border-bottom: 1px solid map-get($foreground, divider); + } + } + } + + &.clickable { + tbody { + tr { + &:hover { + background-color: map-get($background, hover); + } + } + } + } + } + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Avatar +// ----------------------------------------------------------------------------------------------------- +.avatar { + width: 40px; + min-width: 40px; + height: 40px; + line-height: 40px; + margin: 0 8px 0 0; + border-radius: 50%; + font-size: 17px; + font-weight: 600; + text-align: center; + + &.square { + border-radius: 0; + } + + &.small { + width: 20px; + min-width: 20px; + height: 20px; + line-height: 20px; + } + + &.big { + width: 72px; + min-width: 72px; + height: 72px; + line-height: 72px; + } + + &.huge { + width: 96px; + min-width: 96px; + height: 96px; + line-height: 96px; + } +} + +.avatar-wrapper { + position: relative; + + .avatar { + margin-top: 0; + margin-bottom: 0; + } + mat-icon.status { + position: absolute; + top: 28px; + left: 28px; + } +} + +mat-icon.status { + border-radius: 50%; + + &.online { + color: #4caf50; + + &:before { + content: 'check_circle'; + } + } + + &.do-not-disturb { + color: #f44336; + + &:before { + content: 'remove_circle_outline'; + } + } + + &.away { + color: #ffc107; + + &:before { + content: 'access_time'; + } + } + + &.offline { + color: #646464; + + &:before { + content: 'not_interested'; + } + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Forms +// ----------------------------------------------------------------------------------------------------- +.form-wrapper { + padding: 16px; + + .form-title { + font-size: 21px; + padding: 8px 0; + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Navigation - Simple +// ----------------------------------------------------------------------------------------------------- +.navigation-simple { + .item { + position: relative; + cursor: pointer; + text-align: left; + margin: 0; + padding: 0 24px; + text-transform: none; + line-height: 48px; + max-height: 48px; + height: 48px; + + mat-icon { + margin: 0 16px 0 0; + } + + .title { + font-size: 13px; + font-weight: 600; + line-height: 1; + } + } + + .subheader { + font-size: 13px; + font-weight: 600; + margin-top: 8px; + } + + mat-divider { + margin: 8px 0; + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Pagination - Simple +// ----------------------------------------------------------------------------------------------------- +.simple-pagination { + position: relative; + display: inline-flex; + flex-direction: row; + padding: 0 8px; + border-radius: 4px; + @include mat-elevation(1); + + .pagination-item { + display: flex; + align-items: center; + justify-content: center; + min-width: 48px; + min-height: 56px; + line-height: 56px; + border-radius: 0; + margin: 0; + font-weight: normal; + + &.active { + cursor: default; + } + + &.disabled { + cursor: default; + } + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Price tables +// ----------------------------------------------------------------------------------------------------- +.price-tables { + .price-table { + position: relative; + width: 280px; + border-radius: 2px; + margin: 12px; + overflow: hidden; + + &.style-1 { + .package-type { + font-size: 17px; + padding: 16px 24px; + + .sale { + font-size: 13px; + font-weight: 600; + } + } + + .price { + padding: 32px 32px 16px 32px; + + .currency { + padding-right: 4px; + font-size: 24px; + font-weight: 600; + } + + .value { + font-size: 72px; + font-weight: 300; + line-height: 1; + } + + .period { + padding: 0 0 5px 4px; + font-size: 17px; + } + } + + mat-divider { + margin: 16px 32px; + } + + .terms { + padding: 16px 32px; + font-size: 15px; + + .term { + } + } + + .cta-button { + margin: 16px auto 32px auto; + width: 128px; + } + } + + &.style-2 { + .badge { + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); + font-size: 11px; + font-weight: 600; + padding: 6px 8px; + } + + .package-type { + padding: 48px 32px 24px 32px; + font-size: 20px; + font-weight: 600; + text-align: center; + } + + .price { + padding: 0 32px 8px 32px; + + .currency { + padding-right: 4px; + font-size: 24px; + font-weight: 600; + } + + .value { + font-size: 56px; + font-weight: 300; + line-height: 1; + } + } + + .period { + padding: 0 32px; + font-size: 15px; + font-weight: 600; + text-align: center; + } + + .terms { + padding: 32px; + font-size: 15px; + + .term { + padding-bottom: 8px; + + &:last-child { + padding-bottom: 0; + } + } + } + + .cta-button { + margin: 8px auto 32px auto; + width: 128px; + } + } + + &.style-3 { + .package-type { + padding: 32px; + text-align: center; + + .title { + font-size: 34px; + } + + .subtitle { + font-size: 17px; + font-weight: 600; + } + } + + .price { + padding: 16px 32px; + + .currency { + padding-right: 4px; + font-size: 15px; + font-weight: 600; + } + + .value { + font-size: 34px; + font-weight: 300; + line-height: 1; + } + + .period { + padding-left: 4px; + text-align: center; + } + } + + .terms { + margin: 32px; + font-size: 15px; + + .term { + padding-bottom: 16px; + + &:last-child { + padding-bottom: 0; + } + } + } + + .cta-button { + margin: 8px 32px; + } + + .note { + padding: 8px 32px 16px 32px; + text-align: center; + } + } + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Table - Simple +// ----------------------------------------------------------------------------------------------------- +.simple-table-container { + .table-title { + font-size: 20px; + padding: 24px; + } +} + +table { + &.simple { + width: 100%; + border: none; + border-spacing: 0; + text-align: left; + + thead { + tr { + th { + padding: 16px 8px; + font-weight: 600; + white-space: nowrap; + + &:first-child { + padding-left: 24px; + } + + &:last-child { + padding-right: 24px; + } + } + } + } + + tbody { + tr { + td { + padding: 16px 8px; + + &:first-child { + padding-left: 24px; + } + + &:last-child { + padding-right: 24px; + } + } + + &:last-child { + td { + border-bottom: none; + } + } + } + } + + &.clickable { + tbody { + tr { + cursor: pointer; + } + } + } + } +} diff --git a/src/@fuse/scss/partials/_navigation.scss b/src/@fuse/scss/partials/_navigation.scss new file mode 100644 index 0000000..215e08e --- /dev/null +++ b/src/@fuse/scss/partials/_navigation.scss @@ -0,0 +1,230 @@ +.nav { + .nav-subheader { + display: flex; + align-items: center; + height: 48px; + font-weight: 600; + padding-left: 24px; + margin-top: 8px; + font-size: 12px; + white-space: nowrap; + } + + .nav-group { + display: block; + + > .group-title { + position: relative; + display: flex; + align-items: center; + height: 48px; + font-weight: 600; + padding-left: 24px; + margin-top: 8px; + font-size: 12px; + white-space: nowrap; + } + } + + .nav-item { + .nav-link { + text-decoration: none !important; + display: flex; + align-items: center; + height: 48px; + padding: 0 24px; + position: relative; + overflow: hidden; + cursor: pointer; + user-select: none; + color: currentColor; + + > .nav-link-title { + flex: 1 1 auto; + white-space: nowrap; + } + + .nav-link-badge { + display: flex; + align-items: center; + min-width: 20px; + height: 20px; + padding: 0 7px; + font-size: 11px; + font-weight: 600; + border-radius: 20px; + transition: opacity 0.2s ease-in-out 0.1s; + margin-left: 8px; + + + .collapsable-arrow { + margin-left: 8px; + } + } + + &:hover { + background-color: rgba(0, 0, 0, 0.04); + } + + .mat-ripple-element { + background-color: rgba(0, 0, 0, 0.04); + } + + &.active { + .nav-link-icon { + opacity: 1; + } + + .nav-link-badge { + background: #ffffff !important; + color: rgba(0, 0, 0, 0.87) !important; + } + } + + .nav-link-icon { + margin-right: 16px; + } + + .nav-link-icon, + .collapsable-arrow { + font-size: 16px; + width: 16px; + height: 16px; + min-width: 16px; + min-height: 16px; + line-height: 16px; + } + } + + &.nav-collapsable { + display: block; + + > .children { + > .nav-item { + > .nav-link, + &.nav-group > .group-title, + &.nav-group > .group-items > .nav-item > .nav-link { + padding-left: 56px; + } + + > .children { + > .nav-item { + > .nav-link, + &.nav-group > .group-title, + &.nav-group > .group-items > .nav-item > .nav-link { + padding-left: 72px; + } + } + } + } + } + } + } + + > .nav-item { + &.nav-collapsable { + background: transparent; + transition: background 200ms ease-in-out; + + &.open { + background: rgba(0, 0, 0, 0.12); + } + } + } + + > .nav-group { + > .group-items { + > .nav-collapsable { + background: transparent; + transition: background 200ms ease-in-out; + + &.open { + background: rgba(0, 0, 0, 0.12); + } + } + } + } + + &.vertical { + .nav-group { + .group-title { + text-transform: uppercase; + } + } + } + + &.horizontal { + display: flex; + flex-direction: row; + + .nav-item { + &.nav-collapsable { + position: relative; + + .children { + display: none; + position: absolute; + top: 0; + left: 100%; + z-index: 999; + min-width: 200px; + 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); + + &.open { + display: block; + } + + .nav-link { + padding-left: 24px !important; + } + } + } + } + + > .nav-item { + > .nav-link { + height: 56px; + } + + &.nav-collapsable { + position: relative; + + > .nav-link { + height: 56px; + + .collapsable-arrow { + display: none; + } + } + + > .children { + top: 100%; + left: 0; + } + } + } + } + + // Material 2 style + &.material2, + .material2 & { + .nav-subheader { + height: 40px; + } + + .nav-group { + > .group-title { + height: 40px; + } + } + .nav-item { + .nav-link { + height: 40px; + padding: 0 12px 0 24px; + border-radius: 0 20px 20px 0; + margin-right: 16px; + } + } + } +} diff --git a/src/@fuse/scss/partials/_normalize.scss b/src/@fuse/scss/partials/_normalize.scss new file mode 100644 index 0000000..037c5d3 --- /dev/null +++ b/src/@fuse/scss/partials/_normalize.scss @@ -0,0 +1,450 @@ +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers (opinionated). + */ + +body { + margin: 0; +} + +/** + * Add the correct display in IE 9-. + */ + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + * 1. Add the correct display in IE. + */ + +figcaption, +figure, +main { + /* 1 */ + display: block; +} + +/** + * Add the correct margin in IE 8. + */ + +figure { + margin: 1em 40px; +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ + +a { + background-color: transparent; /* 1 */ + -webkit-text-decoration-skip: objects; /* 2 */ +} + +/** + * 1. Remove the bottom border in Chrome 57- and Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ + +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font style in Android 4.3-. + */ + +dfn { + font-style: italic; +} + +/** + * Add the correct background and color in IE 9-. + */ + +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +audio, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Remove the border on images inside links in IE 10-. + */ + +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { + /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { + /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ + +button, +html [type="button"], /* 1 */ +[type="reset"], +[type="submit"] { + -webkit-appearance: button; /* 2 */ +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type='button']::-moz-focus-inner, +[type='reset']::-moz-focus-inner, +[type='submit']::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type='button']:-moz-focusring, +[type='reset']:-moz-focusring, +[type='submit']:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + +[type='checkbox'], +[type='radio'] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type='number']::-webkit-inner-spin-button, +[type='number']::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type='search'] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ + +[type='search']::-webkit-search-cancel-button, +[type='search']::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in IE 9-. + * 1. Add the correct display in Edge, IE, and Firefox. + */ + +details, /* 1 */ +menu { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Scripting + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +canvas { + display: inline-block; +} + +/** + * Add the correct display in IE. + */ + +template { + display: none; +} + +/* Hidden + ========================================================================== */ + +/** + * Add the correct display in IE 10-. + */ + +[hidden] { + display: none; +} diff --git a/src/@fuse/scss/partials/_page-layouts.scss b/src/@fuse/scss/partials/_page-layouts.scss new file mode 100644 index 0000000..830cda3 --- /dev/null +++ b/src/@fuse/scss/partials/_page-layouts.scss @@ -0,0 +1,694 @@ +// ----------------------------------------------------------------------------------------------------- +// @ Theming +// ----------------------------------------------------------------------------------------------------- +@mixin page-layouts-theme($theme) { + + $background: map-get($theme, background); + $foreground: map-get($theme, foreground); + + .page-layout { + + // Carded layout + &.carded { + + // Fullwidth + &.fullwidth { + + > .center { + + > .content-card { + background: map-get($background, card); + border-radius: 8px 8px 0 0; + + > .toolbar { + border-bottom-color: map-get($foreground, divider); + } + } + } + } + + // Left / Right sidebar + &.left-sidebar, + &.right-sidebar { + + > .center { + + > .content-card { + background: map-get($background, card); + border-radius: 8px 8px 0 0; + + > .toolbar { + border-bottom-color: map-get($foreground, divider); + } + } + } + } + } + + // Simple layout + &.simple { + + // Left / Right sidebar + &.left-sidebar, + &.right-sidebar { + + > .center { + + > .content { + background: map-get($background, card); + } + } + + // Inner sidebar + &.inner-sidebar { + + > .content { + + > .center { + + > .content { + background: map-get($background, card); + } + } + } + } + } + } + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Page Layouts +// ----------------------------------------------------------------------------------------------------- +$carded-header-height: 200px !default; +$carded-toolbar-height: 64px !default; +$header-height: 120px !default; + +// Calculate toolbar-less carded header height +$carded-header-height-without-toolbar: $carded-header-height - $carded-toolbar-height; + +.page-layout { + position: relative; + overflow: hidden; + + // Carded layout + &.carded { + display: flex; + flex-direction: column; + flex: 1 0 auto; + width: 100%; + min-width: 100%; + + // Top bg + > .top-bg { + position: absolute; + z-index: 1; + top: 0; + right: 0; + left: 0; + height: $carded-header-height; + } + + // Fullwidth + &.fullwidth { + + // Center + > .center { + display: flex; + flex-direction: column; + flex: 1 0 auto; + position: relative; + z-index: 2; + padding: 0 32px; + width: 100%; + min-width: 0; + max-width: 100%; + height: 100%; + max-height: 100%; + + > .header { + height: $carded-header-height-without-toolbar !important; + min-height: $carded-header-height-without-toolbar !important; + max-height: $carded-header-height-without-toolbar !important; + } + + > .content-card { + display: flex; + flex-direction: column; + flex: 1 0 auto; + overflow: hidden; + @include mat-elevation(1); + + > .toolbar { + display: flex; + justify-content: flex-start; + align-items: center; + border-bottom: 1px solid; + height: $carded-toolbar-height; + min-height: $carded-toolbar-height; + max-height: $carded-toolbar-height; + } + + > .content { + flex: 1 0 auto; + } + } + } + + // Tabbed + &.tabbed { + + > .center { + width: 100%; + min-width: 0; + + > .header { + flex: 1 1 auto; + } + + > .content-card { + + > .content { + display: flex; + + > .mat-tab-group { + overflow: hidden; + width: 100%; + + .mat-tab-header { + + .mat-tab-label { + height: 64px; + } + } + + .mat-tab-body { + overflow: hidden; + + .mat-tab-body-content { + overflow: hidden; + + .tab-content { + position: relative; + width: 100%; + height: 100%; + } + } + } + } + } + } + } + } + + // Inner scroll + &.inner-scroll { + flex: 1 1 auto; + + > .center { + flex: 1 1 auto; + + > .content-card { + flex: 1 1 auto; + + > .content { + flex: 1 1 auto; + overflow: auto; + -webkit-overflow-scrolling: touch; + } + } + } + + // Tabbed + &.tabbed { + + > .center { + + > .content-card { + + > .content { + + > .mat-tab-group { + + .mat-tab-body { + + .mat-tab-body-content { + + .tab-content { + overflow: auto; + -webkit-overflow-scrolling: touch; + } + } + } + } + } + } + } + } + } + } + + // Left / Right sidebar + &.left-sidebar, + &.right-sidebar { + flex-direction: row; + + // Sidebar + > .sidebar { + display: flex; + flex-direction: column; + flex: 1 1 auto; + width: 240px; + min-width: 240px; + max-width: 240px; + height: auto; + overflow: hidden; + @include mat-elevation(7); + + &.locked-open { + background: none; + box-shadow: none; + + + .center { + z-index: 1001; + } + + &.left-positioned { + + + .center { + margin-left: 0; + } + } + + &.right-positioned { + + + .center { + margin-right: 0; + } + } + } + + .header { + height: $carded-header-height; + min-height: $carded-header-height; + max-height: $carded-header-height; + } + + .content { + background: transparent; + flex: 1 1 auto; + } + } + + // Center + > .center { + display: flex; + flex-direction: column; + flex: 1 1 auto; + position: relative; + z-index: 3; + margin-left: 32px; + margin-right: 32px; + width: 100%; + min-width: 0; + + > .header { + display: flex; + height: $carded-header-height-without-toolbar; + min-height: $carded-header-height-without-toolbar; + max-height: $carded-header-height-without-toolbar; + } + + > .content-card { + display: flex; + flex-direction: column; + flex: 1 1 auto; + overflow: hidden; + @include mat-elevation(1); + + > .toolbar { + display: flex; + justify-content: flex-start; + align-items: center; + flex: 1 1 auto; + border-bottom: 1px solid; + height: $carded-toolbar-height; + min-height: $carded-toolbar-height; + max-height: $carded-toolbar-height; + + .sidebar-toggle { + margin: 0 8px 0 0 !important; + padding: 0 !important; + border-radius: 0; + } + } + + > .content { + flex: 1 1 auto; + } + } + } + + // Tabbed + &.tabbed { + + > .center { + width: calc(100% - 32px); + min-width: 0; + + @include media-breakpoint('lt-lg') { + width: calc(100% - 64px); + } + + > .header { + flex: 1 1 auto; + } + + > .content-card { + + > .content { + display: flex; + + > .mat-tab-group { + overflow: hidden; + + .mat-tab-header { + + .mat-tab-label { + height: 64px; + } + } + + .mat-tab-body { + overflow: hidden; + + .mat-tab-body-content { + overflow: hidden; + + .tab-content { + position: relative; + width: 100%; + height: 100%; + } + } + } + } + } + } + } + } + + // Inner scroll + &.inner-scroll { + flex: 1 1 auto; + + > .sidebar { + + .content { + overflow: auto; + -webkit-overflow-scrolling: touch; + } + } + + > .center { + flex: 1 1 auto; + + > .content-card { + flex: 1 1 auto; + + > .content { + flex: 1 1 auto; + overflow: auto; + -webkit-overflow-scrolling: touch; + } + } + } + + // Tabbed + &.tabbed { + + > .center { + + > .content-card { + + > .content { + + > .mat-tab-group { + + .mat-tab-body { + + .mat-tab-body-content { + + .tab-content { + overflow: auto; + -webkit-overflow-scrolling: touch; + } + } + } + } + } + } + } + } + } + } + + // Right sidebar specific + &.right-sidebar { + + > .sidebar { + order: 2; + } + + > .center { + order: 1; + } + } + } + + // Simple layout + &.simple { + display: flex; + flex-direction: column; + flex: 1 0 auto; + width: 100%; + min-width: 100%; + + // Fullwidth + &.fullwidth { + + > .content { + flex: 1 1 auto; + min-width: 0; + } + } + + &.fullwidth, + &.inner-sidebar { + + > .header { + height: $header-height; + min-height: $header-height; + max-height: $header-height; + } + } + + // Left / Right sidebar + &.left-sidebar, + &.right-sidebar { + flex-direction: row; + + // Sidebar + > .sidebar { + width: 240px; + min-width: 240px; + max-width: 240px; + overflow: hidden; + @include mat-elevation(7); + + &.locked-open { + background: none; + box-shadow: none; + + + .center { + z-index: 1001; + } + + &.left-positioned { + + + .center { + margin-left: 0; + } + } + + &.right-positioned { + + + .center { + margin-right: 0; + } + } + } + + .content { + flex: 1 1 auto; + } + } + + // Center + > .center { + position: relative; + display: flex; + flex-direction: column; + flex: 1 1 auto; + z-index: 3; + min-width: 0; + width: 100%; + @include mat-elevation(1); + + > .header { + height: $header-height; + min-height: $header-height; + max-height: $header-height; + } + + > .content { + flex: 1 0 auto; + } + } + + // Inner scroll + &.inner-scroll { + flex: 1 1 auto; + + > .sidebar { + + .content { + overflow: auto; + -webkit-overflow-scrolling: touch; + } + } + + > .center { + flex: 1 1 auto; + overflow: auto; + -webkit-overflow-scrolling: touch; + } + } + + // Inner sidebar + &.inner-sidebar { + flex-direction: column; + overflow: hidden; + height: 100%; + + > .content { + display: flex; + min-height: 0; + + > .sidebar { + + &.locked-open { + background: none; + box-shadow: none; + } + + .content { + overflow: auto; + -webkit-overflow-scrolling: touch; + } + } + + > .center { + flex: 1 1 auto; + overflow: auto; + -webkit-overflow-scrolling: touch; + + > .content { + border-radius: 8px; + @include mat-elevation(1); + } + } + } + } + } + + // Right sidebar specific + &.right-sidebar { + + > .sidebar { + order: 2; + } + + > .center { + order: 1; + } + + // Inner sidebar + &.inner-sidebar { + + > .content { + + > .sidebar { + order: 2; + } + + > .center { + order: 1; + } + } + } + } + + // Tabbed + &.tabbed { + min-height: 100%; + + > .header { + height: $header-height; + min-height: $header-height; + max-height: $header-height; + } + + > .content { + + > .mat-tab-group { + + .mat-tab-labels { + padding: 0 24px; + } + } + } + } + } + + // Blank layout + &.blank { + width: 100%; + min-height: 100%; + } + + @include media-breakpoint('xs') { + + // Smaller margins + &.carded { + + &.fullwidth { + + > .center { + padding: 0 16px; + } + } + + &.left-sidebar, + &.right-sidebar { + + > .center { + margin: 0 16px; + } + } + } + // End - Smaller margins + } +} + + diff --git a/src/@fuse/scss/partials/_print.scss b/src/@fuse/scss/partials/_print.scss new file mode 100644 index 0000000..c221109 --- /dev/null +++ b/src/@fuse/scss/partials/_print.scss @@ -0,0 +1,69 @@ +/*----------------------------------------------------------------*/ +/* Print +/*----------------------------------------------------------------*/ + +@media all { + /* Never show page breaks in normal view */ + .page-break-after, + .page-break-before { + display: none; + } +} + +@media print { + /* html and body tweaks */ + html, + body { + height: auto !important; + overflow: initial !important; + } + + /* Page breaks */ + .page-break-after { + display: block; + page-break-after: always; + position: relative; + } + + .page-break-before { + display: block; + page-break-before: always; + position: relative; + } + + /* General styles */ + app { + fuse-sidebar, + navbar, + toolbar, + footer, + .theme-options-button, + fuse-theme-options, + .ps > .ps__rail-x, + .ps > .ps__rail-y { + display: none !important; + } + + #main, + #container-1, + #container-2, + #container-3 { + padding: 0 !important; + } + + .ps { + overflow: visible !important; + } + + .mat-drawer-container, + .mat-sidenav-container { + background-color: white !important; + + .mat-drawer-content, + .mat-sidenav-content { + overflow: initial !important; + height: auto !important; + } + } + } +} diff --git a/src/@fuse/scss/partials/_scrollbars.scss b/src/@fuse/scss/partials/_scrollbars.scss new file mode 100644 index 0000000..cf00022 --- /dev/null +++ b/src/@fuse/scss/partials/_scrollbars.scss @@ -0,0 +1,22 @@ +body:not(.is-mobile) { + ::-webkit-scrollbar { + width: 12px; + height: 12px; + background-color: rgba(0, 0, 0, 0); + } + + ::-webkit-scrollbar:hover { + background-color: rgba(0, 0, 0, 0.12); + } + + ::-webkit-scrollbar-thumb { + border: 2px solid transparent; + box-shadow: inset 0 0 0 12px rgba(0, 0, 0, 0.37); + border-radius: 12px; + } + + ::-webkit-scrollbar-thumb:active { + box-shadow: inset 0 0 0 12px rgba(0, 0, 0, 0.54); + border-radius: 12px; + } +} diff --git a/src/@fuse/scss/partials/_typography.scss b/src/@fuse/scss/partials/_typography.scss new file mode 100644 index 0000000..bbae69f --- /dev/null +++ b/src/@fuse/scss/partials/_typography.scss @@ -0,0 +1,440 @@ +// ----------------------------------------------------------------------------------------------------- +// @ Theming +// ----------------------------------------------------------------------------------------------------- +@mixin typography-theme($theme) { + $background: map-get($theme, background); + $accent: map-get($theme, accent); + $is-dark: map-get($theme, is-dark); + + a { + color: map-get($accent, default); + } + + code { + &:not(.highlight) { + background-color: map-get($background, app-bar); + } + } + + .changelog { + .entry { + background-color: map-get($background, card); + } + } + + .text-boxed { + @if ($is-dark) { + background-color: rgba(255, 255, 255, 0.12); + color: rgba(255, 255, 255, 0.54); + } @else { + background-color: rgba(0, 0, 0, 0.12); + color: rgba(0, 0, 0, 0.54); + } + } +} + +// ----------------------------------------------------------------------------------------------------- +// @ Typography +// ----------------------------------------------------------------------------------------------------- +html { + font-size: 62.5%; + font-family: 'Muli', 'Helvetica Neue', 'Arial', sans-serif; + line-height: 1.4 !important; + letter-spacing: -0.1px !important; +} + +body { + font-size: 14px; +} + +html, +body { + -webkit-font-smoothing: auto; + -moz-osx-font-smoothing: auto; +} + +// Headings +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-weight: normal; +} + +h1, +.h1 { + font-size: 24px; +} + +h2, +.h2 { + font-size: 20px; +} + +h3, +.h3 { + font-size: 16px; +} + +h4, +.h4 { + font-size: 15px; +} + +h5, +.h5 { + font-size: 13px; +} + +h6, +.h6 { + font-size: 12px; +} + +// Links +a { + text-decoration: none; + + &:not(.mat-button):not(.mat-raised-button):not(.mat-flat-button):not(.mat-stroked-button):not(.mat-icon-button):not(.mat-fab):not(.mat-mini-fab) { + &:hover, + &:active { + text-decoration: underline; + } + } +} + +// Abbr +abbr { + cursor: help; + border-bottom: 1px dotted rgba(0, 0, 0, 0.54); +} + +// Blockquote +blockquote { + border-left: 3px solid rgba(0, 0, 0, 0.12); + font-style: italic; + margin: 1em 0; + padding-left: 16px; + + footer { + font-style: normal; + + &:before { + content: '\2014 \00A0'; + } + } + + &.reverse { + border-left: none; + border-right: 3px solid rgba(0, 0, 0, 0.12); + text-align: right; + padding-left: 0; + padding-right: 16px; + + footer { + &:before { + content: ''; + } + + &:after { + content: '\2014 \00A0'; + } + } + } +} + +// Code +code { + font-family: 'Monaco', 'Menlo', 'Consolas', 'Ubuntu Mono', monospace; + + &:not(.highlight) { + color: #106cc8; + padding: 2px 3px; + border-radius: 2px; + line-height: 1.7; + } +} + +// Definition lists +dl { + dt { + font-weight: bold; + } + + dd { + margin: 4px 0 16px 0; + } +} + +// Mark +mark { + background: #f7f49a; +} + +// Pre +pre { + line-height: 1.6; + margin: 8px 16px; + white-space: pre-wrap; +} + +// Small +small { + font-size: 80%; +} + +// Table +table { + thead { + tr { + th { + text-align: left; + } + } + } +} + +// Text format helpers +.text-italic { + font-style: italic; +} + +.text-semibold { + font-weight: 600; +} + +.text-bold, +strong { + font-weight: 700; +} + +.text-strike { + text-decoration: line-through; +} + +.text-super { + vertical-align: super; +} + +.text-sub { + vertical-align: sub; +} + +.text-capitalize { + text-transform: capitalize; +} + +.text-lowercase { + text-transform: lowercase; +} + +.text-uppercase { + text-transform: uppercase; +} + +// Text align helpers +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +// Font weight helpers +@for $weight from 1 through 9 { + .font-weight-#{$weight * 100} { + font-weight: #{$weight * 100}; + } +} + +// Font size helpers +@for $size from 1 through 60 { + .font-size-#{$size * 2} { + font-size: #{$size * 2}px; + } +} + +// Line height helpers +@for $lineHeight from 1 through 60 { + .line-height-#{$lineHeight * 2} { + line-height: #{$lineHeight * 2}px; + } +} + +.line-height-1 { + line-height: 1; +} + +.line-height-1\.25 { + line-height: 1.25; +} + +.line-height-1\.5, +.line-height-1\.50 { + line-height: 1.5; +} + +.line-height-1\.75 { + line-height: 1.75; +} + +// Letter spacing helpers +.letter-spacing-condensed { + letter-spacing: -0.02em; +} + +.letter-spacing-normal { + letter-spacing: normal; +} + +.letter-spacing-relaxed { + letter-spacing: 0.02em; +} + +// Boxed text +.text-boxed { + border-radius: 2px; + padding: 4px 8px; + margin: 0 8px; + font-size: 11px; + font-weight: 600; + white-space: nowrap; +} + +// Truncate +.text-truncate { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +// Nowrap +.text-nowrap { + white-space: nowrap; +} + +// Changelog +.changelog { + .entry { + margin-bottom: 24px; + padding: 24px 32px; + @include mat-elevation(2); + + > .title { + display: flex; + align-items: center; + margin-bottom: 24px; + + .version { + font-size: 24px; + } + + .date { + margin-left: 8px; + font-size: 17px; + opacity: 0.54; + } + } + + .groups { + div { + margin-bottom: 32px; + + &:last-child { + margin-bottom: 0; + } + } + + .title { + display: inline-flex; + font-size: 13px; + color: white; + letter-spacing: 0.015em; + line-height: 1; + padding: 5px 8px; + border-radius: 2px; + } + + .breaking-changes { + .title { + background: #f44336; + } + } + + .new { + .title { + background: #43a047; + } + } + + .improved { + .title { + background: #673ab7; + } + } + + .fixed { + .title { + background: #2196f3; + } + } + + ul { + padding-left: 24px; + + li { + margin-bottom: 6px; + letter-spacing: 0.015em; + + ul { + margin-top: 6px; + } + } + } + } + } +} + +// Message boxes +.message-box { + padding: 16px; + background: #607d8b; + border-left: 6px solid #37474f; + color: rgba(255, 255, 255, 1); + + &.error { + background: #ef5350; + border-left-color: #b71c1c; + } + + &.warning { + background: #ffecb3; + border-left-color: #ffc107; + color: rgba(0, 0, 0, 0.87); + } + + &.success { + background: #4caf50; + border-left-color: #2e7d32; + } + + &.info { + background: #b3e5fc; + border-left-color: #03a9f4; + color: rgba(0, 0, 0, 0.87); + } +} diff --git a/src/@fuse/scss/partials/plugins/_ngx-color-picker.scss b/src/@fuse/scss/partials/plugins/_ngx-color-picker.scss new file mode 100644 index 0000000..f90b83d --- /dev/null +++ b/src/@fuse/scss/partials/plugins/_ngx-color-picker.scss @@ -0,0 +1,36 @@ +@import 'src/@fuse/scss/fuse'; + +.color-picker { + height: auto !important; + border: none !important; + + @include mat-elevation(4); + + .preset-area { + padding: 0 0 16px 16px !important; + height: 140px; + overflow-y: auto; + overflow-x: hidden; + -webkit-overflow-scrolling: touch; + + > hr { + display: none; + } + + .preset-label { + display: none; + } + + .preset-color { + display: block !important; + float: left !important; + margin: 0 !important; + border: none !important; + border-radius: 0 !important; + + &:nth-child(14n + 1) { + clear: both; + } + } + } +} diff --git a/src/@fuse/scss/partials/plugins/_ngx-datatable.scss b/src/@fuse/scss/partials/plugins/_ngx-datatable.scss new file mode 100644 index 0000000..bad247e --- /dev/null +++ b/src/@fuse/scss/partials/plugins/_ngx-datatable.scss @@ -0,0 +1,255 @@ +// ----------------------------------------------------------------------------------------------------- +// @ Theming +// ----------------------------------------------------------------------------------------------------- +@mixin ngx-datatable-theme($theme) { + $background: map-get($theme, background); + $foreground: map-get($theme, foreground); + + ngx-datatable { + &.material { + background: map-get($background, card); + color: map-get($foreground, text); + + .datatable-header { + .datatable-header-cell { + color: map-get($foreground, secondary-text); + } + } + + .datatable-body { + .datatable-row-wrapper { + border-bottom-color: map-get($foreground, divider); + + &:first-child { + border-top-color: map-get($foreground, divider); + } + + .datatable-body-row { + .datatable-body-cell { + color: map-get($foreground, text); + } + } + } + } + + .datatable-footer { + color: map-get($foreground, secondary-text); + + .datatable-pager { + a { + color: map-get($foreground, secondary-text); + } + } + } + + &:not(.cell-selection) { + .datatable-body { + .datatable-row-wrapper { + .datatable-body-row { + &:hover { + background-color: map-get($background, hover); + + .datatable-row-group { + background-color: map-get($background, hover); + } + } + } + } + } + } + } + } +} + +.ngx-datatable { + &.material { + @include mat-elevation(4); + + .empty-row { + display: flex; + align-items: center; + line-height: 1; + height: 56px; + padding: 0 24px; + } + + .datatable-header { + border: none; + min-height: 48px; + + .datatable-header-cell { + display: inline-flex; + align-items: center; + line-height: 1; + min-height: 48px; + font-size: 13px; + padding: 0 24px; + + .datatable-header-cell-template-wrap { + display: inline-flex; + align-items: center; + } + } + } + + .datatable-body { + display: flex; + flex: 1 0 auto; + + .datatable-scroll { + display: flex; + flex-direction: column; + width: 100% !important; + } + + .datatable-row-left, + .datatable-row-center, + .datatable-row-right { + min-height: 48px; + } + + .datatable-row-wrapper { + border-bottom: 1px solid; + + &:first-child { + border-top: 1px solid; + } + .datatable-body-cell { + display: inline-flex; + align-items: center; + line-height: 1; + min-height: 48px; + transition: none; + padding: 0 24px; + overflow: hidden; + } + } + } + + .datatable-footer { + border: none; + min-height: 56px; + + .datatable-footer-inner { + padding: 0 24px; + + @include media-breakpoint('lt-md') { + flex-direction: column; + padding: 16px 0; + height: auto !important; + + .datatable-pager { + margin: 0 !important; + } + } + + .page-count { + padding: 0; + } + + .datatable-pager { + margin: 0 0 0 24px; + + .pager { + li { + a { + display: flex; + align-items: center; + justify-content: center; + text-decoration: none !important; + + i { + width: 20px; + min-width: 20px; + height: 20px; + min-height: 20px; + padding: 0; + } + } + } + } + } + } + } + } +} + +[class*='datatable-icon-'] { + font-family: 'material-outline-icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -webkit-font-feature-settings: 'liga'; + -webkit-font-smoothing: antialiased; +} + +.datatable-icon-filter:before { + content: 'filter_list'; +} + +.datatable-icon-collapse:before { + content: 'unfold_less'; +} + +.datatable-icon-expand:before { + content: 'unfold_more'; +} + +.datatable-icon-close:before { + content: 'close'; +} + +.datatable-icon-up:before { + content: 'arrow_drop_up'; +} + +.datatable-icon-down:before { + content: 'arrow_drop_down'; +} + +.datatable-icon-sort:before { + content: 'sort'; +} + +.datatable-icon-done:before { + content: 'done'; +} + +.datatable-icon-done-all:before { + content: 'done_all'; +} + +.datatable-icon-search:before { + content: 'search'; +} + +.datatable-icon-pin:before { + content: 'lock'; +} + +.datatable-icon-add:before { + content: 'add'; +} + +.datatable-icon-left:before { + content: 'chevron_left'; +} + +.datatable-icon-right:before { + content: 'chevron_right'; +} + +.datatable-icon-skip:before { + content: 'skip_next'; +} + +.datatable-icon-prev:before { + content: 'skip_previous'; +} diff --git a/src/@fuse/scss/partials/plugins/_perfect-scrollbar.scss b/src/@fuse/scss/partials/plugins/_perfect-scrollbar.scss new file mode 100644 index 0000000..788049f --- /dev/null +++ b/src/@fuse/scss/partials/plugins/_perfect-scrollbar.scss @@ -0,0 +1,12 @@ +.ps { + position: relative; + + > .ps__rail-x { + z-index: 99999; + } + + > .ps__rail-y { + z-index: 99999; + left: auto !important; + } +} diff --git a/src/@fuse/scss/partials/plugins/_plugins.scss b/src/@fuse/scss/partials/plugins/_plugins.scss new file mode 100644 index 0000000..d15445d --- /dev/null +++ b/src/@fuse/scss/partials/plugins/_plugins.scss @@ -0,0 +1,4 @@ +@import 'prism'; +@import 'perfect-scrollbar'; +@import 'ngx-datatable'; +@import 'ngx-color-picker'; diff --git a/src/@fuse/scss/partials/plugins/_prism.scss b/src/@fuse/scss/partials/plugins/_prism.scss new file mode 100644 index 0000000..016cf86 --- /dev/null +++ b/src/@fuse/scss/partials/plugins/_prism.scss @@ -0,0 +1,272 @@ +// Edit the sixteen color-value variables, and create your own syntax highlighter colorscheme + +$base00: #263238; +$base01: #2c393f; +$base02: #62727a; +$base03: #707880; +$base04: #c9ccd3; +$base05: #cdd3de; +$base06: #d5dbe5; +$base07: #ffffff; +$base08: #ec5f67; +$base09: #ea9560; +$base0A: #ffcc00; +$base0B: #8bd649; +$base0C: #80cbc4; +$base0D: #89ddff; +$base0E: #82aaff; +$base0F: #ec5f67; + +$red: $base08; +$orange: $base09; +$yellow: $base0A; +$green: $base0B; +$cyan: $base0C; +$blue: $base0D; +$violet: $base0E; +$magenta: $base0F; + +$code-font-family: Consolas, Menlo, Monaco, 'Andale Mono WT', 'Andale Mono', + 'Lucida Console', 'Lucida Sans Typewriter', 'DejaVu Sans Mono', + 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Nimbus Mono L', 'Courier New', + Courier, monospace; +$code-font-size: 14px; +$code-line-height: 1.6; +$code-background: $base00; +$code-color: $base05; +$code-color-fade: $base05; +// $code-text-shadow: none; +$code-color-comment: $base02; +$code-color-keyword: $base0B; +$code-color-value: $base0C; +$code-color-attr-name: $base09; +$code-color-string: $base0C; +$code-color-name: $base0A; +$code-color-number: $base09; +$code-color-variable: $base0D; +$code-color-selector: $base0E; +$code-color-property: $base0A; +$code-color-important: $base08; +$code-color-tag: $base0D; +$code-color-atrule: $base0C; + +// @import "../partials/prism"; +/** + * Prism base code highlighter theme using Sass + * + * @author @MoOx + * https://github.com/MoOx/sass-prism-theme-base/blob/master/_prism.scss + * slightly adapted by me, Bram de Haan + */ + +// prism selector +$code-selector: 'code[class*="language-"], pre[class*="language-"]'; +$code-selector-block: 'pre[class*="language-"]'; +$code-selector-inline: ':not(pre) > code[class*="language-"]'; + +// generic stuff +$code-font-family: Menlo, Monaco, 'Courier New', monospace !default; +$code-font-size: 14px !default; +$code-line-height: 1.6 !default; + +$code-tab-size: 4 !default; +$code-hyphens: none !default; + +$code-block-padding: 12px !default; +$code-inline-padding: 2px 6px !default; +$code-border-radius: 0 !default; + +$code-border: none !default; +$code-background: #2a2a2a !default; +$code-color: #fff !default; +$code-color-fade: #bebec5 !default; +// $code-text-shadow: 0 1px 0 #000 !default; +$code-box-shadow: none !default; +$code-color-property: #b58900 !default; +$code-color-important: #cb4b16 !default; +$code-color-tag: #268bd2 !default; +$code-color-atrule: #2aa198 !default; +$code-color-attr-name: #b65611 !default; + +// $code-linenums-padding: 7px !default; +// $code-linenums-width: 40px !default; +// $code-linenums-background: #444 !default; +// $code-linenums-border-color: #555 !default; +// $code-linenums-border-width: 1px !default; + +@if $code-selector != null { + #{$code-selector} { + -moz-tab-size: $code-tab-size; + -o-tab-size: $code-tab-size; + tab-size: $code-tab-size; + + -webkit-hyphens: $code-hyphens; + -moz-hyphens: $code-hyphens; + -ms-hyphens: $code-hyphens; + hyphens: $code-hyphens; + + // whitespace management + white-space: pre; // fallback + //white-space: pre-wrap; + //word-break: break-all; + //word-wrap: break-word; + + font-family: $code-font-family; + font-size: $code-font-size; + line-height: $code-line-height; + + color: $code-color; + // text-shadow: $code-text-shadow; + background: $code-background; + } +} + +%code-background { + border-radius: $code-border-radius; + border: $code-border; + box-shadow: $code-box-shadow; +} + +@if $code-selector-block != null { + #{$code-selector-block} { + @extend %code-background; + padding: $code-block-padding; + } +} + +@if $code-selector-inline != null { + #{$code-selector-inline} { + @extend %code-background; + padding: $code-inline-padding; + } +} + +// pre[class*="language-"], +// :not(pre) > code[class*="language-"] { +// background: $code-background; +// } + +// prism tokens +// +$code-color-comment: null !default; +$code-color-keyword: null !default; +$code-color-value: null !default; +$code-color-string: null !default; +$code-color-name: null !default; +$code-color-number: null !default; +$code-color-variable: null !default; +$code-color-selector: null !default; +$code-color-punctuation: $code-color-fade !default; + +#{$code-selector} { + .namespace { + opacity: 0.7; + } + + .token { + &.comment, + &.prolog, + &.doctype, + &.cdata { + color: $code-color-comment; + } + + &.null, + &.operator, + &.boolean, + &.number { + color: $code-color-number; + } + + &.string { + color: $code-color-string; + } + &.attr-name { + color: $code-color-attr-name; + } + + &.entity, + &.url, + .language-css &.string, + .style &.string { + color: $code-color-string; + } + + &.selector { + color: $code-color-selector; + } + + &.attr-value, + &.keyword, + &.control, + &.directive, + &.unit { + color: $code-color-keyword; + } + &.important { + color: $code-color-important; + } + &.atrule { + color: $code-color-atrule; + } + + &.regex, + &.statement { + color: $code-color-value; + } + + &.placeholder, + &.variable { + color: $code-color-variable; + } + + &.property, + &.tag { + // font-style: italic; + } + + &.property { + color: $code-color-property; + } + &.tag { + color: $code-color-tag; + } + + &.important, + &.statement { + font-weight: bold; + } + + // todo ? + // &.mixin + // &.gradient + // &.abslength + // &.easing + // &.time + // &.angle + // &.fontfamily + + // ruby/vim https://github.com/LeaVerou/prism/pull/18 + // &.inst-var + // &.builtin + // &.const + // &.symbol + // + // php https://github.com/LeaVerou/prism/pull/20 + // &.deliminator + // &.function + + &.punctuation { + color: $code-color-punctuation; + } + + &.entity { + cursor: help; + } + + // for dev :) + &.debug { + color: red; + } + } +} diff --git a/src/@fuse/scss/theme.scss b/src/@fuse/scss/theme.scss new file mode 100644 index 0000000..bc51a24 --- /dev/null +++ b/src/@fuse/scss/theme.scss @@ -0,0 +1,28 @@ +@import 'src/@fuse/components/countdown/countdown.theme'; +@import 'src/@fuse/components/material-color-picker/material-color-picker.theme'; +@import 'src/@fuse/components/search-bar/search-bar.theme'; +@import 'src/@fuse/components/shortcuts/shortcuts.theme'; +@import 'src/@fuse/components/sidebar/sidebar.theme'; +@import 'src/@fuse/components/theme-options/theme-options.theme'; +@import 'src/@fuse/components/widget/widget.theme'; + +@mixin fuse-core-theme($theme) { + // Theming for Fuse core styles + @include colors-theme($theme); + @include cards-theme($theme); + @include material-theme($theme); + @include page-layouts-theme($theme); + @include typography-theme($theme); + + // Theming for Fuse components + @include fuse-countdown-theme($theme); + @include fuse-search-bar-theme($theme); + @include fuse-shortcuts-theme($theme); + @include fuse-sidebar-theme($theme); + @include fuse-theme-options-theme($theme); + @include fuse-material-color-picker-theme($theme); + @include fuse-widget-theme($theme); + + // Theming for 3rd party components + @include ngx-datatable-theme($theme); +} diff --git a/src/@fuse/services/config.service.ts b/src/@fuse/services/config.service.ts new file mode 100644 index 0000000..80e0235 --- /dev/null +++ b/src/@fuse/services/config.service.ts @@ -0,0 +1,153 @@ +import { Inject, Injectable, InjectionToken } from '@angular/core'; +import { ResolveEnd, Router } from '@angular/router'; +import { Platform } from '@angular/cdk/platform'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { filter } from 'rxjs/operators'; +import * as _ from 'lodash'; +import { FuseConfig } from '../types'; + +// Create the injection token for the custom settings +export const FUSE_CONFIG = new InjectionToken('fuseCustomConfig'); + +@Injectable({ + providedIn: 'root' +}) +export class FuseConfigService { + // Private + private _configSubject: BehaviorSubject; + private readonly _defaultConfig: any; + + /** + * Constructor + * + * @param {Platform} _platform + * @param {Router} _router + * @param _config + */ + constructor( + private _platform: Platform, + private _router: Router, + @Inject(FUSE_CONFIG) private _config: FuseConfig + ) { + // Set the default config from the user provided config (from forRoot) + this._defaultConfig = _config; + + // Initialize the service + this._init(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Set and get the config + */ + set config(value) { + // Get the value from the behavior subject + let config = this._configSubject.getValue(); + + // Merge the new config + config = _.merge({}, config, value); + + // Notify the observers + this._configSubject.next(config); + } + + get config(): any | Observable { + return this._configSubject.asObservable(); + } + + /** + * Get default config + * + * @returns {any} + */ + get defaultConfig(): any { + return this._defaultConfig; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Initialize + * + * @private + */ + private _init(): void { + /** + * Disable custom scrollbars if browser is mobile + */ + if (this._platform.ANDROID || this._platform.IOS) { + this._defaultConfig.customScrollbars = false; + } + + // Set the config from the default config + this._configSubject = new BehaviorSubject(_.cloneDeep(this._defaultConfig)); + + // Reload the default layout config on every RoutesRecognized event + // if the current layout config is different from the default one + this._router.events + .pipe(filter(event => event instanceof ResolveEnd)) + .subscribe(() => { + if ( + !_.isEqual( + this._configSubject.getValue().layout, + this._defaultConfig.layout + ) + ) { + // Clone the current config + const config = _.cloneDeep(this._configSubject.getValue()); + + // Reset the layout from the default config + config.layout = _.cloneDeep(this._defaultConfig.layout); + + // Set the config + this._configSubject.next(config); + } + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Set config + * + * @param value + * @param {{emitEvent: boolean}} opts + */ + setConfig(value, opts = { emitEvent: true }): void { + // Get the value from the behavior subject + let config = this._configSubject.getValue(); + + // Merge the new config + config = _.merge({}, config, value); + + // If emitEvent option is true... + if (opts.emitEvent === true) { + // Notify the observers + this._configSubject.next(config); + } + } + + /** + * Get config + * + * @returns {Observable} + */ + getConfig(): Observable { + return this._configSubject.asObservable(); + } + + /** + * Reset to the default config + */ + resetToDefaults(): void { + // Set the config from the default config + this._configSubject.next(_.cloneDeep(this._defaultConfig)); + } +} diff --git a/src/@fuse/services/copier.service.ts b/src/@fuse/services/copier.service.ts new file mode 100644 index 0000000..fbcd34d --- /dev/null +++ b/src/@fuse/services/copier.service.ts @@ -0,0 +1,71 @@ +/** + * 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({ + providedIn: 'root' +}) +export class FuseCopierService { + private textarea: HTMLTextAreaElement; + + /** + * Copy the text value to the clipboard + * + * @param {string} text + * @returns {boolean} + */ + 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. + * + * @param {string} text + */ + private createTextareaAndSelect(text: string): void { + // 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 + */ + private _removeFake(): void { + if (this.textarea) { + document.body.removeChild(this.textarea); + this.textarea = null; + } + } +} diff --git a/src/@fuse/services/match-media.service.ts b/src/@fuse/services/match-media.service.ts new file mode 100644 index 0000000..2e466a9 --- /dev/null +++ b/src/@fuse/services/match-media.service.ts @@ -0,0 +1,48 @@ +import { MediaChange, MediaObserver } from '@angular/flex-layout'; +import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs'; +import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class FuseMatchMediaService { + activeMediaQuery: string; + onMediaChange: BehaviorSubject = new BehaviorSubject(''); + + /** + * Constructor + * + * @param {MediaObserver} _mediaObserver + */ + constructor(private _mediaObserver: MediaObserver) { + // Set the defaults + this.activeMediaQuery = ''; + + // Initialize + this._init(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Initialize + * + * @private + */ + private _init(): void { + this._mediaObserver.media$ + .pipe( + debounceTime(500), + distinctUntilChanged() + ) + .subscribe((change: MediaChange) => { + if (this.activeMediaQuery !== change.mqAlias) { + this.activeMediaQuery = change.mqAlias; + this.onMediaChange.next(change.mqAlias); + } + }); + } +} diff --git a/src/@fuse/services/splash-screen.service.ts b/src/@fuse/services/splash-screen.service.ts new file mode 100644 index 0000000..1f0ccb9 --- /dev/null +++ b/src/@fuse/services/splash-screen.service.ts @@ -0,0 +1,111 @@ +import { Inject, Injectable } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { + animate, + AnimationBuilder, + AnimationPlayer, + style +} from '@angular/animations'; +import { NavigationEnd, Router } from '@angular/router'; + +import { filter, take } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class FuseSplashScreenService { + splashScreenEl: any; + player: AnimationPlayer; + + /** + * Constructor + * + * @param {AnimationBuilder} _animationBuilder + * @param _document + * @param {Router} _router + */ + constructor( + private _animationBuilder: AnimationBuilder, + @Inject(DOCUMENT) private _document: any, + private _router: Router + ) { + // Initialize + this._init(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Initialize + * + * @private + */ + private _init(): void { + // Get the splash screen element + this.splashScreenEl = this._document.body.querySelector( + '#fuse-splash-screen' + ); + + // If the splash screen element exists... + if (this.splashScreenEl) { + // Hide it on the first NavigationEnd event + this._router.events + .pipe( + filter(event => event instanceof NavigationEnd), + take(1) + ) + .subscribe(() => { + setTimeout(() => { + this.hide(); + }); + }); + } + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Show the splash screen + */ + show(): void { + this.player = this._animationBuilder + .build([ + style({ + opacity: '0', + zIndex: '99999' + }), + animate('400ms ease', style({ opacity: '1' })) + ]) + .create(this.splashScreenEl); + + setTimeout(() => { + this.player.play(); + }, 0); + } + + /** + * Hide the splash screen + */ + hide(): void { + this.player = this._animationBuilder + .build([ + style({ opacity: '1' }), + animate( + '400ms ease', + style({ + opacity: '0', + zIndex: '-10' + }) + ) + ]) + .create(this.splashScreenEl); + + setTimeout(() => { + this.player.play(); + }, 0); + } +} diff --git a/src/@fuse/services/translation-loader.service.ts b/src/@fuse/services/translation-loader.service.ts new file mode 100644 index 0000000..9ce5fdf --- /dev/null +++ b/src/@fuse/services/translation-loader.service.ts @@ -0,0 +1,38 @@ +import { Injectable } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; + +export interface Locale { + lang: string; + data: Object; +} + +@Injectable({ + providedIn: 'root' +}) +export class FuseTranslationLoaderService { + /** + * Constructor + * + * @param {TranslateService} _translateService + */ + constructor(private _translateService: TranslateService) {} + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Load translations + * + * @param {Locale} args + */ + loadTranslations(...args: Locale[]): void { + const locales = [...args]; + + locales.forEach(locale => { + // use setTranslation() with the third argument set to true + // to append translations instead of replacing them + this._translateService.setTranslation(locale.lang, locale.data, true); + }); + } +} diff --git a/src/@fuse/shared.module.ts b/src/@fuse/shared.module.ts new file mode 100644 index 0000000..92ac242 --- /dev/null +++ b/src/@fuse/shared.module.ts @@ -0,0 +1,32 @@ +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { CommonModule } from '@angular/common'; + +import { FlexLayoutModule } from '@angular/flex-layout'; + +import { FuseDirectivesModule } from './directives/directives'; +import { FusePipesModule } from './pipes/pipes.module'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + + FlexLayoutModule, + + FuseDirectivesModule, + FusePipesModule + ], + exports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + + FlexLayoutModule, + + FuseDirectivesModule, + FusePipesModule + ] +}) +export class FuseSharedModule {} diff --git a/src/@fuse/types/fuse-config.ts b/src/@fuse/types/fuse-config.ts new file mode 100644 index 0000000..8ee0ec1 --- /dev/null +++ b/src/@fuse/types/fuse-config.ts @@ -0,0 +1,44 @@ +export interface FuseConfig { + colorTheme: string; + customScrollbars: boolean; + layout: { + style: string; + width: 'fullwidth' | 'boxed'; + navbar: { + primaryBackground: string; + secondaryBackground: string; + hidden: boolean; + folded: boolean; + position: 'left' | 'right' | 'top'; + variant: string; + }; + toolbar: { + customBackgroundColor: boolean; + background: string; + hidden: boolean; + position: + | 'above' + | 'above-static' + | 'above-fixed' + | 'below' + | 'below-static' + | 'below-fixed'; + }; + footer: { + customBackgroundColor: boolean; + background: string; + hidden: boolean; + position: + | 'above' + | 'above-static' + | 'above-fixed' + | 'below' + | 'below-static' + | 'below-fixed'; + }; + sidepanel: { + hidden: boolean; + position: 'left' | 'right'; + }; + }; +} diff --git a/src/@fuse/types/fuse-navigation.ts b/src/@fuse/types/fuse-navigation.ts new file mode 100644 index 0000000..d7a1705 --- /dev/null +++ b/src/@fuse/types/fuse-navigation.ts @@ -0,0 +1,25 @@ +export interface FuseNavigationItem { + id: string; + title: string; + type: 'item' | 'group' | 'collapsable'; + translate?: string; + icon?: string; + hidden?: boolean; + url?: string; + classes?: string; + exactMatch?: boolean; + externalUrl?: boolean; + openInNewTab?: boolean; + function?: () => void; + badge?: { + title?: string; + translate?: string; + bg?: string; + fg?: string; + }; + children?: FuseNavigationItem[]; +} + +export interface FuseNavigation extends FuseNavigationItem { + children?: FuseNavigationItem[]; +} diff --git a/src/@fuse/types/index.ts b/src/@fuse/types/index.ts new file mode 100644 index 0000000..50ed6d7 --- /dev/null +++ b/src/@fuse/types/index.ts @@ -0,0 +1,2 @@ +export * from './fuse-config'; +export * from './fuse-navigation'; diff --git a/src/@fuse/utils/index.ts b/src/@fuse/utils/index.ts new file mode 100644 index 0000000..0c16483 --- /dev/null +++ b/src/@fuse/utils/index.ts @@ -0,0 +1,133 @@ +export class FuseUtils { + /** + * Filter array by string + * + * @param mainArr + * @param searchText + * @returns {any} + */ + public static filterArrayByString(mainArr, searchText): any { + if (searchText === '') { + return mainArr; + } + + searchText = searchText.toLowerCase(); + + return mainArr.filter(itemObj => { + return this.searchInObj(itemObj, searchText); + }); + } + + /** + * Search in object + * + * @param itemObj + * @param searchText + * @returns {boolean} + */ + public static searchInObj(itemObj, searchText): boolean { + for (const prop in itemObj) { + if (!itemObj.hasOwnProperty(prop)) { + continue; + } + + const value = itemObj[prop]; + + if (typeof value === 'string') { + if (this.searchInString(value, searchText)) { + return true; + } + } else if (Array.isArray(value)) { + if (this.searchInArray(value, searchText)) { + return true; + } + } + + if (typeof value === 'object') { + if (this.searchInObj(value, searchText)) { + return true; + } + } + } + } + + /** + * Search in array + * + * @param arr + * @param searchText + * @returns {boolean} + */ + public static searchInArray(arr, searchText): boolean { + for (const value of arr) { + if (typeof value === 'string') { + if (this.searchInString(value, searchText)) { + return true; + } + } + + if (typeof value === 'object') { + if (this.searchInObj(value, searchText)) { + return true; + } + } + } + } + + /** + * Search in string + * + * @param value + * @param searchText + * @returns {any} + */ + public static searchInString(value, searchText): any { + return value.toLowerCase().includes(searchText); + } + + /** + * Generate a unique GUID + * + * @returns {string} + */ + public static generateGUID(): string { + function S4(): string { + return Math.floor((1 + Math.random()) * 0x10000) + .toString(16) + .substring(1); + } + + return S4() + S4(); + } + + /** + * Toggle in array + * + * @param item + * @param array + */ + public static toggleInArray(item, array): void { + if (array.indexOf(item) === -1) { + array.push(item); + } else { + array.splice(array.indexOf(item), 1); + } + } + + /** + * Handleize + * + * @param text + * @returns {string} + */ + public static handleize(text): string { + return text + .toString() + .toLowerCase() + .replace(/\s+/g, '-') // Replace spaces with - + .replace(/[^\w\-]+/g, '') // Remove all non-word chars + .replace(/\-\-+/g, '-') // Replace multiple - with single - + .replace(/^-+/, '') // Trim - from start of text + .replace(/-+$/, ''); // Trim - from end of text + } +} diff --git a/src/app/app-fuse-config.ts b/src/app/app-fuse-config.ts new file mode 100644 index 0000000..a992731 --- /dev/null +++ b/src/app/app-fuse-config.ts @@ -0,0 +1,43 @@ +import { FuseConfig } from 'src/@fuse/types'; + +/** + * Default Fuse Configuration + * + * You can edit these options to change the default options. All these options also can be + * changed per component basis. See `app/main/pages/authentication/login/login.component.ts` + * constructor method to learn more about changing these options per component basis. + */ + +export const appFuseConfig: FuseConfig = { + // Color themes can be defined in src/app/app.theme.scss + colorTheme: 'theme-default', + customScrollbars: true, + layout: { + style: 'vertical-layout-1', + width: 'fullwidth', + navbar: { + primaryBackground: 'fuse-navy-700', + secondaryBackground: 'fuse-navy-900', + folded: true, + hidden: false, + position: 'left', + variant: 'vertical-style-2' + }, + toolbar: { + customBackgroundColor: false, + background: 'fuse-white-500', + hidden: false, + position: 'below-fixed' + }, + footer: { + customBackgroundColor: true, + background: 'fuse-navy-900', + hidden: false, + position: 'below-static' + }, + sidepanel: { + hidden: false, + position: 'right' + } + } +}; diff --git a/src/app/app-provider.module.ts b/src/app/app-provider.module.ts new file mode 100644 index 0000000..6074605 --- /dev/null +++ b/src/app/app-provider.module.ts @@ -0,0 +1,41 @@ +import { NgModule, APP_INITIALIZER } from '@angular/core'; +import { HTTP_INTERCEPTORS } from '@angular/common/http'; + +import { CookieService } from 'ngx-cookie-service'; + +import { BasicAuthHtppInterceptorService } from './interceptor/basic-auth.http-interceptor'; +import { + API_BASE_URL, + GRAFANA_API_TOKEN, + GRAFANA_API_BASE_URL +} from 'src/modules/common/type/injection-token.type'; + +@NgModule({ + imports: [], + exports: [], + providers: [ + CookieService, + { + provide: HTTP_INTERCEPTORS, + useClass: BasicAuthHtppInterceptorService, + multi: true + }, + { + provide: API_BASE_URL, + useValue: 'http://localhost:8088/api', + multi: true + }, + { + provide: GRAFANA_API_BASE_URL, + useValue: 'http://localhost:3000/api', + multi: true + }, + { + provide: GRAFANA_API_TOKEN, + useValue: + 'eyJrIjoiNmQxU2pSSHNlU1AzNHc3aHZheWNYdWltd1lRM1ZvNnYiLCJuIjoiQVBNX0FQSSIsImlkIjoxfQ==', + multi: true + } + ] +}) +export class AppProviderModule {} diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts new file mode 100644 index 0000000..0157d6b --- /dev/null +++ b/src/app/app-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule, RouteReuseStrategy } from '@angular/router'; + +const routes: Routes = [ + { + path: '', + loadChildren: './pages/pages.module#PagesModule' + } +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule], + providers: [] +}) +export class AppRoutingModule {} diff --git a/src/app/app-store.module.ts b/src/app/app-store.module.ts new file mode 100644 index 0000000..3e6b436 --- /dev/null +++ b/src/app/app-store.module.ts @@ -0,0 +1,47 @@ +import { NgModule } from '@angular/core'; +import { StoreModule } from '@ngrx/store'; +import { StoreDevtoolsModule } from '@ngrx/store-devtools'; +import { StoreRouterConnectingModule, RouterState } from '@ngrx/router-store'; +import { EffectsModule } from '@ngrx/effects'; + +import { environment } from '../environments/environment'; +import { REDUCERS, META_REDUCERS, EFFECTS } from './store'; + +@NgModule({ + exports: [StoreModule], + imports: [ + StoreModule.forRoot(REDUCERS, { + metaReducers: META_REDUCERS, + runtimeChecks: { + strictStateImmutability: true, + strictActionImmutability: true, + strictStateSerializability: true, + strictActionSerializability: true + } + }), + /** + * @ngrx/router-store keeps router state up-to-date in the store. + */ + StoreRouterConnectingModule.forRoot({ + routerState: RouterState.Minimal + }), + /** + * Store devtools instrument the store retaining past versions of state + * and recalculating new states. This enables powerful time-travel + * debugging. + * + * To use the debugger, install the Redux Devtools extension for either + * Chrome or Firefox + * + * See: https://github.com/zalmoxisus/redux-devtools-extension + */ + StoreDevtoolsModule.instrument({ + name: 'WebApp DevTools', + maxAge: 50, + logOnly: environment.production + }), + EffectsModule.forRoot(EFFECTS) + ], + providers: [] +}) +export class AppStoreModule {} diff --git a/src/app/app.component.html b/src/app/app.component.html new file mode 100644 index 0000000..7cf0fe9 --- /dev/null +++ b/src/app/app.component.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/app/app.component.scss b/src/app/app.component.scss new file mode 100644 index 0000000..9860721 --- /dev/null +++ b/src/app/app.component.scss @@ -0,0 +1,50 @@ +@import 'src/@fuse/scss/fuse'; + +:host { + position: relative; + display: flex; + flex: 1 1 auto; + width: 100%; + height: 100%; + min-width: 0; + + .theme-options-button { + position: absolute; + top: 160px; + right: 0; + width: 48px; + height: 48px; + line-height: 48px; + text-align: center; + cursor: pointer; + border-radius: 0; + margin: 0; + pointer-events: auto; + opacity: 0.9; + z-index: 998; + + &.right-side-panel { + @include media-breakpoint('gt-md') { + right: 70px; + } + } + + &.side-panel-hidden { + right: 0 !important; + } + + mat-icon { + animation: rotating 3s linear infinite; + } + + &:hover { + opacity: 1; + } + } + + .theme-options-sidebar { + width: 360px; + min-width: 360px; + max-width: 360px; + } +} diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts new file mode 100644 index 0000000..1d4bb2b --- /dev/null +++ b/src/app/app.component.spec.ts @@ -0,0 +1,35 @@ +import { TestBed, async } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule + ], + declarations: [ + AppComponent + ], + }).compileComponents(); + })); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have as title 'frontend'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app.title).toEqual('frontend'); + }); + + it('should render title in a h1 tag', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('h1').textContent).toContain('Welcome to frontend!'); + }); +}); diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 0000000..e7d7253 --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,176 @@ +import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; +import { Platform } from '@angular/cdk/platform'; +import { TranslateService } from '@ngx-translate/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { FuseConfigService } from 'src/@fuse/services/config.service'; +import { FuseNavigationService } from 'src/@fuse/components/navigation/navigation.service'; +import { FuseSidebarService } from 'src/@fuse/components/sidebar/sidebar.service'; +import { FuseSplashScreenService } from 'src/@fuse/services/splash-screen.service'; +import { FuseTranslationLoaderService } from 'src/@fuse/services/translation-loader.service'; + +import { navigation } from './navigation/navigation'; +import { locale as navigationEnglish } from './navigation/i18n/en'; +import { locale as navigationKorean } from './navigation/i18n/ko'; + +@Component({ + selector: 'apm-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'] +}) +export class AppComponent implements OnInit, OnDestroy { + fuseConfig: any; + navigation: any; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {DOCUMENT} document + * @param {FuseConfigService} _fuseConfigService + * @param {FuseNavigationService} _fuseNavigationService + * @param {FuseSidebarService} _fuseSidebarService + * @param {FuseSplashScreenService} _fuseSplashScreenService + * @param {FuseTranslationLoaderService} _fuseTranslationLoaderService + * @param {Platform} _platform + * @param {TranslateService} _translateService + */ + constructor( + @Inject(DOCUMENT) private document: any, + private _fuseConfigService: FuseConfigService, + private _fuseNavigationService: FuseNavigationService, + private _fuseSidebarService: FuseSidebarService, + private _fuseSplashScreenService: FuseSplashScreenService, + private _fuseTranslationLoaderService: FuseTranslationLoaderService, + private _translateService: TranslateService, + private _platform: Platform + ) { + // Get default navigation + this.navigation = navigation; + + // Register the navigation to the service + this._fuseNavigationService.register('main', this.navigation); + + // Set the main navigation as our current navigation + this._fuseNavigationService.setCurrentNavigation('main'); + + // Add languages + this._translateService.addLangs(['ko', 'en']); + + // Set the default language + this._translateService.setDefaultLang('ko'); + + // Set the navigation translations + this._fuseTranslationLoaderService.loadTranslations( + navigationKorean, + navigationEnglish + ); + + // Use a language + this._translateService.use('ko'); + + /** + * ---------------------------------------------------------------------------------------------------- + * ngxTranslate Fix Start + * ---------------------------------------------------------------------------------------------------- + */ + + /** + * If you are using a language other than the default one, i.e. Turkish in this case, + * you may encounter an issue where some of the components are not actually being + * translated when your app first initialized. + * + * This is related to ngxTranslate module and below there is a temporary fix while we + * are moving the multi language implementation over to the Angular's core language + * service. + **/ + + // Set the default language to 'en' and then back to 'tr'. + // '.use' cannot be used here as ngxTranslate won't switch to a language that's already + // been selected and there is no way to force it, so we overcome the issue by switching + // the default language back and forth. + /** + setTimeout(() => { + this._translateService.setDefaultLang('en'); + this._translateService.setDefaultLang('tr'); + }); + */ + setTimeout(() => { + this._translateService.setDefaultLang('en'); + this._translateService.setDefaultLang('ko'); + }); + /** + * ---------------------------------------------------------------------------------------------------- + * ngxTranslate Fix End + * ---------------------------------------------------------------------------------------------------- + */ + + // Add is-mobile class to the body if the platform is mobile + if (this._platform.ANDROID || this._platform.IOS) { + this.document.body.classList.add('is-mobile'); + } + + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Subscribe to config changes + this._fuseConfigService.config + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(config => { + this.fuseConfig = config; + + // Boxed + if (this.fuseConfig.layout.width === 'boxed') { + this.document.body.classList.add('boxed'); + } else { + this.document.body.classList.remove('boxed'); + } + + // Color theme - Use normal for loop for IE11 compatibility + for (let i = 0; i < this.document.body.classList.length; i++) { + const className = this.document.body.classList[i]; + + if (className.startsWith('theme-')) { + this.document.body.classList.remove(className); + } + } + + this.document.body.classList.add(this.fuseConfig.colorTheme); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle sidebar open + * + * @param key + */ + toggleSidebarOpen(key): void { + this._fuseSidebarService.getSidebar(key).toggleOpen(); + } +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts new file mode 100644 index 0000000..d72919a --- /dev/null +++ b/src/app/app.module.ts @@ -0,0 +1,71 @@ +import { NgModule } from '@angular/core'; +import { HttpClientModule } from '@angular/common/http'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; + +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMomentDateModule } from '@angular/material-moment-adapter'; + +import { TranslateModule } from '@ngx-translate/core'; + +import { FuseModule } from 'src/@fuse/fuse.module'; +import { FuseSharedModule } from 'src/@fuse/shared.module'; +import { + FuseProgressBarModule, + FuseSidebarModule, + FuseThemeOptionsModule +} from 'src/@fuse/components'; + +import { AuthModule } from 'src/modules/auth/auth.module'; +import { DashboardModule } from 'src/modules/dashboard/dashboard.module'; +import { GrafanaModule } from 'src/modules/grafana/grafana.module'; +import { UserModule } from 'src/modules/user/user.module'; + +import { AppRoutingModule } from './app-routing.module'; +import { AppProviderModule } from './app-provider.module'; +import { AppStoreModule } from './app-store.module'; + +import { AppComponent } from './app.component'; +import { appFuseConfig } from './app-fuse-config'; + +import { LayoutModule } from './layout/layout.module'; + +@NgModule({ + imports: [ + BrowserModule, + BrowserAnimationsModule, + HttpClientModule, + + TranslateModule.forRoot(), + // Material moment date module + MatMomentDateModule, + + // Material + MatButtonModule, + MatIconModule, + + // Fuse modules + FuseModule.forRoot(appFuseConfig), + FuseProgressBarModule, + FuseSharedModule, + FuseSidebarModule, + FuseThemeOptionsModule, + + AuthModule.forRoot(), + DashboardModule.forRoot(), + GrafanaModule.forRoot(), + UserModule.forRoot(), + + AppRoutingModule, + AppProviderModule, + AppStoreModule, + + // App modules + LayoutModule + ], + declarations: [AppComponent], + + bootstrap: [AppComponent] +}) +export class AppModule {} diff --git a/src/app/app.theme.scss b/src/app/app.theme.scss new file mode 100644 index 0000000..9c3b580 --- /dev/null +++ b/src/app/app.theme.scss @@ -0,0 +1,250 @@ +// ----------------------------------------------------------------------------------------------------- +// @ Custom color maps for Fuse +// ----------------------------------------------------------------------------------------------------- +$fuse-white: ( + 500: white, + contrast: ( + 500: $dark-primary-text + ) +); + +$fuse-black: ( + 500: black, + contrast: ( + 500: $light-primary-text + ) +); + +$fuse-navy: ( + 50: #ececee, + 100: #c5c6cb, + 200: #9ea1a9, + 300: #7d818c, + 400: #5c616f, + 500: #3c4252, + 600: #353a48, + 700: #2d323e, + 800: #262933, + 900: #1e2129, + A100: #c5c6cb, + A200: #9ea1a9, + A400: #5c616f, + A700: #2d323e, + contrast: ( + 50: $dark-primary-text, + 100: $dark-primary-text, + 200: $dark-primary-text, + 300: $light-primary-text, + 400: $light-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 + ) +); + +// Generate Fuse color classes for custom palettes +$custom_palettes: ( + fuse-white: $fuse-white, + fuse-black: $fuse-black, + fuse-navy: $fuse-navy +); + +@include fuse-color-classes($custom_palettes); + +// ----------------------------------------------------------------------------------------------------- +// @ Typography +// ----------------------------------------------------------------------------------------------------- + +// Angular Material typography +// $input: mat-typography-level(16px, 1.125, 400) // line-height must be unitless !!! +$typography: mat-typography-config( + $font-family: 'Muli, Helvetica Neue, Arial, sans-serif', + $title: mat-typography-level(20px, 32px, 600), + $body-2: mat-typography-level(14px, 24px, 600), + $button: mat-typography-level(14px, 14px, 600), + $input: mat-typography-level(16px, 1.125, 400) +); + +// Setup the typography +@include angular-material-typography($typography); + +// ----------------------------------------------------------------------------------------------------- +// @ Component theming +// ----------------------------------------------------------------------------------------------------- + +// Import app and page component themes here to enable theming for them +@import 'src/app/layout/components/chat-panel/chat-panel.theme'; +@import 'src/app/layout/components/toolbar/toolbar.theme'; + +@import 'src/app/pages/accounts/component/signin.theme'; + +@import 'src/app/pages/settings/dashboard/settings-dashboard.theme'; + +// Define a mixin for easier access +@mixin components-theme($theme) { + // Layout components + @include chat-panel-theme($theme); + @include toolbar-theme($theme); + + @include signin-theme($theme); + + @include settings-dashboard-theme($theme); +} + +// ----------------------------------------------------------------------------------------------------- +// @ Define the default theme +// ----------------------------------------------------------------------------------------------------- + +// Define the primary, accent and warn palettes +$default-primary-palette: mat-palette($fuse-navy); +$default-accent-palette: mat-palette($mat-light-blue, 600, 400, 700); +$default-warn-palette: mat-palette($mat-red); + +// Create the Material theme object +$theme: mat-light-theme( + $default-primary-palette, + $default-accent-palette, + $default-warn-palette +); + +// Add ".theme-default" class to the body to activate this theme. +// Class name must start with "theme-" !!! +body.theme-default { + // Create an Angular Material theme from the $theme map + @include angular-material-theme($theme); + + // Apply the theme to the Fuse Core + @include fuse-core-theme($theme); + + // Apply the theme to the user components + @include components-theme($theme); + + // Generate Fuse color classes for primary, accent and warn colors + $palettes: ( + primary: $default-primary-palette, + accent: $default-accent-palette, + warn: $default-warn-palette + ); + + @include fuse-color-classes($palettes); +} + +// ----------------------------------------------------------------------------------------------------- +// @ Define a yellow light theme +// ----------------------------------------------------------------------------------------------------- + +// Define the primary, accent and warn palettes +$yellow-light-theme-primary-palette: mat-palette($fuse-navy, 600, 400, 700); +$yellow-light-theme-accent-palette: mat-palette($mat-yellow, 600, 400, 700); +$yellow-light-theme-warn-palette: mat-palette($mat-red); + +// Create the Material theme object +$yellow-light-theme: mat-light-theme( + $yellow-light-theme-primary-palette, + $yellow-light-theme-accent-palette, + $yellow-light-theme-warn-palette +); + +// Add ".theme-yellow-light" class to the body to activate this theme. +// Class name must start with "theme-" !!! +body.theme-yellow-light { + // Generate the Angular Material theme + @include angular-material-theme($yellow-light-theme); + + // Apply the theme to the Fuse Core + @include fuse-core-theme($yellow-light-theme); + + // Apply the theme to the user components + @include components-theme($yellow-light-theme); + + // Generate Fuse color classes for primary, accent and warn colors + $palettes: ( + primary: $yellow-light-theme-primary-palette, + accent: $yellow-light-theme-accent-palette, + warn: $yellow-light-theme-warn-palette + ); + + @include fuse-color-classes($palettes); +} + +// ----------------------------------------------------------------------------------------------------- +// @ Define a blue-gray dark theme +// ----------------------------------------------------------------------------------------------------- + +// Define the primary, accent and warn palettes +$blue-gray-dark-theme-primary-palette: mat-palette($mat-blue); +$blue-gray-dark-theme-accent-palette: mat-palette($mat-blue-gray); +$blue-gray-dark-theme-warn-palette: mat-palette($mat-red); + +// Create the Material theme object +$blue-gray-dark-theme: mat-dark-theme( + $blue-gray-dark-theme-primary-palette, + $blue-gray-dark-theme-accent-palette, + $blue-gray-dark-theme-warn-palette +); + +// Add ".theme-blue-gray-dark" class to the body to activate this theme. +// Class name must start with "theme-" !!! +body.theme-blue-gray-dark { + // Generate the Angular Material theme + @include angular-material-theme($blue-gray-dark-theme); + + // Apply the theme to the Fuse Core + @include fuse-core-theme($blue-gray-dark-theme); + + // Apply the theme to the user components + @include components-theme($blue-gray-dark-theme); + + // Generate Fuse color classes for primary, accent and warn colors + $palettes: ( + primary: $blue-gray-dark-theme-primary-palette, + accent: $blue-gray-dark-theme-accent-palette, + warn: $blue-gray-dark-theme-warn-palette + ); + + @include fuse-color-classes($palettes); +} + +// ----------------------------------------------------------------------------------------------------- +// @ Define a pink dark theme +// ----------------------------------------------------------------------------------------------------- + +// Define the primary, accent and warn palettes +$pink-dark-theme-primary-palette: mat-palette($mat-pink); +$pink-dark-theme-accent-palette: mat-palette($mat-pink); +$pink-dark-theme-warn-palette: mat-palette($mat-red); + +// Create the Material theme object +$pink-dark-theme: mat-dark-theme( + $pink-dark-theme-primary-palette, + $pink-dark-theme-accent-palette, + $pink-dark-theme-warn-palette +); + +// Add ".theme-pink-dark" class to the body to activate this theme. +// Class name must start with "theme-" !!! +body.theme-pink-dark { + // Generate the Angular Material theme + @include angular-material-theme($pink-dark-theme); + + // Apply the theme to the Fuse Core + @include fuse-core-theme($pink-dark-theme); + + // Apply the theme to the user components + @include components-theme($pink-dark-theme); + + // Generate Fuse color classes for primary, accent and warn colors + $palettes: ( + primary: $pink-dark-theme-primary-palette, + accent: $pink-dark-theme-accent-palette, + warn: $pink-dark-theme-warn-palette + ); + + @include fuse-color-classes($palettes); +} diff --git a/src/app/interceptor/basic-auth.http-interceptor.ts b/src/app/interceptor/basic-auth.http-interceptor.ts new file mode 100644 index 0000000..f47ad03 --- /dev/null +++ b/src/app/interceptor/basic-auth.http-interceptor.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@angular/core'; +import { + HttpInterceptor, + HttpRequest, + HttpHandler +} from '@angular/common/http'; + +import { AuthService } from 'src/modules/auth/service/auth.service'; + +@Injectable({ + providedIn: 'root' +}) +export class BasicAuthHtppInterceptorService implements HttpInterceptor { + constructor(private authService: AuthService) {} + + intercept(req: HttpRequest, next: HttpHandler) { + if (sessionStorage.getItem('username') && sessionStorage.getItem('token')) { + req = req.clone({ + setHeaders: { + Authorization: sessionStorage.getItem('token') + } + }); + } + return next.handle(req); + } +} diff --git a/src/app/layout/components/chat-panel/chat-panel.theme.scss b/src/app/layout/components/chat-panel/chat-panel.theme.scss new file mode 100644 index 0000000..9ff62dc --- /dev/null +++ b/src/app/layout/components/chat-panel/chat-panel.theme.scss @@ -0,0 +1,82 @@ +@mixin chat-panel-theme($theme) { + + $background: map-get($theme, background); + $foreground: map-get($theme, foreground); + $primary: map-get($theme, primary); + $accent: map-get($theme, accent); + $is-dark: map-get($theme, is-dark); + + chat-panel { + + #contacts-list { + background-color: map-get($background, app-bar); + + .contacts-list-item { + + &.active { + background: map-get($background, hover); + + &:after { + background-color: map-get($accent, default); + } + } + + .unread-count { + background-color: map-get($accent, default); + color: map-get($accent, default-contrast); + } + + .status-icon { + border-color: map-get($background, app-bar); + } + } + } + + #chat { + + .messages { + + .message-row { + + &.contact { + + .bubble { + background-color: map-get($primary, default); + color: map-get($primary, default-contrast); + } + } + + &.me { + + .bubble { + color: rgba(0, 0, 0, 0.87); + background-color: #E0E0E0; + } + } + } + } + + .reply-form { + + .message-text { + background-color: map-get($background, app-bar); + border-color: map-get($foreground, divider); + + .mat-form-field-wrapper { + + .mat-form-field-flex { + + .mat-form-field-infix { + @if ($is-dark == true) { + background-color: map-get($background, hover); + } @else { + background-color: white; + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/app/layout/components/content/content.component.html b/src/app/layout/components/content/content.component.html new file mode 100644 index 0000000..3a361ae --- /dev/null +++ b/src/app/layout/components/content/content.component.html @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/src/app/layout/components/content/content.component.scss b/src/app/layout/components/content/content.component.scss new file mode 100644 index 0000000..b0530a2 --- /dev/null +++ b/src/app/layout/components/content/content.component.scss @@ -0,0 +1,13 @@ +content { + position: relative; + display: flex; + z-index: 1; + flex: 1 0 auto; + + > *:not(router-outlet) { + display: flex; + flex: 1 0 auto; + width: 100%; + min-width: 100%; + } +} \ No newline at end of file diff --git a/src/app/layout/components/content/content.component.ts b/src/app/layout/components/content/content.component.ts new file mode 100644 index 0000000..0dcb007 --- /dev/null +++ b/src/app/layout/components/content/content.component.ts @@ -0,0 +1,17 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'content', + templateUrl : './content.component.html', + styleUrls : ['./content.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class ContentComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/layout/components/content/content.module.ts b/src/app/layout/components/content/content.module.ts new file mode 100644 index 0000000..6e981e9 --- /dev/null +++ b/src/app/layout/components/content/content.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { FuseSharedModule } from 'src/@fuse/shared.module'; + +import { ContentComponent } from './content.component'; + +@NgModule({ + declarations: [ContentComponent], + imports: [RouterModule, FuseSharedModule], + exports: [ContentComponent] +}) +export class ContentModule {} diff --git a/src/app/layout/components/footer/footer.component.html b/src/app/layout/components/footer/footer.component.html new file mode 100644 index 0000000..28af107 --- /dev/null +++ b/src/app/layout/components/footer/footer.component.html @@ -0,0 +1,29 @@ + +
+ + + + +
+ Documentation + + Changelog +
+
+
diff --git a/src/app/layout/components/footer/footer.component.scss b/src/app/layout/components/footer/footer.component.scss new file mode 100644 index 0000000..d684b80 --- /dev/null +++ b/src/app/layout/components/footer/footer.component.scss @@ -0,0 +1,16 @@ +:host { + display: flex; + flex: 0 0 auto; + z-index: 3; + + .mat-toolbar { + background: inherit; + color: inherit; + box-shadow: 0px -1px 1px -1px rgba(0, 0, 0, 0.2), 0px 0px 1px 0px rgba(0, 0, 0, 0.14), 0px -1px 3px 0px rgba(0, 0, 0, 0.12); + } + + &.above { + position: relative; + z-index: 99; + } +} \ No newline at end of file diff --git a/src/app/layout/components/footer/footer.component.ts b/src/app/layout/components/footer/footer.component.ts new file mode 100644 index 0000000..0a12144 --- /dev/null +++ b/src/app/layout/components/footer/footer.component.ts @@ -0,0 +1,16 @@ +import { Component } from '@angular/core'; + +@Component({ + selector : 'footer', + templateUrl: './footer.component.html', + styleUrls : ['./footer.component.scss'] +}) +export class FooterComponent +{ + /** + * Constructor + */ + constructor() + { + } +} diff --git a/src/app/layout/components/footer/footer.module.ts b/src/app/layout/components/footer/footer.module.ts new file mode 100644 index 0000000..72b8ed3 --- /dev/null +++ b/src/app/layout/components/footer/footer.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatToolbarModule } from '@angular/material/toolbar'; + +import { FuseSharedModule } from 'src/@fuse/shared.module'; + +import { FooterComponent } from './footer.component'; + +@NgModule({ + declarations: [FooterComponent], + imports: [ + RouterModule, + + MatButtonModule, + MatIconModule, + MatToolbarModule, + + FuseSharedModule + ], + exports: [FooterComponent] +}) +export class FooterModule {} diff --git a/src/app/layout/components/navbar/horizontal/style-1/style-1.component.html b/src/app/layout/components/navbar/horizontal/style-1/style-1.component.html new file mode 100644 index 0000000..41631bb --- /dev/null +++ b/src/app/layout/components/navbar/horizontal/style-1/style-1.component.html @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/src/app/layout/components/navbar/horizontal/style-1/style-1.component.scss b/src/app/layout/components/navbar/horizontal/style-1/style-1.component.scss new file mode 100644 index 0000000..3cc1a98 --- /dev/null +++ b/src/app/layout/components/navbar/horizontal/style-1/style-1.component.scss @@ -0,0 +1,16 @@ +navbar-horizontal-style-1 { + +} + +navbar { + + &.horizontal-style-1 { + display: flex; + flex-direction: column; + flex: 1 1 auto; + width: 100%; + height: 56px; + max-height: 56px; + min-height: 56px; + } +} \ No newline at end of file diff --git a/src/app/layout/components/navbar/horizontal/style-1/style-1.component.ts b/src/app/layout/components/navbar/horizontal/style-1/style-1.component.ts new file mode 100644 index 0000000..cf58dc5 --- /dev/null +++ b/src/app/layout/components/navbar/horizontal/style-1/style-1.component.ts @@ -0,0 +1,72 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { filter, takeUntil } from 'rxjs/operators'; + +import { FuseConfigService } from 'src/@fuse/services/config.service'; +import { FuseNavigationService } from 'src/@fuse/components/navigation/navigation.service'; +import { FuseSidebarService } from 'src/@fuse/components/sidebar/sidebar.service'; + +@Component({ + selector: 'navbar-horizontal-style-1', + templateUrl: './style-1.component.html', + styleUrls: ['./style-1.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class NavbarHorizontalStyle1Component implements OnInit, OnDestroy { + fuseConfig: any; + navigation: any; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {FuseConfigService} _fuseConfigService + * @param {FuseNavigationService} _fuseNavigationService + * @param {FuseSidebarService} _fuseSidebarService + */ + constructor( + private _fuseConfigService: FuseConfigService, + private _fuseNavigationService: FuseNavigationService, + private _fuseSidebarService: FuseSidebarService + ) { + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Get current navigation + this._fuseNavigationService.onNavigationChanged + .pipe( + filter(value => value !== null), + takeUntil(this._unsubscribeAll) + ) + .subscribe(() => { + this.navigation = this._fuseNavigationService.getCurrentNavigation(); + }); + + // Subscribe to the config changes + this._fuseConfigService.config + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(config => { + this.fuseConfig = config; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/layout/components/navbar/horizontal/style-1/style-1.module.ts b/src/app/layout/components/navbar/horizontal/style-1/style-1.module.ts new file mode 100644 index 0000000..176c719 --- /dev/null +++ b/src/app/layout/components/navbar/horizontal/style-1/style-1.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; + +import { FuseNavigationModule } from 'src/@fuse/components'; +import { FuseSharedModule } from 'src/@fuse/shared.module'; + +import { NavbarHorizontalStyle1Component } from './style-1.component'; + +@NgModule({ + declarations: [NavbarHorizontalStyle1Component], + imports: [ + MatButtonModule, + MatIconModule, + + FuseSharedModule, + FuseNavigationModule + ], + exports: [NavbarHorizontalStyle1Component] +}) +export class NavbarHorizontalStyle1Module {} diff --git a/src/app/layout/components/navbar/navbar.component.html b/src/app/layout/components/navbar/navbar.component.html new file mode 100644 index 0000000..158a127 --- /dev/null +++ b/src/app/layout/components/navbar/navbar.component.html @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/app/layout/components/navbar/navbar.component.scss b/src/app/layout/components/navbar/navbar.component.scss new file mode 100644 index 0000000..93609b0 --- /dev/null +++ b/src/app/layout/components/navbar/navbar.component.scss @@ -0,0 +1,3 @@ +navbar { + +} diff --git a/src/app/layout/components/navbar/navbar.component.ts b/src/app/layout/components/navbar/navbar.component.ts new file mode 100644 index 0000000..069ab5f --- /dev/null +++ b/src/app/layout/components/navbar/navbar.component.ts @@ -0,0 +1,53 @@ +import { Component, ElementRef, Input, Renderer2, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector : 'navbar', + templateUrl : './navbar.component.html', + styleUrls : ['./navbar.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class NavbarComponent +{ + // Private + _variant: string; + + /** + * Constructor + * + * @param {ElementRef} _elementRef + * @param {Renderer2} _renderer + */ + constructor( + private _elementRef: ElementRef, + private _renderer: Renderer2 + ) + { + // Set the private defaults + this._variant = 'vertical-style-1'; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + /** + * Variant + */ + get variant(): string + { + return this._variant; + } + + @Input() + set variant(value: string) + { + // Remove the old class name + this._renderer.removeClass(this._elementRef.nativeElement, this.variant); + + // Store the variant value + this._variant = value; + + // Add the new class name + this._renderer.addClass(this._elementRef.nativeElement, value); + } +} diff --git a/src/app/layout/components/navbar/navbar.module.ts b/src/app/layout/components/navbar/navbar.module.ts new file mode 100644 index 0000000..bc6ddb3 --- /dev/null +++ b/src/app/layout/components/navbar/navbar.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; + +import { FuseSharedModule } from 'src/@fuse/shared.module'; + +import { NavbarComponent } from '../../components/navbar/navbar.component'; +import { NavbarHorizontalStyle1Module } from '../../components/navbar/horizontal/style-1/style-1.module'; +import { NavbarVerticalStyle1Module } from '../../components/navbar/vertical/style-1/style-1.module'; +import { NavbarVerticalStyle2Module } from '../../components/navbar/vertical/style-2/style-2.module'; + +@NgModule({ + declarations: [NavbarComponent], + imports: [ + FuseSharedModule, + + NavbarHorizontalStyle1Module, + NavbarVerticalStyle1Module, + NavbarVerticalStyle2Module + ], + exports: [NavbarComponent] +}) +export class NavbarModule {} diff --git a/src/app/layout/components/navbar/vertical/style-1/style-1.component.html b/src/app/layout/components/navbar/vertical/style-1/style-1.component.html new file mode 100644 index 0000000..d56f735 --- /dev/null +++ b/src/app/layout/components/navbar/vertical/style-1/style-1.component.html @@ -0,0 +1,42 @@ + + + + diff --git a/src/app/layout/components/navbar/vertical/style-1/style-1.component.scss b/src/app/layout/components/navbar/vertical/style-1/style-1.component.scss new file mode 100644 index 0000000..5e9b1ba --- /dev/null +++ b/src/app/layout/components/navbar/vertical/style-1/style-1.component.scss @@ -0,0 +1,199 @@ +@import "src/@fuse/scss/fuse"; + +fuse-sidebar { + + &.navbar-fuse-sidebar { + overflow: hidden; + + &.folded:not(.unfolded) { + + navbar { + + navbar-vertical-style-1 { + + .navbar-top { + padding: 12px 0; + justify-content: center; + + .buttons { + display: none; + } + + .logo { + + .logo-icon { + width: 32px; + height: 32px; + } + + .logo-text { + display: none; + } + } + } + + .navbar-scroll-container { + + .user { + padding: 12px 0; + height: 64px; + min-height: 64px; + max-height: 64px; + + .avatar-container { + position: relative; + top: auto; + padding: 0; + transform: translateX(0); + left: auto; + + .avatar { + width: 40px; + height: 40px; + } + } + + .username, + .email { + display: none; + } + } + + .navbar-content { + padding-top: 0; + + // Material 2 specific style + .material2 { + + .nav-item { + + .nav-link { + border-radius: 20px; + margin: 0 12px; + padding: 0 12px; + } + } + } + } + } + } + } + } + } +} + +navbar { + + &.vertical-style-1 { + display: flex; + flex-direction: column; + flex: 1 1 auto; + width: 100%; + height: 100%; + + &.right-navbar { + + .toggle-sidebar-opened { + + mat-icon { + transform: rotate(180deg); + } + } + } + } + + navbar-vertical-style-1 { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + + .navbar-top { + display: flex; + flex-direction: row; + flex: 1 0 auto; + align-items: center; + justify-content: space-between; + min-height: 64px; + max-height: 64px; + height: 64px; + padding: 12px 12px 12px 20px; + + @include media-breakpoint('xs') { + min-height: 56px; + max-height: 56px; + height: 56px; + } + + .logo { + display: flex; + align-items: center; + + .logo-icon { + width: 24px; + height: 24px; + } + + .logo-text { + margin-left: 12px; + font-size: 16px; + font-weight: 300; + letter-spacing: 0.4px; + line-height: normal; + } + } + + .buttons { + display: flex; + align-items: center; + } + } + + .navbar-scroll-container { + display: flex; + flex-direction: column; + flex: 1 1 auto; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + + background: linear-gradient(rgba(0, 0, 0, 0) 30%, rgba(0, 0, 0, 0) 30%), + linear-gradient(rgba(0, 0, 0, 0.25) 0, rgba(0, 0, 0, 0) 40%); + + background-repeat: no-repeat; + background-size: 100% 40px, 100% 10px; + background-attachment: local, scroll; + + .user { + position: relative; + display: flex; + align-items: center; + justify-content: flex-start; + width: 100%; + height: 136px; + min-height: 136px; + max-height: 136px; + padding: 24px 0 64px 0; + + .avatar-container { + position: absolute; + top: 92px; + border-radius: 50%; + padding: 8px; + transform: translateX(-50%); + left: 50%; + + .avatar { + width: 72px; + height: 72px; + margin: 0; + } + } + } + + .navbar-content { + flex: 1 1 auto; + padding-top: 32px; + } + } + } +} \ No newline at end of file diff --git a/src/app/layout/components/navbar/vertical/style-1/style-1.component.ts b/src/app/layout/components/navbar/vertical/style-1/style-1.component.ts new file mode 100644 index 0000000..f06686a --- /dev/null +++ b/src/app/layout/components/navbar/vertical/style-1/style-1.component.ts @@ -0,0 +1,151 @@ +import { + Component, + OnDestroy, + OnInit, + ViewChild, + ViewEncapsulation +} from '@angular/core'; +import { NavigationEnd, Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { delay, filter, take, takeUntil } from 'rxjs/operators'; + +import { FuseConfigService } from 'src/@fuse/services/config.service'; +import { FuseNavigationService } from 'src/@fuse/components/navigation/navigation.service'; +import { FusePerfectScrollbarDirective } from 'src/@fuse/directives/fuse-perfect-scrollbar/fuse-perfect-scrollbar.directive'; +import { FuseSidebarService } from 'src/@fuse/components/sidebar/sidebar.service'; + +@Component({ + selector: 'navbar-vertical-style-1', + templateUrl: './style-1.component.html', + styleUrls: ['./style-1.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class NavbarVerticalStyle1Component implements OnInit, OnDestroy { + fuseConfig: any; + navigation: any; + + // Private + private _fusePerfectScrollbar: FusePerfectScrollbarDirective; + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {FuseConfigService} _fuseConfigService + * @param {FuseNavigationService} _fuseNavigationService + * @param {FuseSidebarService} _fuseSidebarService + * @param {Router} _router + */ + constructor( + private _fuseConfigService: FuseConfigService, + private _fuseNavigationService: FuseNavigationService, + private _fuseSidebarService: FuseSidebarService, + private _router: Router + ) { + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + // Directive + @ViewChild(FusePerfectScrollbarDirective, { static: true }) + set directive(theDirective: FusePerfectScrollbarDirective) { + if (!theDirective) { + return; + } + + this._fusePerfectScrollbar = theDirective; + + // Update the scrollbar on collapsable item toggle + this._fuseNavigationService.onItemCollapseToggled + .pipe( + delay(500), + takeUntil(this._unsubscribeAll) + ) + .subscribe(() => { + this._fusePerfectScrollbar.update(); + }); + + // Scroll to the active item position + this._router.events + .pipe( + filter(event => event instanceof NavigationEnd), + take(1) + ) + .subscribe(() => { + setTimeout(() => { + this._fusePerfectScrollbar.scrollToElement( + 'navbar .nav-link.active', + -120 + ); + }); + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + this._router.events + .pipe( + filter(event => event instanceof NavigationEnd), + takeUntil(this._unsubscribeAll) + ) + .subscribe(() => { + if (this._fuseSidebarService.getSidebar('navbar')) { + this._fuseSidebarService.getSidebar('navbar').close(); + } + }); + + // Subscribe to the config changes + this._fuseConfigService.config + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(config => { + this.fuseConfig = config; + }); + + // Get current navigation + this._fuseNavigationService.onNavigationChanged + .pipe( + filter(value => value !== null), + takeUntil(this._unsubscribeAll) + ) + .subscribe(() => { + this.navigation = this._fuseNavigationService.getCurrentNavigation(); + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle sidebar opened status + */ + toggleSidebarOpened(): void { + this._fuseSidebarService.getSidebar('navbar').toggleOpen(); + } + + /** + * Toggle sidebar folded status + */ + toggleSidebarFolded(): void { + this._fuseSidebarService.getSidebar('navbar').toggleFold(); + } +} diff --git a/src/app/layout/components/navbar/vertical/style-1/style-1.module.ts b/src/app/layout/components/navbar/vertical/style-1/style-1.module.ts new file mode 100644 index 0000000..669d29c --- /dev/null +++ b/src/app/layout/components/navbar/vertical/style-1/style-1.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; + +import { FuseNavigationModule } from 'src/@fuse/components'; +import { FuseSharedModule } from 'src/@fuse/shared.module'; + +import { NavbarVerticalStyle1Component } from './style-1.component'; + +@NgModule({ + declarations: [NavbarVerticalStyle1Component], + imports: [ + MatButtonModule, + MatIconModule, + + FuseSharedModule, + FuseNavigationModule + ], + exports: [NavbarVerticalStyle1Component] +}) +export class NavbarVerticalStyle1Module {} diff --git a/src/app/layout/components/navbar/vertical/style-2/style-2.component.html b/src/app/layout/components/navbar/vertical/style-2/style-2.component.html new file mode 100644 index 0000000..0b5d6b0 --- /dev/null +++ b/src/app/layout/components/navbar/vertical/style-2/style-2.component.html @@ -0,0 +1,36 @@ + + + diff --git a/src/app/layout/components/navbar/vertical/style-2/style-2.component.scss b/src/app/layout/components/navbar/vertical/style-2/style-2.component.scss new file mode 100644 index 0000000..47d5887 --- /dev/null +++ b/src/app/layout/components/navbar/vertical/style-2/style-2.component.scss @@ -0,0 +1,96 @@ +@import 'src/@fuse/scss/fuse'; + +fuse-sidebar { + &.navbar-fuse-sidebar { + overflow: hidden; + + &.folded:not(.unfolded) { + navbar { + navbar-vertical-style-2 { + .navbar-header { + padding: 0 13px; + + .logo { + .logo-text { + opacity: 0; + transition: opacity 200ms ease; + } + } + } + + .navbar-content { + // Material 2 specific style + .material2 { + .nav-item { + .nav-link { + border-radius: 20px; + margin: 0 12px; + padding: 0 12px; + } + } + } + } + } + } + } + } +} + +navbar { + &.vertical-style-2 { + display: flex; + flex-direction: column; + flex: 1 1 auto; + width: 100%; + height: 100%; + + &.right-navbar { + .toggle-sidebar-opened { + mat-icon { + transform: rotate(180deg); + } + } + } + } + + navbar-vertical-style-2 { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + + .navbar-header { + display: flex; + align-items: center; + justify-content: space-between; + height: 64px; + min-height: 64px; + padding: 0 16px 0 24px; + transition: padding 200ms ease; + @include mat-elevation(1); + + .logo { + display: flex; + align-items: center; + + .logo-icon { + width: 38px; + height: 38px; + } + + .logo-text { + margin-left: 8px; + font-size: 20px; + font-weight: 300; + letter-spacing: 0.4px; + } + } + } + + .navbar-content { + flex: 1 1 auto; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + } + } +} diff --git a/src/app/layout/components/navbar/vertical/style-2/style-2.component.ts b/src/app/layout/components/navbar/vertical/style-2/style-2.component.ts new file mode 100644 index 0000000..577dbd0 --- /dev/null +++ b/src/app/layout/components/navbar/vertical/style-2/style-2.component.ts @@ -0,0 +1,151 @@ +import { + Component, + OnDestroy, + OnInit, + ViewChild, + ViewEncapsulation +} from '@angular/core'; +import { NavigationEnd, Router } from '@angular/router'; +import { Subject } from 'rxjs'; +import { delay, filter, take, takeUntil } from 'rxjs/operators'; + +import { FuseConfigService } from 'src/@fuse/services/config.service'; +import { FuseNavigationService } from 'src/@fuse/components/navigation/navigation.service'; +import { FusePerfectScrollbarDirective } from 'src/@fuse/directives/fuse-perfect-scrollbar/fuse-perfect-scrollbar.directive'; +import { FuseSidebarService } from 'src/@fuse/components/sidebar/sidebar.service'; + +@Component({ + selector: 'navbar-vertical-style-2', + templateUrl: './style-2.component.html', + styleUrls: ['./style-2.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class NavbarVerticalStyle2Component implements OnInit, OnDestroy { + fuseConfig: any; + navigation: any; + + // Private + private _fusePerfectScrollbar: FusePerfectScrollbarDirective; + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {FuseConfigService} _fuseConfigService + * @param {FuseNavigationService} _fuseNavigationService + * @param {FuseSidebarService} _fuseSidebarService + * @param {Router} _router + */ + constructor( + private _fuseConfigService: FuseConfigService, + private _fuseNavigationService: FuseNavigationService, + private _fuseSidebarService: FuseSidebarService, + private _router: Router + ) { + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Accessors + // ----------------------------------------------------------------------------------------------------- + + // Directive + @ViewChild(FusePerfectScrollbarDirective, { static: true }) + set directive(theDirective: FusePerfectScrollbarDirective) { + if (!theDirective) { + return; + } + + this._fusePerfectScrollbar = theDirective; + + // Update the scrollbar on collapsable item toggle + this._fuseNavigationService.onItemCollapseToggled + .pipe( + delay(500), + takeUntil(this._unsubscribeAll) + ) + .subscribe(() => { + this._fusePerfectScrollbar.update(); + }); + + // Scroll to the active item position + this._router.events + .pipe( + filter(event => event instanceof NavigationEnd), + take(1) + ) + .subscribe(() => { + setTimeout(() => { + this._fusePerfectScrollbar.scrollToElement( + 'navbar .nav-link.active', + -120 + ); + }); + }); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + this._router.events + .pipe( + filter(event => event instanceof NavigationEnd), + takeUntil(this._unsubscribeAll) + ) + .subscribe(() => { + if (this._fuseSidebarService.getSidebar('navbar')) { + this._fuseSidebarService.getSidebar('navbar').close(); + } + }); + + // Get current navigation + this._fuseNavigationService.onNavigationChanged + .pipe( + filter(value => value !== null), + takeUntil(this._unsubscribeAll) + ) + .subscribe(() => { + this.navigation = this._fuseNavigationService.getCurrentNavigation(); + }); + + // Subscribe to the config changes + this._fuseConfigService.config + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(config => { + this.fuseConfig = config; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle sidebar opened status + */ + toggleSidebarOpened(): void { + this._fuseSidebarService.getSidebar('navbar').toggleOpen(); + } + + /** + * Toggle sidebar folded status + */ + toggleSidebarFolded(): void { + this._fuseSidebarService.getSidebar('navbar').toggleFold(); + } +} diff --git a/src/app/layout/components/navbar/vertical/style-2/style-2.module.ts b/src/app/layout/components/navbar/vertical/style-2/style-2.module.ts new file mode 100644 index 0000000..ba58dd7 --- /dev/null +++ b/src/app/layout/components/navbar/vertical/style-2/style-2.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; + +import { FuseNavigationModule } from 'src/@fuse/components'; +import { FuseSharedModule } from 'src/@fuse/shared.module'; + +import { NavbarVerticalStyle2Component } from './style-2.component'; + +@NgModule({ + declarations: [NavbarVerticalStyle2Component], + imports: [ + MatButtonModule, + MatIconModule, + + FuseSharedModule, + FuseNavigationModule + ], + exports: [NavbarVerticalStyle2Component] +}) +export class NavbarVerticalStyle2Module {} diff --git a/src/app/layout/components/quick-panel/quick-panel.component.html b/src/app/layout/components/quick-panel/quick-panel.component.html new file mode 100644 index 0000000..93f4521 --- /dev/null +++ b/src/app/layout/components/quick-panel/quick-panel.component.html @@ -0,0 +1,76 @@ +
+ + + +

+ Today +

+ +
+
+ {{date | date:'EEEE'}} +
+
+ {{date | date:'d'}} + th + {{date | date:'MMMM'}} +
+
+
+ + + + +

+ Events +

+ + +

{{event.title}}

+

{{event.detail}}

+
+
+ + + + +

+ Notes +

+ + +

{{note.title}}

+

{{note.detail}}

+
+
+ + + + +

+ Quick Settings +

+ + + +

Notifications

+
+
+ + + +

Cloud Sync

+
+
+ + + +

Retro Thrusters

+
+
+
+ +
\ No newline at end of file diff --git a/src/app/layout/components/quick-panel/quick-panel.component.scss b/src/app/layout/components/quick-panel/quick-panel.component.scss new file mode 100644 index 0000000..c386797 --- /dev/null +++ b/src/app/layout/components/quick-panel/quick-panel.component.scss @@ -0,0 +1,13 @@ +quick-panel { + display: flex; + flex-direction: column; + flex: 1 1 auto; + width: 280px; + min-width: 280px; + max-width: 280px; + z-index: 99; + + .mat-slide-toggle-content { + flex: 1; + } +} diff --git a/src/app/layout/components/quick-panel/quick-panel.component.ts b/src/app/layout/components/quick-panel/quick-panel.component.ts new file mode 100644 index 0000000..b6a195e --- /dev/null +++ b/src/app/layout/components/quick-panel/quick-panel.component.ts @@ -0,0 +1,27 @@ +import { Component, ViewEncapsulation } from '@angular/core'; + +@Component({ + selector: 'quick-panel', + templateUrl: './quick-panel.component.html', + styleUrls: ['./quick-panel.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class QuickPanelComponent { + date: Date; + events: any[]; + notes: any[]; + settings: any; + + /** + * Constructor + */ + constructor() { + // Set the defaults + this.date = new Date(); + this.settings = { + notify: true, + cloud: false, + retro: true + }; + } +} diff --git a/src/app/layout/components/quick-panel/quick-panel.module.ts b/src/app/layout/components/quick-panel/quick-panel.module.ts new file mode 100644 index 0000000..338e497 --- /dev/null +++ b/src/app/layout/components/quick-panel/quick-panel.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatListModule } from '@angular/material/list'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; + +import { FuseSharedModule } from 'src/@fuse/shared.module'; + +import { QuickPanelComponent } from './quick-panel.component'; + +@NgModule({ + declarations: [QuickPanelComponent], + imports: [ + MatDividerModule, + MatListModule, + MatSlideToggleModule, + + FuseSharedModule + ], + exports: [QuickPanelComponent] +}) +export class QuickPanelModule {} diff --git a/src/app/layout/components/toolbar/toolbar.component.html b/src/app/layout/components/toolbar/toolbar.component.html new file mode 100644 index 0000000..95f2b88 --- /dev/null +++ b/src/app/layout/components/toolbar/toolbar.component.html @@ -0,0 +1,127 @@ + +
+
+ + +
+ +
+ +
+ + +
+ +
+ + + + + + + + + + + + +
+ + + + + + + +
+ + + +
+ + +
+
+
diff --git a/src/app/layout/components/toolbar/toolbar.component.scss b/src/app/layout/components/toolbar/toolbar.component.scss new file mode 100644 index 0000000..b8c280e --- /dev/null +++ b/src/app/layout/components/toolbar/toolbar.component.scss @@ -0,0 +1,54 @@ +@import 'src/@fuse/scss/fuse'; + +toolbar { + position: relative; + display: flex; + flex: 0 0 auto; + z-index: 4; + + &.below { + z-index: 2; + } + + .mat-toolbar { + position: relative; + background: inherit !important; + color: inherit !important; + } + + .logo { + display: flex; + align-items: center; + + .logo-icon { + width: 38px; + } + } + + .user-button, + fuse-search-bar, + .language-button, + .chat-panel-toggle-button, + .quick-panel-toggle-button { + min-width: 64px; + height: 64px; + + @include media-breakpoint('xs') { + height: 56px; + } + } + + .navbar-toggle-button { + min-width: 56px; + height: 56px; + } + + .toolbar-separator { + height: 64px; + width: 1px; + + @include media-breakpoint('xs') { + height: 56px; + } + } +} diff --git a/src/app/layout/components/toolbar/toolbar.component.ts b/src/app/layout/components/toolbar/toolbar.component.ts new file mode 100644 index 0000000..6815418 --- /dev/null +++ b/src/app/layout/components/toolbar/toolbar.component.ts @@ -0,0 +1,157 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; +import { TranslateService } from '@ngx-translate/core'; +import * as _ from 'lodash'; + +import { FuseConfigService } from 'src/@fuse/services/config.service'; +import { FuseSidebarService } from 'src/@fuse/components/sidebar/sidebar.service'; + +import { navigation } from '../../../navigation/navigation'; + +@Component({ + selector: 'toolbar', + templateUrl: './toolbar.component.html', + styleUrls: ['./toolbar.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class ToolbarComponent implements OnInit, OnDestroy { + horizontalNavbar: boolean; + rightNavbar: boolean; + hiddenNavbar: boolean; + languages: any; + navigation: any; + selectedLanguage: any; + userStatusOptions: any[]; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {FuseConfigService} _fuseConfigService + * @param {FuseSidebarService} _fuseSidebarService + * @param {TranslateService} _translateService + */ + constructor( + private _fuseConfigService: FuseConfigService, + private _fuseSidebarService: FuseSidebarService, + private _translateService: TranslateService + ) { + // Set the defaults + this.userStatusOptions = [ + { + title: 'Online', + icon: 'icon-checkbox-marked-circle', + color: '#4CAF50' + }, + { + title: 'Away', + icon: 'icon-clock', + color: '#FFC107' + }, + { + title: 'Do not Disturb', + icon: 'icon-minus-circle', + color: '#F44336' + }, + { + title: 'Invisible', + icon: 'icon-checkbox-blank-circle-outline', + color: '#BDBDBD' + }, + { + title: 'Offline', + icon: 'icon-checkbox-blank-circle-outline', + color: '#616161' + } + ]; + + this.languages = [ + { + id: 'en', + title: 'English', + flag: 'us' + }, + { + id: 'ko', + title: '한국어', + flag: 'ko' + } + ]; + + this.navigation = navigation; + + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Subscribe to the config changes + this._fuseConfigService.config + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(settings => { + this.horizontalNavbar = settings.layout.navbar.position === 'top'; + this.rightNavbar = settings.layout.navbar.position === 'right'; + this.hiddenNavbar = settings.layout.navbar.hidden === true; + }); + + // Set the selected language from default languages + this.selectedLanguage = _.find(this.languages, { + id: this._translateService.currentLang + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Toggle sidebar open + * + * @param key + */ + toggleSidebarOpen(key): void { + this._fuseSidebarService.getSidebar(key).toggleOpen(); + } + + /** + * Search + * + * @param value + */ + search(value): void { + // Do your search here... + console.log(value); + } + + /** + * Set the language + * + * @param lang + */ + setLanguage(lang): void { + // Set the selected language for the toolbar + this.selectedLanguage = lang; + + // Use the selected language for translations + this._translateService.use(lang.id); + } +} diff --git a/src/app/layout/components/toolbar/toolbar.module.ts b/src/app/layout/components/toolbar/toolbar.module.ts new file mode 100644 index 0000000..3677ae4 --- /dev/null +++ b/src/app/layout/components/toolbar/toolbar.module.ts @@ -0,0 +1,28 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatToolbarModule } from '@angular/material/toolbar'; + +import { FuseSearchBarModule, FuseShortcutsModule } from 'src/@fuse/components'; +import { FuseSharedModule } from 'src/@fuse/shared.module'; + +import { ToolbarComponent } from './toolbar.component'; + +@NgModule({ + declarations: [ToolbarComponent], + imports: [ + RouterModule, + MatButtonModule, + MatIconModule, + MatMenuModule, + MatToolbarModule, + + FuseSharedModule, + FuseSearchBarModule, + FuseShortcutsModule + ], + exports: [ToolbarComponent] +}) +export class ToolbarModule {} diff --git a/src/app/layout/components/toolbar/toolbar.theme.scss b/src/app/layout/components/toolbar/toolbar.theme.scss new file mode 100644 index 0000000..0885f49 --- /dev/null +++ b/src/app/layout/components/toolbar/toolbar.theme.scss @@ -0,0 +1,9 @@ +@mixin toolbar-theme($theme) { + $foreground: map-get($theme, foreground); + + toolbar { + .toolbar-separator { + background: map-get($foreground, divider); + } + } +} diff --git a/src/app/layout/horizontal/layout-1/layout-1.component.html b/src/app/layout/horizontal/layout-1/layout-1.component.html new file mode 100644 index 0000000..a84b4ed --- /dev/null +++ b/src/app/layout/horizontal/layout-1/layout-1.component.html @@ -0,0 +1,117 @@ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + diff --git a/src/app/layout/horizontal/layout-1/layout-1.component.scss b/src/app/layout/horizontal/layout-1/layout-1.component.scss new file mode 100644 index 0000000..d4b85e9 --- /dev/null +++ b/src/app/layout/horizontal/layout-1/layout-1.component.scss @@ -0,0 +1,62 @@ +@import "src/@fuse/scss/fuse"; + +horizontal-layout-1 { + display: flex; + flex: 1 1 auto; + width: 100%; + height: 100%; + + #main { + position: relative; + display: flex; + flex: 1 1 auto; + flex-direction: column; + width: 100%; + height: 100%; + z-index: 1; + min-width: 0; + + // Container 1 + > .container { + position: relative; + display: flex; + flex: 1 1 0%; + width: 100%; + min-height: 0; + min-width: 0; + + // Container 2 + > .container { + position: relative; + display: flex; + flex: 1 1 0%; + flex-direction: column; + min-width: 0; + + // Container 3 (Scrollable) + > .container { + position: relative; + display: flex; + flex: 1 1 0%; + flex-direction: column; + overflow-x: hidden; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + + // Content component + content { + + &.inner-scroll { + flex: 1 1 0%; + min-height: 0; + + > *:not(router-outlet) { + flex: 1 1 0%; + } + } + } + } + } + } + } +} diff --git a/src/app/layout/horizontal/layout-1/layout-1.component.ts b/src/app/layout/horizontal/layout-1/layout-1.component.ts new file mode 100644 index 0000000..0d9ad75 --- /dev/null +++ b/src/app/layout/horizontal/layout-1/layout-1.component.ts @@ -0,0 +1,58 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { FuseConfigService } from 'src/@fuse/services/config.service'; +import { navigation } from '../../../navigation/navigation'; + +@Component({ + selector: 'horizontal-layout-1', + templateUrl: './layout-1.component.html', + styleUrls: ['./layout-1.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class HorizontalLayout1Component implements OnInit, OnDestroy { + fuseConfig: any; + navigation: any; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {FuseConfigService} _fuseConfigService + */ + constructor(private _fuseConfigService: FuseConfigService) { + // Set the defaults + this.navigation = navigation; + + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Subscribe to config changes + this._fuseConfigService.config + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(config => { + this.fuseConfig = config; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/layout/horizontal/layout-1/layout-1.module.ts b/src/app/layout/horizontal/layout-1/layout-1.module.ts new file mode 100644 index 0000000..391b15f --- /dev/null +++ b/src/app/layout/horizontal/layout-1/layout-1.module.ts @@ -0,0 +1,35 @@ +import { NgModule } from '@angular/core'; +import { MatSidenavModule } from '@angular/material/sidenav'; + +import { + FuseSidebarModule, + FuseThemeOptionsModule +} from 'src/@fuse/components'; +import { FuseSharedModule } from 'src/@fuse/shared.module'; + +import { ContentModule } from '../../components/content/content.module'; +import { FooterModule } from '../../components/footer/footer.module'; +import { NavbarModule } from '../../components/navbar/navbar.module'; +import { QuickPanelModule } from '../../components/quick-panel/quick-panel.module'; +import { ToolbarModule } from '../../components/toolbar/toolbar.module'; + +import { HorizontalLayout1Component } from './layout-1.component'; + +@NgModule({ + declarations: [HorizontalLayout1Component], + imports: [ + MatSidenavModule, + + FuseSharedModule, + FuseSidebarModule, + FuseThemeOptionsModule, + + ContentModule, + FooterModule, + NavbarModule, + QuickPanelModule, + ToolbarModule + ], + exports: [HorizontalLayout1Component] +}) +export class HorizontalLayout1Module {} diff --git a/src/app/layout/layout.module.ts b/src/app/layout/layout.module.ts new file mode 100644 index 0000000..c1db0a1 --- /dev/null +++ b/src/app/layout/layout.module.ts @@ -0,0 +1,25 @@ +import { NgModule } from '@angular/core'; + +import { VerticalLayout1Module } from './vertical/layout-1/layout-1.module'; +import { VerticalLayout2Module } from './vertical/layout-2/layout-2.module'; +import { VerticalLayout3Module } from './vertical/layout-3/layout-3.module'; + +import { HorizontalLayout1Module } from './horizontal/layout-1/layout-1.module'; + +@NgModule({ + imports: [ + VerticalLayout1Module, + VerticalLayout2Module, + VerticalLayout3Module, + + HorizontalLayout1Module + ], + exports: [ + VerticalLayout1Module, + VerticalLayout2Module, + VerticalLayout3Module, + + HorizontalLayout1Module + ] +}) +export class LayoutModule {} diff --git a/src/app/layout/vertical/layout-1/layout-1.component.html b/src/app/layout/vertical/layout-1/layout-1.component.html new file mode 100644 index 0000000..071fb52 --- /dev/null +++ b/src/app/layout/vertical/layout-1/layout-1.component.html @@ -0,0 +1,171 @@ + + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + diff --git a/src/app/layout/vertical/layout-1/layout-1.component.scss b/src/app/layout/vertical/layout-1/layout-1.component.scss new file mode 100644 index 0000000..9c9f7ff --- /dev/null +++ b/src/app/layout/vertical/layout-1/layout-1.component.scss @@ -0,0 +1,61 @@ +@import 'src/@fuse/scss/fuse'; + +vertical-layout-1 { + display: flex; + flex: 1 1 auto; + width: 100%; + height: 100%; + + #main { + position: relative; + display: flex; + flex: 1 1 auto; + flex-direction: column; + width: 100%; + height: 100%; + z-index: 1; + min-width: 0; + + // Container 1 + > .container { + position: relative; + display: flex; + flex: 1 1 0%; + width: 100%; + min-height: 0; + min-width: 0; + + // Container 2 + > .container { + position: relative; + display: flex; + flex: 1 1 0%; + flex-direction: column; + min-width: 0; + + // Container 3 (Scrollable) + > .container { + position: relative; + display: flex; + flex: 1 1 0%; + flex-direction: column; + overflow-x: hidden; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + + // Content component + content { + &.inner-scroll { + flex: 1 1 0%; + min-height: 0; + + > *:not(router-outlet) { + flex: 1 1 0%; + } + } + } + } + } + } + } +} diff --git a/src/app/layout/vertical/layout-1/layout-1.component.ts b/src/app/layout/vertical/layout-1/layout-1.component.ts new file mode 100644 index 0000000..7b4c981 --- /dev/null +++ b/src/app/layout/vertical/layout-1/layout-1.component.ts @@ -0,0 +1,59 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { FuseConfigService } from 'src/@fuse/services/config.service'; +import { navigation } from '../../../navigation/navigation'; +import { FuseConfig } from 'src/@fuse/types'; + +@Component({ + selector: 'vertical-layout-1', + templateUrl: './layout-1.component.html', + styleUrls: ['./layout-1.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class VerticalLayout1Component implements OnInit, OnDestroy { + fuseConfig: FuseConfig; + navigation: any; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {FuseConfigService} _fuseConfigService + */ + constructor(private _fuseConfigService: FuseConfigService) { + // Set the defaults + this.navigation = navigation; + + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Subscribe to config changes + this._fuseConfigService.config + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(config => { + this.fuseConfig = config; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/layout/vertical/layout-1/layout-1.module.ts b/src/app/layout/vertical/layout-1/layout-1.module.ts new file mode 100644 index 0000000..14777c0 --- /dev/null +++ b/src/app/layout/vertical/layout-1/layout-1.module.ts @@ -0,0 +1,31 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { FuseSidebarModule } from 'src/@fuse/components'; +import { FuseSharedModule } from 'src/@fuse/shared.module'; + +import { ContentModule } from '../../components/content/content.module'; +import { FooterModule } from '../../components/footer/footer.module'; +import { NavbarModule } from '../../components/navbar/navbar.module'; +import { QuickPanelModule } from '../../components/quick-panel/quick-panel.module'; +import { ToolbarModule } from '../../components/toolbar/toolbar.module'; + +import { VerticalLayout1Component } from '../../vertical/layout-1/layout-1.component'; + +@NgModule({ + declarations: [VerticalLayout1Component], + imports: [ + RouterModule, + + FuseSharedModule, + FuseSidebarModule, + + ContentModule, + FooterModule, + NavbarModule, + QuickPanelModule, + ToolbarModule + ], + exports: [VerticalLayout1Component] +}) +export class VerticalLayout1Module {} diff --git a/src/app/layout/vertical/layout-2/layout-2.component.html b/src/app/layout/vertical/layout-2/layout-2.component.html new file mode 100644 index 0000000..a1e2221 --- /dev/null +++ b/src/app/layout/vertical/layout-2/layout-2.component.html @@ -0,0 +1,165 @@ + + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + diff --git a/src/app/layout/vertical/layout-2/layout-2.component.scss b/src/app/layout/vertical/layout-2/layout-2.component.scss new file mode 100644 index 0000000..e266d7b --- /dev/null +++ b/src/app/layout/vertical/layout-2/layout-2.component.scss @@ -0,0 +1,48 @@ +@import "src/@fuse/scss/fuse"; + +vertical-layout-2 { + display: flex; + flex: 1 1 auto; + width: 100%; + height: 100%; + + #main { + position: relative; + display: flex; + flex: 1 1 auto; + flex-direction: column; + width: 100%; + height: 100%; + z-index: 1; + min-width: 0; + + // Container 1 (Scrollable) + > .container { + position: relative; + display: flex; + flex: 1 1 auto; + flex-direction: column; + width: 100%; + overflow-x: hidden; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + + // Container 2 + > .container { + position: relative; + display: flex; + flex: 1 0 auto; + width: 100%; + + // Container 3 + > .container { + position: relative; + display: flex; + flex: 1 1 auto; + flex-direction: column; + min-width: 0; + } + } + } + } +} \ No newline at end of file diff --git a/src/app/layout/vertical/layout-2/layout-2.component.ts b/src/app/layout/vertical/layout-2/layout-2.component.ts new file mode 100644 index 0000000..f903320 --- /dev/null +++ b/src/app/layout/vertical/layout-2/layout-2.component.ts @@ -0,0 +1,58 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { FuseConfigService } from 'src/@fuse/services/config.service'; +import { navigation } from '../../../navigation/navigation'; + +@Component({ + selector: 'vertical-layout-2', + templateUrl: './layout-2.component.html', + styleUrls: ['./layout-2.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class VerticalLayout2Component implements OnInit, OnDestroy { + fuseConfig: any; + navigation: any; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {FuseConfigService} _fuseConfigService + */ + constructor(private _fuseConfigService: FuseConfigService) { + // Set the defaults + this.navigation = navigation; + + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Subscribe to config changes + this._fuseConfigService.config + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(config => { + this.fuseConfig = config; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/layout/vertical/layout-2/layout-2.module.ts b/src/app/layout/vertical/layout-2/layout-2.module.ts new file mode 100644 index 0000000..05f16c2 --- /dev/null +++ b/src/app/layout/vertical/layout-2/layout-2.module.ts @@ -0,0 +1,31 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { FuseSidebarModule } from 'src/@fuse/components'; +import { FuseSharedModule } from 'src/@fuse/shared.module'; + +import { ContentModule } from '../../components/content/content.module'; +import { FooterModule } from '../../components/footer/footer.module'; +import { NavbarModule } from '../../components/navbar/navbar.module'; +import { QuickPanelModule } from '../../components/quick-panel/quick-panel.module'; +import { ToolbarModule } from '../../components/toolbar/toolbar.module'; + +import { VerticalLayout2Component } from './layout-2.component'; + +@NgModule({ + declarations: [VerticalLayout2Component], + imports: [ + RouterModule, + + FuseSharedModule, + FuseSidebarModule, + + ContentModule, + FooterModule, + NavbarModule, + QuickPanelModule, + ToolbarModule + ], + exports: [VerticalLayout2Component] +}) +export class VerticalLayout2Module {} diff --git a/src/app/layout/vertical/layout-3/layout-3.component.html b/src/app/layout/vertical/layout-3/layout-3.component.html new file mode 100644 index 0000000..9cb5e89 --- /dev/null +++ b/src/app/layout/vertical/layout-3/layout-3.component.html @@ -0,0 +1,118 @@ + + + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + diff --git a/src/app/layout/vertical/layout-3/layout-3.component.scss b/src/app/layout/vertical/layout-3/layout-3.component.scss new file mode 100644 index 0000000..c0c8b1c --- /dev/null +++ b/src/app/layout/vertical/layout-3/layout-3.component.scss @@ -0,0 +1,49 @@ +@import "src/@fuse/scss/fuse"; + +vertical-layout-3 { + display: flex; + flex: 1 1 auto; + width: 100%; + height: 100%; + + #main { + position: relative; + display: flex; + flex: 1 1 auto; + flex-direction: column; + width: 100%; + height: 100%; + z-index: 1; + min-width: 0; + + // Container 1 (Scrollable) + > .container { + position: relative; + display: flex; + flex: 1 1 auto; + flex-direction: column; + width: 100%; + overflow-x: hidden; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + + // Container 2 + > .container { + position: relative; + display: flex; + flex: 1 0 auto; + width: 100%; + min-width: 0; + padding: 32px; + + // Content component + > content { + flex: 1 1 auto; + min-width: 0; + + @include mat-elevation(3); + } + } + } + } +} \ No newline at end of file diff --git a/src/app/layout/vertical/layout-3/layout-3.component.ts b/src/app/layout/vertical/layout-3/layout-3.component.ts new file mode 100644 index 0000000..b82150f --- /dev/null +++ b/src/app/layout/vertical/layout-3/layout-3.component.ts @@ -0,0 +1,58 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { FuseConfigService } from 'src/@fuse/services/config.service'; +import { navigation } from '../../../navigation/navigation'; + +@Component({ + selector: 'vertical-layout-3', + templateUrl: './layout-3.component.html', + styleUrls: ['./layout-3.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class VerticalLayout3Component implements OnInit, OnDestroy { + fuseConfig: any; + navigation: any; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {FuseConfigService} _fuseConfigService + */ + constructor(private _fuseConfigService: FuseConfigService) { + // Set the defaults + this.navigation = navigation; + + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Subscribe to config changes + this._fuseConfigService.config + .pipe(takeUntil(this._unsubscribeAll)) + .subscribe(config => { + this.fuseConfig = config; + }); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } +} diff --git a/src/app/layout/vertical/layout-3/layout-3.module.ts b/src/app/layout/vertical/layout-3/layout-3.module.ts new file mode 100644 index 0000000..5db1240 --- /dev/null +++ b/src/app/layout/vertical/layout-3/layout-3.module.ts @@ -0,0 +1,31 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { FuseSidebarModule } from 'src/@fuse/components/index'; +import { FuseSharedModule } from 'src/@fuse/shared.module'; + +import { ContentModule } from '../../components/content/content.module'; +import { FooterModule } from '../../components/footer/footer.module'; +import { NavbarModule } from '../../components/navbar/navbar.module'; +import { QuickPanelModule } from '../../components/quick-panel/quick-panel.module'; +import { ToolbarModule } from '../../components/toolbar/toolbar.module'; + +import { VerticalLayout3Component } from './layout-3.component'; + +@NgModule({ + declarations: [VerticalLayout3Component], + imports: [ + RouterModule, + + FuseSharedModule, + FuseSidebarModule, + + ContentModule, + FooterModule, + NavbarModule, + QuickPanelModule, + ToolbarModule + ], + exports: [VerticalLayout3Component] +}) +export class VerticalLayout3Module {} diff --git a/src/app/navigation/i18n/en.ts b/src/app/navigation/i18n/en.ts new file mode 100644 index 0000000..384cbef --- /dev/null +++ b/src/app/navigation/i18n/en.ts @@ -0,0 +1,46 @@ +export const locale = { + lang: 'en', + data: { + navigation: { + dashboard: { + title: 'Dashboard', + ucap: { + title: 'UCAP' + }, + mariadb: { + title: 'MariaDB' + } + }, + statistics: { + title: 'Statistics', + system: { + title: 'System' + }, + process: { + title: 'Process' + }, + connections: { + title: 'Connections' + }, + messages: { + title: 'Messages' + } + }, + settings: { + title: 'Settings', + general: { + title: 'General' + }, + dashboard: { + title: 'Dashboard' + }, + alarm: { + title: 'Alarm' + }, + etc: { + title: 'ETC' + } + } + } + } +}; diff --git a/src/app/navigation/i18n/ko.ts b/src/app/navigation/i18n/ko.ts new file mode 100644 index 0000000..2b0bfac --- /dev/null +++ b/src/app/navigation/i18n/ko.ts @@ -0,0 +1,46 @@ +export const locale = { + lang: 'ko', + data: { + navigation: { + dashboard: { + title: '데시보드', + ucap: { + title: 'UCAP' + }, + mariadb: { + title: 'MariaDB' + } + }, + statistics: { + title: '통계', + system: { + title: '시스템' + }, + process: { + title: '프로세스' + }, + connections: { + title: '접속' + }, + messages: { + title: '메시지' + } + }, + settings: { + title: '설정', + general: { + title: '일반' + }, + dashboard: { + title: '데시보드' + }, + alarm: { + title: '알림' + }, + etc: { + title: '기타' + } + } + } + } +}; diff --git a/src/app/navigation/navigation.ts b/src/app/navigation/navigation.ts new file mode 100644 index 0000000..a4e41a0 --- /dev/null +++ b/src/app/navigation/navigation.ts @@ -0,0 +1,78 @@ +import { FuseNavigation } from 'src/@fuse/types'; + +export const navigation: FuseNavigation[] = [ + { + id: 'dashboard', + title: 'Dashboard', + translate: 'navigation.dashboard.title', + type: 'collapsable', + icon: 'dashboard', + children: [ + { + id: 'dashboard-ucap', + title: 'UCAP', + translate: 'navigation.dashboard.ucap.title', + type: 'item', + icon: 'email', + url: '/dashboard/main' + }, + { + id: 'dashboard-mariadb', + title: 'MariaDB', + translate: 'navigation.dashboard.mariadb.title', + type: 'item', + icon: 'email', + url: '/dashboard/mariadb' + } + ] + }, + { + id: 'statistics', + title: 'Statistics', + icon: 'insert_chart', + translate: 'navigation.statistics.title', + type: 'item', + url: '/statistics' + }, + { + id: 'settings', + title: 'Settings', + icon: 'settings', + translate: 'navigation.settings.title', + type: 'collapsable', + children: [ + { + id: 'settings-general', + title: 'General', + translate: 'navigation.settings.general.title', + type: 'item', + icon: 'settings_applications', + url: '/settings/general' + }, + { + id: 'settings-dashboard', + title: 'Dashboard', + translate: 'navigation.settings.dashboard.title', + type: 'item', + icon: 'dashboard', + url: '/settings/dashboard' + }, + { + id: 'settings-alarm', + title: 'Alarm', + translate: 'navigation.settings.alarm.title', + type: 'item', + icon: 'alarm', + url: '/settings/alarm' + }, + { + id: 'settings-etc', + title: 'Etc', + translate: 'navigation.settings.etc.title', + type: 'item', + icon: 'subject', + url: '/settings/etc' + } + ] + } +]; diff --git a/src/app/pages/accounts/accounts-routing.module.ts b/src/app/pages/accounts/accounts-routing.module.ts new file mode 100644 index 0000000..8a6c2fb --- /dev/null +++ b/src/app/pages/accounts/accounts-routing.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { SigninComponent } from './component/signin.component'; + +const routes: Routes = [ + { + path: 'signin', + component: SigninComponent + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class AccountsRoutingModule {} diff --git a/src/app/pages/accounts/accounts.module.ts b/src/app/pages/accounts/accounts.module.ts new file mode 100644 index 0000000..55e6a82 --- /dev/null +++ b/src/app/pages/accounts/accounts.module.ts @@ -0,0 +1,44 @@ +import { NgModule } from '@angular/core'; + +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTabsModule } from '@angular/material/tabs'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatInputModule } from '@angular/material/input'; + +import { ChartsModule } from 'ng2-charts'; +import { NgxChartsModule } from '@swimlane/ngx-charts'; + +import { FuseSharedModule } from 'src/@fuse/shared.module'; +import { FuseWidgetModule } from 'src/@fuse/components/widget/widget.module'; + +import { AccountsRoutingModule } from './accounts-routing.module'; + +import { COMPONENTS } from './component'; + +@NgModule({ + imports: [ + MatButtonModule, + MatCheckboxModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatSelectModule, + MatTabsModule, + + ChartsModule, + NgxChartsModule, + + FuseSharedModule, + FuseWidgetModule, + + AccountsRoutingModule + ], + declarations: [...COMPONENTS], + providers: [] +}) +export class AccountsModule {} diff --git a/src/app/pages/accounts/component/index.ts b/src/app/pages/accounts/component/index.ts new file mode 100644 index 0000000..f3e557c --- /dev/null +++ b/src/app/pages/accounts/component/index.ts @@ -0,0 +1,3 @@ +import { SigninComponent } from './signin.component'; + +export const COMPONENTS = [SigninComponent]; diff --git a/src/app/pages/accounts/component/signin.component.html b/src/app/pages/accounts/component/signin.component.html new file mode 100644 index 0000000..10b661c --- /dev/null +++ b/src/app/pages/accounts/component/signin.component.html @@ -0,0 +1,112 @@ +
+
+ + +
+ Welcome to the UCAP APM! +
+ +
+ +
+
+ +
+
+ + +
LOGIN TO YOUR ACCOUNT
+ +
+ + Username + + perm_identity + + Username is required + + + + + Password + + vpn_key + + Password is required + + + + + + +
+ + + + +
+
+
diff --git a/src/app/pages/accounts/component/signin.component.scss b/src/app/pages/accounts/component/signin.component.scss new file mode 100644 index 0000000..e88b03f --- /dev/null +++ b/src/app/pages/accounts/component/signin.component.scss @@ -0,0 +1,197 @@ +@import 'src/@fuse/scss/fuse'; + +signin { + #signin { + width: 100%; + overflow: hidden; + background: url('/assets/images/backgrounds/dark-material-bg.jpg') no-repeat; + background-size: cover; + + #signin-intro { + padding: 128px; + + @include media-breakpoint('sm') { + padding: 128px 64px; + } + + .logo { + width: 128px; + margin-bottom: 32px; + } + + .title { + font-size: 42px; + font-weight: 300; + line-height: 1; + } + + .description { + padding-top: 16px; + font-size: 14px; + max-width: 600px; + } + } + + #signin-form-wrapper { + width: 400px; + min-width: 400px; + max-width: 400px; + overflow: auto; + -webkit-overflow-scrolling: touch; + + @include mat-elevation(16); + + @include media-breakpoint('sm') { + width: 360px; + min-width: 360px; + max-width: 360px; + } + + @include media-breakpoint('xs') { + width: 100%; + min-width: 100%; + max-width: 100%; + } + + #signin-form { + padding: 128px 48px 48px 48px; + + @include media-breakpoint('xs') { + text-align: center; + padding: 24px; + } + + .logo { + width: 128px; + margin: 32px auto; + } + + .title { + font-size: 21px; + } + + .description { + padding-top: 8px; + } + + form { + width: 100%; + padding-top: 32px; + + mat-form-field { + width: 100%; + + @include media-breakpoint('xs') { + width: 80%; + } + } + + mat-checkbox { + margin: 0; + } + + .remember-forgot-password { + font-size: 13px; + margin-top: 8px; + + .remember-me { + margin-bottom: 16px; + } + + .forgot-password { + font-size: 13px; + font-weight: 600; + margin-bottom: 16px; + } + } + + .submit-button { + width: 100%; + margin: 16px auto; + display: block; + + @include media-breakpoint('xs') { + width: 80%; + } + } + } + + .separator { + font-size: 15px; + font-weight: 600; + margin: 24px auto; + position: relative; + overflow: hidden; + width: 100px; + text-align: center; + + .text { + display: inline-flex; + position: relative; + padding: 0 8px; + z-index: 9999; + + &:before, + &:after { + content: ''; + display: block; + width: 30px; + position: absolute; + top: 10px; + border-top: 1px solid; + } + + &:before { + right: 100%; + } + + &:after { + left: 100%; + } + } + } + + button { + &.google, + &.facebook { + width: 70%; + text-transform: none; + color: #ffffff; + font-size: 13px; + + @include media-breakpoint('xs') { + width: 60%; + } + + mat-icon { + color: #ffffff; + margin: 0 8px 0 0; + } + } + + &.google { + background-color: #d73d32; + margin-bottom: 8px; + } + + &.facebook { + background-color: rgb(63, 92, 154); + } + } + + .register { + margin: 32px auto 24px auto; + width: 250px; + font-weight: 600; + + .text { + margin-right: 8px; + } + + .link { + } + } + } + } + } +} diff --git a/src/app/pages/accounts/component/signin.component.ts b/src/app/pages/accounts/component/signin.component.ts new file mode 100644 index 0000000..ce8ad2c --- /dev/null +++ b/src/app/pages/accounts/component/signin.component.ts @@ -0,0 +1,76 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; + +import { FuseConfigService } from 'src/@fuse/services/config.service'; +import { fuseAnimations } from 'src/@fuse/animations'; +import { AuthService } from 'src/modules/auth/service/auth.service'; +import { take } from 'rxjs/operators'; + +@Component({ + selector: 'signin', + templateUrl: './signin.component.html', + styleUrls: ['./signin.component.scss'], + encapsulation: ViewEncapsulation.None, + animations: fuseAnimations +}) +export class SigninComponent implements OnInit { + signinForm: FormGroup; + + /** + * Constructor + */ + constructor( + private _fuseConfigService: FuseConfigService, + private formBuilder: FormBuilder, + private authService: AuthService + ) { + // Configure the layout + this._fuseConfigService.config = { + layout: { + navbar: { + hidden: true + }, + toolbar: { + hidden: true + }, + footer: { + hidden: true + }, + sidepanel: { + hidden: true + } + } + }; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + this.signinForm = this.formBuilder.group({ + username: ['', [Validators.required]], + password: ['', Validators.required] + }); + } + + onSubmit(): void { + this.authService + .authenticate( + this.signinForm.get('username').value, + this.signinForm.get('password').value + ) + .pipe(take(1)) + .subscribe( + res => { + console.log(res); + }, + err => { + console.log(err); + } + ); + } +} diff --git a/src/app/pages/accounts/component/signin.theme.scss b/src/app/pages/accounts/component/signin.theme.scss new file mode 100644 index 0000000..f4af4a1 --- /dev/null +++ b/src/app/pages/accounts/component/signin.theme.scss @@ -0,0 +1,35 @@ +@mixin signin-theme($theme) { + $background: map-get($theme, background); + $foreground: map-get($theme, foreground); + $accent: map-get($theme, accent); + $is-dark: map-get($theme, is-dark); + + signin { + #signin { + #signin-intro { + color: white; + } + + #signin-form-wrapper { + @if ($is-dark) { + background: mat-color($fuse-navy, 600); + } @else { + background: map-get($background, card); + } + + #signin-form { + .separator { + color: map-get($foreground, divider); + + .text { + &:before, + &:after { + border-top-color: map-get($foreground, divider); + } + } + } + } + } + } + } +} diff --git a/src/app/pages/dashboard/component/dashboard.component.html b/src/app/pages/dashboard/component/dashboard.component.html new file mode 100644 index 0000000..a26893a --- /dev/null +++ b/src/app/pages/dashboard/component/dashboard.component.html @@ -0,0 +1,69 @@ +
+ +
+ +
+

Dashboard

+
+ + + + +
+ + + +
+ + + +
+ + +
diff --git a/src/app/pages/dashboard/component/dashboard.component.scss b/src/app/pages/dashboard/component/dashboard.component.scss new file mode 100644 index 0000000..ba63361 --- /dev/null +++ b/src/app/pages/dashboard/component/dashboard.component.scss @@ -0,0 +1,74 @@ +@import 'src/@fuse/scss/fuse'; + +#dashboard-analytics { + .main-widget { + display: flex; + flex-direction: column; + } + + // .dashboard-iframe { + // display: flex; + // height: calc(100vh - 110px); + // flex-direction: column; + // } + + .draggable { + padding: 10px; + width: 200px; + border: solid 2px #000; + margin-left: 20px; + text-align: center; + font-family: Arial, Helvetica, sans-serif; + } + + .content { + // display: flex; + // flex: 1 1 auto; + // padding: 32px; + // min-width: 0; + + display: flex; + height: calc(100vh - 110px); + flex-direction: column; + + @include media-breakpoint('lt-lg') { + flex-direction: column; + } + + .left { + display: flex; + flex-direction: column; + flex: 1 1 auto; + min-width: 0; + + .widget { + flex: 1 1 auto; + min-width: 0; + } + } + + .right { + display: flex; + flex: 0 0 auto; + width: 320px; + min-width: 320px; + max-width: 320px; + + @include media-breakpoint('lt-lg') { + flex: 1 0 100%; + margin-top: 32px; + width: 100%; + min-width: 0; + max-width: none; + } + + .fuse-card { + @include media-breakpoint('lt-lg') { + width: 100%; + min-width: 0; + max-width: none; + } + } + } + } +} diff --git a/src/app/pages/dashboard/component/dashboard.component.ts b/src/app/pages/dashboard/component/dashboard.component.ts new file mode 100644 index 0000000..552645c --- /dev/null +++ b/src/app/pages/dashboard/component/dashboard.component.ts @@ -0,0 +1,114 @@ +import { + Component, + OnInit, + ViewEncapsulation, + AfterContentInit, + AfterViewInit, + DoCheck, + ViewChild, + ElementRef +} from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; + +import { fuseAnimations } from 'src/@fuse/animations'; +import { FuseConfigService } from 'src/@fuse/services/config.service'; + +import { GridsterConfig, GridsterItem } from 'angular-gridster2'; +import { DashboardService, IComponent } from '../service/dashboard.service'; +import { Router, ActivatedRoute } from '@angular/router'; +import { map, take } from 'rxjs/operators'; + +@Component({ + selector: 'dashboard', + templateUrl: './dashboard.component.html', + styleUrls: ['./dashboard.component.scss'], + encapsulation: ViewEncapsulation.None, + animations: fuseAnimations +}) +export class DashboardComponent implements OnInit { + widgets: any; + dashboardUrl: string; + + @ViewChild('dashboardIFrame', { static: true }) dashboardIFrame: ElementRef; + + /** + * Constructor + */ + constructor( + private router: Router, + private activatedRoute: ActivatedRoute, + public domSanitizer: DomSanitizer, + public dashboardService: DashboardService, + private fuseConfigService: FuseConfigService + ) { + this.router.routeReuseStrategy.shouldReuseRoute = function() { + return false; + }; + + this.fuseConfigService.config = { + layout: { + toolbar: { + hidden: true + }, + footer: { + hidden: true + }, + sidepanel: { + hidden: true + } + } + }; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Get the widgets from the service + + this.activatedRoute.paramMap + .pipe( + take(1), + map(params => { + const dashboardId: string = params.get('id'); + let dashboardUrl: string = ''; + switch (dashboardId) { + case 'main': + dashboardUrl = + 'http://localhost:3000/d/dNOFxlDZz/system?theme=light&refresh=5s&kiosk'; + break; + case 'mariadb': + dashboardUrl = + 'http://localhost:8888/sources/0/dashboards/4?tempVars%5Bhost%5D=telegraf&lower=now%28%29%20-%2015m&present=true'; + break; + + default: + break; + } + + this.dashboardIFrame.nativeElement.src = dashboardUrl; + }) + ) + .subscribe(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + get options(): GridsterConfig { + return this.dashboardService.options; + } + + get layout(): GridsterItem[] { + return this.dashboardService.layout; + } + + get components(): IComponent[] { + return this.dashboardService.components; + } +} diff --git a/src/app/pages/dashboard/component/index.ts b/src/app/pages/dashboard/component/index.ts new file mode 100644 index 0000000..b51ba66 --- /dev/null +++ b/src/app/pages/dashboard/component/index.ts @@ -0,0 +1,3 @@ +import { DashboardComponent } from './dashboard.component'; + +export const COMPONENTS = [DashboardComponent]; diff --git a/src/app/pages/dashboard/dashboard-routing.module.ts b/src/app/pages/dashboard/dashboard-routing.module.ts new file mode 100644 index 0000000..aa50d56 --- /dev/null +++ b/src/app/pages/dashboard/dashboard-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { DashboardComponent } from './component/dashboard.component'; + +const routes: Routes = [ + { + path: ':id', + component: DashboardComponent + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class DashboardRoutingModule {} diff --git a/src/app/pages/dashboard/dashboard.module.ts b/src/app/pages/dashboard/dashboard.module.ts new file mode 100644 index 0000000..1a08b22 --- /dev/null +++ b/src/app/pages/dashboard/dashboard.module.ts @@ -0,0 +1,49 @@ +import { NgModule } from '@angular/core'; + +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTabsModule } from '@angular/material/tabs'; + +import { GridsterModule } from 'angular-gridster2'; + +import { ChartsModule } from 'ng2-charts'; +import { NgxChartsModule } from '@swimlane/ngx-charts'; + +import { FuseSharedModule } from 'src/@fuse/shared.module'; +import { FuseWidgetModule } from 'src/@fuse/components/widget/widget.module'; + +import { ChartModule as APMChartModule } from 'src/modules/chart/chart.module'; + +import { DashboardRoutingModule } from './dashboard-routing.module'; + +import { COMPONENTS } from './component'; +import { DIRECTIVES } from './directive'; +import { SERVICES } from './service'; + +@NgModule({ + imports: [ + MatButtonModule, + MatFormFieldModule, + MatIconModule, + MatMenuModule, + MatSelectModule, + MatTabsModule, + + GridsterModule, + ChartsModule, + NgxChartsModule, + + FuseSharedModule, + FuseWidgetModule, + + APMChartModule, + + DashboardRoutingModule + ], + declarations: [...COMPONENTS, ...DIRECTIVES], + providers: [...SERVICES] +}) +export class DashboardModule {} diff --git a/src/app/pages/dashboard/directive/index.ts b/src/app/pages/dashboard/directive/index.ts new file mode 100644 index 0000000..b3261d4 --- /dev/null +++ b/src/app/pages/dashboard/directive/index.ts @@ -0,0 +1,3 @@ +import { LayoutItemDirective } from './layout-item.directive'; + +export const DIRECTIVES = [LayoutItemDirective]; diff --git a/src/app/pages/dashboard/directive/layout-item.directive.ts b/src/app/pages/dashboard/directive/layout-item.directive.ts new file mode 100644 index 0000000..2d0f18a --- /dev/null +++ b/src/app/pages/dashboard/directive/layout-item.directive.ts @@ -0,0 +1,40 @@ +import { + Directive, + Input, + OnChanges, + ViewContainerRef, + ComponentFactoryResolver, + ComponentRef +} from '@angular/core'; +import { GaugeComponent } from 'src/modules/chart/component/gauge.component'; +import { GraphComponent } from 'src/modules/chart/component/graph.component'; +import { LineComponent } from 'src/modules/chart/component/line.component'; + +const components = { + gaugeComponent: GaugeComponent, + graphComponent: GraphComponent, + lineChart: LineComponent +}; + +@Directive({ + selector: '[appLayoutItem]' +}) +export class LayoutItemDirective implements OnChanges { + @Input() componentRef: string; + + component: ComponentRef; + + constructor( + private container: ViewContainerRef, + private resolver: ComponentFactoryResolver + ) {} + + ngOnChanges(): void { + const component = components[this.componentRef]; + + if (component) { + const factory = this.resolver.resolveComponentFactory(component); + this.component = this.container.createComponent(factory); + } + } +} diff --git a/src/app/pages/dashboard/service/dashboard.service.ts b/src/app/pages/dashboard/service/dashboard.service.ts new file mode 100644 index 0000000..833fe71 --- /dev/null +++ b/src/app/pages/dashboard/service/dashboard.service.ts @@ -0,0 +1,75 @@ +import { Injectable } from '@angular/core'; +import { GridsterConfig, GridsterItem } from 'angular-gridster2'; +import { UUID } from 'angular2-uuid'; + +export interface IComponent { + id: string; + componentRef: string; +} + +@Injectable({ + providedIn: 'root' +}) +export class DashboardService { + public options: GridsterConfig = { + gridType: 'fit', + compactType: 'compactLeft&Up', + displayGrid: 'onDrag&Resize', + draggable: { + enabled: true + }, + pushItems: true, + resizable: { + enabled: true + }, + margin: 5 + }; + + public layout: GridsterItem[] = []; + public components: IComponent[] = []; + + dropId: string; + + constructor() {} + + addItem(): void { + this.layout.push({ + cols: 5, + id: UUID.UUID(), + rows: 5, + x: 0, + y: 0 + }); + } + + deleteItem(id: string): void { + const item = this.layout.find(d => d.id === id); + this.layout.splice(this.layout.indexOf(item), 1); + const comp = this.components.find(c => c.id === id); + this.components.splice(this.components.indexOf(comp), 1); + } + + setDropId(dropId: string): void { + this.dropId = dropId; + } + + dropItem(dragId: string): void { + const { components } = this; + const comp: IComponent = components.find(c => c.id === this.dropId); + const updateIdx: number = comp + ? components.indexOf(comp) + : components.length; + const componentItem: IComponent = { + id: this.dropId, + componentRef: dragId + }; + this.components = Object.assign([], this.components, { + [updateIdx]: componentItem + }); + } + + getComponentRef(id: string): string { + const comp = this.components.find(c => c.id === id); + return comp ? comp.componentRef : null; + } +} diff --git a/src/app/pages/dashboard/service/index.ts b/src/app/pages/dashboard/service/index.ts new file mode 100644 index 0000000..23cd12b --- /dev/null +++ b/src/app/pages/dashboard/service/index.ts @@ -0,0 +1,3 @@ +import { DashboardService } from './dashboard.service'; + +export const SERVICES = [DashboardService]; diff --git a/src/app/pages/pages-routing.module.ts b/src/app/pages/pages-routing.module.ts new file mode 100644 index 0000000..a2d1462 --- /dev/null +++ b/src/app/pages/pages-routing.module.ts @@ -0,0 +1,27 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +const routes: Routes = [ + { + path: 'accounts', + loadChildren: './accounts/accounts.module#AccountsModule' + }, + { + path: 'dashboard', + loadChildren: './dashboard/dashboard.module#DashboardModule' + }, + { + path: 'statistics', + loadChildren: './statistics/statistics.module#StatisticsModule' + }, + { + path: 'settings', + loadChildren: './settings/settings.module#SettingsModule' + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class PagesRoutingModule {} diff --git a/src/app/pages/pages.module.ts b/src/app/pages/pages.module.ts new file mode 100644 index 0000000..82718f0 --- /dev/null +++ b/src/app/pages/pages.module.ts @@ -0,0 +1,9 @@ +import { NgModule } from '@angular/core'; + +import { FuseSharedModule } from 'src/@fuse/shared.module'; +import { PagesRoutingModule } from './pages-routing.module'; + +@NgModule({ + imports: [FuseSharedModule, PagesRoutingModule] +}) +export class PagesModule {} diff --git a/src/app/pages/settings/alarm/component/index.ts b/src/app/pages/settings/alarm/component/index.ts new file mode 100644 index 0000000..f8f7aa6 --- /dev/null +++ b/src/app/pages/settings/alarm/component/index.ts @@ -0,0 +1,3 @@ +import { MainComponent } from './main.component'; + +export const COMPONENTS = [MainComponent]; diff --git a/src/app/pages/settings/alarm/component/main.component.html b/src/app/pages/settings/alarm/component/main.component.html new file mode 100644 index 0000000..d371cd4 --- /dev/null +++ b/src/app/pages/settings/alarm/component/main.component.html @@ -0,0 +1,23 @@ +
+ +
+ + + +
+ +
+

Alarm

+
+ + + +
+ +
+ +
+ +
+ +
diff --git a/src/app/pages/settings/alarm/component/main.component.scss b/src/app/pages/settings/alarm/component/main.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/settings/alarm/component/main.component.ts b/src/app/pages/settings/alarm/component/main.component.ts new file mode 100644 index 0000000..d46dd43 --- /dev/null +++ b/src/app/pages/settings/alarm/component/main.component.ts @@ -0,0 +1,41 @@ +import { + Component, + OnInit, + ViewEncapsulation, + AfterContentInit, + AfterViewInit, + DoCheck +} from '@angular/core'; + +import { fuseAnimations } from 'src/@fuse/animations'; +import { FuseConfigService } from 'src/@fuse/services/config.service'; + +@Component({ + selector: 'app-pages-settings-alarm', + templateUrl: './main.component.html', + styleUrls: ['./main.component.scss'], + animations: fuseAnimations +}) +export class MainComponent implements OnInit { + widgets: any; + + /** + * Constructor + */ + constructor(private fuseConfigService: FuseConfigService) {} + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Get the widgets from the service + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- +} diff --git a/src/app/pages/settings/dashboard/component/details.component.html b/src/app/pages/settings/dashboard/component/details.component.html new file mode 100644 index 0000000..0d4fbbe --- /dev/null +++ b/src/app/pages/settings/dashboard/component/details.component.html @@ -0,0 +1,124 @@ +
+ check_box + + + Select a Dashboard + +
+ +
+
+ + +
+ + + + + + + +
+
+ +
+
+ + Title + + + + + Description + + {{ description.value.length }} / 500 + + + +
+
+
diff --git a/src/app/pages/settings/dashboard/component/details.component.scss b/src/app/pages/settings/dashboard/component/details.component.scss new file mode 100644 index 0000000..f5ae123 --- /dev/null +++ b/src/app/pages/settings/dashboard/component/details.component.scss @@ -0,0 +1,47 @@ +@import 'src/@fuse/scss/fuse'; + +app-pages-settings-dashboard-details { + display: flex; + flex: 1 0 auto; + flex-direction: column; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + + .dashboard-header { + padding: 24px; + border-bottom: 1px solid; + + .actions { + min-width: 88px; + } + } + + .dashboard-content { + padding: 24px; + + .title { + font-size: 17px; + font-weight: 600; + } + + .tag { + font-size: 11px; + border-radius: 2px; + margin: 8px 4px 0 0; + padding: 3px 8px; + + .tag-color { + width: 8px; + height: 8px; + margin-right: 8px; + border-radius: 50%; + } + } + + .dates { + .mat-form-field { + width: auto !important; + } + } + } +} diff --git a/src/app/pages/settings/dashboard/component/details.component.ts b/src/app/pages/settings/dashboard/component/details.component.ts new file mode 100644 index 0000000..00729ba --- /dev/null +++ b/src/app/pages/settings/dashboard/component/details.component.ts @@ -0,0 +1,151 @@ +import { + Component, + OnDestroy, + OnInit, + ViewChild, + ViewEncapsulation, + Input +} from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { Subject } from 'rxjs'; +import { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators'; + +import { FuseUtils } from 'src/@fuse/utils'; +import { fuseAnimations } from 'src/@fuse/animations'; +import { Dashboard } from 'src/modules/dashboard/model/Dashboard'; + +@Component({ + selector: 'app-pages-settings-dashboard-details', + templateUrl: './details.component.html', + styleUrls: ['./details.component.scss'], + encapsulation: ViewEncapsulation.None, + animations: fuseAnimations +}) +export class DetailsComponent implements OnInit, OnDestroy { + @Input() + dashboard: Dashboard; + tags: any[]; + formType: string; + dashboardForm: FormGroup; + + @ViewChild('titleInput', { static: false }) + titleInputField; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {TodoService} _dashboardService + * @param {FormBuilder} _formBuilder + */ + constructor(private _formBuilder: FormBuilder) { + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + if (undefined !== this.dashboard) { + this.dashboardForm = this.createDashboardForm(); + } + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Focus title field + */ + focusTitleField(): void { + setTimeout(() => { + this.titleInputField.nativeElement.focus(); + }); + } + + /** + * Create dashboard form + * + * @returns {FormGroup} + */ + createDashboardForm(): FormGroup { + return this._formBuilder.group({ + id: [this.dashboard.id], + title: [this.dashboard.title], + description: [this.dashboard.description] + }); + } + + /** + * Toggle star + * + * @param event + */ + toggleStar(event): void { + event.stopPropagation(); + } + + /** + * Toggle important + * + * @param event + */ + toggleImportant(event): void { + event.stopPropagation(); + } + + /** + * Toggle Completed + * + * @param event + */ + toggleCompleted(event): void { + event.stopPropagation(); + } + + /** + * Toggle Deleted + * + * @param event + */ + toggleDeleted(event): void { + event.stopPropagation(); + } + + /** + * Toggle tag on dashboard + * + * @param tagId + */ + toggleTagOnTodo(tagId): void {} + + /** + * Has tag? + * + * @param tagId + * @returns {any} + */ + hasTag(tagId): any {} + + /** + * Add dashboard + */ + addTodo(): void {} +} diff --git a/src/app/pages/settings/dashboard/component/index.ts b/src/app/pages/settings/dashboard/component/index.ts new file mode 100644 index 0000000..4e7c7bc --- /dev/null +++ b/src/app/pages/settings/dashboard/component/index.ts @@ -0,0 +1,11 @@ +import { DetailsComponent } from './details.component'; +import { ListItemComponent } from './list-item.component'; +import { ListComponent } from './list.component'; +import { MainComponent } from './main.component'; + +export const COMPONENTS = [ + DetailsComponent, + ListItemComponent, + ListComponent, + MainComponent +]; diff --git a/src/app/pages/settings/dashboard/component/list-item.component.html b/src/app/pages/settings/dashboard/component/list-item.component.html new file mode 100644 index 0000000..613ff97 --- /dev/null +++ b/src/app/pages/settings/dashboard/component/list-item.component.html @@ -0,0 +1,96 @@ +
+ + drag_handle + + + + +
+
+
+ {{ dashboard.title }} +
+
+ +
+
+
+ {{ dashboard.url }} +
+
+
+ +
+ + + + + + + + + + + +
+
+
diff --git a/src/app/pages/settings/dashboard/component/list-item.component.scss b/src/app/pages/settings/dashboard/component/list-item.component.scss new file mode 100644 index 0000000..3083b60 --- /dev/null +++ b/src/app/pages/settings/dashboard/component/list-item.component.scss @@ -0,0 +1,107 @@ +@import 'src/@fuse/scss/fuse'; + +app-pages-settings-dashboard-list-item { + display: block; + position: relative; + padding: 16px 16px 16px 24px; + border-bottom: 1px solid; + text-transform: none; + cursor: pointer; + flex-shrink: 0; + + .handle { + height: 48px; + line-height: 48px; + cursor: move; + user-select: none; + } + + &.move-disabled { + .handle { + display: none; + } + } + + .tags { + .tag { + font-size: 11px; + border-radius: 2px; + margin: 8px 4px 0 0; + padding: 3px 8px; + + .tag-color { + width: 8px; + height: 8px; + margin-right: 8px; + border-radius: 50%; + } + } + } + + &.completed { + .title, + .notes { + text-decoration: line-through; + } + } + + .info { + margin: 0 16px 0 8px; + + .title { + font-size: 15px; + font-weight: 600; + } + + .notes { + margin-top: 4px; + } + } + + .buttons { + .is-starred { + margin: 0 0 0 16px; + } + + .is-important { + margin: 0; + } + } + + &:not(.has-handle):not(.move-disabled), + &.has-handle [ngxdraghandle], + &.has-handle [ngxDragHandle] { + cursor: move; + } + + .ngx-dnd-content { + user-select: none; + } + + &.gu-mirror { + position: fixed !important; + margin: 0 !important; + z-index: 9999 !important; + opacity: 0.8; + -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=80)'; + filter: alpha(opacity=80); + @include mat-elevation(7); + } + + &.gu-hide { + display: none !important; + } + + &.gu-unselectable { + -webkit-user-select: none !important; + -moz-user-select: none !important; + -ms-user-select: none !important; + user-select: none !important; + } + + &.gu-transit { + opacity: 0.2; + -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=20)'; + filter: alpha(opacity=20); + } +} diff --git a/src/app/pages/settings/dashboard/component/list-item.component.ts b/src/app/pages/settings/dashboard/component/list-item.component.ts new file mode 100644 index 0000000..4761a4d --- /dev/null +++ b/src/app/pages/settings/dashboard/component/list-item.component.ts @@ -0,0 +1,126 @@ +import { + Component, + HostBinding, + Input, + OnDestroy, + OnInit, + ViewEncapsulation, + Output, + EventEmitter +} from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil, take } from 'rxjs/operators'; +import { Dashboard } from 'src/modules/dashboard/model/Dashboard'; +import { DashboardService } from 'src/modules/dashboard/service/dashboard.service'; + +@Component({ + selector: 'app-pages-settings-dashboard-list-item', + templateUrl: './list-item.component.html', + styleUrls: ['./list-item.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class ListItemComponent implements OnInit, OnDestroy { + tags: any[]; + + @Input() + dashboard: Dashboard; + + @Output() + deleted: EventEmitter = new EventEmitter(); + + @HostBinding('class.selected') + selected: boolean; + + @HostBinding('class.completed') + completed: boolean; + + @HostBinding('class.move-disabled') + moveDisabled: boolean; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {TodoService} _todoService + * @param {ActivatedRoute} _activatedRoute + */ + constructor( + private _activatedRoute: ActivatedRoute, + private dashboardService: DashboardService + ) { + // Disable move if path is not /all + // if (_activatedRoute.snapshot.url[0].path !== 'all') { + // this.moveDisabled = true; + // } + + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Set the initial values + //this.completed = this.todo.completed; + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * On selected change + */ + onSelectedChange(): void {} + + /** + * Toggle display + */ + toggleDisplay(event): void { + event.stopPropagation(); + + this.dashboardService + .updateDashboardDisplay(this.dashboard.id, !this.dashboard.display) + .pipe(take(1)) + .subscribe( + res => { + this.dashboard = res; + }, + err => {} + ); + } + + /** + * Toggle star + */ + removeDashboard(event): void { + event.stopPropagation(); + + this.dashboardService + .deleteDashboard(this.dashboard.id) + .pipe(take(1)) + .subscribe( + () => { + this.deleted.emit(this.dashboard.id); + }, + err => {} + ); + } +} diff --git a/src/app/pages/settings/dashboard/component/list.component.html b/src/app/pages/settings/dashboard/component/list.component.html new file mode 100644 index 0000000..55e3d0c --- /dev/null +++ b/src/app/pages/settings/dashboard/component/list.component.html @@ -0,0 +1,29 @@ +
+ There are no Dashboard! +
+
+ + +
diff --git a/src/app/pages/settings/dashboard/component/list.component.scss b/src/app/pages/settings/dashboard/component/list.component.scss new file mode 100644 index 0000000..b241db4 --- /dev/null +++ b/src/app/pages/settings/dashboard/component/list.component.scss @@ -0,0 +1,15 @@ +app-pages-settings-dashboard-list { + display: flex; + flex: 1 0 auto; + flex-direction: column; + position: relative; + padding: 0; + border-right: 1px solid; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + + .no-dashboard-text { + font-size: 24px; + font-weight: 300; + } +} diff --git a/src/app/pages/settings/dashboard/component/list.component.ts b/src/app/pages/settings/dashboard/component/list.component.ts new file mode 100644 index 0000000..e958f15 --- /dev/null +++ b/src/app/pages/settings/dashboard/component/list.component.ts @@ -0,0 +1,143 @@ +import { + Component, + OnDestroy, + OnInit, + ViewEncapsulation, + Output, + EventEmitter +} from '@angular/core'; +import { Location } from '@angular/common'; +import { ActivatedRoute } from '@angular/router'; +import { Subject } from 'rxjs'; +import { takeUntil, map, take } from 'rxjs/operators'; + +import { fuseAnimations } from 'src/@fuse/animations'; +import { GrafanaApiService } from 'src/modules/grafana/service/grafana-api.service'; + +import { DashboardService } from 'src/modules/dashboard/service/dashboard.service'; +import { Dashboard } from 'src/modules/dashboard/model/Dashboard'; + +@Component({ + selector: 'app-pages-settings-dashboard-list', + templateUrl: './list.component.html', + styleUrls: ['./list.component.scss'], + encapsulation: ViewEncapsulation.None, + animations: fuseAnimations +}) +export class ListComponent implements OnInit, OnDestroy { + @Output() + selectedDashboard = new EventEmitter(); + + dashboards: Dashboard[] = []; + currentDashboard: Dashboard; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {ActivatedRoute} _activatedRoute + * @param {TodoService} _todoService + * @param {Location} _location + */ + constructor( + private _activatedRoute: ActivatedRoute, + private _location: Location, + private dashboardService: DashboardService, + private grafanaApiService: GrafanaApiService + ) { + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + this.dashboardService + .getDashboards() + .pipe( + take(1), + map(value => { + this.dashboards = value; + }) + ) + .subscribe(); + } + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + private findDashboardIndex(id: number): number { + let findIndex = -1; + for (let i = 0; i < this.dashboards.length; i++) { + if (this.dashboards[i].id === id) { + findIndex = i; + break; + } + } + return findIndex; + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Read todo + */ + readDashboard(dashboard: Dashboard): void { + // Set current todo + this.selectedDashboard.emit(dashboard); + } + + /** + * On drop + * + * @param ev + */ + onDrop(ev): void { + console.log(this.dashboards); + + let findIndex = this.findDashboardIndex(ev.value.id); + if (-1 === findIndex) { + return; + } + + this.dashboardService + .updateDashboardSortOrder(ev.value.id, findIndex + 1) + .pipe(take(1)) + .subscribe( + res => { + console.log(res); + }, + err => {} + ); + } + + /** + * Read todo + */ + onDeletedDashboard(dashboardId: number): void { + let findIndex = this.findDashboardIndex(dashboardId); + if (-1 === findIndex) { + return; + } + + this.dashboards.splice(findIndex, 1); + } +} diff --git a/src/app/pages/settings/dashboard/component/main.component.html b/src/app/pages/settings/dashboard/component/main.component.html new file mode 100644 index 0000000..0100c24 --- /dev/null +++ b/src/app/pages/settings/dashboard/component/main.component.html @@ -0,0 +1,47 @@ +
+ +
+ + + +
+ +
+

Settings - Dashboard

+
+ + + +
+ +
+
+ +
+
+ + + +
+ + +
+ +
+ +
+ +
diff --git a/src/app/pages/settings/dashboard/component/main.component.scss b/src/app/pages/settings/dashboard/component/main.component.scss new file mode 100644 index 0000000..6b0440b --- /dev/null +++ b/src/app/pages/settings/dashboard/component/main.component.scss @@ -0,0 +1,84 @@ +@import 'src/@fuse/scss/fuse'; + +:host { + width: 100%; + + .center { + .header { + .search-wrapper { + border-radius: 28px; + overflow: hidden; + @include mat-elevation(1); + + .sidebar-toggle { + margin: 0 0 0 6px; + width: 56px; + height: 56px; + border-radius: 0; + border-right: 1px solid; + } + + .search { + width: 100%; + height: 56px; + line-height: 56px; + padding: 0 18px; + + input { + height: 56px; + min-height: 56px; + max-height: 56px; + padding: 0 16px; + border: none; + outline: none; + } + } + } + } + + .content-card { + .toolbar { + .toolbar-separator { + height: 32px; + width: 1px; + margin: 0 12px; + } + } + + @include media-breakpoint('lt-xl') { + app-pages-settings-dashboard-list { + border-right: 0; + } + + app-pages-settings-dashboard-list, + app-pages-settings-dashboard-details { + flex: 1 0 100%; + } + + app-pages-settings-dashboard-details { + display: none !important; + } + + &.current-dashboard-selected { + .toolbar { + padding-left: 16px !important; + + .dashboard-selection { + display: none !important; + } + } + + .content { + app-pages-settings-dashboard-list { + display: none !important; + } + + app-pages-settings-dashboard-details { + display: flex !important; + } + } + } + } + } + } +} diff --git a/src/app/pages/settings/dashboard/component/main.component.ts b/src/app/pages/settings/dashboard/component/main.component.ts new file mode 100644 index 0000000..7ec9bde --- /dev/null +++ b/src/app/pages/settings/dashboard/component/main.component.ts @@ -0,0 +1,67 @@ +import { + Component, + OnInit, + ViewEncapsulation, + AfterContentInit, + AfterViewInit, + DoCheck +} from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { fuseAnimations } from 'src/@fuse/animations'; +import { FuseConfigService } from 'src/@fuse/services/config.service'; +import { Dashboard } from 'src/modules/dashboard/model/Dashboard'; + +@Component({ + selector: 'app-pages-settings-dashboard', + templateUrl: './main.component.html', + styleUrls: ['./main.component.scss'], + animations: fuseAnimations +}) +export class MainComponent implements OnInit { + widgets: any; + dashboards: Dashboard[]; + currentDashboard: Dashboard; + + /** + * Constructor + */ + constructor( + private fuseConfigService: FuseConfigService, + private activatedRoute: ActivatedRoute + ) {} + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Get the widgets from the service + this.dashboards = this.activatedRoute.snapshot.data.dashboards || []; + + console.log(this.dashboards); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- + + /** + * Deselect current todo + */ + deselectCurrentDashboard(): void { + this.currentDashboard = null; + } + + onSelectedDashboard(dashboard: Dashboard): void { + console.log(dashboard); + this.currentDashboard = dashboard; + } +} diff --git a/src/app/pages/settings/dashboard/service/index.ts b/src/app/pages/settings/dashboard/service/index.ts new file mode 100644 index 0000000..c9db2c1 --- /dev/null +++ b/src/app/pages/settings/dashboard/service/index.ts @@ -0,0 +1,3 @@ +import { SettingsDashboardResolver } from './settings-dashboard.resolver'; + +export const SERVICES = [SettingsDashboardResolver]; diff --git a/src/app/pages/settings/dashboard/service/settings-dashboard.resolver.ts b/src/app/pages/settings/dashboard/service/settings-dashboard.resolver.ts new file mode 100644 index 0000000..3e918fc --- /dev/null +++ b/src/app/pages/settings/dashboard/service/settings-dashboard.resolver.ts @@ -0,0 +1,37 @@ +import { Injectable } from '@angular/core'; +import { + Resolve, + RouterStateSnapshot, + ActivatedRouteSnapshot, + Params +} from '@angular/router'; + +import { BehaviorSubject, Observable } from 'rxjs'; + +import { Dashboard } from 'src/modules/dashboard/model/Dashboard'; +import { DashboardService } from 'src/modules/dashboard/service/dashboard.service'; + +@Injectable() +export class SettingsDashboardResolver implements Resolve { + dashboards: Dashboard[]; + currentDashboard: Dashboard; + + routeParams: Params; + + onDashboardsChanged: BehaviorSubject; + onCurrentDashboardChanged: BehaviorSubject; + + constructor(private dashboardService: DashboardService) { + this.onDashboardsChanged = new BehaviorSubject([]); + this.onCurrentDashboardChanged = new BehaviorSubject(null); + } + + resolve( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot + ): Dashboard[] | Observable | Promise { + this.routeParams = route.params; + + return this.dashboardService.getDashboards(); + } +} diff --git a/src/app/pages/settings/dashboard/settings-dashboard-routing.module.ts b/src/app/pages/settings/dashboard/settings-dashboard-routing.module.ts new file mode 100644 index 0000000..a9b17d9 --- /dev/null +++ b/src/app/pages/settings/dashboard/settings-dashboard-routing.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { MainComponent } from './component/main.component'; +import { SettingsDashboardResolver } from './service/settings-dashboard.resolver'; + +const routes: Routes = [ + { + path: '', + component: MainComponent, + resolve: { + dashboards: SettingsDashboardResolver + } + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class SettingsDashboardRoutingModule {} diff --git a/src/app/pages/settings/dashboard/settings-dashboard-store.module.ts b/src/app/pages/settings/dashboard/settings-dashboard-store.module.ts new file mode 100644 index 0000000..e330ecf --- /dev/null +++ b/src/app/pages/settings/dashboard/settings-dashboard-store.module.ts @@ -0,0 +1,13 @@ +import { NgModule, ModuleWithProviders } from '@angular/core'; +import { StoreModule } from '@ngrx/store'; +import { EffectsModule } from '@ngrx/effects'; + +import { reducer, Effects } from './store'; + +@NgModule({ + imports: [ + StoreModule.forFeature('pages-settings-dashboard', reducer), + EffectsModule.forFeature([Effects]) + ] +}) +export class SettingsDashboardStoreModule {} diff --git a/src/app/pages/settings/dashboard/settings-dashboard.module.ts b/src/app/pages/settings/dashboard/settings-dashboard.module.ts new file mode 100644 index 0000000..8e01481 --- /dev/null +++ b/src/app/pages/settings/dashboard/settings-dashboard.module.ts @@ -0,0 +1,43 @@ +import { NgModule } from '@angular/core'; + +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTabsModule } from '@angular/material/tabs'; +import { MatCheckboxModule } from '@angular/material/checkbox'; + +import { NgxDnDModule } from '@swimlane/ngx-dnd'; + +import { FuseSharedModule } from 'src/@fuse/shared.module'; +import { FuseWidgetModule } from 'src/@fuse/components/widget/widget.module'; + +import { SettingsDashboardRoutingModule } from './settings-dashboard-routing.module'; +import { SettingsDashboardStoreModule } from './settings-dashboard-store.module'; + +import { COMPONENTS } from './component'; +import { SERVICES } from './service'; + +@NgModule({ + imports: [ + MatButtonModule, + MatFormFieldModule, + MatIconModule, + MatMenuModule, + MatSelectModule, + MatTabsModule, + MatCheckboxModule, + + NgxDnDModule, + + FuseSharedModule, + FuseWidgetModule, + + SettingsDashboardRoutingModule, + SettingsDashboardStoreModule + ], + declarations: [...COMPONENTS], + providers: [...SERVICES] +}) +export class SettingsDashboardModule {} diff --git a/src/app/pages/settings/dashboard/settings-dashboard.theme.scss b/src/app/pages/settings/dashboard/settings-dashboard.theme.scss new file mode 100644 index 0000000..137458b --- /dev/null +++ b/src/app/pages/settings/dashboard/settings-dashboard.theme.scss @@ -0,0 +1,87 @@ +@mixin settings-dashboard-theme($theme) { + $background: map-get($theme, background); + $foreground: map-get($theme, foreground); + $accent: map-get($theme, accent); + $is-dark: map-get($theme, is-dark); + + // Todo + app-pages-settings-dashboard { + .center { + .header { + .search-wrapper { + background: map-get($background, card); + + .sidebar-toggle { + border-right-color: map-get($foreground, divider); + } + + .search { + input { + background: map-get($background, card); + color: map-get($foreground, text); + } + } + } + } + + .content-card { + .toolbar { + .toolbar-separator { + background: map-get($foreground, divider); + } + } + } + } + } + + // Todo list + app-pages-settings-dashboard-list { + border-right-color: map-get($foreground, divider); + } + + // Todo list item + app-pages-settings-dashboard-list-item { + border-bottom-color: map-get($foreground, divider); + + .tags { + .tag { + background-color: rgba(0, 0, 0, 0.08); + } + } + + &.completed { + @if ($is-dark) { + background: map-get($background, background); + } @else { + background: #efefef; + } + + .title, + .notes { + color: map-get($foreground, secondary-text); + } + } + + &.selected { + @if ($is-dark) { + background: map-get($background, background); + } @else { + background: map-get($accent, 50); + } + } + } + + // Todo details + app-pages-settings-dashboard-details { + .dashboard-header { + background: map-get($background, background); + border-bottom-color: map-get($foreground, divider); + } + + .dashboard-content { + .tag { + background-color: rgba(0, 0, 0, 0.08); + } + } + } +} diff --git a/src/app/pages/settings/dashboard/store/action.ts b/src/app/pages/settings/dashboard/store/action.ts new file mode 100644 index 0000000..5d20333 --- /dev/null +++ b/src/app/pages/settings/dashboard/store/action.ts @@ -0,0 +1,17 @@ +import { createAction, props } from '@ngrx/store'; + +import { Dashboard } from 'src/modules/dashboard/model/Dashboard'; + +export const loadDashboardsSuccess = createAction( + '[Collection/API] Load Dashboards Success', + props<{ books: Dashboard[] }>() +); + +export const loadDashboardsFailure = createAction( + '[Collection/API] Load Books Failure', + props<{ error: any }>() +); + +export enum ActionType { + Load = '[pages.settings.dashboard] Load' +} diff --git a/src/app/pages/settings/dashboard/store/effect.ts b/src/app/pages/settings/dashboard/store/effect.ts new file mode 100644 index 0000000..dfa3cab --- /dev/null +++ b/src/app/pages/settings/dashboard/store/effect.ts @@ -0,0 +1,11 @@ +import { Injectable } from '@angular/core'; + +import { Effect, Actions, ofType } from '@ngrx/effects'; + +import { of } from 'rxjs'; +import { map, tap, exhaustMap, catchError } from 'rxjs/operators'; + +@Injectable() +export class Effects { + constructor(private actions$: Actions) {} +} diff --git a/src/app/pages/settings/dashboard/store/index.ts b/src/app/pages/settings/dashboard/store/index.ts new file mode 100644 index 0000000..bd32214 --- /dev/null +++ b/src/app/pages/settings/dashboard/store/index.ts @@ -0,0 +1,4 @@ +export * from './action'; +export * from './effect'; +export * from './reducer'; +export * from './state'; diff --git a/src/app/pages/settings/dashboard/store/reducer.ts b/src/app/pages/settings/dashboard/store/reducer.ts new file mode 100644 index 0000000..0c23f3d --- /dev/null +++ b/src/app/pages/settings/dashboard/store/reducer.ts @@ -0,0 +1,6 @@ +import { createReducer, on } from '@ngrx/store'; + +import { State, initialState } from './state'; +import { loadDashboardsSuccess } from './action'; + +export const reducer = createReducer(initialState); diff --git a/src/app/pages/settings/dashboard/store/state.ts b/src/app/pages/settings/dashboard/store/state.ts new file mode 100644 index 0000000..16bfd42 --- /dev/null +++ b/src/app/pages/settings/dashboard/store/state.ts @@ -0,0 +1,25 @@ +import { Selector, createSelector } from '@ngrx/store'; +import { Dashboard } from 'src/modules/dashboard/model/Dashboard'; + +export interface State { + dashboards: Dashboard[] | null; + currentDashboard: Dashboard | null; +} + +export const initialState: State = { + dashboards: null, + currentDashboard: null +}; + +export function getSelectors(selector: Selector) { + return { + selectDashboards: createSelector( + selector, + (state: State) => state.dashboards + ), + selectCurrentDashboard: createSelector( + selector, + (state: State) => state.currentDashboard + ) + }; +} diff --git a/src/app/pages/settings/etc/component/index.ts b/src/app/pages/settings/etc/component/index.ts new file mode 100644 index 0000000..f8f7aa6 --- /dev/null +++ b/src/app/pages/settings/etc/component/index.ts @@ -0,0 +1,3 @@ +import { MainComponent } from './main.component'; + +export const COMPONENTS = [MainComponent]; diff --git a/src/app/pages/settings/etc/component/main.component.html b/src/app/pages/settings/etc/component/main.component.html new file mode 100644 index 0000000..900d900 --- /dev/null +++ b/src/app/pages/settings/etc/component/main.component.html @@ -0,0 +1,23 @@ +
+ +
+ + + +
+ +
+

ETC

+
+ + + +
+ +
+ +
+ +
+ +
diff --git a/src/app/pages/settings/etc/component/main.component.scss b/src/app/pages/settings/etc/component/main.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/settings/etc/component/main.component.ts b/src/app/pages/settings/etc/component/main.component.ts new file mode 100644 index 0000000..88da5ab --- /dev/null +++ b/src/app/pages/settings/etc/component/main.component.ts @@ -0,0 +1,41 @@ +import { + Component, + OnInit, + ViewEncapsulation, + AfterContentInit, + AfterViewInit, + DoCheck +} from '@angular/core'; + +import { fuseAnimations } from 'src/@fuse/animations'; +import { FuseConfigService } from 'src/@fuse/services/config.service'; + +@Component({ + selector: 'app-pages-settings-etc', + templateUrl: './main.component.html', + styleUrls: ['./main.component.scss'], + animations: fuseAnimations +}) +export class MainComponent implements OnInit { + widgets: any; + + /** + * Constructor + */ + constructor(private fuseConfigService: FuseConfigService) {} + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Get the widgets from the service + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- +} diff --git a/src/app/pages/settings/general/component/index.ts b/src/app/pages/settings/general/component/index.ts new file mode 100644 index 0000000..f8f7aa6 --- /dev/null +++ b/src/app/pages/settings/general/component/index.ts @@ -0,0 +1,3 @@ +import { MainComponent } from './main.component'; + +export const COMPONENTS = [MainComponent]; diff --git a/src/app/pages/settings/general/component/main.component.html b/src/app/pages/settings/general/component/main.component.html new file mode 100644 index 0000000..a8ebab1 --- /dev/null +++ b/src/app/pages/settings/general/component/main.component.html @@ -0,0 +1,23 @@ +
+ +
+ + + +
+ +
+

General

+
+ + + +
+ +
+ +
+ +
+ +
diff --git a/src/app/pages/settings/general/component/main.component.scss b/src/app/pages/settings/general/component/main.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/settings/general/component/main.component.ts b/src/app/pages/settings/general/component/main.component.ts new file mode 100644 index 0000000..10f8d0d --- /dev/null +++ b/src/app/pages/settings/general/component/main.component.ts @@ -0,0 +1,41 @@ +import { + Component, + OnInit, + ViewEncapsulation, + AfterContentInit, + AfterViewInit, + DoCheck +} from '@angular/core'; + +import { fuseAnimations } from 'src/@fuse/animations'; +import { FuseConfigService } from 'src/@fuse/services/config.service'; + +@Component({ + selector: 'app-pages-settings-general', + templateUrl: './main.component.html', + styleUrls: ['./main.component.scss'], + animations: fuseAnimations +}) +export class MainComponent implements OnInit { + widgets: any; + + /** + * Constructor + */ + constructor(private fuseConfigService: FuseConfigService) {} + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Get the widgets from the service + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- +} diff --git a/src/app/pages/settings/settings-routing.module.ts b/src/app/pages/settings/settings-routing.module.ts new file mode 100644 index 0000000..0dc0e88 --- /dev/null +++ b/src/app/pages/settings/settings-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +const routes: Routes = [ + { + path: 'dashboard', + loadChildren: + './dashboard/settings-dashboard.module#SettingsDashboardModule' + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class SettingsRoutingModule {} diff --git a/src/app/pages/settings/settings.module.ts b/src/app/pages/settings/settings.module.ts new file mode 100644 index 0000000..0ac54fb --- /dev/null +++ b/src/app/pages/settings/settings.module.ts @@ -0,0 +1,10 @@ +import { NgModule } from '@angular/core'; + +import { SettingsRoutingModule } from './settings-routing.module'; + +@NgModule({ + imports: [SettingsRoutingModule], + declarations: [], + providers: [] +}) +export class SettingsModule {} diff --git a/src/app/pages/statistics/component/connections.component.html b/src/app/pages/statistics/component/connections.component.html new file mode 100644 index 0000000..4c44bff --- /dev/null +++ b/src/app/pages/statistics/component/connections.component.html @@ -0,0 +1 @@ +Connections diff --git a/src/app/pages/statistics/component/connections.component.scss b/src/app/pages/statistics/component/connections.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/statistics/component/connections.component.ts b/src/app/pages/statistics/component/connections.component.ts new file mode 100644 index 0000000..32265a4 --- /dev/null +++ b/src/app/pages/statistics/component/connections.component.ts @@ -0,0 +1,41 @@ +import { + Component, + OnInit, + ViewEncapsulation, + AfterContentInit, + AfterViewInit, + DoCheck +} from '@angular/core'; + +import { fuseAnimations } from 'src/@fuse/animations'; +import { FuseConfigService } from 'src/@fuse/services/config.service'; + +@Component({ + selector: 'app-pages-statistics-connections', + templateUrl: './connections.component.html', + styleUrls: ['./connections.component.scss'], + animations: fuseAnimations +}) +export class ConnectionsComponent implements OnInit { + widgets: any; + + /** + * Constructor + */ + constructor(private fuseConfigService: FuseConfigService) {} + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Get the widgets from the service + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- +} diff --git a/src/app/pages/statistics/component/index.ts b/src/app/pages/statistics/component/index.ts new file mode 100644 index 0000000..521aea4 --- /dev/null +++ b/src/app/pages/statistics/component/index.ts @@ -0,0 +1,13 @@ +import { ConnectionsComponent } from './connections.component'; +import { MessagesComponent } from './messages.component'; +import { ProcessComponent } from './process.component'; +import { SystemComponent } from './system.component'; +import { StatisticsComponent } from './statistics.component'; + +export const COMPONENTS = [ + ConnectionsComponent, + MessagesComponent, + ProcessComponent, + SystemComponent, + StatisticsComponent +]; diff --git a/src/app/pages/statistics/component/messages.component.html b/src/app/pages/statistics/component/messages.component.html new file mode 100644 index 0000000..ae9bcc5 --- /dev/null +++ b/src/app/pages/statistics/component/messages.component.html @@ -0,0 +1 @@ +Messages diff --git a/src/app/pages/statistics/component/messages.component.scss b/src/app/pages/statistics/component/messages.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/statistics/component/messages.component.ts b/src/app/pages/statistics/component/messages.component.ts new file mode 100644 index 0000000..80f3a07 --- /dev/null +++ b/src/app/pages/statistics/component/messages.component.ts @@ -0,0 +1,41 @@ +import { + Component, + OnInit, + ViewEncapsulation, + AfterContentInit, + AfterViewInit, + DoCheck +} from '@angular/core'; + +import { fuseAnimations } from 'src/@fuse/animations'; +import { FuseConfigService } from 'src/@fuse/services/config.service'; + +@Component({ + selector: 'app-pages-statistics-messages', + templateUrl: './messages.component.html', + styleUrls: ['./messages.component.scss'], + animations: fuseAnimations +}) +export class MessagesComponent implements OnInit { + widgets: any; + + /** + * Constructor + */ + constructor(private fuseConfigService: FuseConfigService) {} + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Get the widgets from the service + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- +} diff --git a/src/app/pages/statistics/component/process.component.html b/src/app/pages/statistics/component/process.component.html new file mode 100644 index 0000000..83cbc68 --- /dev/null +++ b/src/app/pages/statistics/component/process.component.html @@ -0,0 +1 @@ +Process diff --git a/src/app/pages/statistics/component/process.component.scss b/src/app/pages/statistics/component/process.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/statistics/component/process.component.ts b/src/app/pages/statistics/component/process.component.ts new file mode 100644 index 0000000..66b9c43 --- /dev/null +++ b/src/app/pages/statistics/component/process.component.ts @@ -0,0 +1,41 @@ +import { + Component, + OnInit, + ViewEncapsulation, + AfterContentInit, + AfterViewInit, + DoCheck +} from '@angular/core'; + +import { fuseAnimations } from 'src/@fuse/animations'; +import { FuseConfigService } from 'src/@fuse/services/config.service'; + +@Component({ + selector: 'app-pages-statistics-process', + templateUrl: './process.component.html', + styleUrls: ['./process.component.scss'], + animations: fuseAnimations +}) +export class ProcessComponent implements OnInit { + widgets: any; + + /** + * Constructor + */ + constructor(private fuseConfigService: FuseConfigService) {} + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Get the widgets from the service + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- +} diff --git a/src/app/pages/statistics/component/statistics.component.html b/src/app/pages/statistics/component/statistics.component.html new file mode 100644 index 0000000..e749f55 --- /dev/null +++ b/src/app/pages/statistics/component/statistics.component.html @@ -0,0 +1,41 @@ +
+ +
+ + + +
+ +
+

Statistics

+
+ + + +
+ +
+ + + + + + + + + + + + + +
+ +
+ +
+ +
diff --git a/src/app/pages/statistics/component/statistics.component.scss b/src/app/pages/statistics/component/statistics.component.scss new file mode 100644 index 0000000..a6dfc37 --- /dev/null +++ b/src/app/pages/statistics/component/statistics.component.scss @@ -0,0 +1,26 @@ +@import 'src/@fuse/scss/fuse'; + +#product { + .content { + .mat-tab-group, + .mat-tab-body-wrapper, + .tab-content { + flex: 1 1 auto; + max-width: 100%; + } + + .mat-tab-body-content { + display: flex; + } + + .mat-tab-label { + height: 64px; + } + + // Temporary prefix alignment fix + .mat-form-field-appearance-outline .mat-form-field-prefix, + .mat-form-field-appearance-outline .mat-form-field-suffix { + top: 0; + } + } +} diff --git a/src/app/pages/statistics/component/statistics.component.ts b/src/app/pages/statistics/component/statistics.component.ts new file mode 100644 index 0000000..dce64bd --- /dev/null +++ b/src/app/pages/statistics/component/statistics.component.ts @@ -0,0 +1,58 @@ +import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { Location } from '@angular/common'; + +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { fuseAnimations } from 'src/@fuse/animations'; +import { FuseUtils } from 'src/@fuse/utils'; + +@Component({ + selector: 'app-pages-statistics', + templateUrl: './statistics.component.html', + styleUrls: ['./statistics.component.scss'], + encapsulation: ViewEncapsulation.None, + animations: fuseAnimations +}) +export class StatisticsComponent implements OnInit, OnDestroy { + pageType: string; + + // Private + private _unsubscribeAll: Subject; + + /** + * Constructor + * + * @param {EcommerceProductService} _ecommerceProductService + * @param {FormBuilder} _formBuilder + * @param {Location} _location + * @param {MatSnackBar} _matSnackBar + */ + constructor(private _location: Location) { + // Set the private defaults + this._unsubscribeAll = new Subject(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void {} + + /** + * On destroy + */ + ngOnDestroy(): void { + // Unsubscribe from all subscriptions + this._unsubscribeAll.next(); + this._unsubscribeAll.complete(); + } + + // ----------------------------------------------------------------------------------------------------- + // @ Public methods + // ----------------------------------------------------------------------------------------------------- +} diff --git a/src/app/pages/statistics/component/system.component.html b/src/app/pages/statistics/component/system.component.html new file mode 100644 index 0000000..00b3942 --- /dev/null +++ b/src/app/pages/statistics/component/system.component.html @@ -0,0 +1 @@ +System diff --git a/src/app/pages/statistics/component/system.component.scss b/src/app/pages/statistics/component/system.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/statistics/component/system.component.ts b/src/app/pages/statistics/component/system.component.ts new file mode 100644 index 0000000..6b4e6da --- /dev/null +++ b/src/app/pages/statistics/component/system.component.ts @@ -0,0 +1,41 @@ +import { + Component, + OnInit, + ViewEncapsulation, + AfterContentInit, + AfterViewInit, + DoCheck +} from '@angular/core'; + +import { fuseAnimations } from 'src/@fuse/animations'; +import { FuseConfigService } from 'src/@fuse/services/config.service'; + +@Component({ + selector: 'app-pages-statistics-system', + templateUrl: './system.component.html', + styleUrls: ['./system.component.scss'], + animations: fuseAnimations +}) +export class SystemComponent implements OnInit { + widgets: any; + + /** + * Constructor + */ + constructor(private fuseConfigService: FuseConfigService) {} + + // ----------------------------------------------------------------------------------------------------- + // @ Lifecycle hooks + // ----------------------------------------------------------------------------------------------------- + + /** + * On init + */ + ngOnInit(): void { + // Get the widgets from the service + } + + // ----------------------------------------------------------------------------------------------------- + // @ Private methods + // ----------------------------------------------------------------------------------------------------- +} diff --git a/src/app/pages/statistics/statistics-routing.module.ts b/src/app/pages/statistics/statistics-routing.module.ts new file mode 100644 index 0000000..3a92128 --- /dev/null +++ b/src/app/pages/statistics/statistics-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { StatisticsComponent } from './component/statistics.component'; + +const routes: Routes = [ + { + path: '', + component: StatisticsComponent + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class StatisticsRoutingModule {} diff --git a/src/app/pages/statistics/statistics.module.ts b/src/app/pages/statistics/statistics.module.ts new file mode 100644 index 0000000..558fbf8 --- /dev/null +++ b/src/app/pages/statistics/statistics.module.ts @@ -0,0 +1,34 @@ +import { NgModule } from '@angular/core'; + +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTabsModule } from '@angular/material/tabs'; + +import { FuseSharedModule } from 'src/@fuse/shared.module'; +import { FuseWidgetModule } from 'src/@fuse/components/widget/widget.module'; + +import { StatisticsRoutingModule } from './statistics-routing.module'; + +import { COMPONENTS } from './component'; + +@NgModule({ + imports: [ + MatButtonModule, + MatFormFieldModule, + MatIconModule, + MatMenuModule, + MatSelectModule, + MatTabsModule, + + FuseSharedModule, + FuseWidgetModule, + + StatisticsRoutingModule + ], + declarations: [...COMPONENTS], + providers: [] +}) +export class StatisticsModule {} diff --git a/src/app/store/index.ts b/src/app/store/index.ts new file mode 100644 index 0000000..64f4bc6 --- /dev/null +++ b/src/app/store/index.ts @@ -0,0 +1,39 @@ +import { Type } from '@angular/core'; +import { + ActionReducer, + ActionReducerMap, + MetaReducer, + createSelector +} from '@ngrx/store'; + +import * as fromRouter from '@ngrx/router-store'; + +import { environment } from '../../environments/environment'; + +export const EFFECTS: Type[] = []; + +export const REDUCERS: ActionReducerMap = { + router: fromRouter.routerReducer +}; + +// console.log all actions +export function logger(reducer: ActionReducer): ActionReducer { + return function(state: State, action: any): State { + const result = reducer(state, action); + console.groupCollapsed(action.type); + console.log('prev state', state); + console.log('action', action); + console.log('next state', result); + console.groupEnd(); + + return result; + }; +} + +export const META_REDUCERS: MetaReducer[] = !environment.production + ? [logger] + : []; + +export interface State { + router: fromRouter.RouterReducerState; +} diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/icons/flags/ko.png b/src/assets/icons/flags/ko.png new file mode 100644 index 0000000..5ecae7c Binary files /dev/null and b/src/assets/icons/flags/ko.png differ diff --git a/src/assets/icons/flags/us.png b/src/assets/icons/flags/us.png new file mode 100644 index 0000000..a2cdfe7 Binary files /dev/null and b/src/assets/icons/flags/us.png differ diff --git a/src/assets/icons/material-icons/outline/fonts/material-outline-icons.svg b/src/assets/icons/material-icons/outline/fonts/material-outline-icons.svg new file mode 100644 index 0000000..946f548 --- /dev/null +++ b/src/assets/icons/material-icons/outline/fonts/material-outline-icons.svg @@ -0,0 +1,2037 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/icons/material-icons/outline/fonts/material-outline-icons.ttf b/src/assets/icons/material-icons/outline/fonts/material-outline-icons.ttf new file mode 100644 index 0000000..b59d861 Binary files /dev/null and b/src/assets/icons/material-icons/outline/fonts/material-outline-icons.ttf differ diff --git a/src/assets/icons/material-icons/outline/fonts/material-outline-icons.woff b/src/assets/icons/material-icons/outline/fonts/material-outline-icons.woff new file mode 100644 index 0000000..36d5526 Binary files /dev/null and b/src/assets/icons/material-icons/outline/fonts/material-outline-icons.woff differ diff --git a/src/assets/icons/material-icons/outline/style.css b/src/assets/icons/material-icons/outline/style.css new file mode 100644 index 0000000..c73f0c8 --- /dev/null +++ b/src/assets/icons/material-icons/outline/style.css @@ -0,0 +1,3074 @@ +@font-face { + font-family: 'material-outline-icons'; + src: + url('fonts/material-outline-icons.ttf?8ot508') format('truetype'), + url('fonts/material-outline-icons.woff?8ot508') format('woff'), + url('fonts/material-outline-icons.svg?8ot508#material-outline-icons') format('svg'); + font-weight: normal; + font-style: normal; +} + +i, .icomoon-liga, .material-icons { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'material-outline-icons' !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Enable Ligatures ================ */ + letter-spacing: 0; + -webkit-font-feature-settings: "liga"; + -moz-font-feature-settings: "liga=1"; + -moz-font-feature-settings: "liga"; + -ms-font-feature-settings: "liga" 1; + font-feature-settings: "liga"; + -webkit-font-variant-ligatures: discretionary-ligatures; + font-variant-ligatures: discretionary-ligatures; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-3d_rotation:before { + content: "\e900"; +} +.icon-4k:before { + content: "\e901"; +} +.icon-360:before { + content: "\e902"; +} +.icon-ac_unit:before { + content: "\e903"; +} +.icon-access_alarm:before { + content: "\e904"; +} +.icon-access_alarms:before { + content: "\e905"; +} +.icon-access_time:before { + content: "\e906"; +} +.icon-accessibility_new:before { + content: "\e907"; +} +.icon-accessibility:before { + content: "\e908"; +} +.icon-accessible_forward:before { + content: "\e909"; +} +.icon-accessible:before { + content: "\e90a"; +} +.icon-account_balance_wallet:before { + content: "\e90b"; +} +.icon-account_balance:before { + content: "\e90c"; +} +.icon-account_box:before { + content: "\e90d"; +} +.icon-account_circle:before { + content: "\e90e"; +} +.icon-adb:before { + content: "\e90f"; +} +.icon-add_a_photo:before { + content: "\e910"; +} +.icon-add_alarm:before { + content: "\e911"; +} +.icon-add_alert:before { + content: "\e912"; +} +.icon-add_box:before { + content: "\e913"; +} +.icon-add_circle_outline:before { + content: "\e914"; +} +.icon-add_circle:before { + content: "\e915"; +} +.icon-add_comment:before { + content: "\e916"; +} +.icon-add_location:before { + content: "\e917"; +} +.icon-add_photo_alternate:before { + content: "\e918"; +} +.icon-add_shopping_cart:before { + content: "\e919"; +} +.icon-add_to_home_screen:before { + content: "\e91a"; +} +.icon-add_to_photos:before { + content: "\e91b"; +} +.icon-add_to_queue:before { + content: "\e91c"; +} +.icon-add:before { + content: "\e91d"; +} +.icon-adjust:before { + content: "\e91e"; +} +.icon-airline_seat_flat_angled:before { + content: "\e91f"; +} +.icon-airline_seat_flat:before { + content: "\e920"; +} +.icon-airline_seat_individual_suite:before { + content: "\e921"; +} +.icon-airline_seat_legroom_extra:before { + content: "\e922"; +} +.icon-airline_seat_legroom_normal:before { + content: "\e923"; +} +.icon-airline_seat_legroom_reduced:before { + content: "\e924"; +} +.icon-airline_seat_recline_extra:before { + content: "\e925"; +} +.icon-airline_seat_recline_normal:before { + content: "\e926"; +} +.icon-airplanemode_active:before { + content: "\e927"; +} +.icon-airplanemode_inactive:before { + content: "\e928"; +} +.icon-airplay:before { + content: "\e929"; +} +.icon-airport_shuttle:before { + content: "\e92a"; +} +.icon-alarm_add:before { + content: "\e92b"; +} +.icon-alarm_off:before { + content: "\e92c"; +} +.icon-alarm_on:before { + content: "\e92d"; +} +.icon-alarm:before { + content: "\e92e"; +} +.icon-album:before { + content: "\e92f"; +} +.icon-all_inbox:before { + content: "\e930"; +} +.icon-all_inclusive:before { + content: "\e931"; +} +.icon-all_out:before { + content: "\e932"; +} +.icon-alternate_email:before { + content: "\e933"; +} +.icon-android:before { + content: "\e934"; +} +.icon-announcement:before { + content: "\e935"; +} +.icon-apps:before { + content: "\e936"; +} +.icon-archive:before { + content: "\e937"; +} +.icon-arrow_back_ios:before { + content: "\e938"; +} +.icon-arrow_back:before { + content: "\e939"; +} +.icon-arrow_downward:before { + content: "\e93a"; +} +.icon-arrow_drop_down_circle:before { + content: "\e93b"; +} +.icon-arrow_drop_down:before { + content: "\e93c"; +} +.icon-arrow_drop_up:before { + content: "\e93d"; +} +.icon-arrow_forward_ios:before { + content: "\e93e"; +} +.icon-arrow_forward:before { + content: "\e93f"; +} +.icon-arrow_left:before { + content: "\e940"; +} +.icon-arrow_right_alt:before { + content: "\e941"; +} +.icon-arrow_right:before { + content: "\e942"; +} +.icon-arrow_upward:before { + content: "\e943"; +} +.icon-art_track:before { + content: "\e944"; +} +.icon-aspect_ratio:before { + content: "\e945"; +} +.icon-assessment:before { + content: "\e946"; +} +.icon-assignment_ind:before { + content: "\e947"; +} +.icon-assignment_late:before { + content: "\e948"; +} +.icon-assignment_return:before { + content: "\e949"; +} +.icon-assignment_returned:before { + content: "\e94a"; +} +.icon-assignment_turned_in:before { + content: "\e94b"; +} +.icon-assignment:before { + content: "\e94c"; +} +.icon-assistant_photo:before { + content: "\e94d"; +} +.icon-assistant:before { + content: "\e94e"; +} +.icon-atm:before { + content: "\e94f"; +} +.icon-attach_file:before { + content: "\e950"; +} +.icon-attach_money:before { + content: "\e951"; +} +.icon-attachment:before { + content: "\e952"; +} +.icon-audiotrack:before { + content: "\e953"; +} +.icon-autorenew:before { + content: "\e954"; +} +.icon-av_timer:before { + content: "\e955"; +} +.icon-backspace:before { + content: "\e956"; +} +.icon-backup:before { + content: "\e957"; +} +.icon-ballot:before { + content: "\e958"; +} +.icon-bar_chart:before { + content: "\e959"; +} +.icon-battery_alert:before { + content: "\e95a"; +} +.icon-battery_charging_full:before { + content: "\e95b"; +} +.icon-battery_full:before { + content: "\e95c"; +} +.icon-battery_std:before { + content: "\e95d"; +} +.icon-battery_unknown:before { + content: "\e95e"; +} +.icon-beach_access:before { + content: "\e95f"; +} +.icon-beenhere:before { + content: "\e960"; +} +.icon-block:before { + content: "\e961"; +} +.icon-bluetooth_audio:before { + content: "\e962"; +} +.icon-bluetooth_connected:before { + content: "\e963"; +} +.icon-bluetooth_disabled:before { + content: "\e964"; +} +.icon-bluetooth_searching:before { + content: "\e965"; +} +.icon-bluetooth:before { + content: "\e966"; +} +.icon-blur_circular:before { + content: "\e967"; +} +.icon-blur_linear:before { + content: "\e968"; +} +.icon-blur_off:before { + content: "\e969"; +} +.icon-blur_on:before { + content: "\e96a"; +} +.icon-book:before { + content: "\e96b"; +} +.icon-bookmark_border:before { + content: "\e96c"; +} +.icon-bookmark:before { + content: "\e96d"; +} +.icon-bookmarks:before { + content: "\e96e"; +} +.icon-border_all:before { + content: "\e96f"; +} +.icon-border_bottom:before { + content: "\e970"; +} +.icon-border_clear:before { + content: "\e971"; +} +.icon-border_horizontal:before { + content: "\e972"; +} +.icon-border_inner:before { + content: "\e973"; +} +.icon-border_left:before { + content: "\e974"; +} +.icon-border_outer:before { + content: "\e975"; +} +.icon-border_right:before { + content: "\e976"; +} +.icon-border_style:before { + content: "\e977"; +} +.icon-border_top:before { + content: "\e978"; +} +.icon-border_vertical:before { + content: "\e979"; +} +.icon-branding_watermark:before { + content: "\e97a"; +} +.icon-brightness_1:before { + content: "\e97b"; +} +.icon-brightness_2:before { + content: "\e97c"; +} +.icon-brightness_3:before { + content: "\e97d"; +} +.icon-brightness_4:before { + content: "\e97e"; +} +.icon-brightness_5:before { + content: "\e97f"; +} +.icon-brightness_6:before { + content: "\e980"; +} +.icon-brightness_7:before { + content: "\e981"; +} +.icon-brightness_auto:before { + content: "\e982"; +} +.icon-brightness_high:before { + content: "\e983"; +} +.icon-brightness_low:before { + content: "\e984"; +} +.icon-brightness_medium:before { + content: "\e985"; +} +.icon-broken_image:before { + content: "\e986"; +} +.icon-brush:before { + content: "\e987"; +} +.icon-bubble_chart:before { + content: "\e988"; +} +.icon-bug_report:before { + content: "\e989"; +} +.icon-build:before { + content: "\e98a"; +} +.icon-burst_mode:before { + content: "\e98b"; +} +.icon-business_center:before { + content: "\e98c"; +} +.icon-business:before { + content: "\e98d"; +} +.icon-cached:before { + content: "\e98e"; +} +.icon-cake:before { + content: "\e98f"; +} +.icon-calendar_today:before { + content: "\e990"; +} +.icon-calendar_view_day:before { + content: "\e991"; +} +.icon-call_end:before { + content: "\e992"; +} +.icon-call_made:before { + content: "\e993"; +} +.icon-call_merge:before { + content: "\e994"; +} +.icon-call_missed_outgoing:before { + content: "\e995"; +} +.icon-call_missed:before { + content: "\e996"; +} +.icon-call_received:before { + content: "\e997"; +} +.icon-call_split:before { + content: "\e998"; +} +.icon-call_to_action:before { + content: "\e999"; +} +.icon-call:before { + content: "\e99a"; +} +.icon-camera_alt:before { + content: "\e99b"; +} +.icon-camera_enhance:before { + content: "\e99c"; +} +.icon-camera_front:before { + content: "\e99d"; +} +.icon-camera_rear:before { + content: "\e99e"; +} +.icon-camera_roll:before { + content: "\e99f"; +} +.icon-camera:before { + content: "\e9a0"; +} +.icon-cancel_presentation:before { + content: "\e9a1"; +} +.icon-cancel:before { + content: "\e9a2"; +} +.icon-card_giftcard:before { + content: "\e9a3"; +} +.icon-card_membership:before { + content: "\e9a4"; +} +.icon-card_travel:before { + content: "\e9a5"; +} +.icon-casino:before { + content: "\e9a6"; +} +.icon-cast_connected:before { + content: "\e9a7"; +} +.icon-cast_for_education:before { + content: "\e9a8"; +} +.icon-cast:before { + content: "\e9a9"; +} +.icon-category:before { + content: "\e9aa"; +} +.icon-center_focus_strong:before { + content: "\e9ab"; +} +.icon-center_focus_weak:before { + content: "\e9ac"; +} +.icon-change_history:before { + content: "\e9ad"; +} +.icon-chat_bubble_outline:before { + content: "\e9ae"; +} +.icon-chat_bubble:before { + content: "\e9af"; +} +.icon-chat:before { + content: "\e9b0"; +} +.icon-check_box_outline_blank:before { + content: "\e9b1"; +} +.icon-check_box:before { + content: "\e9b2"; +} +.icon-check_circle_outline:before { + content: "\e9b3"; +} +.icon-check_circle:before { + content: "\e9b4"; +} +.icon-check:before { + content: "\e9b5"; +} +.icon-chevron_left:before { + content: "\e9b6"; +} +.icon-chevron_right:before { + content: "\e9b7"; +} +.icon-child_care:before { + content: "\e9b8"; +} +.icon-child_friendly:before { + content: "\e9b9"; +} +.icon-chrome_reader_mode:before { + content: "\e9ba"; +} +.icon-class:before { + content: "\e9bb"; +} +.icon-clear_all:before { + content: "\e9bc"; +} +.icon-clear:before { + content: "\e9bd"; +} +.icon-close:before { + content: "\e9be"; +} +.icon-closed_caption:before { + content: "\e9bf"; +} +.icon-cloud_circle:before { + content: "\e9c0"; +} +.icon-cloud_done:before { + content: "\e9c1"; +} +.icon-cloud_download:before { + content: "\e9c2"; +} +.icon-cloud_off:before { + content: "\e9c3"; +} +.icon-cloud_queue:before { + content: "\e9c4"; +} +.icon-cloud_upload:before { + content: "\e9c5"; +} +.icon-cloud:before { + content: "\e9c6"; +} +.icon-code:before { + content: "\e9c7"; +} +.icon-collections_bookmark:before { + content: "\e9c8"; +} +.icon-collections:before { + content: "\e9c9"; +} +.icon-color_lens:before { + content: "\e9ca"; +} +.icon-colorize:before { + content: "\e9cb"; +} +.icon-comment:before { + content: "\e9cc"; +} +.icon-commute:before { + content: "\e9cd"; +} +.icon-compare_arrows:before { + content: "\e9ce"; +} +.icon-compare:before { + content: "\e9cf"; +} +.icon-compass_calibration:before { + content: "\e9d0"; +} +.icon-computer:before { + content: "\e9d1"; +} +.icon-confirmation_number:before { + content: "\e9d2"; +} +.icon-contact_mail:before { + content: "\e9d3"; +} +.icon-contact_phone:before { + content: "\e9d4"; +} +.icon-contact_support:before { + content: "\e9d5"; +} +.icon-contacts:before { + content: "\e9d6"; +} +.icon-control_camera:before { + content: "\e9d7"; +} +.icon-control_point_duplicate:before { + content: "\e9d8"; +} +.icon-control_point:before { + content: "\e9d9"; +} +.icon-copyright:before { + content: "\e9da"; +} +.icon-create_new_folder:before { + content: "\e9db"; +} +.icon-create:before { + content: "\e9dc"; +} +.icon-credit_card:before { + content: "\e9dd"; +} +.icon-crop_3_2:before { + content: "\e9de"; +} +.icon-crop_5_4:before { + content: "\e9df"; +} +.icon-crop_7_5:before { + content: "\e9e0"; +} +.icon-crop_16_9:before { + content: "\e9e1"; +} +.icon-crop_din:before { + content: "\e9e2"; +} +.icon-crop_free:before { + content: "\e9e3"; +} +.icon-crop_landscape:before { + content: "\e9e4"; +} +.icon-crop_original:before { + content: "\e9e5"; +} +.icon-crop_portrait:before { + content: "\e9e6"; +} +.icon-crop_rotate:before { + content: "\e9e7"; +} +.icon-crop_square:before { + content: "\e9e8"; +} +.icon-crop:before { + content: "\e9e9"; +} +.icon-dashboard:before { + content: "\e9ea"; +} +.icon-data_usage:before { + content: "\e9eb"; +} +.icon-date_range:before { + content: "\e9ec"; +} +.icon-dehaze:before { + content: "\e9ed"; +} +.icon-delete_forever:before { + content: "\e9ee"; +} +.icon-delete_outline:before { + content: "\e9ef"; +} +.icon-delete_sweep:before { + content: "\e9f0"; +} +.icon-delete:before { + content: "\e9f1"; +} +.icon-departure_board:before { + content: "\e9f2"; +} +.icon-description:before { + content: "\e9f3"; +} +.icon-desktop_access_disabled:before { + content: "\e9f4"; +} +.icon-desktop_mac:before { + content: "\e9f5"; +} +.icon-desktop_windows:before { + content: "\e9f6"; +} +.icon-details:before { + content: "\e9f7"; +} +.icon-developer_board:before { + content: "\e9f8"; +} +.icon-developer_mode:before { + content: "\e9f9"; +} +.icon-device_hub:before { + content: "\e9fa"; +} +.icon-device_unknown:before { + content: "\e9fb"; +} +.icon-devices_other:before { + content: "\e9fc"; +} +.icon-devices:before { + content: "\e9fd"; +} +.icon-dialer_sip:before { + content: "\e9fe"; +} +.icon-dialpad:before { + content: "\e9ff"; +} +.icon-directions_bike:before { + content: "\ea00"; +} +.icon-directions_boat:before { + content: "\ea01"; +} +.icon-directions_bus:before { + content: "\ea02"; +} +.icon-directions_car:before { + content: "\ea03"; +} +.icon-directions_railway:before { + content: "\ea04"; +} +.icon-directions_run:before { + content: "\ea05"; +} +.icon-directions_subway:before { + content: "\ea06"; +} +.icon-directions_transit:before { + content: "\ea07"; +} +.icon-directions_walk:before { + content: "\ea08"; +} +.icon-directions:before { + content: "\ea09"; +} +.icon-disc_full:before { + content: "\ea0a"; +} +.icon-dns:before { + content: "\ea0b"; +} +.icon-dock:before { + content: "\ea0c"; +} +.icon-domain_disabled:before { + content: "\ea0d"; +} +.icon-domain:before { + content: "\ea0e"; +} +.icon-done_all:before { + content: "\ea0f"; +} +.icon-done_outline:before { + content: "\ea10"; +} +.icon-done:before { + content: "\ea11"; +} +.icon-donut_large:before { + content: "\ea12"; +} +.icon-donut_small:before { + content: "\ea13"; +} +.icon-drafts:before { + content: "\ea14"; +} +.icon-drag_handle:before { + content: "\ea15"; +} +.icon-drag_indicator:before { + content: "\ea16"; +} +.icon-drive_eta:before { + content: "\ea17"; +} +.icon-duo:before { + content: "\ea18"; +} +.icon-dvr:before { + content: "\ea19"; +} +.icon-edit_attributes:before { + content: "\ea1a"; +} +.icon-edit_location:before { + content: "\ea1b"; +} +.icon-edit:before { + content: "\ea1c"; +} +.icon-eject:before { + content: "\ea1d"; +} +.icon-email:before { + content: "\ea1e"; +} +.icon-enhanced_encryption:before { + content: "\ea1f"; +} +.icon-equalizer:before { + content: "\ea20"; +} +.icon-error_outline:before { + content: "\ea21"; +} +.icon-error:before { + content: "\ea22"; +} +.icon-euro_symbol:before { + content: "\ea23"; +} +.icon-ev_station:before { + content: "\ea24"; +} +.icon-event_available:before { + content: "\ea25"; +} +.icon-event_busy:before { + content: "\ea26"; +} +.icon-event_note:before { + content: "\ea27"; +} +.icon-event_seat:before { + content: "\ea28"; +} +.icon-event:before { + content: "\ea29"; +} +.icon-exit_to_app:before { + content: "\ea2a"; +} +.icon-expand_less:before { + content: "\ea2b"; +} +.icon-expand_more:before { + content: "\ea2c"; +} +.icon-explicit:before { + content: "\ea2d"; +} +.icon-explore_off:before { + content: "\ea2e"; +} +.icon-explore:before { + content: "\ea2f"; +} +.icon-exposure_neg_1:before { + content: "\ea30"; +} +.icon-exposure_neg_2:before { + content: "\ea31"; +} +.icon-exposure_plus_1:before { + content: "\ea32"; +} +.icon-exposure_plus_2:before { + content: "\ea33"; +} +.icon-exposure_zero:before { + content: "\ea34"; +} +.icon-exposure:before { + content: "\ea35"; +} +.icon-extension:before { + content: "\ea36"; +} +.icon-face:before { + content: "\ea37"; +} +.icon-fast_forward:before { + content: "\ea38"; +} +.icon-fast_rewind:before { + content: "\ea39"; +} +.icon-fastfood:before { + content: "\ea3a"; +} +.icon-favorite_border:before { + content: "\ea3b"; +} +.icon-favorite:before { + content: "\ea3c"; +} +.icon-featured_play_list:before { + content: "\ea3d"; +} +.icon-featured_video:before { + content: "\ea3e"; +} +.icon-feedback:before { + content: "\ea3f"; +} +.icon-fiber_dvr:before { + content: "\ea40"; +} +.icon-fiber_manual_record:before { + content: "\ea41"; +} +.icon-fiber_new:before { + content: "\ea42"; +} +.icon-fiber_pin:before { + content: "\ea43"; +} +.icon-fiber_smart_record:before { + content: "\ea44"; +} +.icon-file_copy:before { + content: "\ea45"; +} +.icon-filter_1:before { + content: "\ea46"; +} +.icon-filter_2:before { + content: "\ea47"; +} +.icon-filter_3:before { + content: "\ea48"; +} +.icon-filter_4:before { + content: "\ea49"; +} +.icon-filter_5:before { + content: "\ea4a"; +} +.icon-filter_6:before { + content: "\ea4b"; +} +.icon-filter_7:before { + content: "\ea4c"; +} +.icon-filter_8:before { + content: "\ea4d"; +} +.icon-filter_9_plus:before { + content: "\ea4e"; +} +.icon-filter_9:before { + content: "\ea4f"; +} +.icon-filter_b_and_w:before { + content: "\ea50"; +} +.icon-filter_center_focus:before { + content: "\ea51"; +} +.icon-filter_drama:before { + content: "\ea52"; +} +.icon-filter_frames:before { + content: "\ea53"; +} +.icon-filter_hdr:before { + content: "\ea54"; +} +.icon-filter_list:before { + content: "\ea55"; +} +.icon-filter_none:before { + content: "\ea56"; +} +.icon-filter_tilt_shift:before { + content: "\ea57"; +} +.icon-filter_vintage:before { + content: "\ea58"; +} +.icon-filter:before { + content: "\ea59"; +} +.icon-find_in_page:before { + content: "\ea5a"; +} +.icon-find_replace:before { + content: "\ea5b"; +} +.icon-fingerprint:before { + content: "\ea5c"; +} +.icon-first_page:before { + content: "\ea5d"; +} +.icon-fitness_center:before { + content: "\ea5e"; +} +.icon-flag:before { + content: "\ea5f"; +} +.icon-flare:before { + content: "\ea60"; +} +.icon-flash_auto:before { + content: "\ea61"; +} +.icon-flash_off:before { + content: "\ea62"; +} +.icon-flash_on:before { + content: "\ea63"; +} +.icon-flight_land:before { + content: "\ea64"; +} +.icon-flight_takeoff:before { + content: "\ea65"; +} +.icon-flight:before { + content: "\ea66"; +} +.icon-flip_to_back:before { + content: "\ea67"; +} +.icon-flip_to_front:before { + content: "\ea68"; +} +.icon-flip:before { + content: "\ea69"; +} +.icon-folder_open:before { + content: "\ea6a"; +} +.icon-folder_shared:before { + content: "\ea6b"; +} +.icon-folder_special:before { + content: "\ea6c"; +} +.icon-folder:before { + content: "\ea6d"; +} +.icon-font_download:before { + content: "\ea6e"; +} +.icon-format_align_center:before { + content: "\ea6f"; +} +.icon-format_align_justify:before { + content: "\ea70"; +} +.icon-format_align_left:before { + content: "\ea71"; +} +.icon-format_align_right:before { + content: "\ea72"; +} +.icon-format_bold:before { + content: "\ea73"; +} +.icon-format_clear:before { + content: "\ea74"; +} +.icon-format_color_reset:before { + content: "\ea75"; +} +.icon-format_indent_decrease:before { + content: "\ea76"; +} +.icon-format_indent_increase:before { + content: "\ea77"; +} +.icon-format_italic:before { + content: "\ea78"; +} +.icon-format_line_spacing:before { + content: "\ea79"; +} +.icon-format_list_bulleted:before { + content: "\ea7a"; +} +.icon-format_list_numbered_rtl:before { + content: "\ea7b"; +} +.icon-format_list_numbered:before { + content: "\ea7c"; +} +.icon-format_paint:before { + content: "\ea7d"; +} +.icon-format_quote:before { + content: "\ea7e"; +} +.icon-format_shapes:before { + content: "\ea7f"; +} +.icon-format_size:before { + content: "\ea80"; +} +.icon-format_strikethrough:before { + content: "\ea81"; +} +.icon-format_textdirection_l_to_r:before { + content: "\ea82"; +} +.icon-format_textdirection_r_to_l:before { + content: "\ea83"; +} +.icon-format_underlined:before { + content: "\ea84"; +} +.icon-forum:before { + content: "\ea85"; +} +.icon-forward_5:before { + content: "\ea86"; +} +.icon-forward_10:before { + content: "\ea87"; +} +.icon-forward_30:before { + content: "\ea88"; +} +.icon-forward:before { + content: "\ea89"; +} +.icon-free_breakfast:before { + content: "\ea8a"; +} +.icon-fullscreen_exit:before { + content: "\ea8b"; +} +.icon-fullscreen:before { + content: "\ea8c"; +} +.icon-functions:before { + content: "\ea8d"; +} +.icon-g_translate:before { + content: "\ea8e"; +} +.icon-gamepad:before { + content: "\ea8f"; +} +.icon-games:before { + content: "\ea90"; +} +.icon-gavel:before { + content: "\ea91"; +} +.icon-gesture:before { + content: "\ea92"; +} +.icon-get_app:before { + content: "\ea93"; +} +.icon-gif:before { + content: "\ea94"; +} +.icon-golf_course:before { + content: "\ea95"; +} +.icon-gps_fixed:before { + content: "\ea96"; +} +.icon-gps_not_fixed:before { + content: "\ea97"; +} +.icon-gps_off:before { + content: "\ea98"; +} +.icon-grade:before { + content: "\ea99"; +} +.icon-gradient:before { + content: "\ea9a"; +} +.icon-grain:before { + content: "\ea9b"; +} +.icon-graphic_eq:before { + content: "\ea9c"; +} +.icon-grid_off:before { + content: "\ea9d"; +} +.icon-grid_on:before { + content: "\ea9e"; +} +.icon-group_add:before { + content: "\ea9f"; +} +.icon-group_work:before { + content: "\eaa0"; +} +.icon-group:before { + content: "\eaa1"; +} +.icon-hd:before { + content: "\eaa2"; +} +.icon-hdr_off:before { + content: "\eaa3"; +} +.icon-hdr_on:before { + content: "\eaa4"; +} +.icon-hdr_strong:before { + content: "\eaa5"; +} +.icon-hdr_weak:before { + content: "\eaa6"; +} +.icon-headset_mic:before { + content: "\eaa7"; +} +.icon-headset:before { + content: "\eaa8"; +} +.icon-healing:before { + content: "\eaa9"; +} +.icon-hearing:before { + content: "\eaaa"; +} +.icon-help_outline:before { + content: "\eaab"; +} +.icon-help:before { + content: "\eaac"; +} +.icon-high_quality:before { + content: "\eaad"; +} +.icon-highlight_off:before { + content: "\eaae"; +} +.icon-highlight:before { + content: "\eaaf"; +} +.icon-history:before { + content: "\eab0"; +} +.icon-home:before { + content: "\eab1"; +} +.icon-horizontal_split:before { + content: "\eab2"; +} +.icon-hot_tub:before { + content: "\eab3"; +} +.icon-hotel:before { + content: "\eab4"; +} +.icon-hourglass_empty:before { + content: "\eab5"; +} +.icon-hourglass_full:before { + content: "\eab6"; +} +.icon-how_to_reg:before { + content: "\eab7"; +} +.icon-how_to_vote:before { + content: "\eab8"; +} +.icon-http:before { + content: "\eab9"; +} +.icon-https:before { + content: "\eaba"; +} +.icon-image_aspect_ratio:before { + content: "\eabb"; +} +.icon-image_search:before { + content: "\eabc"; +} +.icon-image:before { + content: "\eabd"; +} +.icon-import_contacts:before { + content: "\eabe"; +} +.icon-import_export:before { + content: "\eabf"; +} +.icon-important_devices:before { + content: "\eac0"; +} +.icon-inbox:before { + content: "\eac1"; +} +.icon-indeterminate_check_box:before { + content: "\eac2"; +} +.icon-info:before { + content: "\eac3"; +} +.icon-input:before { + content: "\eac4"; +} +.icon-insert_chart_outlined:before { + content: "\eac5"; +} +.icon-insert_chart:before { + content: "\eac6"; +} +.icon-insert_comment:before { + content: "\eac7"; +} +.icon-insert_drive_file:before { + content: "\eac8"; +} +.icon-insert_emoticon:before { + content: "\eac9"; +} +.icon-insert_invitation:before { + content: "\eaca"; +} +.icon-insert_link:before { + content: "\eacb"; +} +.icon-insert_photo:before { + content: "\eacc"; +} +.icon-invert_colors_off:before { + content: "\eacd"; +} +.icon-invert_colors:before { + content: "\eace"; +} +.icon-iso:before { + content: "\eacf"; +} +.icon-keyboard_arrow_down:before { + content: "\ead0"; +} +.icon-keyboard_arrow_left:before { + content: "\ead1"; +} +.icon-keyboard_arrow_right:before { + content: "\ead2"; +} +.icon-keyboard_arrow_up:before { + content: "\ead3"; +} +.icon-keyboard_backspace:before { + content: "\ead4"; +} +.icon-keyboard_capslock:before { + content: "\ead5"; +} +.icon-keyboard_hide:before { + content: "\ead6"; +} +.icon-keyboard_return:before { + content: "\ead7"; +} +.icon-keyboard_tab:before { + content: "\ead8"; +} +.icon-keyboard_voice:before { + content: "\ead9"; +} +.icon-keyboard:before { + content: "\eada"; +} +.icon-kitchen:before { + content: "\eadb"; +} +.icon-label_important:before { + content: "\eadc"; +} +.icon-label_off:before { + content: "\eadd"; +} +.icon-label:before { + content: "\eade"; +} +.icon-landscape:before { + content: "\eadf"; +} +.icon-language:before { + content: "\eae0"; +} +.icon-laptop_chromebook:before { + content: "\eae1"; +} +.icon-laptop_mac:before { + content: "\eae2"; +} +.icon-laptop_windows:before { + content: "\eae3"; +} +.icon-laptop:before { + content: "\eae4"; +} +.icon-last_page:before { + content: "\eae5"; +} +.icon-launch:before { + content: "\eae6"; +} +.icon-layers_clear:before { + content: "\eae7"; +} +.icon-layers:before { + content: "\eae8"; +} +.icon-leak_add:before { + content: "\eae9"; +} +.icon-leak_remove:before { + content: "\eaea"; +} +.icon-lens:before { + content: "\eaeb"; +} +.icon-library_add:before { + content: "\eaec"; +} +.icon-library_books:before { + content: "\eaed"; +} +.icon-library_music:before { + content: "\eaee"; +} +.icon-line_style:before { + content: "\eaef"; +} +.icon-line_weight:before { + content: "\eaf0"; +} +.icon-linear_scale:before { + content: "\eaf1"; +} +.icon-link_off:before { + content: "\eaf2"; +} +.icon-link:before { + content: "\eaf3"; +} +.icon-linked_camera:before { + content: "\eaf4"; +} +.icon-list_alt:before { + content: "\eaf5"; +} +.icon-list:before { + content: "\eaf6"; +} +.icon-live_help:before { + content: "\eaf7"; +} +.icon-live_tv:before { + content: "\eaf8"; +} +.icon-local_activity:before { + content: "\eaf9"; +} +.icon-local_airport:before { + content: "\eafa"; +} +.icon-local_atm:before { + content: "\eafb"; +} +.icon-local_bar:before { + content: "\eafc"; +} +.icon-local_cafe:before { + content: "\eafd"; +} +.icon-local_car_wash:before { + content: "\eafe"; +} +.icon-local_convenience_store:before { + content: "\eaff"; +} +.icon-local_dining:before { + content: "\eb00"; +} +.icon-local_drink:before { + content: "\eb01"; +} +.icon-local_florist:before { + content: "\eb02"; +} +.icon-local_gas_station:before { + content: "\eb03"; +} +.icon-local_grocery_store:before { + content: "\eb04"; +} +.icon-local_hospital:before { + content: "\eb05"; +} +.icon-local_hotel:before { + content: "\eb06"; +} +.icon-local_laundry_service:before { + content: "\eb07"; +} +.icon-local_library:before { + content: "\eb08"; +} +.icon-local_mall:before { + content: "\eb09"; +} +.icon-local_movies:before { + content: "\eb0a"; +} +.icon-local_offer:before { + content: "\eb0b"; +} +.icon-local_parking:before { + content: "\eb0c"; +} +.icon-local_pharmacy:before { + content: "\eb0d"; +} +.icon-local_phone:before { + content: "\eb0e"; +} +.icon-local_pizza:before { + content: "\eb0f"; +} +.icon-local_play:before { + content: "\eb10"; +} +.icon-local_post_office:before { + content: "\eb11"; +} +.icon-local_printshop:before { + content: "\eb12"; +} +.icon-local_see:before { + content: "\eb13"; +} +.icon-local_shipping:before { + content: "\eb14"; +} +.icon-local_taxi:before { + content: "\eb15"; +} +.icon-location_city:before { + content: "\eb16"; +} +.icon-location_disabled:before { + content: "\eb17"; +} +.icon-location_off:before { + content: "\eb18"; +} +.icon-location_on:before { + content: "\eb19"; +} +.icon-location_searching:before { + content: "\eb1a"; +} +.icon-lock_open:before { + content: "\eb1b"; +} +.icon-lock:before { + content: "\eb1c"; +} +.icon-looks_3:before { + content: "\eb1d"; +} +.icon-looks_4:before { + content: "\eb1e"; +} +.icon-looks_5:before { + content: "\eb1f"; +} +.icon-looks_6:before { + content: "\eb20"; +} +.icon-looks_one:before { + content: "\eb21"; +} +.icon-looks_two:before { + content: "\eb22"; +} +.icon-looks:before { + content: "\eb23"; +} +.icon-loop:before { + content: "\eb24"; +} +.icon-loupe:before { + content: "\eb25"; +} +.icon-low_priority:before { + content: "\eb26"; +} +.icon-loyalty:before { + content: "\eb27"; +} +.icon-mail_outline:before { + content: "\eb28"; +} +.icon-mail:before { + content: "\eb29"; +} +.icon-map:before { + content: "\eb2a"; +} +.icon-markunread_mailbox:before { + content: "\eb2b"; +} +.icon-markunread:before { + content: "\eb2c"; +} +.icon-maximize:before { + content: "\eb2d"; +} +.icon-meeting_room:before { + content: "\eb2e"; +} +.icon-memory:before { + content: "\eb2f"; +} +.icon-menu:before { + content: "\eb30"; +} +.icon-merge_type:before { + content: "\eb31"; +} +.icon-message:before { + content: "\eb32"; +} +.icon-mic_none:before { + content: "\eb33"; +} +.icon-mic_off:before { + content: "\eb34"; +} +.icon-mic:before { + content: "\eb35"; +} +.icon-minimize:before { + content: "\eb36"; +} +.icon-missed_video_call:before { + content: "\eb37"; +} +.icon-mms:before { + content: "\eb38"; +} +.icon-mobile_friendly:before { + content: "\eb39"; +} +.icon-mobile_off:before { + content: "\eb3a"; +} +.icon-mobile_screen_share:before { + content: "\eb3b"; +} +.icon-mode_comment:before { + content: "\eb3c"; +} +.icon-monetization_on:before { + content: "\eb3d"; +} +.icon-money_off:before { + content: "\eb3e"; +} +.icon-money:before { + content: "\eb3f"; +} +.icon-monochrome_photos:before { + content: "\eb40"; +} +.icon-mood_bad:before { + content: "\eb41"; +} +.icon-mood:before { + content: "\eb42"; +} +.icon-more_horiz:before { + content: "\eb43"; +} +.icon-more_vert:before { + content: "\eb44"; +} +.icon-more:before { + content: "\eb45"; +} +.icon-motorcycle:before { + content: "\eb46"; +} +.icon-mouse:before { + content: "\eb47"; +} +.icon-move_to_inbox:before { + content: "\eb48"; +} +.icon-movie_creation:before { + content: "\eb49"; +} +.icon-movie_filter:before { + content: "\eb4a"; +} +.icon-movie:before { + content: "\eb4b"; +} +.icon-multiline_chart:before { + content: "\eb4c"; +} +.icon-music_note:before { + content: "\eb4d"; +} +.icon-music_off:before { + content: "\eb4e"; +} +.icon-music_video:before { + content: "\eb4f"; +} +.icon-my_location:before { + content: "\eb50"; +} +.icon-nature_people:before { + content: "\eb51"; +} +.icon-nature:before { + content: "\eb52"; +} +.icon-navigate_before:before { + content: "\eb53"; +} +.icon-navigate_next:before { + content: "\eb54"; +} +.icon-navigation:before { + content: "\eb55"; +} +.icon-near_me:before { + content: "\eb56"; +} +.icon-network_check:before { + content: "\eb57"; +} +.icon-network_locked:before { + content: "\eb58"; +} +.icon-new_releases:before { + content: "\eb59"; +} +.icon-next_week:before { + content: "\eb5a"; +} +.icon-nfc:before { + content: "\eb5b"; +} +.icon-no_encryption:before { + content: "\eb5c"; +} +.icon-no_meeting_room:before { + content: "\eb5d"; +} +.icon-no_sim:before { + content: "\eb5e"; +} +.icon-not_interested:before { + content: "\eb5f"; +} +.icon-not_listed_location:before { + content: "\eb60"; +} +.icon-note_add:before { + content: "\eb61"; +} +.icon-note:before { + content: "\eb62"; +} +.icon-notes:before { + content: "\eb63"; +} +.icon-notification_important:before { + content: "\eb64"; +} +.icon-notifications_active:before { + content: "\eb65"; +} +.icon-notifications_none:before { + content: "\eb66"; +} +.icon-notifications_off:before { + content: "\eb67"; +} +.icon-notifications_paused:before { + content: "\eb68"; +} +.icon-notifications:before { + content: "\eb69"; +} +.icon-offline_bolt:before { + content: "\eb6a"; +} +.icon-offline_pin:before { + content: "\eb6b"; +} +.icon-ondemand_video:before { + content: "\eb6c"; +} +.icon-opacity:before { + content: "\eb6d"; +} +.icon-open_in_browser:before { + content: "\eb6e"; +} +.icon-open_in_new:before { + content: "\eb6f"; +} +.icon-open_with:before { + content: "\eb70"; +} +.icon-outlined_flag:before { + content: "\eb71"; +} +.icon-pages:before { + content: "\eb72"; +} +.icon-pageview:before { + content: "\eb73"; +} +.icon-palette:before { + content: "\eb74"; +} +.icon-pan_tool:before { + content: "\eb75"; +} +.icon-panorama_fish_eye:before { + content: "\eb76"; +} +.icon-panorama_horizontal:before { + content: "\eb77"; +} +.icon-panorama_vertical:before { + content: "\eb78"; +} +.icon-panorama_wide_angle:before { + content: "\eb79"; +} +.icon-panorama:before { + content: "\eb7a"; +} +.icon-party_mode:before { + content: "\eb7b"; +} +.icon-pause_circle_filled:before { + content: "\eb7c"; +} +.icon-pause_circle_outline:before { + content: "\eb7d"; +} +.icon-pause_presentation:before { + content: "\eb7e"; +} +.icon-pause:before { + content: "\eb7f"; +} +.icon-payment:before { + content: "\eb80"; +} +.icon-people_outline:before { + content: "\eb81"; +} +.icon-people:before { + content: "\eb82"; +} +.icon-perm_camera_mic:before { + content: "\eb83"; +} +.icon-perm_contact_calendar:before { + content: "\eb84"; +} +.icon-perm_data_setting:before { + content: "\eb85"; +} +.icon-perm_device_information:before { + content: "\eb86"; +} +.icon-perm_identity:before { + content: "\eb87"; +} +.icon-perm_media:before { + content: "\eb88"; +} +.icon-perm_phone_msg:before { + content: "\eb89"; +} +.icon-perm_scan_wifi:before { + content: "\eb8a"; +} +.icon-person_add_disabled:before { + content: "\eb8b"; +} +.icon-person_add:before { + content: "\eb8c"; +} +.icon-person_outline:before { + content: "\eb8d"; +} +.icon-person_pin_circle:before { + content: "\eb8e"; +} +.icon-person_pin:before { + content: "\eb8f"; +} +.icon-person:before { + content: "\eb90"; +} +.icon-personal_video:before { + content: "\eb91"; +} +.icon-pets:before { + content: "\eb92"; +} +.icon-phone_android:before { + content: "\eb93"; +} +.icon-phone_bluetooth_speaker:before { + content: "\eb94"; +} +.icon-phone_callback:before { + content: "\eb95"; +} +.icon-phone_forwarded:before { + content: "\eb96"; +} +.icon-phone_in_talk:before { + content: "\eb97"; +} +.icon-phone_iphone:before { + content: "\eb98"; +} +.icon-phone_locked:before { + content: "\eb99"; +} +.icon-phone_missed:before { + content: "\eb9a"; +} +.icon-phone_paused:before { + content: "\eb9b"; +} +.icon-phone:before { + content: "\eb9c"; +} +.icon-phonelink_erase:before { + content: "\eb9d"; +} +.icon-phonelink_lock:before { + content: "\eb9e"; +} +.icon-phonelink_off:before { + content: "\eb9f"; +} +.icon-phonelink_ring:before { + content: "\eba0"; +} +.icon-phonelink_setup:before { + content: "\eba1"; +} +.icon-phonelink:before { + content: "\eba2"; +} +.icon-photo_album:before { + content: "\eba3"; +} +.icon-photo_camera:before { + content: "\eba4"; +} +.icon-photo_filter:before { + content: "\eba5"; +} +.icon-photo_library:before { + content: "\eba6"; +} +.icon-photo_size_select_actual:before { + content: "\eba7"; +} +.icon-photo_size_select_large:before { + content: "\eba8"; +} +.icon-photo_size_select_small:before { + content: "\eba9"; +} +.icon-photo:before { + content: "\ebaa"; +} +.icon-picture_as_pdf:before { + content: "\ebab"; +} +.icon-picture_in_picture_alt:before { + content: "\ebac"; +} +.icon-picture_in_picture:before { + content: "\ebad"; +} +.icon-pie_chart:before { + content: "\ebae"; +} +.icon-pin_drop:before { + content: "\ebaf"; +} +.icon-place:before { + content: "\ebb0"; +} +.icon-play_arrow:before { + content: "\ebb1"; +} +.icon-play_circle_filled_white:before { + content: "\ebb2"; +} +.icon-play_circle_filled:before { + content: "\ebb3"; +} +.icon-play_circle_outline:before { + content: "\ebb4"; +} +.icon-play_for_work:before { + content: "\ebb5"; +} +.icon-playlist_add_check:before { + content: "\ebb6"; +} +.icon-playlist_add:before { + content: "\ebb7"; +} +.icon-playlist_play:before { + content: "\ebb8"; +} +.icon-plus_one:before { + content: "\ebb9"; +} +.icon-poll:before { + content: "\ebba"; +} +.icon-polymer:before { + content: "\ebbb"; +} +.icon-pool:before { + content: "\ebbc"; +} +.icon-portable_wifi_off:before { + content: "\ebbd"; +} +.icon-portrait:before { + content: "\ebbe"; +} +.icon-power_input:before { + content: "\ebbf"; +} +.icon-power_off:before { + content: "\ebc0"; +} +.icon-power_settings_new:before { + content: "\ebc1"; +} +.icon-power:before { + content: "\ebc2"; +} +.icon-pregnant_woman:before { + content: "\ebc3"; +} +.icon-present_to_all:before { + content: "\ebc4"; +} +.icon-print_disabled:before { + content: "\ebc5"; +} +.icon-print:before { + content: "\ebc6"; +} +.icon-priority_high:before { + content: "\ebc7"; +} +.icon-public:before { + content: "\ebc8"; +} +.icon-publish:before { + content: "\ebc9"; +} +.icon-query_builder:before { + content: "\ebca"; +} +.icon-question_answer:before { + content: "\ebcb"; +} +.icon-queue_music:before { + content: "\ebcc"; +} +.icon-queue_play_next:before { + content: "\ebcd"; +} +.icon-queue:before { + content: "\ebce"; +} +.icon-radio_button_checked:before { + content: "\ebcf"; +} +.icon-radio_button_unchecked:before { + content: "\ebd0"; +} +.icon-radio:before { + content: "\ebd1"; +} +.icon-rate_review:before { + content: "\ebd2"; +} +.icon-receipt:before { + content: "\ebd3"; +} +.icon-recent_actors:before { + content: "\ebd4"; +} +.icon-record_voice_over:before { + content: "\ebd5"; +} +.icon-redeem:before { + content: "\ebd6"; +} +.icon-redo:before { + content: "\ebd7"; +} +.icon-refresh:before { + content: "\ebd8"; +} +.icon-remove_circle_outline:before { + content: "\ebd9"; +} +.icon-remove_circle:before { + content: "\ebda"; +} +.icon-remove_from_queue:before { + content: "\ebdb"; +} +.icon-remove_red_eye:before { + content: "\ebdc"; +} +.icon-remove_shopping_cart:before { + content: "\ebdd"; +} +.icon-remove:before { + content: "\ebde"; +} +.icon-reorder:before { + content: "\ebdf"; +} +.icon-repeat_one:before { + content: "\ebe0"; +} +.icon-repeat:before { + content: "\ebe1"; +} +.icon-replay_5:before { + content: "\ebe2"; +} +.icon-replay_10:before { + content: "\ebe3"; +} +.icon-replay_30:before { + content: "\ebe4"; +} +.icon-replay:before { + content: "\ebe5"; +} +.icon-reply_all:before { + content: "\ebe6"; +} +.icon-reply:before { + content: "\ebe7"; +} +.icon-report_off:before { + content: "\ebe8"; +} +.icon-report_problem:before { + content: "\ebe9"; +} +.icon-report:before { + content: "\ebea"; +} +.icon-restaurant_menu:before { + content: "\ebeb"; +} +.icon-restaurant:before { + content: "\ebec"; +} +.icon-restore_from_trash:before { + content: "\ebed"; +} +.icon-restore_page:before { + content: "\ebee"; +} +.icon-restore:before { + content: "\ebef"; +} +.icon-ring_volume:before { + content: "\ebf0"; +} +.icon-room_service:before { + content: "\ebf1"; +} +.icon-room:before { + content: "\ebf2"; +} +.icon-rotate_90_degrees_ccw:before { + content: "\ebf3"; +} +.icon-rotate_left:before { + content: "\ebf4"; +} +.icon-rotate_right:before { + content: "\ebf5"; +} +.icon-rounded_corner:before { + content: "\ebf6"; +} +.icon-router:before { + content: "\ebf7"; +} +.icon-rowing:before { + content: "\ebf8"; +} +.icon-rss_feed:before { + content: "\ebf9"; +} +.icon-rv_hookup:before { + content: "\ebfa"; +} +.icon-satellite:before { + content: "\ebfb"; +} +.icon-save_alt:before { + content: "\ebfc"; +} +.icon-save:before { + content: "\ebfd"; +} +.icon-scanner:before { + content: "\ebfe"; +} +.icon-scatter_plot:before { + content: "\ebff"; +} +.icon-schedule:before { + content: "\ec00"; +} +.icon-school:before { + content: "\ec01"; +} +.icon-score:before { + content: "\ec02"; +} +.icon-screen_lock_landscape:before { + content: "\ec03"; +} +.icon-screen_lock_portrait:before { + content: "\ec04"; +} +.icon-screen_lock_rotation:before { + content: "\ec05"; +} +.icon-screen_rotation:before { + content: "\ec06"; +} +.icon-screen_share:before { + content: "\ec07"; +} +.icon-sd_card:before { + content: "\ec08"; +} +.icon-sd_storage:before { + content: "\ec09"; +} +.icon-search:before { + content: "\ec0a"; +} +.icon-security:before { + content: "\ec0b"; +} +.icon-select_all:before { + content: "\ec0c"; +} +.icon-send:before { + content: "\ec0d"; +} +.icon-sentiment_dissatisfied:before { + content: "\ec0e"; +} +.icon-sentiment_satisfied_alt:before { + content: "\ec0f"; +} +.icon-sentiment_satisfied:before { + content: "\ec10"; +} +.icon-sentiment_very_dissatisfied:before { + content: "\ec11"; +} +.icon-sentiment_very_satisfied:before { + content: "\ec12"; +} +.icon-settings_applications:before { + content: "\ec13"; +} +.icon-settings_backup_restore:before { + content: "\ec14"; +} +.icon-settings_bluetooth:before { + content: "\ec15"; +} +.icon-settings_brightness:before { + content: "\ec16"; +} +.icon-settings_cell:before { + content: "\ec17"; +} +.icon-settings_ethernet:before { + content: "\ec18"; +} +.icon-settings_input_antenna:before { + content: "\ec19"; +} +.icon-settings_input_component:before { + content: "\ec1a"; +} +.icon-settings_input_composite:before { + content: "\ec1b"; +} +.icon-settings_input_hdmi:before { + content: "\ec1c"; +} +.icon-settings_input_svideo:before { + content: "\ec1d"; +} +.icon-settings_overscan:before { + content: "\ec1e"; +} +.icon-settings_phone:before { + content: "\ec1f"; +} +.icon-settings_power:before { + content: "\ec20"; +} +.icon-settings_remote:before { + content: "\ec21"; +} +.icon-settings_system_daydream:before { + content: "\ec22"; +} +.icon-settings_voice:before { + content: "\ec23"; +} +.icon-settings:before { + content: "\ec24"; +} +.icon-share:before { + content: "\ec25"; +} +.icon-shop_two:before { + content: "\ec26"; +} +.icon-shop:before { + content: "\ec27"; +} +.icon-shopping_basket:before { + content: "\ec28"; +} +.icon-shopping_cart:before { + content: "\ec29"; +} +.icon-short_text:before { + content: "\ec2a"; +} +.icon-show_chart:before { + content: "\ec2b"; +} +.icon-shuffle:before { + content: "\ec2c"; +} +.icon-shutter_speed:before { + content: "\ec2d"; +} +.icon-signal_cellular_0_bar:before { + content: "\ec2e"; +} +.icon-signal_cellular_4_bar:before { + content: "\ec2f"; +} +.icon-signal_cellular_alt:before { + content: "\ec30"; +} +.icon-signal_cellular_connected_no_internet_4_bar:before { + content: "\ec31"; +} +.icon-signal_cellular_no_sim:before { + content: "\ec32"; +} +.icon-signal_cellular_null:before { + content: "\ec33"; +} +.icon-signal_cellular_off:before { + content: "\ec34"; +} +.icon-signal_wifi_0_bar:before { + content: "\ec35"; +} +.icon-signal_wifi_4_bar_lock:before { + content: "\ec36"; +} +.icon-signal_wifi_4_bar:before { + content: "\ec37"; +} +.icon-signal_wifi_off:before { + content: "\ec38"; +} +.icon-sim_card:before { + content: "\ec39"; +} +.icon-skip_next:before { + content: "\ec3a"; +} +.icon-skip_previous:before { + content: "\ec3b"; +} +.icon-slideshow:before { + content: "\ec3c"; +} +.icon-slow_motion_video:before { + content: "\ec3d"; +} +.icon-smartphone:before { + content: "\ec3e"; +} +.icon-smoke_free:before { + content: "\ec3f"; +} +.icon-smoking_rooms:before { + content: "\ec40"; +} +.icon-sms_failed:before { + content: "\ec41"; +} +.icon-sms:before { + content: "\ec42"; +} +.icon-snooze:before { + content: "\ec43"; +} +.icon-sort_by_alpha:before { + content: "\ec44"; +} +.icon-sort:before { + content: "\ec45"; +} +.icon-spa:before { + content: "\ec46"; +} +.icon-space_bar:before { + content: "\ec47"; +} +.icon-speaker_group:before { + content: "\ec48"; +} +.icon-speaker_notes_off:before { + content: "\ec49"; +} +.icon-speaker_notes:before { + content: "\ec4a"; +} +.icon-speaker_phone:before { + content: "\ec4b"; +} +.icon-speaker:before { + content: "\ec4c"; +} +.icon-spellcheck:before { + content: "\ec4d"; +} +.icon-star_border:before { + content: "\ec4e"; +} +.icon-star_half:before { + content: "\ec4f"; +} +.icon-star_rate:before { + content: "\ec50"; +} +.icon-star:before { + content: "\ec51"; +} +.icon-stars:before { + content: "\ec52"; +} +.icon-stay_current_landscape:before { + content: "\ec53"; +} +.icon-stay_current_portrait:before { + content: "\ec54"; +} +.icon-stay_primary_landscape:before { + content: "\ec55"; +} +.icon-stay_primary_portrait:before { + content: "\ec56"; +} +.icon-stop_screen_share:before { + content: "\ec57"; +} +.icon-stop:before { + content: "\ec58"; +} +.icon-storage:before { + content: "\ec59"; +} +.icon-store_mall_directory:before { + content: "\ec5a"; +} +.icon-store:before { + content: "\ec5b"; +} +.icon-straighten:before { + content: "\ec5c"; +} +.icon-streetview:before { + content: "\ec5d"; +} +.icon-strikethrough_s:before { + content: "\ec5e"; +} +.icon-style:before { + content: "\ec5f"; +} +.icon-subdirectory_arrow_left:before { + content: "\ec60"; +} +.icon-subdirectory_arrow_right:before { + content: "\ec61"; +} +.icon-subject:before { + content: "\ec62"; +} +.icon-subscriptions:before { + content: "\ec63"; +} +.icon-subtitles:before { + content: "\ec64"; +} +.icon-subway:before { + content: "\ec65"; +} +.icon-supervised_user_circle:before { + content: "\ec66"; +} +.icon-supervisor_account:before { + content: "\ec67"; +} +.icon-surround_sound:before { + content: "\ec68"; +} +.icon-swap_calls:before { + content: "\ec69"; +} +.icon-swap_horiz:before { + content: "\ec6a"; +} +.icon-swap_horizontal_circle:before { + content: "\ec6b"; +} +.icon-swap_vert:before { + content: "\ec6c"; +} +.icon-swap_vertical_circle:before { + content: "\ec6d"; +} +.icon-switch_camera:before { + content: "\ec6e"; +} +.icon-switch_video:before { + content: "\ec6f"; +} +.icon-sync_disabled:before { + content: "\ec70"; +} +.icon-sync_problem:before { + content: "\ec71"; +} +.icon-sync:before { + content: "\ec72"; +} +.icon-system_update:before { + content: "\ec73"; +} +.icon-tab_unselected:before { + content: "\ec74"; +} +.icon-tab:before { + content: "\ec75"; +} +.icon-table_chart:before { + content: "\ec76"; +} +.icon-tablet_android:before { + content: "\ec77"; +} +.icon-tablet_mac:before { + content: "\ec78"; +} +.icon-tablet:before { + content: "\ec79"; +} +.icon-tag_faces:before { + content: "\ec7a"; +} +.icon-tap_and_play:before { + content: "\ec7b"; +} +.icon-terrain:before { + content: "\ec7c"; +} +.icon-text_fields:before { + content: "\ec7d"; +} +.icon-text_format:before { + content: "\ec7e"; +} +.icon-text_rotate_up:before { + content: "\ec7f"; +} +.icon-text_rotate_vertical:before { + content: "\ec80"; +} +.icon-text_rotation_down:before { + content: "\ec81"; +} +.icon-text_rotation_none:before { + content: "\ec82"; +} +.icon-textsms:before { + content: "\ec83"; +} +.icon-texture:before { + content: "\ec84"; +} +.icon-theaters:before { + content: "\ec85"; +} +.icon-thumb_down_alt:before { + content: "\ec86"; +} +.icon-thumb_down:before { + content: "\ec87"; +} +.icon-thumb_up_alt:before { + content: "\ec88"; +} +.icon-thumb_up:before { + content: "\ec89"; +} +.icon-thumbs_up_down:before { + content: "\ec8a"; +} +.icon-time_to_leave:before { + content: "\ec8b"; +} +.icon-timelapse:before { + content: "\ec8c"; +} +.icon-timeline:before { + content: "\ec8d"; +} +.icon-timer_3:before { + content: "\ec8e"; +} +.icon-timer_10:before { + content: "\ec8f"; +} +.icon-timer_off:before { + content: "\ec90"; +} +.icon-timer:before { + content: "\ec91"; +} +.icon-title:before { + content: "\ec92"; +} +.icon-toc:before { + content: "\ec93"; +} +.icon-today:before { + content: "\ec94"; +} +.icon-toggle_off:before { + content: "\ec95"; +} +.icon-toggle_on:before { + content: "\ec96"; +} +.icon-toll:before { + content: "\ec97"; +} +.icon-tonality:before { + content: "\ec98"; +} +.icon-touch_app:before { + content: "\ec99"; +} +.icon-toys:before { + content: "\ec9a"; +} +.icon-track_changes:before { + content: "\ec9b"; +} +.icon-traffic:before { + content: "\ec9c"; +} +.icon-train:before { + content: "\ec9d"; +} +.icon-tram:before { + content: "\ec9e"; +} +.icon-transfer_within_a_station:before { + content: "\ec9f"; +} +.icon-transform:before { + content: "\eca0"; +} +.icon-transit_enterexit:before { + content: "\eca1"; +} +.icon-translate:before { + content: "\eca2"; +} +.icon-trending_down:before { + content: "\eca3"; +} +.icon-trending_flat:before { + content: "\eca4"; +} +.icon-trending_up:before { + content: "\eca5"; +} +.icon-trip_origin:before { + content: "\eca6"; +} +.icon-tune:before { + content: "\eca7"; +} +.icon-turned_in_not:before { + content: "\eca8"; +} +.icon-turned_in:before { + content: "\eca9"; +} +.icon-tv_off:before { + content: "\ecaa"; +} +.icon-tv:before { + content: "\ecab"; +} +.icon-unarchive:before { + content: "\ecac"; +} +.icon-undo:before { + content: "\ecad"; +} +.icon-unfold_less:before { + content: "\ecae"; +} +.icon-unfold_more:before { + content: "\ecaf"; +} +.icon-unsubscribe:before { + content: "\ecb0"; +} +.icon-update:before { + content: "\ecb1"; +} +.icon-usb:before { + content: "\ecb2"; +} +.icon-verified_user:before { + content: "\ecb3"; +} +.icon-vertical_align_bottom:before { + content: "\ecb4"; +} +.icon-vertical_align_center:before { + content: "\ecb5"; +} +.icon-vertical_align_top:before { + content: "\ecb6"; +} +.icon-vertical_split:before { + content: "\ecb7"; +} +.icon-vibration:before { + content: "\ecb8"; +} +.icon-video_call:before { + content: "\ecb9"; +} +.icon-video_label:before { + content: "\ecba"; +} +.icon-video_library:before { + content: "\ecbb"; +} +.icon-videocam_off:before { + content: "\ecbc"; +} +.icon-videocam:before { + content: "\ecbd"; +} +.icon-videogame_asset:before { + content: "\ecbe"; +} +.icon-view_agenda:before { + content: "\ecbf"; +} +.icon-view_array:before { + content: "\ecc0"; +} +.icon-view_carousel:before { + content: "\ecc1"; +} +.icon-view_column:before { + content: "\ecc2"; +} +.icon-view_comfy:before { + content: "\ecc3"; +} +.icon-view_compact:before { + content: "\ecc4"; +} +.icon-view_day:before { + content: "\ecc5"; +} +.icon-view_headline:before { + content: "\ecc6"; +} +.icon-view_list:before { + content: "\ecc7"; +} +.icon-view_module:before { + content: "\ecc8"; +} +.icon-view_quilt:before { + content: "\ecc9"; +} +.icon-view_stream:before { + content: "\ecca"; +} +.icon-view_week:before { + content: "\eccb"; +} +.icon-vignette:before { + content: "\eccc"; +} +.icon-visibility_off:before { + content: "\eccd"; +} +.icon-visibility:before { + content: "\ecce"; +} +.icon-voice_chat:before { + content: "\eccf"; +} +.icon-voice_over_off:before { + content: "\ecd0"; +} +.icon-voicemail:before { + content: "\ecd1"; +} +.icon-volume_down:before { + content: "\ecd2"; +} +.icon-volume_mute:before { + content: "\ecd3"; +} +.icon-volume_off:before { + content: "\ecd4"; +} +.icon-volume_up:before { + content: "\ecd5"; +} +.icon-vpn_key:before { + content: "\ecd6"; +} +.icon-vpn_lock:before { + content: "\ecd7"; +} +.icon-wallpaper:before { + content: "\ecd8"; +} +.icon-warning:before { + content: "\ecd9"; +} +.icon-watch_later:before { + content: "\ecda"; +} +.icon-watch:before { + content: "\ecdb"; +} +.icon-waves:before { + content: "\ecdc"; +} +.icon-wb_auto:before { + content: "\ecdd"; +} +.icon-wb_cloudy:before { + content: "\ecde"; +} +.icon-wb_incandescent:before { + content: "\ecdf"; +} +.icon-wb_iridescent:before { + content: "\ece0"; +} +.icon-wb_sunny:before { + content: "\ece1"; +} +.icon-wc:before { + content: "\ece2"; +} +.icon-web_asset:before { + content: "\ece3"; +} +.icon-web:before { + content: "\ece4"; +} +.icon-weekend:before { + content: "\ece5"; +} +.icon-whatshot:before { + content: "\ece6"; +} +.icon-where_to_vote:before { + content: "\ece7"; +} +.icon-widgets:before { + content: "\ece8"; +} +.icon-wifi_lock:before { + content: "\ece9"; +} +.icon-wifi_off:before { + content: "\ecea"; +} +.icon-wifi_tethering:before { + content: "\eceb"; +} +.icon-wifi:before { + content: "\ecec"; +} +.icon-work_off:before { + content: "\eced"; +} +.icon-work_outline:before { + content: "\ecee"; +} +.icon-work:before { + content: "\ecef"; +} +.icon-wrap_text:before { + content: "\ecf0"; +} +.icon-youtube_searched_for:before { + content: "\ecf1"; +} +.icon-zoom_in:before { + content: "\ecf2"; +} +.icon-zoom_out_map:before { + content: "\ecf3"; +} +.icon-zoom_out:before { + content: "\ecf4"; +} diff --git a/src/assets/icons/meteocons/Read Me.txt b/src/assets/icons/meteocons/Read Me.txt new file mode 100644 index 0000000..8491652 --- /dev/null +++ b/src/assets/icons/meteocons/Read Me.txt @@ -0,0 +1,7 @@ +Open *demo.html* to see a list of all the glyphs in your font along with their codes/ligatures. + +To use the generated font in desktop programs, you can install the TTF font. In order to copy the character associated with each icon, refer to the text box at the bottom right corner of each glyph in demo.html. The character inside this text box may be invisible; but it can still be copied. See this guide for more info: https://icomoon.io/#docs/local-fonts + +You won't need any of the files located under the *demo-files* directory when including the generated font in your own projects. + +You can import *selection.json* back to the IcoMoon app using the *Import Icons* button (or via Main Menu → Manage Projects) to retrieve your icon selection. diff --git a/src/assets/icons/meteocons/demo-files/demo.css b/src/assets/icons/meteocons/demo-files/demo.css new file mode 100644 index 0000000..f73ce90 --- /dev/null +++ b/src/assets/icons/meteocons/demo-files/demo.css @@ -0,0 +1,190 @@ +body { + padding: 0; + margin: 0; + font-family: sans-serif; + font-size: 1em; + line-height: 1.5; + color: #555; + background: #FFF; +} + +h1 { + font-size: 1.5em; + font-weight: normal; +} + +small { + font-size: .66666667em; +} + +a { + color: #E74C3C; + text-decoration: none; +} + +a:hover, a:focus { + box-shadow: 0 1px #E74C3C; +} + +.bshadow0, input { + box-shadow: inset 0 -2px #E7E7E7; +} + +input:hover { + box-shadow: inset 0 -2px #CCC; +} + +input, fieldset { + font-family: sans-serif; + font-size: 1em; + margin: 0; + padding: 0; + border: 0; +} + +input { + color: inherit; + line-height: 1.5; + height: 1.5em; + padding: .25em 0; +} + +input:focus { + outline: none; + box-shadow: inset 0 -2px #449FDB; +} + +.glyph { + font-size: 16px; + width: 15em; + padding-bottom: 1em; + margin-right: 4em; + margin-bottom: 1em; + float: left; + overflow: hidden; +} + +.liga { + width: 80%; + width: calc(100% - 2.5em); +} + +.talign-right { + text-align: right; +} + +.talign-center { + text-align: center; +} + +.bgc1 { + background: #F1F1F1; +} + +.fgc1 { + color: #999; +} + +.fgc0 { + color: #000; +} + +p { + margin-top: 1em; + margin-bottom: 1em; +} + +.mvm { + margin-top: .75em; + margin-bottom: .75em; +} + +.mtn { + margin-top: 0; +} + +.mtl, .mal { + margin-top: 1.5em; +} + +.mbl, .mal { + margin-bottom: 1.5em; +} + +.mal, .mhl { + margin-left: 1.5em; + margin-right: 1.5em; +} + +.mhmm { + margin-left: 1em; + margin-right: 1em; +} + +.mls { + margin-left: .25em; +} + +.ptl { + padding-top: 1.5em; +} + +.pbs, .pvs { + padding-bottom: .25em; +} + +.pvs, .pts { + padding-top: .25em; +} + +.unit { + float: left; +} + +.unitRight { + float: right; +} + +.size1of2 { + width: 50%; +} + +.size1of1 { + width: 100%; +} + +.clearfix:before, .clearfix:after { + content: " "; + display: table; +} + +.clearfix:after { + clear: both; +} + +.hidden-true { + display: none; +} + +.textbox0 { + width: 3em; + background: #F1F1F1; + padding: .25em .5em; + line-height: 1.5; + height: 1.5em; +} + +#testDrive { + display: block; + padding-top: 24px; + line-height: 1.5; +} + +.fs0 { + font-size: 16px; +} + +.fs1 { + font-size: 24px; +} + diff --git a/src/assets/icons/meteocons/demo-files/demo.js b/src/assets/icons/meteocons/demo-files/demo.js new file mode 100644 index 0000000..20becf4 --- /dev/null +++ b/src/assets/icons/meteocons/demo-files/demo.js @@ -0,0 +1,38 @@ +if ( !('boxShadow' in document.body.style) ) +{ + document.body.setAttribute('class', 'noBoxShadow'); +} + +document.body.addEventListener("click", function (e) { + var target = e.target; + if ( target.tagName === "INPUT" && + target.getAttribute('class').indexOf('liga') === -1 ) + { + target.select(); + } +}); + +(function () { + var fontSize = document.getElementById('fontSize'), + testDrive = document.getElementById('testDrive'), + testText = document.getElementById('testText'); + + function updateTest() + { + testDrive.innerHTML = testText.value || String.fromCharCode(160); + if ( window.icomoonLiga ) + { + window.icomoonLiga(testDrive); + } + } + + function updateSize() + { + testDrive.style.fontSize = fontSize.value + 'px'; + } + + fontSize.addEventListener('change', updateSize, false); + testText.addEventListener('input', updateTest, false); + testText.addEventListener('change', updateTest, false); + updateSize(); +}()); diff --git a/src/assets/icons/meteocons/demo.html b/src/assets/icons/meteocons/demo.html new file mode 100644 index 0000000..bc9f824 --- /dev/null +++ b/src/assets/icons/meteocons/demo.html @@ -0,0 +1,795 @@ + + + + + IcoMoon Demo + + + + + + +
+

+ Font Name: + meteocons + (Glyphs: 47) +

+
+
+

Grid Size: 16

+
+
+ + + + icon-sunrise +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-sun +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-moon +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-sun2 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-windy +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-wind +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-snowflake +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-cloudy +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-cloud +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-weather +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-weather2 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-weather3 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-lines +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-cloud2 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-lightning +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-lightning2 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-rainy +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-rainy2 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-windy2 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-windy3 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-snowy +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-snowy2 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-snowy3 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-weather4 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-cloudy2 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-cloud3 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-lightning3 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-sun3 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-moon2 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-cloudy3 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-cloud4 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-cloud5 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-lightning4 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-rainy3 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-rainy4 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-windy4 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-windy5 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-snowy4 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-snowy5 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-weather5 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-cloudy4 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-lightning5 +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-thermometer +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-compass +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-none +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-Celsius +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-Fahrenheit +
+
+ + +
+
+ liga: + +
+
+
+ + +
+

Font Test Drive

+ + +
  +
+
+ +
+

Generated by IcoMoon

+
+ + + + diff --git a/src/assets/icons/meteocons/fonts/meteocons.svg b/src/assets/icons/meteocons/fonts/meteocons.svg new file mode 100644 index 0000000..f060478 --- /dev/null +++ b/src/assets/icons/meteocons/fonts/meteocons.svg @@ -0,0 +1,106 @@ + + + + Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/meteocons/fonts/meteocons.ttf b/src/assets/icons/meteocons/fonts/meteocons.ttf new file mode 100644 index 0000000..378e63c Binary files /dev/null and b/src/assets/icons/meteocons/fonts/meteocons.ttf differ diff --git a/src/assets/icons/meteocons/fonts/meteocons.woff b/src/assets/icons/meteocons/fonts/meteocons.woff new file mode 100644 index 0000000..e33230c Binary files /dev/null and b/src/assets/icons/meteocons/fonts/meteocons.woff differ diff --git a/src/assets/icons/meteocons/selection.json b/src/assets/icons/meteocons/selection.json new file mode 100644 index 0000000..ce511ea --- /dev/null +++ b/src/assets/icons/meteocons/selection.json @@ -0,0 +1,1302 @@ +{ + "IcoMoonType": "selection", + "icons": [ + { + "icon": { + "paths": [ + "M355.23 576c14.876-73.042 79.376-128 156.792-128 77.418 0 141.916 54.958 156.752 128h64c-15.668-108.25-108.168-192-220.752-192-112.542 0-205.082 83.75-220.75 192h63.958zM512.022 320c17.666 0 32-14.334 32-32v-64c0-17.666-14.334-32-32-32-17.664 0-32 14.334-32 32v64c-0 17.666 14.336 32 32 32zM806.146 313.834c-12.498-12.5-32.748-12.5-45.25 0l-45.25 45.25c-12.498 12.5-12.498 32.75 0 45.25 12.502 12.5 32.752 12.5 45.25 0l45.25-45.25c12.5-12.5 12.5-32.75 0-45.25zM308.354 359.084l-45.25-45.25c-12.498-12.5-32.746-12.5-45.25 0-12.498 12.5-12.498 32.75 0 45.25l45.25 45.25c12.504 12.5 32.752 12.5 45.25 0 12.504-12.5 12.504-32.75 0-45.25zM704.022 640h-384c-17.664 0-32 14.334-32 32s14.336 32 32 32h384c17.666 0 32-14.334 32-32s-14.334-32-32-32zM640.022 768h-256c-17.664 0-32 14.334-32 32s14.336 32 32 32h256c17.666 0 32-14.334 32-32s-14.334-32-32-32z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "sunrise", + "dawn", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 1, + "order": 4246, + "prevSize": 24, + "code": 59648, + "name": "sunrise" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 0 + }, + { + "icon": { + "paths": [ + "M512 288c-123.5 0-224 100.5-224 224s100.5 224 224 224 224-100.5 224-224c0-123.5-100.5-224-224-224zM512 672c-88.376 0-160-71.624-160-160s71.624-160 160-160 160 71.624 160 160-71.624 160-160 160zM512 224c17.666 0 32-14.334 32-32v-64c0-17.666-14.334-32-32-32s-32 14.334-32 32v64c0 17.666 14.334 32 32 32zM512 800c-17.666 0-32 14.334-32 32v64c0 17.666 14.334 32 32 32s32-14.334 32-32v-64c0-17.666-14.334-32-32-32zM760.876 308.334l45.25-45.25c12.5-12.5 12.5-32.75 0-45.25s-32.75-12.5-45.25 0l-45.25 45.25c-12.5 12.5-12.5 32.75 0 45.25 12.498 12.5 32.75 12.5 45.25 0zM263.124 715.668l-45.25 45.25c-12.5 12.498-12.5 32.748 0 45.248s32.75 12.5 45.25 0l45.25-45.248c12.5-12.542 12.5-32.752 0-45.25-12.498-12.502-32.75-12.544-45.25 0zM224 512c0-17.666-14.334-32-32-32h-64c-17.666 0-32 14.334-32 32s14.334 32 32 32h64c17.666 0 32-14.334 32-32zM896 480h-64c-17.666 0-32 14.334-32 32s14.334 32 32 32h64c17.666 0 32-14.334 32-32s-14.334-32-32-32zM263.082 308.334c12.502 12.5 32.752 12.5 45.25 0 12.502-12.5 12.502-32.75 0-45.25l-45.25-45.25c-12.5-12.5-32.748-12.5-45.25 0-12.5 12.5-12.5 32.75 0 45.25l45.25 45.25zM760.918 715.624c-12.542-12.5-32.752-12.5-45.25 0-12.502 12.5-12.542 32.75 0 45.25l45.25 45.25c12.498 12.5 32.748 12.5 45.248 0s12.5-32.748 0-45.25l-45.248-45.25z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "sun", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 2, + "order": 4247, + "prevSize": 24, + "code": 59649, + "name": "sun" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 1 + }, + { + "icon": { + "paths": [ + "M699.704 686.3c-99.752 99.832-262.166 99.832-362 0-99.832-99.834-99.832-262.25 0-362.042 26.418-26.374 58.624-46.5 95.664-59.624 11.668-4.084 24.586-1.124 33.25 7.584 8.752 8.75 11.71 21.666 7.586 33.25-25.084 70.75-8 147.332 44.498 199.834 52.418 52.456 129.002 69.5 199.834 44.5 11.584-4.124 24.542-1.166 33.25 7.584 8.752 8.666 11.668 21.624 7.542 33.25-13.042 37.040-33.208 69.246-59.624 95.664zM382.954 369.508c-74.876 74.876-74.876 196.708 0 271.542 80 80.042 216.25 72.834 286-16.334-71.918 4.5-142.75-21.458-195.5-74.168-52.75-52.708-78.666-123.542-74.168-195.458-5.748 4.502-11.208 9.294-16.332 14.418z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "moon", + "night", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 3, + "order": 4248, + "prevSize": 24, + "code": 59650, + "name": "moon" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 2 + }, + { + "icon": { + "paths": [ + "M542 254c17.666 0 32-14.334 32-32v-64c0-17.666-14.334-32-32-32s-32 14.334-32 32v64c0 17.666 14.334 32 32 32zM542 830c-17.666 0-32 14.334-32 32v64c0 17.666 14.334 32 32 32s32-14.334 32-32v-64c0-17.666-14.334-32-32-32zM293.124 745.668l-45.25 45.25c-12.5 12.498-12.5 32.748 0 45.248s32.75 12.5 45.25 0l45.25-45.248c12.5-12.542 12.5-32.752 0-45.25-12.498-12.502-32.75-12.544-45.25 0zM254 542c0-17.666-14.334-32-32-32h-64c-17.666 0-32 14.334-32 32s14.334 32 32 32h64c17.666 0 32-14.334 32-32zM293.082 338.334c12.502 12.5 32.752 12.5 45.25 0 12.502-12.5 12.502-32.75 0-45.25l-45.25-45.25c-12.5-12.5-32.748-12.5-45.25 0-12.5 12.5-12.5 32.75 0 45.25l45.25 45.25zM670 318c-22.376 0-43.624 4.334-64 10.416-20.376-6.084-41.624-10.416-64-10.416-123.5 0-224 100.5-224 224s100.5 224 224 224c22.376 0 43.624-4.332 64-10.418 20.376 6.086 41.624 10.418 64 10.418 123.5 0 224-100.5 224-224s-100.5-224-224-224zM510.458 698.834c-73.292-14.666-128.458-79.252-128.458-156.834 0-77.584 55.166-142.166 128.458-156.834-39.79 40.458-64.458 95.75-64.458 156.834s24.668 116.376 64.458 156.834z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "sun", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 4, + "order": 4249, + "prevSize": 24, + "code": 59651, + "name": "sun2" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 3 + }, + { + "icon": { + "paths": [ + "M990 446h-163.25c-16.126-143.584-136.874-256-284.75-256-99.624 0-187.5 50.916-239.25 128h-208.75c-17.666 0-32 14.334-32 32s14.334 32 32 32h177.666c-7.248 20.416-11.958 41.792-14.416 64h-99.25c-17.666 0-32 14.334-32 32s14.334 32 32 32h99.25c2.458 22.168 7.168 43.624 14.416 64h-171.834c-20.914 0-37.832 14.334-37.832 32s16.918 32 37.832 32h202.918c51.75 77.124 139.624 128 239.25 128 99.624 0 187.5-50.876 239.248-128h74.92c20.914 0 37.832-14.334 37.832-32s-16.918-32-37.832-32h-43.834c7.248-20.376 11.916-41.832 14.416-64h163.25c17.666 0 32-14.334 32-32s-14.334-32-32-32zM340.458 382h201.542c17.666 0 32-14.334 32-32s-14.334-32-32-32h-156.292c40.418-39.458 95.458-64 156.292-64 112.582 0 205.084 83.75 220.75 192h-441.5c3.25-22.624 9.668-44.084 19.208-64zM542 702c-60.834 0-115.876-24.582-156.292-64h312.542c-40.374 39.418-95.416 64-156.25 64zM743.5 574h-403.042c-9.54-19.916-15.958-41.376-19.208-64h441.5c-3.25 22.624-9.668 44.084-19.25 64z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "windy", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 5, + "order": 4250, + "prevSize": 24, + "code": 59652, + "name": "windy" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 4 + }, + { + "icon": { + "paths": [ + "M862 384c-53 0-96 43-96 96 0 11.292 2.334 21.916 5.876 32h-613.876c-17.666 0-32 14.334-32 32s14.334 32 32 32h704c53 0 96-43 96-96s-43-96-96-96zM158 448h384c53 0 96-43 96-96s-43-96-96-96-96 43-96 96c0 11.292 2.334 21.916 5.876 32h-293.876c-17.666 0-32 14.334-32 32s14.334 32 32 32zM670 640c-1.876 0-3.668 0.416-5.582 0.582-1.25-0.082-2.292-0.582-3.542-0.582h-493.708c-22.75 0-41.168 14.334-41.168 32s18.418 32 41.168 32h412.708c-3.542 10.084-5.876 20.752-5.876 32 0 53 43 96 96 96s96-43 96-96-43-96-96-96z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "wind", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 6, + "order": 4251, + "prevSize": 24, + "code": 59653, + "name": "wind" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 5 + }, + { + "icon": { + "paths": [ + "M765.744 584.5l-65.25-37.668c2.084-11.332 3.5-22.916 3.5-34.832 0-11.958-1.416-23.584-3.584-34.916l65.25-37.708c30.666-17.75 41.084-56.876 23.458-87.376-17.708-30.624-56.75-41.124-87.376-23.5l-65.876 38.042c-17.624-15-37.708-26.834-59.876-34.708l-0-75.834c0-35.334-28.624-64-64-64-35.332 0-64 28.666-64 64v75.792c-22.166 7.876-42.25 19.71-59.874 34.708l-65.752-37.958c-30.624-17.666-69.792-7.208-87.498 23.416-17.626 30.584-7.124 69.708 23.498 87.376l65.126 37.626c-2.124 11.376-3.502 23.042-3.502 35.042 0 11.916 1.376 23.542 3.502 34.876l-65.168 37.624c-30.668 17.668-41.168 56.876-23.458 87.5 17.622 30.5 56.79 41 87.458 23.376l65.666-37.958c17.626 15 37.75 26.916 60 34.834v75.746c0 35.376 28.668 64 64 64 35.376 0 64-28.624 64-64v-75.834c22.25-7.916 42.376-19.75 59.916-34.79l65.834 37.998c30.624 17.624 69.752 7.124 87.376-23.376 17.714-30.622 7.256-69.748-23.37-87.498zM447.994 512c0-35.334 28.624-64 64-64 35.334 0 64 28.666 64 64 0 35.332-28.666 64-64 64-35.374 0-64-28.668-64-64z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "snowflake", + "gear", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 7, + "order": 4252, + "prevSize": 24, + "code": 59654, + "name": "snowflake" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 6 + }, + { + "icon": { + "paths": [ + "M416 128c17.666 0 32-14.334 32-32v-64c0-17.666-14.334-32-32-32s-32 14.334-32 32v64c0 17.666 14.334 32 32 32zM664.876 212.334l45.25-45.25c12.498-12.5 12.498-32.75 0-45.25-12.5-12.5-32.75-12.5-45.25 0l-45.25 45.25c-12.5 12.5-12.5 32.75 0 45.25 12.498 12.5 32.75 12.5 45.25 0zM32 448h64c17.666 0 32-14.334 32-32s-14.334-32-32-32h-64c-17.666 0-32 14.334-32 32s14.334 32 32 32zM704 416c0 17.666 14.334 32 32 32h64c17.666 0 32-14.334 32-32s-14.334-32-32-32h-64c-17.666 0-32 14.334-32 32zM167.082 212.334c12.502 12.5 32.752 12.5 45.25 0 12.502-12.5 12.502-32.75 0-45.25l-45.25-45.25c-12.5-12.5-32.748-12.5-45.25 0-12.5 12.5-12.5 32.75 0 45.25l45.25 45.25zM800 512c-10.624 0-21.124 0.75-31.584 2.25-33.542-45.75-78.248-80.666-128.916-103-2.582-121.25-101.624-219.25-223.5-219.25-123.5 0-224 100.5-224 224 0 34.876 8.668 67.5 23 96.876-119.25 4.874-215 102.748-215 223.124 0 123.5 100.5 224 224 224 27.376 0 54.168-5 79.418-14.666 57.914 50.5 131.582 78.666 208.582 78.666 77.084 0 150.666-28.166 208.582-78.666 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224s-100.5-224-224-224zM416 256c79.624 0 145.124 58.334 157.416 134.5-20.042-4-40.498-6.5-61.416-6.5-91.876 0-177 39.624-236.75 106.5-11.874-22.334-19.25-47.416-19.25-74.5 0-88.376 71.624-160 160-160zM800 896c-34.25 0-65.832-11-91.876-29.334-46.956 56.584-116.876 93.334-196.124 93.334-79.25 0-149.168-36.75-196.124-93.334-26 18.334-57.626 29.334-91.876 29.334-88.376 0-160-71.624-160-160s71.624-160 160-160c15.5 0 30.124 2.916 44.25 7.082 5.624 1.584 11.334 2.834 16.624 5.042 8.75-17.124 19.75-32.792 31.958-47.5 46.752-56.248 116.292-92.624 195.168-92.624 20.25 0 39.668 2.916 58.5 7.418 21.124 4.998 41.084 12.582 59.668 22.582 46.582 24.75 84.832 63.084 108.914 110.126 18.794-7.75 39.336-12.126 60.918-12.126 88.376 0 160 71.624 160 160s-71.624 160-160 160z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "cloudy", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 8, + "order": 4253, + "prevSize": 24, + "code": 59655, + "name": "cloudy" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 7 + }, + { + "icon": { + "paths": [ + "M870.124 524.332c9.75-7.25 19.624-14.376 28.458-23.208 26.416-26.458 46.542-58.666 59.584-95.708 4.166-11.584 1.208-24.584-7.544-33.25-8.708-8.75-21.624-11.708-33.246-7.584-70.792 25-147.376 8-199.792-44.5-52.5-52.502-69.584-129.042-44.5-199.792 4.084-11.626 1.166-24.542-7.584-33.292-8.666-8.666-21.624-11.668-33.25-7.582-37.084 13.164-69.25 33.246-95.668 59.664-67.082 67-87.958 162-64.958 247.584-86.5 11.042-164.25 57-216.042 127.586-10.458-1.5-20.958-2.25-31.584-2.25-123.5 0-224 100.5-224 224.002 0 123.498 100.5 223.998 224 223.998 27.376 0 54.168-5 79.418-14.668 57.914 50.5 131.582 78.668 208.582 78.668 77.084 0 150.666-28.168 208.582-78.668 25.25 9.668 52.042 14.668 79.418 14.668 123.5 0 224-100.5 224-223.998 0.002-98.878-64.832-182.044-153.874-211.67zM581.832 184.332c5.084-5.166 10.542-9.958 16.292-14.458-4.5 71.958 21.458 142.75 74.208 195.458 52.752 52.75 123.542 78.666 195.502 74.208-27.584 35.168-65.584 57.042-106.252 66.376-54.75-69.5-135.208-113.25-223.916-120.374-24.542-67.918-10.166-146.876 44.166-201.21zM800 896c-34.25 0-65.832-11-91.876-29.334-46.958 56.584-116.876 93.334-196.124 93.334-79.25 0-149.168-36.75-196.124-93.334-26 18.334-57.624 29.334-91.876 29.334-88.376 0-160-71.624-160-159.998 0-88.376 71.624-160 160-160 21.624 0 42.124 4.376 60.876 12.124 40.376-78.71 119.5-133.792 212.624-139.086 4.876-0.29 9.624-1.042 14.5-1.042 25.832 0 50.624 4.042 74 11.166 31.582 9.668 60.376 25.416 85.376 45.708 23.876 19.376 43.876 43.124 59.624 69.792 2.666 4.5 5.668 8.75 8.082 13.458 18.792-7.75 39.336-12.124 60.918-12.124 88.376 0 160 71.624 160 160s-71.624 160.002-160 160.002z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "cloud", + "night", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 9, + "order": 4254, + "prevSize": 24, + "code": 59656, + "name": "cloud" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 8 + }, + { + "icon": { + "paths": [ + "M512 190c17.666 0 32-14.334 32-32v-64c0-17.666-14.334-32-32-32s-32 14.334-32 32v64c0 17.666 14.334 32 32 32zM760.876 274.334l45.25-45.25c12.498-12.5 12.498-32.75 0-45.25-12.5-12.5-32.75-12.5-45.25 0l-45.25 45.25c-12.5 12.5-12.5 32.75 0 45.25s32.75 12.5 45.25 0zM128 510h64c17.666 0 32-14.334 32-32s-14.334-32-32-32h-64c-17.666 0-32 14.334-32 32s14.334 32 32 32zM800 478c0 17.666 14.334 32 32 32h64c17.666 0 32-14.334 32-32s-14.334-32-32-32h-64c-17.666 0-32 14.334-32 32zM263.082 274.334c12.502 12.5 32.752 12.5 45.25 0 12.502-12.5 12.502-32.75 0-45.25l-45.25-45.25c-12.5-12.5-32.748-12.5-45.25 0-12.5 12.5-12.5 32.75 0 45.25l45.25 45.25zM291.25 510h64c-2.124-10.334-3.25-21.042-3.25-32 0-88.376 71.624-160 160-160 88.376 0 160 71.624 160 160 0 10.958-1.124 21.666-3.25 32h64c1.584-10.542 3.25-21.042 3.25-32 0-123.5-100.5-224-224-224s-224 100.5-224 224c0 10.958 1.75 21.458 3.25 32zM896 574h-768c-17.666 0-32 14.334-32 32s14.334 32 32 32h768c17.666 0 32-14.334 32-32s-14.334-32-32-32zM896 702h-768c-17.666 0-32 14.334-32 32s14.334 32 32 32h768c17.666 0 32-14.334 32-32s-14.334-32-32-32zM896 830h-768c-17.666 0-32 14.334-32 32s14.334 32 32 32h768c17.666 0 32-14.334 32-32s-14.334-32-32-32z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 10, + "order": 4255, + "prevSize": 24, + "code": 59657, + "name": "weather" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 9 + }, + { + "icon": { + "paths": [ + "M128 638.002h768c17.666 0 32-14.334 32-32s-14.334-32-32-32h-768c-17.666 0-32 14.334-32 32s14.334 32 32 32zM896 702.002h-768c-17.666 0-32 14.334-32 32s14.334 32 32 32h768c17.666 0 32-14.334 32-32s-14.334-32-32-32zM896 830.002h-768c-17.666 0-32 14.334-32 32s14.334 32 32 32h768c17.666 0 32-14.334 32-32s-14.334-32-32-32zM410.084 510c-0.666-0.666-1.502-1.084-2.166-1.75-74.876-74.876-74.876-196.668 0-271.584 5.124-5.084 10.54-9.916 16.292-14.416-4.502 71.916 21.458 142.75 74.208 195.458 52.748 52.792 123.58 78.666 195.498 74.166-5.334 6.792-11.748 12.25-17.792 18.124h83.042c10.084-16.084 18.5-33.5 25.166-52.126 4.042-11.708 1.084-24.666-7.666-33.334-8.582-8.708-21.584-11.708-33.248-7.582-70.752 24.998-147.292 7.958-199.75-44.5-52.502-52.5-69.584-129.042-44.502-199.792 4.166-11.624 1.166-24.542-7.582-33.292-8.668-8.708-21.626-11.666-33.25-7.542-37.042 13.084-69.25 33.208-95.666 59.584-86.418 86.42-97.71 219.544-34.544 318.586h81.96z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 11, + "order": 4256, + "prevSize": 24, + "code": 59658, + "name": "weather2" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 10 + }, + { + "icon": { + "paths": [ + "M67.208 512c-2.084-10.334-3.208-21.042-3.208-32 0-88.376 71.624-160 160-160 21.624 0 42.124 4.416 60.876 12.166 42.458-82.832 127.706-140.166 227.124-140.166s184.668 57.334 227.082 140.166c18.794-7.75 39.336-12.166 60.918-12.166 88.376 0 160 71.624 160 160 0 10.958-1.124 21.666-3.25 32h64c1.584-10.542 3.25-21.042 3.25-32 0-123.5-100.5-224-224-224-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.040-130.25-256.416-130.25s-196.624 48.834-256.416 130.25c-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224 0 10.958 1.708 21.458 3.25 32h63.958zM992 576h-960c-17.666 0-32 14.334-32 32s14.334 32 32 32h960c17.666 0 32-14.334 32-32s-14.334-32-32-32zM992 704h-960c-17.666 0-32 14.334-32 32s14.334 32 32 32h960c17.666 0 32-14.334 32-32s-14.334-32-32-32zM992 832h-960c-17.666 0-32 14.334-32 32s14.334 32 32 32h960c17.666 0 32-14.334 32-32s-14.334-32-32-32z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "weather", + "cloud" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 12, + "order": 4257, + "prevSize": 24, + "code": 59659, + "name": "weather3" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 11 + }, + { + "icon": { + "paths": [ + "M224 320h576c17.666 0 32-14.334 32-32s-14.334-32-32-32h-576c-17.666 0-32 14.334-32 32s14.334 32 32 32zM800 384h-576c-17.666 0-32 14.334-32 32s14.334 32 32 32h576c17.666 0 32-14.334 32-32s-14.334-32-32-32zM800 512h-576c-17.666 0-32 14.334-32 32s14.334 32 32 32h576c17.666 0 32-14.334 32-32s-14.334-32-32-32zM800 640h-576c-17.666 0-32 14.334-32 32s14.334 32 32 32h576c17.666 0 32-14.334 32-32s-14.334-32-32-32z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "lines", + "list", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 13, + "order": 4258, + "prevSize": 24, + "code": 59660, + "name": "lines" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 12 + }, + { + "icon": { + "paths": [ + "M800 320c-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.040-130.25-256.416-130.25s-196.624 48.834-256.416 130.25c-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224 0 123.5 100.5 224 224 224 27.376 0 54.168-5 79.418-14.666 57.914 50.5 131.582 78.666 208.582 78.666 77.084 0 150.666-28.166 208.582-78.666 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224 0-123.5-100.5-224-224-224zM800 704c-34.25 0-65.832-11-91.876-29.334-46.956 56.582-116.876 93.334-196.124 93.334-79.25 0-149.168-36.752-196.124-93.334-26 18.334-57.626 29.334-91.876 29.334-88.376 0-160-71.624-160-160s71.624-160 160-160c21.624 0 42.124 4.416 60.876 12.166 42.458-82.832 127.706-140.166 227.124-140.166s184.668 57.334 227.082 140.166c18.794-7.75 39.336-12.166 60.918-12.166 88.376 0 160 71.624 160 160s-71.624 160-160 160z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "cloud", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 14, + "order": 4259, + "prevSize": 24, + "code": 59661, + "name": "cloud2" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 13 + }, + { + "icon": { + "paths": [ + "M800 128c-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.040-130.25-256.416-130.25-102.376 0-196.624 48.834-256.416 130.25-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224s100.5 224 224 224c27.376 0 54.168-5 79.418-14.666 43.082 37.542 94.832 62.582 150.208 73.042l-69.626 69.624 64 64-64 192 192-192-64-64 22-65.998c68.916-4.876 134.25-31.086 186.582-76.668 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224s-100.5-224-224-224zM800 512c-34.25 0-65.832-11-91.876-29.334-37.876 45.666-91.124 77.25-151.75 88.208l-44.374 5.126c-79.25 0-149.168-36.75-196.124-93.334-26 18.334-57.626 29.334-91.876 29.334-88.376 0-160-71.624-160-160s71.624-160 160-160c21.624 0 42.124 4.416 60.876 12.166 42.458-82.832 127.706-140.166 227.124-140.166s184.668 57.334 227.082 140.166c18.794-7.75 39.336-12.166 60.918-12.166 88.376 0 160 71.624 160 160s-71.624 160-160 160z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "lightning", + "weather", + "cloud" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 15, + "order": 4260, + "prevSize": 24, + "code": 59662, + "name": "lightning" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 14 + }, + { + "icon": { + "paths": [ + "M800 128c-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.040-130.25-256.416-130.25-102.376 0-196.624 48.834-256.416 130.25-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224s100.5 224 224 224c27.376 0 54.168-5 79.418-14.666 24.582 21.416 52.5 37.916 81.832 50.832l49.832-49.748c-46.916-15.252-88.332-42.542-119.208-79.752-25.998 18.334-57.624 29.334-91.874 29.334-88.376 0-160-71.624-160-160s71.624-160 160-160c21.624 0 42.124 4.416 60.876 12.166 42.458-82.832 127.706-140.166 227.124-140.166s184.668 57.334 227.082 140.166c18.794-7.75 39.336-12.166 60.918-12.166 88.376 0 160 71.624 160 160s-71.624 160-160 160c-34.25 0-65.832-11-91.876-29.334-20.75 25.042-46.624 45.334-75.25 61.168l-26.874 80.666c41.75-13.124 81-33.876 114.582-63.166 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224s-100.5-224-224-224zM384 704l64 64-64 192 192-192-64-64 64-192-192 192z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "lightning", + "weather", + "cloud" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 16, + "order": 4261, + "prevSize": 24, + "code": 59663, + "name": "lightning2" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 15 + }, + { + "icon": { + "paths": [ + "M800 192c-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.040-130.25-256.416-130.25s-196.624 48.834-256.416 130.25c-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224 0 123.5 100.5 224 224 224 27.376 0 54.168-5 79.418-14.666 57.914 50.5 131.582 78.666 208.582 78.666 77.084 0 150.666-28.166 208.582-78.666 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224 0-123.5-100.5-224-224-224zM800 576c-34.25 0-65.832-11-91.876-29.334-46.956 56.584-116.876 93.334-196.124 93.334-79.25 0-149.168-36.75-196.124-93.334-26 18.334-57.626 29.334-91.876 29.334-88.376 0-160-71.624-160-160s71.624-160 160-160c21.624 0 42.124 4.416 60.876 12.166 42.458-82.832 127.706-140.166 227.124-140.166s184.668 57.334 227.082 140.166c18.794-7.75 39.336-12.166 60.918-12.166 88.376 0 160 71.624 160 160s-71.624 160-160 160zM448 896c0 35.376 28.624 64 64 64s64-28.624 64-64-64-128-64-128-64 92.624-64 128z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "rainy", + "weather", + "cloud" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 17, + "order": 4262, + "prevSize": 24, + "code": 59664, + "name": "rainy" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 16 + }, + { + "icon": { + "paths": [ + "M800 128c-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.040-130.25-256.416-130.25s-196.624 48.834-256.416 130.25c-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224s100.5 224 224 224c27.376 0 54.168-5 79.418-14.666 57.914 50.5 131.582 78.666 208.582 78.666 77.084 0 150.666-28.166 208.582-78.666 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224s-100.5-224-224-224zM800 512c-34.25 0-65.832-11-91.876-29.334-46.956 56.584-116.876 93.334-196.124 93.334-79.25 0-149.168-36.75-196.124-93.334-26 18.334-57.626 29.334-91.876 29.334-88.376 0-160-71.624-160-160s71.624-160 160-160c21.624 0 42.124 4.416 60.876 12.166 42.458-82.832 127.706-140.166 227.124-140.166s184.668 57.334 227.082 140.166c18.794-7.75 39.336-12.166 60.918-12.166 88.376 0 160 71.624 160 160s-71.624 160-160 160zM450 960c0 35.376 28.624 64 64 64s64-28.624 64-64-64-128-64-128-64 92.624-64 128zM704 896c0 35.376 28.624 64 64 64s64-28.624 64-64-64-128-64-128-64 92.624-64 128zM192 768c0 35.376 28.624 64 64 64s64-28.624 64-64-64-128-64-128-64 92.624-64 128z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "rainy", + "weather", + "cloud" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 18, + "order": 4263, + "prevSize": 24, + "code": 59665, + "name": "rainy2" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 17 + }, + { + "icon": { + "paths": [ + "M834.084 332.166c-47.958-49.084-114.25-77.542-183.46-77.542-69.124 0-135.376 28.458-183.33 77.542-105.626 4.918-190.042 92.376-190.042 199.168 0 109.916 89.418 199.332 199.376 199.332 11.668 0 23.208-1 34.542-2.998 41.458 27.082 89.834 41.708 139.458 41.708 49.708 0 98.126-14.626 139.544-41.708 11.414 1.998 22.916 2.998 34.582 2.998 109.874 0 199.25-89.416 199.25-199.332-0.004-106.792-84.38-194.25-189.92-199.168zM824.75 666.666c-16.624 0-32.75-2.998-48-8.834-35 30.5-79.5 47.544-126.126 47.544-46.498 0-90.998-17.044-125.998-47.544-15.25 5.836-31.5 8.834-48 8.834-74.624 0-135.376-60.75-135.376-135.332 0-74.626 60.75-135.376 135.376-135.376 6.376 0 12.75 0.458 19.042 1.376 36.208-49.166 93.082-78.708 154.956-78.708 61.876 0 118.876 29.542 155.002 78.708 6.25-0.916 12.624-1.376 19.124-1.376 74.624 0 135.25 60.75 135.25 135.376 0 74.582-60.624 135.332-135.25 135.332zM288 704h-256c-17.666 0-32 14.334-32 32s14.334 32 32 32h256c17.666 0 32-14.334 32-32s-14.334-32-32-32zM32 640h128c17.666 0 32-14.334 32-32s-14.334-32-32-32h-128c-17.666 0-32 14.334-32 32s14.334 32 32 32zM96 512h128c17.666 0 32-14.334 32-32s-14.334-32-32-32h-128c-17.666 0-32 14.334-32 32s14.334 32 32 32z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "windy", + "weather", + "cloud" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 19, + "order": 4264, + "prevSize": 24, + "code": 59666, + "name": "windy2" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 18 + }, + { + "icon": { + "paths": [ + "M834.084 141.584c-47.96-49.126-114.25-77.584-183.46-77.584-69.124 0-135.376 28.458-183.33 77.584-105.626 4.876-190.042 92.334-190.042 199.084 0 109.956 89.418 199.416 199.376 199.416 11.668 0 23.208-1.002 34.542-3 41.458 27.042 89.834 41.666 139.458 41.666 49.708 0 98.126-14.624 139.544-41.666 11.414 1.998 22.916 3 34.582 3 109.876 0 199.25-89.46 199.25-199.416-0.004-106.752-84.38-194.252-189.92-199.084zM824.75 476.084c-16.624 0-32.75-3-48-8.916-35 30.5-79.5 47.584-126.126 47.584-46.498 0-90.998-17.084-125.998-47.584-15.25 5.918-31.5 8.916-48 8.916-74.624 0-135.376-60.75-135.376-135.416 0-74.584 60.75-135.334 135.376-135.334 6.376 0 12.75 0.5 19.042 1.376 36.208-49.168 93.082-78.71 154.956-78.71 61.876 0 118.876 29.542 155.002 78.708 6.25-0.876 12.624-1.376 19.124-1.376 74.624 0 135.25 60.75 135.25 135.334 0 74.668-60.624 135.418-135.25 135.418zM288 513.376h-256c-17.666 0-32 14.292-32 32 0 17.706 14.334 32 32 32h256c17.666 0 32-14.294 32-32 0-17.708-14.334-32-32-32zM32 449.376h128c17.666 0 32-14.292 32-32s-14.334-32-32-32h-128c-17.666 0-32 14.292-32 32s14.334 32 32 32zM96 321.376h128c17.666 0 32-14.292 32-32s-14.334-32-32-32h-128c-17.666 0-32 14.292-32 32s14.334 32 32 32zM448 768c0 35.376 28.624 64 64 64s64-28.624 64-64-64-128-64-128-64 92.624-64 128zM704 896c0 35.376 28.624 64 64 64s64-28.624 64-64-64-128-64-128-64 92.624-64 128z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "windy", + "rainy", + "weather", + "cloud" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 20, + "order": 4265, + "prevSize": 24, + "code": 59667, + "name": "windy3" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 19 + }, + { + "icon": { + "paths": [ + "M652.084 887.376l-36-20.752c1.084-6.248 1.916-12.622 1.916-19.248 0-6.624-0.832-13-2-19.25l36.084-20.792c16.834-9.834 22.582-31.458 12.916-48.208-9.752-16.958-31.334-22.75-48.25-13l-36.376 21c-9.752-8.292-20.75-14.792-33-19.208v-41.792c0-19.542-15.876-35.376-35.376-35.376s-35.332 15.834-35.332 35.376v41.75c-12.252 4.376-23.292 10.958-33.042 19.25l-36.292-21c-16.958-9.75-38.584-4-48.334 12.958-9.75 16.834-3.876 38.5 13 48.252l35.918 20.75c-1.168 6.292-1.918 12.668-1.918 19.292 0 6.626 0.75 13 1.918 19.248l-35.916 20.75c-16.918 9.75-22.75 31.5-13 48.376s31.376 22.624 48.25 12.876l36.334-20.876c9.748 8.25 20.792 14.75 33.084 19.124v41.876c0 19.498 15.832 35.248 35.332 35.248s35.376-15.75 35.376-35.248v-41.876c12.25-4.376 23.376-10.876 33.042-19.25l36.334 21c16.916 9.75 38.498 4 48.25-12.876 9.748-16.874 3.998-38.5-12.918-48.374zM512 882.75c-19.5 0-35.376-15.876-35.376-35.376s15.876-35.292 35.376-35.292 35.334 15.792 35.334 35.292-15.834 35.376-35.334 35.376zM800 128c-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.040-130.25-256.416-130.25s-196.624 48.834-256.416 130.25c-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224s100.5 224 224 224c27.376 0 54.168-5 79.418-14.666 57.914 50.5 131.582 78.666 208.582 78.666 77.084 0 150.666-28.166 208.582-78.666 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224s-100.5-224-224-224zM800 512c-34.25 0-65.832-11-91.876-29.334-46.956 56.584-116.876 93.334-196.124 93.334-79.25 0-149.168-36.75-196.124-93.334-26 18.334-57.626 29.334-91.876 29.334-88.376 0-160-71.624-160-160s71.624-160 160-160c21.624 0 42.124 4.416 60.876 12.166 42.458-82.832 127.706-140.166 227.124-140.166s184.668 57.334 227.082 140.166c18.794-7.75 39.336-12.166 60.918-12.166 88.376 0 160 71.624 160 160s-71.624 160-160 160z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "snowy", + "weather", + "cloud" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 21, + "order": 4266, + "prevSize": 24, + "code": 59668, + "name": "snowy" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 20 + }, + { + "icon": { + "paths": [ + "M652.084 695.376l-36-20.75c1.084-6.25 1.916-12.624 1.916-19.25 0-6.624-0.832-13-2-19.25l36.084-20.792c16.834-9.834 22.582-31.458 12.916-48.208-9.752-16.958-31.334-22.75-48.25-13l-36.376 21c-9.754-8.292-20.75-14.792-33-19.208v-41.792c0-19.542-15.876-35.376-35.376-35.376s-35.332 15.834-35.332 35.376v41.75c-12.252 4.376-23.292 10.958-33.042 19.25l-36.292-21c-16.958-9.75-38.584-4-48.334 12.958-9.75 16.834-3.876 38.5 13 48.252l35.918 20.75c-1.168 6.292-1.918 12.668-1.918 19.292s0.75 13 1.918 19.246l-35.916 20.752c-16.918 9.75-22.75 31.5-13 48.376s31.376 22.624 48.25 12.876l36.334-20.876c9.748 8.25 20.792 14.75 33.084 19.124v41.876c0 19.498 15.832 35.248 35.332 35.248s35.376-15.75 35.376-35.248v-41.876c12.25-4.376 23.376-10.876 33.042-19.25l36.334 21c16.916 9.75 38.498 4 48.25-12.876 9.748-16.874 3.998-38.5-12.918-48.374zM512 690.75c-19.5 0-35.376-15.876-35.376-35.376s15.876-35.292 35.376-35.292 35.334 15.792 35.334 35.292-15.834 35.376-35.334 35.376zM800 128c-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.040-130.25-256.416-130.25-102.376 0-196.624 48.834-256.416 130.25-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224s100.5 224 224 224c23.624 0 46.668-4.416 68.876-11.668 2.124-10.164 5.458-20.082 10.75-29.29 7.876-13.708 19.124-24.624 32-33.004-6.624-6.458-13.876-12.208-19.75-19.376-26 18.338-57.626 29.338-91.876 29.338-88.376 0-160-71.624-160-160 0-88.376 71.624-160 160-160 21.624 0 42.124 4.416 60.876 12.166 42.458-82.832 127.706-140.166 227.124-140.166s184.668 57.334 227.082 140.166c18.794-7.75 39.336-12.166 60.918-12.166 88.376 0 160 71.624 160 160 0 88.376-71.624 160-160 160-34.25 0-65.832-11-91.876-29.334-5.876 7.166-13.208 12.918-19.792 19.376 12.918 8.414 24.25 19.376 32.084 33.124 5.416 9.292 8.708 19.168 10.832 29.166 22.128 7.252 45.128 11.668 68.752 11.668 123.5 0 224-100.5 224-224s-100.5-224-224-224z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "snowy", + "weather", + "cloud" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 22, + "order": 4267, + "prevSize": 24, + "code": 59669, + "name": "snowy2" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 21 + }, + { + "icon": { + "paths": [ + "M652.084 887.376l-36-20.752c1.084-6.248 1.916-12.622 1.916-19.248 0-6.624-0.832-13-2-19.25l36.084-20.792c16.834-9.834 22.582-31.458 12.916-48.208-9.752-16.958-31.334-22.75-48.25-13l-36.376 21c-9.752-8.292-20.75-14.792-33-19.208v-41.792c0-19.542-15.876-35.376-35.376-35.376s-35.332 15.834-35.332 35.376v41.75c-12.252 4.376-23.292 10.958-33.042 19.25l-36.292-21c-16.958-9.75-38.584-4-48.334 12.958-9.75 16.834-3.876 38.5 13 48.252l35.918 20.75c-1.168 6.292-1.918 12.668-1.918 19.292 0 6.626 0.75 13 1.918 19.248l-35.916 20.75c-16.918 9.75-22.75 31.5-13 48.376s31.376 22.624 48.25 12.876l36.334-20.876c9.748 8.25 20.792 14.75 33.084 19.124v41.876c0 19.498 15.832 35.248 35.332 35.248s35.376-15.75 35.376-35.248v-41.876c12.25-4.376 23.376-10.876 33.042-19.25l36.334 21c16.916 9.75 38.498 4 48.25-12.876 9.748-16.874 3.998-38.5-12.918-48.374zM512 882.75c-19.5 0-35.376-15.876-35.376-35.376s15.876-35.292 35.376-35.292 35.334 15.792 35.334 35.292-15.834 35.376-35.334 35.376zM948.332 792.5l-24.166-6.416c-0.582-7.666-2.416-14.958-5.792-21.958l17.542-17.542c8.25-8.25 8.208-21.584 0-29.708-8.166-8.208-21.416-8.25-29.666 0l-17.582 17.5c-6.918-3.25-14.292-5.124-21.918-5.75l-6.418-24.124c-2.998-11.166-14.5-17.876-25.748-14.876-11.208 3.042-17.75 14.542-14.834 25.75l6.418 23.792c-3.168 2.168-6.168 4.584-9 7.334-2.75 2.834-5.084 5.832-7.252 8.918l-23.792-6.418c-11.208-2.998-22.792 3.752-25.792 14.876-2.998 11.25 3.752 22.708 14.834 25.75l24 6.458c0.668 7.542 2.584 14.916 5.958 21.918l-17.624 17.624c-8.166 8.208-8.124 21.458 0.084 29.624 8.166 8.166 21.416 8.25 29.584 0.084l17.664-17.666c6.918 3.414 14.336 5.332 22.002 5.914l6.332 24.042c3.084 11.208 14.5 17.876 25.752 14.876 11.166-3 17.914-14.498 14.916-25.834l-6.418-23.792c3-2.124 6.084-4.5 8.918-7.25 2.75-2.792 5.084-5.876 7.248-8.958l23.834 6.418c11.208 3 22.75-3.708 25.708-14.834 3-11.17-3.624-22.668-14.792-25.752zM876.624 805.876c-8.25 8.25-21.542 8.208-29.75 0-8.124-8.124-8.208-21.458 0-29.708 8.208-8.166 21.542-8.166 29.75 0 8.126 8.208 8.126 21.582 0 29.708zM237.876 685l-23.75 6.376c-2.208-3-4.5-6.042-7.292-8.876-2.832-2.75-5.832-5.124-8.958-7.25l6.376-23.876c3-11.208-3.668-22.75-14.75-25.708-11.25-3-22.75 3.668-25.75 14.834l-6.5 24.124c-7.624 0.624-14.916 2.5-21.876 5.792l-17.624-17.542c-8.25-8.25-21.5-8.208-29.668 0-8.208 8.208-8.208 21.5 0 29.708l17.542 17.542c-3.292 7-5.208 14.376-5.792 21.958l-24.084 6.416c-11.25 3.084-17.918 14.5-14.916 25.75 3.042 11.166 14.542 17.75 25.792 14.834l23.75-6.46c2.124 3.208 4.5 6.21 7.376 9.002 2.75 2.75 5.75 5.208 8.876 7.25l-6.376 23.792c-3 11.25 3.668 22.834 14.832 25.834 11.252 3 22.668-3.666 25.668-14.876l6.5-24c7.624-0.624 15-2.542 22-5.876l17.582 17.584c8.168 8.248 21.418 8.082 29.668-0.084 8.124-8.124 8.25-21.416 0-29.624l-17.624-17.624c3.376-6.92 5.376-14.376 5.876-22.002l24.124-6.376c11.124-3.042 17.792-14.5 14.792-25.75-3.002-11.12-14.502-17.788-25.794-14.872zM177.124 741.916c-8.208 8.208-21.5 8.208-29.75 0-8.124-8.166-8.124-21.542 0-29.666 8.25-8.166 21.542-8.166 29.75 0s8.126 21.5 0 29.666zM1024 352c0-123.5-100.5-224-224-224-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.040-130.25-256.416-130.25s-196.624 48.834-256.416 130.25c-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224s100.5 224 224 224c27.376 0 54.168-5 79.418-14.666 57.914 50.5 131.582 78.666 208.582 78.666 77.084 0 150.666-28.166 208.582-78.666 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224zM708.124 482.666c-46.956 56.584-116.876 93.334-196.124 93.334-79.25 0-149.168-36.75-196.124-93.334-26 18.334-57.626 29.334-91.876 29.334-88.376 0-160-71.624-160-160s71.624-160 160-160c21.624 0 42.124 4.416 60.876 12.166 42.458-82.832 127.706-140.166 227.124-140.166s184.668 57.334 227.082 140.166c18.794-7.75 39.336-12.166 60.918-12.166 88.376 0 160 71.624 160 160s-71.624 160-160 160c-34.25 0-65.832-11-91.876-29.334z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "snowy", + "weather", + "cloud" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 23, + "order": 4268, + "prevSize": 24, + "code": 59670, + "name": "snowy3" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 22 + }, + { + "icon": { + "paths": [ + "M800 128c-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.040-130.25-256.416-130.25s-196.624 48.834-256.416 130.25c-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224s100.5 224 224 224c27.376 0 54.168-5 79.418-14.666 57.914 50.5 131.582 78.666 208.582 78.666 77.084 0 150.666-28.166 208.582-78.666 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224s-100.5-224-224-224zM800 512c-19.418 0-38.418-3.5-56.5-10.416l-36-13.834-29 25.334c-46.5 40.582-105.624 62.916-166.5 62.916s-120-22.334-166.5-62.916l-29-25.334-36 13.834c-18 6.916-37.082 10.416-56.5 10.416-88.25 0-160-71.792-160-160s71.75-160 160-160c7.584 0 15 0.542 22.5 1.584l37.916 5.5 22.708-30.916c48.626-66.21 123.294-104.168 204.876-104.168 81.624 0 156.25 37.916 204.834 104.126l22.75 30.958 37.998-5.5c7.418-1.042 14.834-1.584 22.418-1.584 88.25 0 160 71.792 160 160s-71.75 160-160 160zM192 640c-35.376 0-64 28.624-64 64s28.624 64 64 64 64-28.624 64-64-28.624-64-64-64zM512 704c-35.376 0-64 28.624-64 64s28.624 64 64 64 64-28.624 64-64-28.624-64-64-64zM832 640c-35.376 0-64 28.624-64 64s28.624 64 64 64 64-28.624 64-64-28.624-64-64-64zM704 896c-35.376 0-64 28.624-64 64s28.624 64 64 64 64-28.624 64-64-28.624-64-64-64zM320 896c-35.376 0-64 28.624-64 64s28.624 64 64 64 64-28.624 64-64-28.624-64-64-64z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "weather", + "cloud" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 24, + "order": 4269, + "prevSize": 24, + "code": 59671, + "name": "weather4" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 23 + }, + { + "icon": { + "paths": [ + "M1024 480.002c0-98.334-80-178.292-178.334-178.292-4.792 0-9.542 0.208-14.292 0.582-46.25-57.708-115.958-91.956-191.376-91.956-75.376 0-145.124 34.248-191.376 91.958-4.75-0.376-9.542-0.582-14.376-0.582-98.246-0.002-178.246 79.956-178.246 178.29 0 10.292 1.376 20.208 3 30.084-1.084 1.416-2.376 2.708-3.416 4.166-10.458-1.5-20.958-2.25-31.584-2.25-123.5 0-224 100.498-224 223.998 0 123.502 100.5 224 224 224 27.376 0 54.168-5 79.418-14.666 57.914 50.5 131.582 78.666 208.582 78.666 77.084 0 150.666-28.166 208.582-78.666 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.498 224-224 0-51.376-18.084-98.166-47.332-135.998 29.164-31.792 47.332-73.666 47.332-120zM800 896c-34.25 0-65.832-10.998-91.876-29.332-46.958 56.582-116.876 93.332-196.124 93.332-79.25 0-149.168-36.75-196.124-93.332-26 18.334-57.624 29.332-91.876 29.332-88.376 0-160-71.624-160-160s71.624-159.998 160-159.998c21.624 0 42.124 4.376 60.876 12.124 1.124-2.124 2.5-4 3.624-6.042 11.25-20.542 25.124-39.376 41.332-56.084 46.168-47.832 110.334-78 182.168-78 99.418 0 184.668 57.332 227.082 140.124 11.292-4.624 23.336-7.626 35.75-9.624l25.168-2.5c24.668 0 47.75 6.084 68.624 16 22.624 10.832 42.042 26.748 57.292 46.376 21 27.042 34.084 60.708 34.084 97.624 0 88.376-71.624 160-160 160zM931.124 555.25c-36.958-26.916-82-43.248-131.124-43.248-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.042-130.25-256.416-130.25-68.25 0-132.624 22.084-185.876 60.668 14.958-45.708 57.458-78.958 108.124-78.958 15.5 0 30.124 3.124 43.5 8.664 30.376-59.124 91.25-100.040 162.25-100.040s131.916 40.914 162.168 100.040c13.458-5.54 28.166-8.664 43.498-8.664 63.168 0 114.334 51.166 114.334 114.292 0.002 28.956-11.122 55.080-28.874 75.246z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "cloudy", + "weather", + "clouds" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 25, + "order": 4270, + "prevSize": 24, + "code": 59672, + "name": "cloudy2" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 24 + }, + { + "icon": { + "paths": [ + "M1024 269.666c0-98.292-80-178.248-178.334-178.248-4.792 0-9.542 0.166-14.292 0.54-46.25-57.666-115.956-91.958-191.374-91.958-75.376 0-145.124 34.292-191.376 91.958-4.75-0.374-9.542-0.54-14.376-0.54-98.248 0-178.248 79.958-178.248 178.248 0 10.292 1.376 20.25 3 30.084-1.084 1.416-2.376 2.708-3.416 4.166-10.458-1.5-20.958-2.25-31.584-2.25-123.5 0-224 100.5-224 224 0 123.502 100.5 224 224 224 27.376 0 54.168-4.998 79.418-14.666 36.708 32 80.208 53.876 126.414 66.416l-45.832 30.584 64 64-64 128 192-128-64-64 9.624-19.166c73.5-2.25 143.5-29.458 198.958-77.834 25.25 9.668 52.042 14.666 79.418 14.666 123.5 0 224-100.498 224-224 0-51.332-18.084-98.166-47.332-136 29.164-31.75 47.332-73.624 47.332-120zM800 685.666c-34.25 0-65.832-11-91.876-29.292-38 45.792-91.5 77.458-152.458 88.25l-47.542 4.624c-77.624-1.248-146.124-37.248-192.248-92.872-26 18.292-57.624 29.292-91.876 29.292-88.376 0-160-71.582-160-160 0-88.334 71.624-160 160-160 21.624 0 42.124 4.418 60.876 12.166 1.124-2.166 2.5-4 3.624-6.084 11.25-20.542 25.124-39.334 41.332-56.084 46.168-47.792 110.334-78 182.168-78 99.418 0 184.668 57.334 227.082 140.166 11.292-4.666 23.336-7.666 35.75-9.666l25.168-2.5c24.668 0 47.75 6.084 68.624 16 22.624 10.834 42.042 26.75 57.292 46.416 21 27.042 34.084 60.668 34.084 97.584 0 88.418-71.624 160-160 160zM931.124 344.916c-36.958-26.876-82-43.25-131.124-43.25-10.624 0-21.124 0.75-31.584 2.25-59.748-81.374-154.040-130.25-256.416-130.25-68.25 0-132.624 22.124-185.876 60.708 14.958-45.706 57.458-78.956 108.124-78.956 15.5 0 30.124 3.124 43.5 8.666 30.376-59.168 91.252-100.084 162.252-100.084s131.916 40.916 162.168 100.084c13.458-5.542 28.166-8.666 43.498-8.666 63.168 0 114.334 51.166 114.334 114.248 0 29-11.124 55.126-28.876 75.25z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "cloud", + "lightning", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 26, + "order": 4271, + "prevSize": 24, + "code": 59673, + "name": "cloud3" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 25 + }, + { + "icon": { + "paths": [ + "M384 768l64 64-64 192 192-192-64-64 64-128-192 128zM1024 269.666c0-98.292-80-178.248-178.334-178.248-4.792 0-9.542 0.166-14.292 0.54-46.25-57.666-115.956-91.958-191.374-91.958-75.376 0-145.124 34.292-191.376 91.958-4.75-0.374-9.542-0.54-14.376-0.54-98.248 0-178.248 79.958-178.248 178.248 0 10.292 1.376 20.25 3 30.084-1.084 1.416-2.376 2.708-3.416 4.166-10.458-1.5-20.958-2.25-31.584-2.25-123.5 0-224 100.5-224 224 0 123.502 100.5 224 224 224 27.376 0 54.168-4.998 79.418-14.666 2.208 1.918 4.832 3.25 7.082 5.124l56.624-37.75c-18.876-13.376-36.5-28.25-51.25-46-26 18.292-57.624 29.292-91.876 29.292-88.376 0-160-71.582-160-160 0-88.334 71.624-160 160-160 21.624 0 42.124 4.418 60.876 12.166 1.124-2.166 2.5-4 3.624-6.084 11.25-20.542 25.124-39.334 41.332-56.084 46.168-47.792 110.334-78 182.168-78 99.418 0 184.668 57.334 227.082 140.166 11.292-4.666 23.336-7.666 35.75-9.666l25.168-2.5c24.668 0 47.75 6.084 68.624 16 22.624 10.834 42.042 26.75 57.292 46.416 21 27.042 34.084 60.668 34.084 97.584 0 88.418-71.624 160-160 160-34.25 0-65.832-11-91.876-29.292-28 33.75-64.876 59.124-106.292 75.124l-11.958 23.876 36.5 36.5c34.124-13.292 66.042-32.376 94.208-56.876 25.25 9.668 52.042 14.666 79.418 14.666 123.5 0 224-100.498 224-224 0-51.332-18.084-98.166-47.332-136 29.166-31.746 47.334-73.62 47.334-119.996zM931.124 344.916c-36.958-26.876-82-43.25-131.124-43.25-10.624 0-21.124 0.75-31.584 2.25-59.748-81.374-154.040-130.25-256.416-130.25-68.25 0-132.624 22.124-185.876 60.708 14.958-45.706 57.458-78.956 108.124-78.956 15.5 0 30.124 3.124 43.5 8.666 30.376-59.168 91.252-100.084 162.252-100.084s131.916 40.916 162.168 100.084c13.458-5.542 28.166-8.666 43.498-8.666 63.168 0 114.334 51.166 114.334 114.248 0 29-11.124 55.126-28.876 75.25z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "lightning", + "clouds", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 27, + "order": 4272, + "prevSize": 24, + "code": 59674, + "name": "lightning3" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 26 + }, + { + "icon": { + "paths": [ + "M512 288c-123.5 0-224 100.5-224 224 0 123.498 100.5 224 224 224s224-100.502 224-224c0-123.5-100.5-224-224-224zM512 224c17.666 0 32-14.292 32-32v-64c0-17.666-14.334-32-32-32-17.708 0-32 14.334-32 32v64c0 17.708 14.292 32 32 32zM512 800c-17.708 0-32 14.334-32 32v64c0 17.708 14.292 32 32 32 17.666 0 32-14.292 32-32v-64c0-17.666-14.334-32-32-32zM760.834 308.334l45.25-45.25c12.5-12.5 12.5-32.75 0-45.25-12.502-12.5-32.75-12.5-45.25 0l-45.25 45.25c-12.502 12.5-12.502 32.75 0 45.25 12.5 12.498 32.748 12.498 45.25 0zM263.082 715.708l-45.246 45.25c-12.504 12.5-12.504 32.752 0 45.25 12.498 12.5 32.746 12.5 45.246 0l45.25-45.25c12.502-12.582 12.502-32.75 0-45.25-12.498-12.5-32.748-12.584-45.25 0zM224 512c0-17.666-14.334-32-32-32h-64c-17.708 0-32 14.334-32 32 0 17.708 14.292 32 32 32h64c17.666 0 32-14.292 32-32zM896 480h-64c-17.708 0-32 14.334-32 32 0 17.708 14.292 32 32 32h64c17.666 0 32-14.292 32-32 0-17.666-14.334-32-32-32zM263.042 308.334c12.498 12.5 32.75 12.5 45.25 0 12.498-12.5 12.498-32.75 0-45.25l-45.25-45.25c-12.5-12.5-32.752-12.5-45.25 0-12.5 12.5-12.5 32.75 0 45.25l45.25 45.25zM760.918 715.624c-12.586-12.5-32.752-12.5-45.25 0-12.5 12.498-12.586 32.75 0 45.25l45.25 45.25c12.498 12.498 32.748 12.498 45.25 0 12.498-12.5 12.498-32.752 0-45.25l-45.25-45.25z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "sun", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 28, + "order": 4273, + "prevSize": 24, + "code": 59675, + "name": "sun3" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 27 + }, + { + "icon": { + "paths": [ + "M496.164 527.864c-63.040-63.084-79.958-154.21-52.040-233.084-30.5 10.79-59.336 27.666-83.708 52.040-87.502 87.5-87.502 229.334 0 316.79 87.458 87.46 229.25 87.504 316.748 0 24.458-24.372 41.292-53.208 52.042-83.708-78.83 27.918-169.998 11-233.042-52.038z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "moon", + "night", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 29, + "order": 4274, + "prevSize": 24, + "code": 59676, + "name": "moon2" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 28 + }, + { + "icon": { + "paths": [ + "M416 128c17.666 0 32-14.334 32-32v-64c0-17.666-14.334-32-32-32s-32 14.334-32 32v64c0 17.666 14.334 32 32 32zM664.876 212.334l45.25-45.25c12.498-12.5 12.498-32.75 0-45.25-12.5-12.5-32.75-12.5-45.25 0l-45.25 45.25c-12.5 12.5-12.5 32.75 0 45.25 12.498 12.5 32.75 12.5 45.25 0zM32 448h64c17.666 0 32-14.334 32-32s-14.334-32-32-32h-64c-17.666 0-32 14.334-32 32s14.334 32 32 32zM704 416c0 17.666 14.334 32 32 32h64c17.666 0 32-14.334 32-32s-14.334-32-32-32h-64c-17.666 0-32 14.334-32 32zM167.082 212.334c12.502 12.5 32.752 12.5 45.25 0 12.502-12.5 12.502-32.75 0-45.25l-45.25-45.25c-12.5-12.5-32.748-12.5-45.25 0-12.5 12.5-12.5 32.75 0 45.25l45.25 45.25zM800 512c-10.624 0-21.124 0.75-31.584 2.25-33.542-45.75-78.248-80.666-128.916-103-2.582-121.25-101.624-219.25-223.5-219.25-123.5 0-224 100.5-224 224 0 34.876 8.668 67.5 23 96.876-119.25 4.874-215 102.748-215 223.124 0 123.5 100.5 224 224 224 27.376 0 54.168-5 79.418-14.666 57.914 50.5 131.582 78.666 208.582 78.666 77.084 0 150.666-28.166 208.582-78.666 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224s-100.5-224-224-224zM512 384c-91.876 0-177 39.624-236.75 106.5-11.874-22.334-19.25-47.416-19.25-74.5 0-88.376 71.624-160 160-160 79.624 0 145.124 58.334 157.416 134.5-20.040-4-40.498-6.5-61.416-6.5z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "cloudy", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 30, + "order": 4275, + "prevSize": 24, + "code": 59677, + "name": "cloudy3" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 29 + }, + { + "icon": { + "paths": [ + "M870.124 524.332c9.75-7.25 19.624-14.374 28.458-23.208 26.416-26.458 46.542-58.666 59.584-95.708 4.166-11.584 1.208-24.584-7.544-33.25-8.708-8.75-21.624-11.708-33.246-7.584-70.792 25-147.376 8-199.792-44.5-52.498-52.5-69.582-129.042-44.498-199.792 4.084-11.624 1.166-24.542-7.584-33.292-8.666-8.666-21.624-11.666-33.25-7.582-37.084 13.166-69.25 33.25-95.668 59.666-67.082 67-87.958 162-64.958 247.584-86.5 11.042-164.25 57-216.042 127.584-10.458-1.5-20.958-2.25-31.584-2.25-123.5 0-224 100.498-224 224 0 123.5 100.5 224 224 224 27.376 0 54.168-5.002 79.418-14.668 57.912 50.5 131.58 78.668 208.58 78.668 77.084 0 150.666-28.168 208.582-78.668 25.25 9.666 52.042 14.668 79.418 14.668 123.5 0 224-100.5 224-224 0.002-98.876-64.832-182.042-153.874-211.668zM581.832 184.334c5.084-5.166 10.542-9.958 16.292-14.458-4.5 71.958 21.458 142.75 74.208 195.458 52.752 52.75 123.542 78.666 195.502 74.208-27.584 35.168-65.584 57.042-106.252 66.376-54.75-69.5-135.208-113.248-223.916-120.374-24.542-67.918-10.166-146.878 44.166-201.21z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "cloud", + "night", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 31, + "order": 4276, + "prevSize": 24, + "code": 59678, + "name": "cloud4" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 30 + }, + { + "icon": { + "paths": [ + "M800 320c-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.040-130.25-256.416-130.25s-196.624 48.834-256.416 130.25c-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224 0 123.5 100.5 224 224 224 27.376 0 54.168-5 79.418-14.666 57.914 50.5 131.582 78.666 208.582 78.666 77.084 0 150.666-28.166 208.582-78.666 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224 0-123.5-100.5-224-224-224z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "cloud", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 32, + "order": 4277, + "prevSize": 24, + "code": 59679, + "name": "cloud5" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 31 + }, + { + "icon": { + "paths": [ + "M800 128c-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.040-130.25-256.416-130.25-102.376 0-196.624 48.834-256.416 130.25-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224s100.5 224 224 224c27.376 0 54.168-5 79.418-14.666 43.082 37.542 94.832 62.582 150.208 73.042l-69.626 69.624 64 64-64 192 192-192-64-64 22-65.998c68.916-4.876 134.25-31.086 186.582-76.668 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224s-100.5-224-224-224z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "lightning", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 33, + "order": 4278, + "prevSize": 24, + "code": 59680, + "name": "lightning4" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 32 + }, + { + "icon": { + "paths": [ + "M800 192c-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.040-130.25-256.416-130.25s-196.624 48.834-256.416 130.25c-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224 0 123.5 100.5 224 224 224 27.376 0 54.168-5 79.418-14.666 57.914 50.5 131.582 78.666 208.582 78.666 77.084 0 150.666-28.166 208.582-78.666 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224 0-123.5-100.5-224-224-224zM448 896c0 35.376 28.624 64 64 64s64-28.624 64-64-64-128-64-128-64 92.624-64 128z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "rainy", + "cloud", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 34, + "order": 4279, + "prevSize": 24, + "code": 59681, + "name": "rainy3" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 33 + }, + { + "icon": { + "paths": [ + "M800 128c-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.040-130.25-256.416-130.25s-196.624 48.834-256.416 130.25c-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224s100.5 224 224 224c27.376 0 54.168-5 79.418-14.666 57.914 50.5 131.582 78.666 208.582 78.666 77.084 0 150.666-28.166 208.582-78.666 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224s-100.5-224-224-224zM450 960c0 35.376 28.624 64 64 64s64-28.624 64-64-64-128-64-128-64 92.624-64 128zM704 896c0 35.376 28.624 64 64 64s64-28.624 64-64-64-128-64-128-64 92.624-64 128zM192 768c0 35.376 28.624 64 64 64s64-28.624 64-64-64-128-64-128-64 92.624-64 128z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "rainy", + "cloud", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 35, + "order": 4280, + "prevSize": 24, + "code": 59682, + "name": "rainy4" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 34 + }, + { + "icon": { + "paths": [ + "M834.084 332.166c-47.958-49.084-114.25-77.542-183.46-77.542-69.124 0-135.376 28.458-183.374 77.542-105.624 4.918-190 92.376-190 199.168 0 109.916 89.418 199.332 199.376 199.332 11.624 0 23.208-1 34.5-2.998 41.5 27.082 89.876 41.708 139.498 41.708 49.708 0 98.126-14.626 139.544-41.708 11.414 1.998 22.916 2.998 34.582 2.998 109.874 0 199.25-89.416 199.25-199.332 0-106.792-84.376-194.25-189.916-199.168zM288 704h-256c-17.666 0-32 14.334-32 32s14.334 32 32 32h256c17.666 0 32-14.334 32-32s-14.334-32-32-32zM32 640h128c17.666 0 32-14.334 32-32s-14.334-32-32-32h-128c-17.666 0-32 14.334-32 32s14.334 32 32 32zM96 512h128c17.666 0 32-14.334 32-32s-14.334-32-32-32h-128c-17.666 0-32 14.334-32 32s14.334 32 32 32z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "windy", + "cloud", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 36, + "order": 4281, + "prevSize": 24, + "code": 59683, + "name": "windy4" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 35 + }, + { + "icon": { + "paths": [ + "M834.084 141.584c-47.96-49.126-114.25-77.584-183.46-77.584-69.124 0-135.376 28.458-183.33 77.584-105.626 4.876-190.042 92.334-190.042 199.084 0 109.956 89.418 199.416 199.376 199.416 11.668 0 23.208-1.002 34.542-3 41.458 27.042 89.834 41.666 139.458 41.666 49.708 0 98.126-14.624 139.544-41.666 11.414 1.998 22.916 3 34.582 3 109.874 0 199.25-89.46 199.25-199.416-0.004-106.752-84.38-194.252-189.92-199.084zM288 513.376h-256c-17.666 0-32 14.292-32 32 0 17.706 14.334 32 32 32h256c17.666 0 32-14.294 32-32 0-17.708-14.334-32-32-32zM32 449.376h128c17.666 0 32-14.292 32-32s-14.334-32-32-32h-128c-17.666 0-32 14.292-32 32s14.334 32 32 32zM96 321.376h128c17.666 0 32-14.292 32-32s-14.334-32-32-32h-128c-17.666 0-32 14.292-32 32s14.334 32 32 32zM448 768c0 35.376 28.624 64 64 64s64-28.624 64-64-64-128-64-128-64 92.624-64 128zM704 896c0 35.376 28.624 64 64 64s64-28.624 64-64-64-128-64-128-64 92.624-64 128z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "windy", + "rainy", + "weather", + "cloud" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 37, + "order": 4282, + "prevSize": 24, + "code": 59684, + "name": "windy5" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 36 + }, + { + "icon": { + "paths": [ + "M652.084 887.376l-36-20.752c1.084-6.248 1.914-12.622 1.914-19.248 0-6.624-0.83-13-1.998-19.25l36.084-20.792c16.834-9.834 22.582-31.458 12.916-48.208-9.752-16.958-31.334-22.75-48.25-13l-36.376 21c-9.752-8.292-20.75-14.792-33-19.208v-41.792c0-19.542-15.876-35.376-35.376-35.376s-35.334 15.834-35.334 35.376v41.75c-12.25 4.376-23.292 10.958-33.042 19.25l-36.292-21c-16.958-9.75-38.582-4-48.332 12.958-9.75 16.834-3.876 38.5 13 48.252l35.918 20.75c-1.168 6.292-1.918 12.668-1.918 19.292 0 6.626 0.75 13 1.918 19.248l-35.916 20.75c-16.918 9.75-22.75 31.5-13 48.376s31.376 22.624 48.25 12.876l36.334-20.876c9.748 8.25 20.792 14.75 33.082 19.124v41.876c0 19.498 15.834 35.248 35.334 35.248s35.376-15.75 35.376-35.248v-41.876c12.25-4.376 23.376-10.876 33.042-19.25l36.334 21c16.916 9.75 38.498 4 48.25-12.876 9.748-16.874 3.998-38.5-12.918-48.374zM512 882.75c-19.5 0-35.376-15.876-35.376-35.376s15.876-35.292 35.376-35.292 35.332 15.792 35.332 35.292-15.832 35.376-35.332 35.376zM800 128c-10.624 0-21.124 0.75-31.584 2.25-59.75-81.416-154.040-130.25-256.416-130.25s-196.624 48.834-256.416 130.25c-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224s100.5 224 224 224c27.376 0 54.168-5 79.418-14.666 57.914 50.5 131.582 78.666 208.582 78.666 77.084 0 150.666-28.166 208.582-78.666 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224s-100.5-224-224-224z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "snowy", + "cloud", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 38, + "order": 4283, + "prevSize": 24, + "code": 59685, + "name": "snowy4" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 37 + }, + { + "icon": { + "paths": [ + "M652.084 887.376l-36-20.752c1.084-6.248 1.916-12.622 1.916-19.248 0-6.624-0.832-13-2-19.25l36.084-20.792c16.834-9.834 22.582-31.458 12.916-48.208-9.752-16.958-31.334-22.75-48.25-13l-36.376 21c-9.752-8.292-20.75-14.792-33-19.208v-41.792c0-19.542-15.876-35.376-35.376-35.376s-35.332 15.834-35.332 35.376v41.75c-12.252 4.376-23.292 10.958-33.042 19.25l-36.292-21c-16.958-9.75-38.584-4-48.334 12.958-9.75 16.834-3.876 38.5 13 48.252l35.918 20.75c-1.168 6.292-1.918 12.668-1.918 19.292 0 6.626 0.75 13 1.918 19.248l-35.916 20.75c-16.918 9.75-22.75 31.5-13 48.376s31.376 22.624 48.25 12.876l36.334-20.876c9.748 8.25 20.792 14.75 33.084 19.124v41.876c0 19.498 15.832 35.248 35.332 35.248s35.376-15.75 35.376-35.248v-41.876c12.25-4.376 23.376-10.876 33.042-19.25l36.334 21c16.916 9.75 38.498 4 48.25-12.876 9.748-16.874 3.998-38.5-12.918-48.374zM512 882.75c-19.5 0-35.376-15.876-35.376-35.376s15.876-35.292 35.376-35.292 35.334 15.792 35.334 35.292-15.834 35.376-35.334 35.376zM948.332 792.5l-24.166-6.416c-0.582-7.666-2.416-14.958-5.792-21.958l17.542-17.542c8.25-8.25 8.208-21.584 0-29.708-8.166-8.208-21.416-8.25-29.666 0l-17.582 17.5c-6.918-3.25-14.292-5.124-21.918-5.75l-6.418-24.124c-2.998-11.166-14.5-17.876-25.748-14.876-11.208 3.042-17.75 14.542-14.834 25.75l6.418 23.792c-3.168 2.168-6.168 4.584-9 7.334-2.75 2.834-5.084 5.832-7.252 8.918l-23.792-6.418c-11.208-2.998-22.792 3.752-25.792 14.876-2.998 11.25 3.752 22.708 14.834 25.75l24 6.458c0.668 7.542 2.584 14.916 5.958 21.918l-17.624 17.624c-8.166 8.208-8.124 21.458 0.084 29.624 8.166 8.166 21.416 8.25 29.584 0.084l17.664-17.666c6.918 3.414 14.336 5.332 22.002 5.914l6.332 24.042c3.084 11.208 14.5 17.876 25.752 14.876 11.166-3 17.914-14.498 14.916-25.834l-6.418-23.792c3-2.124 6.084-4.5 8.918-7.25 2.75-2.792 5.084-5.876 7.248-8.958l23.834 6.418c11.208 3 22.75-3.708 25.708-14.834 3-11.17-3.624-22.668-14.792-25.752zM876.624 805.876c-8.25 8.25-21.542 8.208-29.75 0-8.124-8.124-8.208-21.458 0-29.708 8.208-8.166 21.542-8.166 29.75 0 8.126 8.208 8.126 21.582 0 29.708zM237.876 685l-23.75 6.376c-2.208-3-4.5-6.042-7.292-8.876-2.832-2.75-5.832-5.124-8.958-7.25l6.376-23.876c3-11.208-3.668-22.75-14.75-25.708-11.25-3-22.75 3.668-25.75 14.834l-6.5 24.124c-7.624 0.624-14.916 2.5-21.876 5.792l-17.624-17.542c-8.25-8.25-21.5-8.208-29.668 0-8.208 8.208-8.208 21.5 0 29.708l17.542 17.542c-3.292 7-5.208 14.376-5.792 21.958l-24.084 6.416c-11.25 3.084-17.918 14.5-14.916 25.75 3.042 11.166 14.542 17.75 25.792 14.834l23.75-6.46c2.124 3.208 4.5 6.21 7.376 9.002 2.75 2.75 5.75 5.208 8.876 7.25l-6.376 23.792c-3 11.25 3.668 22.834 14.832 25.834 11.252 3 22.668-3.666 25.668-14.876l6.5-24c7.624-0.624 15-2.542 22-5.876l17.582 17.584c8.168 8.248 21.418 8.082 29.668-0.084 8.124-8.124 8.25-21.416 0-29.624l-17.624-17.624c3.376-6.92 5.376-14.376 5.876-22.002l24.124-6.376c11.124-3.042 17.792-14.5 14.792-25.75-3.002-11.12-14.502-17.788-25.794-14.872zM177.124 741.916c-8.208 8.208-21.5 8.208-29.75 0-8.124-8.166-8.124-21.542 0-29.666 8.25-8.166 21.542-8.166 29.75 0s8.126 21.5 0 29.666zM1024 352c0-123.5-100.5-224-224-224-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.040-130.25-256.416-130.25s-196.624 48.834-256.416 130.25c-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224s100.5 224 224 224c27.376 0 54.168-5 79.418-14.666 57.914 50.5 131.582 78.666 208.582 78.666 77.084 0 150.666-28.166 208.582-78.666 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "snowy", + "cloud", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 39, + "order": 4284, + "prevSize": 24, + "code": 59686, + "name": "snowy5" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 38 + }, + { + "icon": { + "paths": [ + "M800 128c-10.624 0-21.124 0.75-31.584 2.25-59.748-81.416-154.040-130.25-256.416-130.25s-196.624 48.834-256.416 130.25c-10.46-1.5-20.96-2.25-31.584-2.25-123.5 0-224 100.5-224 224s100.5 224 224 224c27.376 0 54.168-5 79.418-14.666 57.914 50.5 131.582 78.666 208.582 78.666 77.084 0 150.666-28.166 208.582-78.666 25.25 9.666 52.042 14.666 79.418 14.666 123.5 0 224-100.5 224-224s-100.5-224-224-224zM192 640c-35.376 0-64 28.624-64 64s28.624 64 64 64 64-28.624 64-64-28.624-64-64-64zM512 704c-35.376 0-64 28.624-64 64s28.624 64 64 64 64-28.624 64-64-28.624-64-64-64zM832 640c-35.376 0-64 28.624-64 64s28.624 64 64 64 64-28.624 64-64-28.624-64-64-64zM704 896c-35.376 0-64 28.624-64 64s28.624 64 64 64 64-28.624 64-64-28.624-64-64-64zM320 896c-35.376 0-64 28.624-64 64s28.624 64 64 64 64-28.624 64-64-28.624-64-64-64z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "weather", + "cloud" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 40, + "order": 4285, + "prevSize": 24, + "code": 59687, + "name": "weather5" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 39 + }, + { + "icon": { + "paths": [ + "M976.668 494.834c29.248 37.832 47.332 84.624 47.332 136 0 123.498-100.5 224-224 224-27.376 0-54.168-5-79.418-14.666-57.916 50.498-131.498 78.666-208.582 78.666-77 0-150.668-28.168-208.582-78.666-25.25 9.666-52.042 14.666-79.418 14.666-123.5 0-224-100.502-224-224 0-123.5 100.5-224 224-224 10.624 0 21.124 0.75 31.584 2.25 1.042-1.458 2.332-2.75 3.416-4.166-1.624-9.876-3-19.792-3-30.082 0-98.334 80-178.292 178.25-178.292 4.832 0 9.624 0.208 14.376 0.584 46.25-57.708 116-91.958 191.376-91.958 75.418 0 145.124 34.25 191.376 91.958 4.75-0.376 9.5-0.584 14.292-0.584 98.33-0.002 178.33 79.956 178.33 178.29 0 46.332-18.168 88.208-47.332 120z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "cloudy", + "weather", + "clouds" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 41, + "order": 4286, + "prevSize": 24, + "code": 59688, + "name": "cloudy4" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 40 + }, + { + "icon": { + "paths": [ + "M1024 269.666c0-98.292-80-178.248-178.334-178.248-4.792 0-9.542 0.166-14.292 0.54-46.25-57.666-115.956-91.958-191.374-91.958-75.376 0-145.124 34.292-191.376 91.958-4.75-0.374-9.542-0.54-14.376-0.54-98.248 0-178.248 79.958-178.248 178.248 0 10.292 1.376 20.25 3 30.084-1.084 1.416-2.376 2.708-3.416 4.166-10.458-1.5-20.958-2.25-31.584-2.25-123.5 0-224 100.5-224 224 0 123.502 100.5 224 224 224 27.376 0 54.168-4.998 79.418-14.666 36.708 32 80.208 53.876 126.414 66.416l-45.832 30.584 64 64-64 128 192-128-64-64 9.624-19.166c73.5-2.25 143.5-29.458 198.958-77.834 25.25 9.668 52.042 14.666 79.418 14.666 123.5 0 224-100.498 224-224 0-51.332-18.084-98.166-47.332-136 29.164-31.75 47.332-73.624 47.332-120z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "lightning", + "clouds", + "weather" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 42, + "order": 4287, + "prevSize": 24, + "code": 59689, + "name": "lightning5" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 41 + }, + { + "icon": { + "paths": [ + "M576 721.75v-587.916c0-38.584-28.668-69.834-64-69.834-35.334 0-64 31.25-64 69.834v587.916c-38.084 22.166-64 63.002-64 110.25 0 70.666 57.332 128 128 128 70.666 0 128-57.334 128-128 0-47.248-25.876-88.084-64-110.25z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "thermometer", + "temperature" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 43, + "order": 4288, + "prevSize": 24, + "code": 59690, + "name": "thermometer" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 42 + }, + { + "icon": { + "paths": [ + "M512 0c-282.792 0-512 229.208-512 512 0 282.75 229.208 512 512 512 282.75 0 512-229.25 512-512 0-282.792-229.25-512-512-512zM512 896c-211.75 0-384-172.25-384-384s172.25-384 384-384 384 172.25 384 384-172.25 384-384 384zM320 704l256-128 128-256-256 128-128 256z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "compass", + "location", + "map" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 44, + "order": 4289, + "prevSize": 24, + "code": 59691, + "name": "compass" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 43 + }, + { + "icon": { + "paths": [ + "M318.188 557.292h-2.084l-67.042-102.376-81.876-120.874h-63.5v352.79h70.124l0-222.208h3.042l58.208 89.084 89.376 133.124h63.876v-352.79h-70.124v223.25zM412.938 708.332h51.668l129.582-392.664h-52.25l-129 392.664zM797.438 334.042h-71.666l-123.958 352.79h74.75l23.042-72.75h122.918l21.498 72.75h76.292l-122.876-352.79zM718.562 555.25l14.292-46.584 27.208-91.664h2l27.708 93.208 13.792 45.042h-85z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "none", + "nothing" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 45, + "order": 4290, + "prevSize": 24, + "code": 59692, + "name": "none" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 44 + }, + { + "icon": { + "paths": [ + "M418.334 352.75c-7.208-6.792-15.584-12.166-25.084-16.124-9.624-3.876-19.876-5.876-30.75-5.876-10.916 0-21.168 2-30.75 5.876-9.5 3.958-17.876 9.334-25.082 16.124-7.168 6.834-12.792 14.834-16.918 24.084-4.084 9.21-6.124 18.958-6.124 29.166 0 10.25 2.042 20 6.124 29.21 4.124 9.208 9.75 17.25 16.918 24.040 7.208 6.834 15.582 12.25 25.082 16.126 9.582 3.958 19.834 5.916 30.75 5.916 10.876 0 21.124-1.958 30.75-5.916 9.5-3.876 17.876-9.292 25.084-16.126 7.166-6.79 12.792-14.834 16.832-24.040 4.084-9.21 6.208-18.958 6.208-29.21 0-10.208-2.124-19.958-6.208-29.166-4.042-9.252-9.666-17.252-16.832-24.084zM387.624 430.082c-6.876 6.834-15.25 10.25-25.124 10.25s-18.25-3.418-25.124-10.25c-6.792-6.834-10.25-14.834-10.25-24.084 0-9.5 3.458-17.666 10.25-24.29 6.876-6.666 15.25-9.958 25.124-9.958s18.25 3.292 25.124 9.958c6.75 6.624 10.208 14.79 10.208 24.29-0 9.252-3.456 17.252-10.208 24.084zM670.5 623.582c-12.124 3.46-24.166 5.166-36.124 5.166-7.876 0-15.624-1.208-23.292-3.58-7.708-2.418-14.708-6.168-20.998-11.292-6.334-5.126-11.46-11.668-15.334-19.708-3.918-8-5.916-17.834-5.916-29.418v-102.916c0-11.584 1.998-21.5 5.916-29.708 3.874-8.166 8.918-14.834 15.082-19.958 6.168-5.124 13.084-8.792 21-11 7.834-2.21 15.668-3.334 23.542-3.334 11.958 0 24.248 1.75 36.874 5.376 12.626 3.582 24.376 9.998 35.336 19.208l33.792-54.292c-13.708-11.916-29.958-20.624-48.958-26.124-18.918-5.416-38.584-8.166-59.086-8.166-16.708 0-33.166 2.416-49.166 7.168-16.042 4.792-30.292 11.958-42.75 21.5-12.416 9.584-22.542 21.416-30.166 35.582-7.75 14.168-11.582 30.666-11.582 49.416v132.084c0 19.124 3.958 35.75 11.832 49.918 7.834 14.168 18.082 25.958 30.668 35.332 12.664 9.416 26.958 16.458 42.998 21.25 16.084 4.75 32.458 7.168 49.208 7.168 20.792 0 40.542-3.084 59.376-9.208 18.75-6.166 34.624-14.708 47.624-25.584l-33.292-54.292c-12.252 9.58-24.5 16.038-36.584 19.412z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "Celsius", + "temperature" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 46, + "order": 4291, + "prevSize": 24, + "code": 59693, + "name": "Celsius" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 45 + }, + { + "icon": { + "paths": [ + "M417.062 354.542c-7.208-6.792-15.582-12.168-25.082-16.124-9.624-3.876-19.876-5.876-30.75-5.876-10.918 0-21.168 2-30.75 5.876-9.5 3.958-17.876 9.334-25.084 16.124-7.166 6.832-12.792 14.832-16.918 24.082-4.084 9.21-6.124 18.958-6.124 29.168 0 10.25 2.040 20 6.124 29.208 4.126 9.208 9.752 17.25 16.918 24.042 7.208 6.832 15.584 12.25 25.084 16.124 9.582 3.958 19.832 5.916 30.75 5.916 10.876 0 21.124-1.958 30.75-5.916 9.5-3.876 17.876-9.292 25.082-16.124 7.168-6.792 12.792-14.834 16.832-24.042 4.084-9.208 6.21-18.958 6.21-29.208 0-10.208-2.126-19.958-6.21-29.168-4.040-9.25-9.664-17.25-16.832-24.082zM386.354 431.874c-6.876 6.834-15.25 10.252-25.124 10.252s-18.25-3.418-25.124-10.252c-6.792-6.832-10.25-14.832-10.25-24.082 0-9.5 3.458-17.666 10.25-24.292 6.876-6.666 15.25-9.958 25.124-9.958s18.25 3.292 25.124 9.958c6.748 6.624 10.208 14.792 10.208 24.292 0 9.25-3.46 17.25-10.208 24.082zM741.644 401.666v-63h-243.164v352.792h70.126v-143.876h147.958v-62.958h-147.958v-82.958h173.038z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "Fahrenheit", + "temperature" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "id": 47, + "order": 4292, + "prevSize": 24, + "code": 59694, + "name": "Fahrenheit" + }, + "setIdx": 0, + "setId": 3, + "iconIdx": 46 + } + ], + "height": 1024, + "metadata": { + "name": "meteocons" + }, + "preferences": { + "showGlyphs": true, + "showQuickUse": false, + "showQuickUse2": true, + "showSVGs": true, + "fontPref": { + "prefix": "icon-", + "metadata": { + "fontFamily": "meteocons", + "majorVersion": 1, + "minorVersion": 0 + }, + "metrics": { + "emSize": 1024, + "baseline": 0, + "whitespace": 0 + }, + "embed": false, + "resetPoint": 59648, + "showSelector": true, + "showMetrics": true, + "showMetadata": true, + "showVersion": true, + "noie8": true, + "ie7": false + }, + "imagePref": { + "prefix": "icon-", + "png": true, + "useClassSelector": true, + "color": 4473924, + "bgColor": 16777215, + "classSelector": ".icon", + "height": 32, + "columns": 16, + "margin": 16 + }, + "historySize": 100, + "gridSize": 16, + "showGrid": true, + "showCodes": false, + "showLiga": false + } +} diff --git a/src/assets/icons/meteocons/style.css b/src/assets/icons/meteocons/style.css new file mode 100644 index 0000000..bdc332d --- /dev/null +++ b/src/assets/icons/meteocons/style.css @@ -0,0 +1,210 @@ +@font-face { + font-family: 'meteocons'; + src: url('fonts/meteocons.ttf?1o770y') format('truetype'), + url('fonts/meteocons.woff?1o770y') format('woff'), + url('fonts/meteocons.svg?1o770y#meteocons') format('svg'); + font-weight: normal; + font-style: normal; +} + +.meteocons { + font-family: 'meteocons' !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-sunrise:before { + content: '\e900'; +} + +.icon-sun:before { + content: '\e901'; +} + +.icon-moon:before { + content: '\e902'; +} + +.icon-sun2:before { + content: '\e903'; +} + +.icon-windy:before { + content: '\e904'; +} + +.icon-wind:before { + content: '\e905'; +} + +.icon-snowflake:before { + content: '\e906'; +} + +.icon-cloudy:before { + content: '\e907'; +} + +.icon-cloud:before { + content: '\e908'; +} + +.icon-weather:before { + content: '\e909'; +} + +.icon-weather2:before { + content: '\e90a'; +} + +.icon-weather3:before { + content: '\e90b'; +} + +.icon-lines:before { + content: '\e90c'; +} + +.icon-cloud2:before { + content: '\e90d'; +} + +.icon-lightning:before { + content: '\e90e'; +} + +.icon-lightning2:before { + content: '\e90f'; +} + +.icon-rainy:before { + content: '\e910'; +} + +.icon-rainy2:before { + content: '\e911'; +} + +.icon-windy2:before { + content: '\e912'; +} + +.icon-windy3:before { + content: '\e913'; +} + +.icon-snowy:before { + content: '\e914'; +} + +.icon-snowy2:before { + content: '\e915'; +} + +.icon-snowy3:before { + content: '\e916'; +} + +.icon-weather4:before { + content: '\e917'; +} + +.icon-cloudy2:before { + content: '\e918'; +} + +.icon-cloud3:before { + content: '\e919'; +} + +.icon-lightning3:before { + content: '\e91a'; +} + +.icon-sun3:before { + content: '\e91b'; +} + +.icon-moon2:before { + content: '\e91c'; +} + +.icon-cloudy3:before { + content: '\e91d'; +} + +.icon-cloud4:before { + content: '\e91e'; +} + +.icon-cloud5:before { + content: '\e91f'; +} + +.icon-lightning4:before { + content: '\e920'; +} + +.icon-rainy3:before { + content: '\e921'; +} + +.icon-rainy4:before { + content: '\e922'; +} + +.icon-windy4:before { + content: '\e923'; +} + +.icon-windy5:before { + content: '\e924'; +} + +.icon-snowy4:before { + content: '\e925'; +} + +.icon-snowy5:before { + content: '\e926'; +} + +.icon-weather5:before { + content: '\e927'; +} + +.icon-cloudy4:before { + content: '\e928'; +} + +.icon-lightning5:before { + content: '\e929'; +} + +.icon-thermometer:before { + content: '\e92a'; +} + +.icon-compass:before { + content: '\e92b'; +} + +.icon-none:before { + content: '\e92c'; +} + +.icon-celsius:before { + content: '\e92d'; +} + +.icon-fahrenheit:before { + content: '\e92e'; +} diff --git a/src/assets/images/avatars/Abbott.jpg b/src/assets/images/avatars/Abbott.jpg new file mode 100644 index 0000000..9a6114c Binary files /dev/null and b/src/assets/images/avatars/Abbott.jpg differ diff --git a/src/assets/images/avatars/Arnold.jpg b/src/assets/images/avatars/Arnold.jpg new file mode 100644 index 0000000..f370d9a Binary files /dev/null and b/src/assets/images/avatars/Arnold.jpg differ diff --git a/src/assets/images/avatars/Barrera.jpg b/src/assets/images/avatars/Barrera.jpg new file mode 100644 index 0000000..c0e9afe Binary files /dev/null and b/src/assets/images/avatars/Barrera.jpg differ diff --git a/src/assets/images/avatars/Blair.jpg b/src/assets/images/avatars/Blair.jpg new file mode 100644 index 0000000..0ffd2af Binary files /dev/null and b/src/assets/images/avatars/Blair.jpg differ diff --git a/src/assets/images/avatars/Boyle.jpg b/src/assets/images/avatars/Boyle.jpg new file mode 100644 index 0000000..e651314 Binary files /dev/null and b/src/assets/images/avatars/Boyle.jpg differ diff --git a/src/assets/images/avatars/Christy.jpg b/src/assets/images/avatars/Christy.jpg new file mode 100644 index 0000000..fbff21d Binary files /dev/null and b/src/assets/images/avatars/Christy.jpg differ diff --git a/src/assets/images/avatars/Copeland.jpg b/src/assets/images/avatars/Copeland.jpg new file mode 100644 index 0000000..891240d Binary files /dev/null and b/src/assets/images/avatars/Copeland.jpg differ diff --git a/src/assets/images/avatars/Estes.jpg b/src/assets/images/avatars/Estes.jpg new file mode 100644 index 0000000..e6e223f Binary files /dev/null and b/src/assets/images/avatars/Estes.jpg differ diff --git a/src/assets/images/avatars/Harper.jpg b/src/assets/images/avatars/Harper.jpg new file mode 100644 index 0000000..f27ebe7 Binary files /dev/null and b/src/assets/images/avatars/Harper.jpg differ diff --git a/src/assets/images/avatars/Helen.jpg b/src/assets/images/avatars/Helen.jpg new file mode 100644 index 0000000..ac0b93d Binary files /dev/null and b/src/assets/images/avatars/Helen.jpg differ diff --git a/src/assets/images/avatars/Henderson.jpg b/src/assets/images/avatars/Henderson.jpg new file mode 100644 index 0000000..e9e1e63 Binary files /dev/null and b/src/assets/images/avatars/Henderson.jpg differ diff --git a/src/assets/images/avatars/Josefina.jpg b/src/assets/images/avatars/Josefina.jpg new file mode 100644 index 0000000..1f0feb6 Binary files /dev/null and b/src/assets/images/avatars/Josefina.jpg differ diff --git a/src/assets/images/avatars/Katina.jpg b/src/assets/images/avatars/Katina.jpg new file mode 100644 index 0000000..ab53c42 Binary files /dev/null and b/src/assets/images/avatars/Katina.jpg differ diff --git a/src/assets/images/avatars/Lily.jpg b/src/assets/images/avatars/Lily.jpg new file mode 100644 index 0000000..e7fe3eb Binary files /dev/null and b/src/assets/images/avatars/Lily.jpg differ diff --git a/src/assets/images/avatars/Mai.jpg b/src/assets/images/avatars/Mai.jpg new file mode 100644 index 0000000..c732238 Binary files /dev/null and b/src/assets/images/avatars/Mai.jpg differ diff --git a/src/assets/images/avatars/Nancy.jpg b/src/assets/images/avatars/Nancy.jpg new file mode 100644 index 0000000..fdb71d9 Binary files /dev/null and b/src/assets/images/avatars/Nancy.jpg differ diff --git a/src/assets/images/avatars/Nora.jpg b/src/assets/images/avatars/Nora.jpg new file mode 100644 index 0000000..c062263 Binary files /dev/null and b/src/assets/images/avatars/Nora.jpg differ diff --git a/src/assets/images/avatars/Odessa.jpg b/src/assets/images/avatars/Odessa.jpg new file mode 100644 index 0000000..7c2b4d6 Binary files /dev/null and b/src/assets/images/avatars/Odessa.jpg differ diff --git a/src/assets/images/avatars/Reyna.jpg b/src/assets/images/avatars/Reyna.jpg new file mode 100644 index 0000000..ea888d7 Binary files /dev/null and b/src/assets/images/avatars/Reyna.jpg differ diff --git a/src/assets/images/avatars/Shauna.jpg b/src/assets/images/avatars/Shauna.jpg new file mode 100644 index 0000000..99f290b Binary files /dev/null and b/src/assets/images/avatars/Shauna.jpg differ diff --git a/src/assets/images/avatars/Shepard.jpg b/src/assets/images/avatars/Shepard.jpg new file mode 100644 index 0000000..4c99bdf Binary files /dev/null and b/src/assets/images/avatars/Shepard.jpg differ diff --git a/src/assets/images/avatars/Tillman.jpg b/src/assets/images/avatars/Tillman.jpg new file mode 100644 index 0000000..dcec53e Binary files /dev/null and b/src/assets/images/avatars/Tillman.jpg differ diff --git a/src/assets/images/avatars/Trevino.jpg b/src/assets/images/avatars/Trevino.jpg new file mode 100644 index 0000000..9ba4a3e Binary files /dev/null and b/src/assets/images/avatars/Trevino.jpg differ diff --git a/src/assets/images/avatars/Tyson.jpg b/src/assets/images/avatars/Tyson.jpg new file mode 100644 index 0000000..c571612 Binary files /dev/null and b/src/assets/images/avatars/Tyson.jpg differ diff --git a/src/assets/images/avatars/Velazquez.jpg b/src/assets/images/avatars/Velazquez.jpg new file mode 100644 index 0000000..53c7dec Binary files /dev/null and b/src/assets/images/avatars/Velazquez.jpg differ diff --git a/src/assets/images/avatars/alice.jpg b/src/assets/images/avatars/alice.jpg new file mode 100644 index 0000000..d4ec655 Binary files /dev/null and b/src/assets/images/avatars/alice.jpg differ diff --git a/src/assets/images/avatars/andrew.jpg b/src/assets/images/avatars/andrew.jpg new file mode 100644 index 0000000..30deeb7 Binary files /dev/null and b/src/assets/images/avatars/andrew.jpg differ diff --git a/src/assets/images/avatars/carl.jpg b/src/assets/images/avatars/carl.jpg new file mode 100644 index 0000000..8f85a75 Binary files /dev/null and b/src/assets/images/avatars/carl.jpg differ diff --git a/src/assets/images/avatars/danielle.jpg b/src/assets/images/avatars/danielle.jpg new file mode 100644 index 0000000..2ad8a09 Binary files /dev/null and b/src/assets/images/avatars/danielle.jpg differ diff --git a/src/assets/images/avatars/garry.jpg b/src/assets/images/avatars/garry.jpg new file mode 100644 index 0000000..f2bcd45 Binary files /dev/null and b/src/assets/images/avatars/garry.jpg differ diff --git a/src/assets/images/avatars/james.jpg b/src/assets/images/avatars/james.jpg new file mode 100644 index 0000000..78cf2b8 Binary files /dev/null and b/src/assets/images/avatars/james.jpg differ diff --git a/src/assets/images/avatars/jane.jpg b/src/assets/images/avatars/jane.jpg new file mode 100644 index 0000000..d916ac9 Binary files /dev/null and b/src/assets/images/avatars/jane.jpg differ diff --git a/src/assets/images/avatars/joyce.jpg b/src/assets/images/avatars/joyce.jpg new file mode 100644 index 0000000..a6a2e5f Binary files /dev/null and b/src/assets/images/avatars/joyce.jpg differ diff --git a/src/assets/images/avatars/katherine.jpg b/src/assets/images/avatars/katherine.jpg new file mode 100644 index 0000000..e4ef6aa Binary files /dev/null and b/src/assets/images/avatars/katherine.jpg differ diff --git a/src/assets/images/avatars/profile.jpg b/src/assets/images/avatars/profile.jpg new file mode 100644 index 0000000..ae83b58 Binary files /dev/null and b/src/assets/images/avatars/profile.jpg differ diff --git a/src/assets/images/avatars/vincent.jpg b/src/assets/images/avatars/vincent.jpg new file mode 100644 index 0000000..be97d2f Binary files /dev/null and b/src/assets/images/avatars/vincent.jpg differ diff --git a/src/assets/images/backgrounds/dark-material-bg.jpg b/src/assets/images/backgrounds/dark-material-bg.jpg new file mode 100644 index 0000000..2453fde Binary files /dev/null and b/src/assets/images/backgrounds/dark-material-bg.jpg differ diff --git a/src/assets/images/calendar/autumn.jpg b/src/assets/images/calendar/autumn.jpg new file mode 100644 index 0000000..320ee0c Binary files /dev/null and b/src/assets/images/calendar/autumn.jpg differ diff --git a/src/assets/images/calendar/spring.jpg b/src/assets/images/calendar/spring.jpg new file mode 100644 index 0000000..5904a84 Binary files /dev/null and b/src/assets/images/calendar/spring.jpg differ diff --git a/src/assets/images/calendar/summer.jpg b/src/assets/images/calendar/summer.jpg new file mode 100644 index 0000000..1d20da2 Binary files /dev/null and b/src/assets/images/calendar/summer.jpg differ diff --git a/src/assets/images/calendar/winter.jpg b/src/assets/images/calendar/winter.jpg new file mode 100644 index 0000000..c89a33d Binary files /dev/null and b/src/assets/images/calendar/winter.jpg differ diff --git a/src/assets/images/cards/card1.jpg b/src/assets/images/cards/card1.jpg new file mode 100644 index 0000000..581fac7 Binary files /dev/null and b/src/assets/images/cards/card1.jpg differ diff --git a/src/assets/images/cards/card2-large.jpg b/src/assets/images/cards/card2-large.jpg new file mode 100644 index 0000000..8803f36 Binary files /dev/null and b/src/assets/images/cards/card2-large.jpg differ diff --git a/src/assets/images/cards/card2-medium.jpg b/src/assets/images/cards/card2-medium.jpg new file mode 100644 index 0000000..2c8602e Binary files /dev/null and b/src/assets/images/cards/card2-medium.jpg differ diff --git a/src/assets/images/cards/card2-small.jpg b/src/assets/images/cards/card2-small.jpg new file mode 100644 index 0000000..3bc2020 Binary files /dev/null and b/src/assets/images/cards/card2-small.jpg differ diff --git a/src/assets/images/cards/card2.jpg b/src/assets/images/cards/card2.jpg new file mode 100644 index 0000000..8f9e0cf Binary files /dev/null and b/src/assets/images/cards/card2.jpg differ diff --git a/src/assets/images/cards/card3-square.jpg b/src/assets/images/cards/card3-square.jpg new file mode 100644 index 0000000..7a75951 Binary files /dev/null and b/src/assets/images/cards/card3-square.jpg differ diff --git a/src/assets/images/cards/card3.jpg b/src/assets/images/cards/card3.jpg new file mode 100644 index 0000000..7cbfd35 Binary files /dev/null and b/src/assets/images/cards/card3.jpg differ diff --git a/src/assets/images/demo-content/morain-lake.jpg b/src/assets/images/demo-content/morain-lake.jpg new file mode 100644 index 0000000..5e914d7 Binary files /dev/null and b/src/assets/images/demo-content/morain-lake.jpg differ diff --git a/src/assets/images/ecommerce/a-walk-amongst-friends.jpg b/src/assets/images/ecommerce/a-walk-amongst-friends.jpg new file mode 100644 index 0000000..0e1c8c0 Binary files /dev/null and b/src/assets/images/ecommerce/a-walk-amongst-friends.jpg differ diff --git a/src/assets/images/ecommerce/braies-lake.jpg b/src/assets/images/ecommerce/braies-lake.jpg new file mode 100644 index 0000000..359ef8e Binary files /dev/null and b/src/assets/images/ecommerce/braies-lake.jpg differ diff --git a/src/assets/images/ecommerce/fall-glow.jpg b/src/assets/images/ecommerce/fall-glow.jpg new file mode 100644 index 0000000..19a3886 Binary files /dev/null and b/src/assets/images/ecommerce/fall-glow.jpg differ diff --git a/src/assets/images/ecommerce/first-snow.jpg b/src/assets/images/ecommerce/first-snow.jpg new file mode 100644 index 0000000..c49747e Binary files /dev/null and b/src/assets/images/ecommerce/first-snow.jpg differ diff --git a/src/assets/images/ecommerce/lago-di-braies.jpg b/src/assets/images/ecommerce/lago-di-braies.jpg new file mode 100644 index 0000000..e319a79 Binary files /dev/null and b/src/assets/images/ecommerce/lago-di-braies.jpg differ diff --git a/src/assets/images/ecommerce/lago-di-sorapis.jpg b/src/assets/images/ecommerce/lago-di-sorapis.jpg new file mode 100644 index 0000000..f71aa97 Binary files /dev/null and b/src/assets/images/ecommerce/lago-di-sorapis.jpg differ diff --git a/src/assets/images/ecommerce/morain-lake.jpg b/src/assets/images/ecommerce/morain-lake.jpg new file mode 100644 index 0000000..e66d21c Binary files /dev/null and b/src/assets/images/ecommerce/morain-lake.jpg differ diff --git a/src/assets/images/ecommerce/never-stop-changing.jpg b/src/assets/images/ecommerce/never-stop-changing.jpg new file mode 100644 index 0000000..e6bde1a Binary files /dev/null and b/src/assets/images/ecommerce/never-stop-changing.jpg differ diff --git a/src/assets/images/ecommerce/product-image-placeholder.png b/src/assets/images/ecommerce/product-image-placeholder.png new file mode 100644 index 0000000..e204c93 Binary files /dev/null and b/src/assets/images/ecommerce/product-image-placeholder.png differ diff --git a/src/assets/images/ecommerce/reaching.jpg b/src/assets/images/ecommerce/reaching.jpg new file mode 100644 index 0000000..0dba473 Binary files /dev/null and b/src/assets/images/ecommerce/reaching.jpg differ diff --git a/src/assets/images/ecommerce/yosemite.jpg b/src/assets/images/ecommerce/yosemite.jpg new file mode 100644 index 0000000..e82fa6d Binary files /dev/null and b/src/assets/images/ecommerce/yosemite.jpg differ diff --git a/src/assets/images/file-manager/sample-file-preview.jpg b/src/assets/images/file-manager/sample-file-preview.jpg new file mode 100644 index 0000000..897b45e Binary files /dev/null and b/src/assets/images/file-manager/sample-file-preview.jpg differ diff --git a/src/assets/images/flags/ko.png b/src/assets/images/flags/ko.png new file mode 100644 index 0000000..5ecae7c Binary files /dev/null and b/src/assets/images/flags/ko.png differ diff --git a/src/assets/images/flags/us.png b/src/assets/images/flags/us.png new file mode 100644 index 0000000..a2cdfe7 Binary files /dev/null and b/src/assets/images/flags/us.png differ diff --git a/src/assets/images/logos/fuse.svg b/src/assets/images/logos/fuse.svg new file mode 100644 index 0000000..bc463a7 --- /dev/null +++ b/src/assets/images/logos/fuse.svg @@ -0,0 +1,1127 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/src/assets/images/mail/attachment-1.jpg b/src/assets/images/mail/attachment-1.jpg new file mode 100644 index 0000000..a8bf96c Binary files /dev/null and b/src/assets/images/mail/attachment-1.jpg differ diff --git a/src/assets/images/mail/attachment-2.jpg b/src/assets/images/mail/attachment-2.jpg new file mode 100644 index 0000000..37ad0f4 Binary files /dev/null and b/src/assets/images/mail/attachment-2.jpg differ diff --git a/src/assets/images/mail/attachment-3.jpg b/src/assets/images/mail/attachment-3.jpg new file mode 100644 index 0000000..c705354 Binary files /dev/null and b/src/assets/images/mail/attachment-3.jpg differ diff --git a/src/assets/images/profile/a-walk-amongst-friends-small.jpg b/src/assets/images/profile/a-walk-amongst-friends-small.jpg new file mode 100644 index 0000000..d331c49 Binary files /dev/null and b/src/assets/images/profile/a-walk-amongst-friends-small.jpg differ diff --git a/src/assets/images/profile/braies-lake-small.jpg b/src/assets/images/profile/braies-lake-small.jpg new file mode 100644 index 0000000..f4863ac Binary files /dev/null and b/src/assets/images/profile/braies-lake-small.jpg differ diff --git a/src/assets/images/profile/fall-glow-small.jpg b/src/assets/images/profile/fall-glow-small.jpg new file mode 100644 index 0000000..0170520 Binary files /dev/null and b/src/assets/images/profile/fall-glow-small.jpg differ diff --git a/src/assets/images/profile/first-snow-small.jpg b/src/assets/images/profile/first-snow-small.jpg new file mode 100644 index 0000000..3b89b4d Binary files /dev/null and b/src/assets/images/profile/first-snow-small.jpg differ diff --git a/src/assets/images/profile/lago-di-braies-small.jpg b/src/assets/images/profile/lago-di-braies-small.jpg new file mode 100644 index 0000000..3299293 Binary files /dev/null and b/src/assets/images/profile/lago-di-braies-small.jpg differ diff --git a/src/assets/images/profile/lago-di-sorapis-small.jpg b/src/assets/images/profile/lago-di-sorapis-small.jpg new file mode 100644 index 0000000..ecb9017 Binary files /dev/null and b/src/assets/images/profile/lago-di-sorapis-small.jpg differ diff --git a/src/assets/images/profile/morain-lake-small.jpg b/src/assets/images/profile/morain-lake-small.jpg new file mode 100644 index 0000000..af57c52 Binary files /dev/null and b/src/assets/images/profile/morain-lake-small.jpg differ diff --git a/src/assets/images/profile/morain-lake.jpg b/src/assets/images/profile/morain-lake.jpg new file mode 100644 index 0000000..5e914d7 Binary files /dev/null and b/src/assets/images/profile/morain-lake.jpg differ diff --git a/src/assets/images/profile/never-stop-changing-small.jpg b/src/assets/images/profile/never-stop-changing-small.jpg new file mode 100644 index 0000000..b47dd57 Binary files /dev/null and b/src/assets/images/profile/never-stop-changing-small.jpg differ diff --git a/src/assets/images/profile/never-stop-changing.jpg b/src/assets/images/profile/never-stop-changing.jpg new file mode 100644 index 0000000..695ada8 Binary files /dev/null and b/src/assets/images/profile/never-stop-changing.jpg differ diff --git a/src/assets/images/profile/reaching-small.jpg b/src/assets/images/profile/reaching-small.jpg new file mode 100644 index 0000000..a31f62f Binary files /dev/null and b/src/assets/images/profile/reaching-small.jpg differ diff --git a/src/assets/images/profile/yosemite-small.jpg b/src/assets/images/profile/yosemite-small.jpg new file mode 100644 index 0000000..d9f65a2 Binary files /dev/null and b/src/assets/images/profile/yosemite-small.jpg differ diff --git a/src/assets/images/scrumboard/calendar.jpg b/src/assets/images/scrumboard/calendar.jpg new file mode 100644 index 0000000..a5a167b Binary files /dev/null and b/src/assets/images/scrumboard/calendar.jpg differ diff --git a/src/assets/images/scrumboard/header-1.jpg b/src/assets/images/scrumboard/header-1.jpg new file mode 100644 index 0000000..aae8f82 Binary files /dev/null and b/src/assets/images/scrumboard/header-1.jpg differ diff --git a/src/assets/images/scrumboard/header-2.jpg b/src/assets/images/scrumboard/header-2.jpg new file mode 100644 index 0000000..681449b Binary files /dev/null and b/src/assets/images/scrumboard/header-2.jpg differ diff --git a/src/assets/images/scrumboard/mail.jpg b/src/assets/images/scrumboard/mail.jpg new file mode 100644 index 0000000..38f06c4 Binary files /dev/null and b/src/assets/images/scrumboard/mail.jpg differ diff --git a/src/environments/environment.hmr.ts b/src/environments/environment.hmr.ts new file mode 100644 index 0000000..db58648 --- /dev/null +++ b/src/environments/environment.hmr.ts @@ -0,0 +1,4 @@ +export const environment = { + production: false, + hmr: true +}; diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts new file mode 100644 index 0000000..0d7b86c --- /dev/null +++ b/src/environments/environment.prod.ts @@ -0,0 +1,4 @@ +export const environment = { + production: true, + hmr: false +}; diff --git a/src/environments/environment.ts b/src/environments/environment.ts new file mode 100644 index 0000000..2494140 --- /dev/null +++ b/src/environments/environment.ts @@ -0,0 +1,17 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false, + hmr: false +}; + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/dist/zone-error'; // Included with Angular CLI. 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/hmr.ts b/src/hmr.ts new file mode 100644 index 0000000..ccc8fc3 --- /dev/null +++ b/src/hmr.ts @@ -0,0 +1,18 @@ +import { NgModuleRef, ApplicationRef } from '@angular/core'; +import { createNewHosts } from '@angularclass/hmr'; + +export const hmrBootstrap = ( + module: any, + bootstrap: () => Promise> +) => { + let ngModule: NgModuleRef; + module.hot.accept(); + bootstrap().then(mod => (ngModule = mod)); + module.hot.dispose(() => { + const appRef: ApplicationRef = ngModule.injector.get(ApplicationRef); + const elements = appRef.components.map(c => c.location.nativeElement); + const makeVisible = createNewHosts(elements); + ngModule.destroy(); + makeVisible(); + }); +}; diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..9b6e06f --- /dev/null +++ b/src/index.html @@ -0,0 +1,221 @@ + + + + UCAP APM + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..ae18878 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,29 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import 'hammerjs'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +import { hmrBootstrap } from './hmr'; + +if (environment.production) { + enableProdMode(); +} + +// platformBrowserDynamic().bootstrapModule(AppModule) +// .catch(err => console.error(err)); + +const bootstrap = () => platformBrowserDynamic().bootstrapModule(AppModule); + +if (environment.hmr) { + if (module['hot']) { + hmrBootstrap(module, bootstrap); + } else { + console.error('HMR is not enabled for webpack-dev-server!'); + console.log('Are you using the --hmr flag for ng serve?'); + } +} else { + bootstrap().catch(err => console.error(err)); +} diff --git a/src/modules/auth/auth.module.ts b/src/modules/auth/auth.module.ts new file mode 100644 index 0000000..416418a --- /dev/null +++ b/src/modules/auth/auth.module.ts @@ -0,0 +1,24 @@ +import { NgModule, ModuleWithProviders } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { SERVICES } from './service'; + +@NgModule({ + declarations: [], + imports: [CommonModule], + exports: [] +}) +export class AuthModule { + public static forRoot(): ModuleWithProviders { + return { + ngModule: AuthRootModule, + providers: [SERVICES] + }; + } +} + +@NgModule({ + imports: [], + exports: [] +}) +export class AuthRootModule {} diff --git a/src/modules/auth/model/jwt-signin-response.model.ts b/src/modules/auth/model/jwt-signin-response.model.ts new file mode 100644 index 0000000..74930ad --- /dev/null +++ b/src/modules/auth/model/jwt-signin-response.model.ts @@ -0,0 +1,4 @@ +export interface JwtSigninResponse { + accessToken: string; + tokenType: string; +} diff --git a/src/modules/auth/model/signin-request.model.ts b/src/modules/auth/model/signin-request.model.ts new file mode 100644 index 0000000..ef4ad96 --- /dev/null +++ b/src/modules/auth/model/signin-request.model.ts @@ -0,0 +1,4 @@ +export interface SigninRequest { + username: string; + password: string; +} diff --git a/src/modules/auth/service/auth.service.ts b/src/modules/auth/service/auth.service.ts new file mode 100644 index 0000000..d6597cd --- /dev/null +++ b/src/modules/auth/service/auth.service.ts @@ -0,0 +1,45 @@ +import { Injectable, Inject } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; + +import { Observable } from 'rxjs'; +import { JwtSigninResponse } from '../model/jwt-signin-response.model'; +import { map } from 'rxjs/operators'; +import { API_BASE_URL } from 'src/modules/common/type/injection-token.type'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthService { + constructor( + @Inject(API_BASE_URL) private apiBaseUrl: string, + private httpClient: HttpClient + ) {} + + public authenticate( + username: string, + password: string + ): Observable { + return this.httpClient + .post(`${this.apiBaseUrl}/auth/signin`, { + username, + password + }) + .pipe( + map(res => { + sessionStorage.setItem('username', username); + let tokenStr = res.tokenType + ' ' + res.accessToken; + sessionStorage.setItem('token', tokenStr); + return res; + }) + ); + } + + isLoggedIn() { + const user = sessionStorage.getItem('username'); + return !(null === user); + } + + logOut() { + sessionStorage.removeItem('username'); + } +} diff --git a/src/modules/auth/service/index.ts b/src/modules/auth/service/index.ts new file mode 100644 index 0000000..83f7860 --- /dev/null +++ b/src/modules/auth/service/index.ts @@ -0,0 +1,3 @@ +import { AuthService } from './auth.service'; + +export const SERVICES = [AuthService]; diff --git a/src/modules/chart/chart.module.ts b/src/modules/chart/chart.module.ts new file mode 100644 index 0000000..3abe285 --- /dev/null +++ b/src/modules/chart/chart.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; + +import { ChartsModule } from 'ng2-charts'; + +import { COMPONENTS } from './component'; + +@NgModule({ + imports: [ChartsModule], + declarations: [...COMPONENTS], + entryComponents: [...COMPONENTS] +}) +export class ChartModule {} diff --git a/src/modules/chart/component/gauge.component.html b/src/modules/chart/component/gauge.component.html new file mode 100644 index 0000000..47d4e74 --- /dev/null +++ b/src/modules/chart/component/gauge.component.html @@ -0,0 +1,7 @@ + diff --git a/src/modules/chart/component/gauge.component.scss b/src/modules/chart/component/gauge.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/chart/component/gauge.component.ts b/src/modules/chart/component/gauge.component.ts new file mode 100644 index 0000000..4392fd2 --- /dev/null +++ b/src/modules/chart/component/gauge.component.ts @@ -0,0 +1,12 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'lib-chart-gauge', + templateUrl: './gauge.component.html', + styleUrls: ['./gauge.component.scss'] +}) +export class GaugeComponent implements OnInit { + constructor() {} + + ngOnInit() {} +} diff --git a/src/modules/chart/component/graph.component.html b/src/modules/chart/component/graph.component.html new file mode 100644 index 0000000..34bbb49 --- /dev/null +++ b/src/modules/chart/component/graph.component.html @@ -0,0 +1,13 @@ +
+
+ + +
+
diff --git a/src/modules/chart/component/graph.component.scss b/src/modules/chart/component/graph.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/chart/component/graph.component.ts b/src/modules/chart/component/graph.component.ts new file mode 100644 index 0000000..1d65948 --- /dev/null +++ b/src/modules/chart/component/graph.component.ts @@ -0,0 +1,34 @@ +import { Component, OnInit } from '@angular/core'; +import { timer } from 'rxjs'; + +@Component({ + selector: 'lib-chart-graph', + templateUrl: './graph.component.html', + styleUrls: ['./graph.component.scss'] +}) +export class GraphComponent implements OnInit { + public chartOptions = { + scaleShowVerticalLines: false, + responsive: true + }; + public chartLabels = [ + '2006', + '2007', + '2008', + '2009', + '2010', + '2011', + '2012', + '2013' + ]; + public chartType = 'line'; + public chartLegend = true; + public chartData = [ + { data: [65, 59, 80, 81, 56, 55, 40, 110], label: 'Series A' }, + { data: [28, 48, 40, 19, 86, 27, 90, 120], label: 'Series B' } + ]; + + constructor() {} + + ngOnInit() {} +} diff --git a/src/modules/chart/component/index.ts b/src/modules/chart/component/index.ts new file mode 100644 index 0000000..90aad1a --- /dev/null +++ b/src/modules/chart/component/index.ts @@ -0,0 +1,5 @@ +import { GaugeComponent } from './gauge.component'; +import { GraphComponent } from './graph.component'; +import { LineComponent } from './line.component'; + +export const COMPONENTS = [GaugeComponent, GraphComponent, LineComponent]; diff --git a/src/modules/chart/component/line.component.html b/src/modules/chart/component/line.component.html new file mode 100644 index 0000000..b6f737a --- /dev/null +++ b/src/modules/chart/component/line.component.html @@ -0,0 +1,13 @@ + + + + + + + diff --git a/src/modules/chart/component/line.component.scss b/src/modules/chart/component/line.component.scss new file mode 100644 index 0000000..d15c3dc --- /dev/null +++ b/src/modules/chart/component/line.component.scss @@ -0,0 +1,7 @@ +iframe { + display: block; /* iframes are inline by default */ + background: #000; + border: none; /* Reset default border */ + height: 100vh; /* Viewport-relative units */ + width: 100vw; +} diff --git a/src/modules/chart/component/line.component.ts b/src/modules/chart/component/line.component.ts new file mode 100644 index 0000000..10f510d --- /dev/null +++ b/src/modules/chart/component/line.component.ts @@ -0,0 +1,12 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'lib-chart-line', + templateUrl: './line.component.html', + styleUrls: ['./line.component.scss'] +}) +export class LineComponent implements OnInit { + constructor() {} + + ngOnInit() {} +} diff --git a/src/modules/common/common.module.ts b/src/modules/common/common.module.ts new file mode 100644 index 0000000..97a8cba --- /dev/null +++ b/src/modules/common/common.module.ts @@ -0,0 +1,22 @@ +import { NgModule, ModuleWithProviders } from '@angular/core'; +import { CommonModule as AngularCommonModule } from '@angular/common'; + +@NgModule({ + declarations: [], + imports: [AngularCommonModule], + exports: [] +}) +export class CommonModule { + public static forRoot(): ModuleWithProviders { + return { + ngModule: CommonRootModule, + providers: [] + }; + } +} + +@NgModule({ + imports: [], + exports: [] +}) +export class CommonRootModule {} diff --git a/src/modules/common/type/injection-token.type.ts b/src/modules/common/type/injection-token.type.ts new file mode 100644 index 0000000..6f99002 --- /dev/null +++ b/src/modules/common/type/injection-token.type.ts @@ -0,0 +1,9 @@ +import { InjectionToken } from '@angular/core'; + +export const API_BASE_URL = new InjectionToken('API_BASE_URL'); +export const GRAFANA_API_BASE_URL = new InjectionToken( + 'GRAFANA_API_BASE_URL' +); +export const GRAFANA_API_TOKEN = new InjectionToken( + 'GRAFANA_API_TOKEN' +); diff --git a/src/modules/dashboard/dashboard-store.module.ts b/src/modules/dashboard/dashboard-store.module.ts new file mode 100644 index 0000000..9bd3d8f --- /dev/null +++ b/src/modules/dashboard/dashboard-store.module.ts @@ -0,0 +1,13 @@ +import { NgModule, ModuleWithProviders } from '@angular/core'; +import { StoreModule } from '@ngrx/store'; +import { EffectsModule } from '@ngrx/effects'; + +import { reducer, Effects } from './store'; + +@NgModule({ + imports: [ + StoreModule.forFeature('dashboard', reducer), + EffectsModule.forFeature([Effects]) + ] +}) +export class DashboardStoreModule {} diff --git a/src/modules/dashboard/dashboard.module.ts b/src/modules/dashboard/dashboard.module.ts new file mode 100644 index 0000000..e6e098d --- /dev/null +++ b/src/modules/dashboard/dashboard.module.ts @@ -0,0 +1,24 @@ +import { NgModule, ModuleWithProviders } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { SERVICES } from './service'; +import { DashboardStoreModule } from './dashboard-store.module'; + +@NgModule({ + declarations: [], + imports: [CommonModule, DashboardStoreModule], + exports: [] +}) +export class DashboardModule { + public static forRoot(): ModuleWithProviders { + return { + ngModule: DashboardRootModule, + providers: [SERVICES] + }; + } +} + +@NgModule({ + imports: [], + exports: [] +}) +export class DashboardRootModule {} diff --git a/src/modules/dashboard/model/Dashboard.ts b/src/modules/dashboard/model/Dashboard.ts new file mode 100644 index 0000000..0cd1574 --- /dev/null +++ b/src/modules/dashboard/model/Dashboard.ts @@ -0,0 +1,8 @@ +export interface Dashboard { + id: number; + title: string; + description: string; + url: string; + sortOrder: number; + display: boolean; +} diff --git a/src/modules/dashboard/service/dashboard.service.ts b/src/modules/dashboard/service/dashboard.service.ts new file mode 100644 index 0000000..1f99da5 --- /dev/null +++ b/src/modules/dashboard/service/dashboard.service.ts @@ -0,0 +1,50 @@ +import { Injectable, Inject } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; + +import { Observable } from 'rxjs'; +import { Dashboard } from '../model/Dashboard'; +import { API_BASE_URL } from 'src/modules/common/type/injection-token.type'; + +@Injectable({ + providedIn: 'root' +}) +export class DashboardService { + constructor( + @Inject(API_BASE_URL) private apiBaseUrl: string, + private httpClient: HttpClient + ) {} + + public getDashboards(): Observable { + return this.httpClient.get( + `${this.apiBaseUrl}/dashboards`, + {} + ); + } + + public updateDashboardDisplay( + id: number, + display: boolean + ): Observable { + return this.httpClient.put( + `${this.apiBaseUrl}/dashboards/${id}/display/${display}`, + {} + ); + } + + public updateDashboardSortOrder( + id: number, + targetSortOrder: number + ): Observable { + return this.httpClient.put( + `${this.apiBaseUrl}/dashboards/${id}/sort_order/${targetSortOrder}`, + {} + ); + } + + public deleteDashboard(id: number): Observable { + return this.httpClient.delete( + `${this.apiBaseUrl}/dashboards/${id}`, + {} + ); + } +} diff --git a/src/modules/dashboard/service/index.ts b/src/modules/dashboard/service/index.ts new file mode 100644 index 0000000..23cd12b --- /dev/null +++ b/src/modules/dashboard/service/index.ts @@ -0,0 +1,3 @@ +import { DashboardService } from './dashboard.service'; + +export const SERVICES = [DashboardService]; diff --git a/src/modules/dashboard/store/action.ts b/src/modules/dashboard/store/action.ts new file mode 100644 index 0000000..6800612 --- /dev/null +++ b/src/modules/dashboard/store/action.ts @@ -0,0 +1,60 @@ +import { createAction, props } from '@ngrx/store'; + +import { Dashboard } from '../model/Dashboard'; + +export const addDashboard = createAction( + '[Dashboard] Add Dashboard', + props<{ dashboard: Dashboard }>() +); + +export const addDashboardSuccess = createAction( + '[Dashboard] Add Dashboard Success', + props<{ dashboard: Dashboard }>() +); + +export const addDashboardFailure = createAction( + '[Dashboard] Add Dashboard Failure', + props<{ dashboard: Dashboard; error: any }>() +); + +export const loadDashboards = createAction('[Dashboard] Load Dashboards'); + +export const loadDashboardsSuccess = createAction( + '[Dashboard] Load Dashboards Success', + props<{ dashboards: Dashboard[] }>() +); + +export const loadDashboardsFailure = createAction( + '[Dashboard] Load Dashboards Failure', + props<{ error: any }>() +); + +export const modifyDashboard = createAction( + '[Dashboard] Modify Dashboard', + props<{ dashboard: Dashboard }>() +); + +export const modifyDashboardSuccess = createAction( + '[Dashboard] Modify Dashboard Success', + props<{ dashboard: Dashboard }>() +); + +export const modifyDashboardFailure = createAction( + '[Dashboard] Modify Dashboard Failure', + props<{ dashboard: Dashboard; error: any }>() +); + +export const removeDashboard = createAction( + '[Dashboard] Remove Dashboard', + props<{ id: number }>() +); + +export const removeDashboardSuccess = createAction( + '[Dashboard] Remove Dashboard Success', + props<{ id: number }>() +); + +export const removeDashboardFailure = createAction( + '[Dashboard] Remove Dashboard Failure', + props<{ id: number; error: any }>() +); diff --git a/src/modules/dashboard/store/effect.ts b/src/modules/dashboard/store/effect.ts new file mode 100644 index 0000000..eedfacb --- /dev/null +++ b/src/modules/dashboard/store/effect.ts @@ -0,0 +1,52 @@ +import { Injectable } from '@angular/core'; + +import { Actions, ofType, createEffect } from '@ngrx/effects'; + +import { of } from 'rxjs'; +import { map, catchError, switchMap, mergeMap } from 'rxjs/operators'; + +import { + loadDashboards, + loadDashboardsSuccess, + loadDashboardsFailure, + addDashboard, + removeDashboard, + removeDashboardSuccess, + removeDashboardFailure +} from './action'; +import { DashboardService } from '../service/dashboard.service'; +import { Dashboard } from '../model/Dashboard'; + +@Injectable() +export class Effects { + loadDashboards$ = createEffect(() => + this.actions$.pipe( + ofType(loadDashboards), + switchMap(() => + this.dashboardService.getDashboards().pipe( + map((dashboards: Dashboard[]) => + loadDashboardsSuccess({ dashboards }) + ), + catchError(error => of(loadDashboardsFailure({ error }))) + ) + ) + ) + ); + + removeBookFromCollection$ = createEffect(() => + this.actions$.pipe( + ofType(removeDashboard), + mergeMap(({ id }) => + this.dashboardService.deleteDashboard(id).pipe( + map(() => removeDashboardSuccess({ id })), + catchError(error => of(removeDashboardFailure({ id, error }))) + ) + ) + ) + ); + + constructor( + private actions$: Actions, + private dashboardService: DashboardService + ) {} +} diff --git a/src/modules/dashboard/store/index.ts b/src/modules/dashboard/store/index.ts new file mode 100644 index 0000000..bd32214 --- /dev/null +++ b/src/modules/dashboard/store/index.ts @@ -0,0 +1,4 @@ +export * from './action'; +export * from './effect'; +export * from './reducer'; +export * from './state'; diff --git a/src/modules/dashboard/store/reducer.ts b/src/modules/dashboard/store/reducer.ts new file mode 100644 index 0000000..f5745d1 --- /dev/null +++ b/src/modules/dashboard/store/reducer.ts @@ -0,0 +1,11 @@ +import { createReducer, on } from '@ngrx/store'; + +import { State, initialState } from './state'; +import { loadDashboardsSuccess } from './action'; + +export const reducer = createReducer( + initialState, + on(loadDashboardsSuccess, (state, { dashboards }) => ({ + dashboards: dashboards + })) +); diff --git a/src/modules/dashboard/store/state.ts b/src/modules/dashboard/store/state.ts new file mode 100644 index 0000000..16bfd42 --- /dev/null +++ b/src/modules/dashboard/store/state.ts @@ -0,0 +1,25 @@ +import { Selector, createSelector } from '@ngrx/store'; +import { Dashboard } from 'src/modules/dashboard/model/Dashboard'; + +export interface State { + dashboards: Dashboard[] | null; + currentDashboard: Dashboard | null; +} + +export const initialState: State = { + dashboards: null, + currentDashboard: null +}; + +export function getSelectors(selector: Selector) { + return { + selectDashboards: createSelector( + selector, + (state: State) => state.dashboards + ), + selectCurrentDashboard: createSelector( + selector, + (state: State) => state.currentDashboard + ) + }; +} diff --git a/src/modules/grafana/grafana.module.ts b/src/modules/grafana/grafana.module.ts new file mode 100644 index 0000000..8e873de --- /dev/null +++ b/src/modules/grafana/grafana.module.ts @@ -0,0 +1,23 @@ +import { NgModule, ModuleWithProviders } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { SERVICES } from './service'; + +@NgModule({ + declarations: [], + imports: [CommonModule], + exports: [] +}) +export class GrafanaModule { + public static forRoot(): ModuleWithProviders { + return { + ngModule: GrafanaRootModule, + providers: [SERVICES] + }; + } +} + +@NgModule({ + imports: [], + exports: [] +}) +export class GrafanaRootModule {} diff --git a/src/modules/grafana/model/Dashboard.ts b/src/modules/grafana/model/Dashboard.ts new file mode 100644 index 0000000..c213ee4 --- /dev/null +++ b/src/modules/grafana/model/Dashboard.ts @@ -0,0 +1,13 @@ +export interface Dashboard { + id: number; + uid: string; + title: string; + url: string; + type: 'dash-db' | 'dash-folder'; + tags: string[]; + isStarred: boolean; + folderId?: number; + folderUid?: string; + folderTitle?: string; + folderUrl?: string; +} diff --git a/src/modules/grafana/service/grafana-api.service.ts b/src/modules/grafana/service/grafana-api.service.ts new file mode 100644 index 0000000..026faa7 --- /dev/null +++ b/src/modules/grafana/service/grafana-api.service.ts @@ -0,0 +1,35 @@ +import { Injectable, Inject } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; + +import { Observable } from 'rxjs'; +import { Dashboard } from '../model/Dashboard'; +import { + GRAFANA_API_BASE_URL, + GRAFANA_API_TOKEN +} from 'src/modules/common/type/injection-token.type'; + +@Injectable({ + providedIn: 'root' +}) +export class GrafanaApiService { + constructor( + @Inject(GRAFANA_API_BASE_URL) private grafanaApiBaseUrl: string, + @Inject(GRAFANA_API_TOKEN) private grafanaApiToken: string, + private httpClient: HttpClient + ) {} + + public getDashboards(): Observable { + const headers = new HttpHeaders({ + 'Content-Type': 'application/json', + Accept: 'application/json', + Authorization: `Bearer ${this.grafanaApiToken}` + }); + + return this.httpClient.get( + `${this.grafanaApiBaseUrl}/search`, + { + headers: headers + } + ); + } +} diff --git a/src/modules/grafana/service/index.ts b/src/modules/grafana/service/index.ts new file mode 100644 index 0000000..85463bb --- /dev/null +++ b/src/modules/grafana/service/index.ts @@ -0,0 +1,3 @@ +import { GrafanaApiService } from './grafana-api.service'; + +export const SERVICES = [GrafanaApiService]; diff --git a/src/modules/influxdb/component/index.ts b/src/modules/influxdb/component/index.ts new file mode 100644 index 0000000..4378934 --- /dev/null +++ b/src/modules/influxdb/component/index.ts @@ -0,0 +1,3 @@ +import { QueryComponent } from './query.component'; + +export const COMPONENTS = [QueryComponent]; diff --git a/src/modules/influxdb/component/query.component.html b/src/modules/influxdb/component/query.component.html new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/influxdb/component/query.component.scss b/src/modules/influxdb/component/query.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/influxdb/component/query.component.ts b/src/modules/influxdb/component/query.component.ts new file mode 100644 index 0000000..7748ac3 --- /dev/null +++ b/src/modules/influxdb/component/query.component.ts @@ -0,0 +1,12 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-influxdb-query', + templateUrl: './query.component.html', + styleUrls: ['./query.component.scss'] +}) +export class QueryComponent implements OnInit { + constructor() {} + + ngOnInit() {} +} diff --git a/src/modules/influxdb/influxdb.module.ts b/src/modules/influxdb/influxdb.module.ts new file mode 100644 index 0000000..95bf360 --- /dev/null +++ b/src/modules/influxdb/influxdb.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; + +import { FuseSharedModule } from 'src/@fuse/shared.module'; + +import { COMPONENTS } from './component'; + +@NgModule({ + imports: [FuseSharedModule], + declarations: [...COMPONENTS] +}) +export class InfluxdbModule {} diff --git a/src/modules/user/model/role.model.ts b/src/modules/user/model/role.model.ts new file mode 100644 index 0000000..12ea167 --- /dev/null +++ b/src/modules/user/model/role.model.ts @@ -0,0 +1,10 @@ +export enum RoleName { + ROLE_SUPER_ADMIN = 'ROLE_SUPER_ADMIN', + ROLE_ADMIN = 'ROLE_ADMIN', + ROLE_USER = 'ROLE_USER' +} + +export interface Role { + id: number; + name: RoleName; +} diff --git a/src/modules/user/model/user.model.ts b/src/modules/user/model/user.model.ts new file mode 100644 index 0000000..e6847f4 --- /dev/null +++ b/src/modules/user/model/user.model.ts @@ -0,0 +1,9 @@ +import { Role } from './role.model'; + +export interface User { + id: number; + username: string; + password?: string; + email: string; + roles: Role[]; +} diff --git a/src/modules/user/service/index.ts b/src/modules/user/service/index.ts new file mode 100644 index 0000000..986f895 --- /dev/null +++ b/src/modules/user/service/index.ts @@ -0,0 +1,3 @@ +import { UserService } from './user.service'; + +export const SERVICES = [UserService]; diff --git a/src/modules/user/service/user.service.ts b/src/modules/user/service/user.service.ts new file mode 100644 index 0000000..34c577e --- /dev/null +++ b/src/modules/user/service/user.service.ts @@ -0,0 +1,27 @@ +import { Injectable, Inject } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; + +import { Observable } from 'rxjs'; +import { User } from '../model/user.model'; +import { API_BASE_URL } from 'src/modules/common/type/injection-token.type'; + +@Injectable({ + providedIn: 'root' +}) +export class UserService { + constructor( + @Inject(API_BASE_URL) private apiBaseUrl: string, + private httpClient: HttpClient + ) {} + + public getUsers(): Observable { + const headers = new HttpHeaders({ + 'Content-Type': 'application/json', + Accept: 'application/json' + }); + + return this.httpClient.get(`${this.apiBaseUrl}/users`, { + headers: headers + }); + } +} diff --git a/src/modules/user/user.module.ts b/src/modules/user/user.module.ts new file mode 100644 index 0000000..dc899d9 --- /dev/null +++ b/src/modules/user/user.module.ts @@ -0,0 +1,23 @@ +import { NgModule, ModuleWithProviders } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { SERVICES } from './service'; + +@NgModule({ + declarations: [], + imports: [CommonModule], + exports: [] +}) +export class UserModule { + public static forRoot(): ModuleWithProviders { + return { + ngModule: UserRootModule, + providers: [SERVICES] + }; + } +} + +@NgModule({ + imports: [], + exports: [] +}) +export class UserRootModule {} diff --git a/src/polyfills.ts b/src/polyfills.ts new file mode 100644 index 0000000..3cba9bc --- /dev/null +++ b/src/polyfills.ts @@ -0,0 +1,64 @@ +/** + * 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/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags.ts'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ +// Add global to window, assigning the value of window itself. +(window as any).global = window; diff --git a/src/styles.scss b/src/styles.scss new file mode 100644 index 0000000..36030bf --- /dev/null +++ b/src/styles.scss @@ -0,0 +1,5 @@ +/* You can add global styles to this file, and also import other style files */ +@import '@fuse/scss/core'; + +// Import app.theme.scss +@import 'app/app.theme'; diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 0000000..1631789 --- /dev/null +++ b/src/test.ts @@ -0,0 +1,20 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// 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); diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..b750221 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": ["node"] + }, + "include": ["src/**/*.ts"], + "exclude": ["src/test.ts", "src/**/*.spec.ts"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..9c996dd --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "module": "esnext", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "typeRoots": ["node_modules/@types"], + "lib": ["es2018", "dom"], + "paths": {} + }, + "angularCompilerOptions": { + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true + } +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 0000000..430cf75 --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": ["jasmine", "node"] + }, + "files": ["src/test.ts", "src/polyfills.ts"], + "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] +} diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..58907a7 --- /dev/null +++ b/tslint.json @@ -0,0 +1,92 @@ +{ + "extends": "tslint:recommended", + "rules": { + "array-type": false, + "arrow-parens": false, + "deprecation": { + "severity": "warning" + }, + "component-class-suffix": true, + "contextual-lifecycle": true, + "directive-class-suffix": true, + "directive-selector": [ + true, + "attribute", + "apm", + "camelCase" + ], + "component-selector": [ + true, + "element", + "apm", + "kebab-case" + ], + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "interface-name": false, + "max-classes-per-file": false, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-consecutive-blank-lines": false, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-empty": false, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-switch-case-fall-through": true, + "no-use-before-declare": true, + "no-var-requires": false, + "object-literal-key-quotes": [ + true, + "as-needed" + ], + "object-literal-sort-keys": false, + "ordered-imports": false, + "quotemark": [ + true, + "single" + ], + "trailing-comma": false, + "no-conflicting-lifecycle": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-inputs-metadata-property": true, + "no-output-native": true, + "no-output-on-prefix": true, + "no-output-rename": true, + "no-outputs-metadata-property": true, + "template-banana-in-box": true, + "template-no-negated-async": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true + }, + "rulesDirectory": [ + "codelyzer" + ] +} \ No newline at end of file