[
  {
    "path": ".commitlintrc",
    "content": "{\n  \"extends\": [\"@commitlint/config-conventional\"]\n}\n"
  },
  {
    "path": ".czrc",
    "content": "{\n  \"path\": \"./node_modules/cz-conventional-changelog\"\n}\n"
  },
  {
    "path": ".editorconfig",
    "content": "# Editor configuration, see https://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 2\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n[*.md]\nmax_line_length = off\ntrim_trailing_whitespace = false\n"
  },
  {
    "path": ".gitignore",
    "content": "# See http://help.github.com/ignore-files/ for more about ignoring files.\n\n# compiled output\n/dist\n/demo\n/tmp\n/out-tsc\n# Only exists if Bazel was run\n/bazel-out\n\n# dependencies\n/node_modules\n\n# profiling files\nchrome-profiler-events*.json\nspeed-measure-plugin*.json\n\n# IDEs and editors\n/.idea\n.project\n.classpath\n.c9/\n*.launch\n.settings/\n*.sublime-workspace\n\n# IDE - VSCode\n.vscode/*\n!.vscode/settings.json\n!.vscode/tasks.json\n!.vscode/launch.json\n!.vscode/extensions.json\n.history/*\n\n# misc\n/.sass-cache\n/connect.lock\n/coverage\n/libpeerconnection.log\nnpm-debug.log\nyarn-error.log\ntestem.log\n/typings\n\n# System Files\n.DS_Store\nThumbs.db\n\n# Build files\n/projects/ng-snotify/package-lock.json\n/docs/_book\n/docs/node_modules\n\n# Tests\nChrome_*\nHeadlessChrome_*\n"
  },
  {
    "path": ".huskyrc",
    "content": "{\n  \"hooks\": {\n    \"pre-commit\": \"npm run precommit\",\n    \"commit-msg\": \"commitlint -E HUSKY_GIT_PARAMS\"\n  }\n}\n"
  },
  {
    "path": ".lintstagedrc",
    "content": "{\n  \"./**/*.{ts,js,scss,html,json,*rc}\": [\"npm run prettier:write\", \"git add\"]\n}\n"
  },
  {
    "path": ".npmignore",
    "content": "# Node\nnode_modules/*\nnpm-debug.log\n/demo\n# DO NOT IGNORE TYPESCRIPT FILES FOR NPM\n# TypeScript\n# *.js\n# *.map\n# *.d.ts\n\n# JetBrains\n.idea\n.project\n.settings\n*.iml\n\n# VS Code\n.vscode/*\n\n# Windows\nThumbs.db\nDesktop.ini\n\n# Mac\n.DS_Store\n**/.DS_Store\n\n# Ngc generated files\n**/*.ngfactory.ts\n\n# Library files\nprojects/*\npackage-lock.json\n"
  },
  {
    "path": ".prettierignore",
    "content": "# compiled output\n/dist\n/docs\n/demo\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"printWidth\": 120,\n  \"tabWidth\": 2,\n  \"useTabs\": false,\n  \"semi\": true,\n  \"singleQuote\": true,\n  \"quoteProps\": \"as-needed\",\n  \"trailingComma\": \"none\",\n  \"bracketSpacing\": true,\n  \"arrowParens\": \"avoid\",\n  \"htmlWhitespaceSensitivity\": \"css\",\n  \"proseWrap\": \"preserve\",\n  \"endOfLine\": \"lf\",\n  \"overrides\": [\n    {\n      \"files\": \"*.scss\",\n      \"options\": {\n        \"singleQuote\": false\n      }\n    },\n    {\n      \"files\": \"*.json\",\n      \"options\": {\n        \"singleQuote\": false\n      }\n    },\n    {\n      \"files\": \".*rc\",\n      \"options\": {\n        \"singleQuote\": false,\n        \"parser\": \"json\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": ".stylelintrc",
    "content": "{\n  \"extends\": \"stylelint-config-recommended\"\n}\n"
  },
  {
    "path": ".travis.yml",
    "content": "dist: bionic\nlanguage: node_js\nnode_js:\n  - '10'\n  - '12'\n  - '13'\n\nos:\n  - linux\n\nservices:\n  - xvfb\n\ninstall:\n  - npm install --no-progress\n\nscript:\n  - npm run prettier:check\n  - npm run lint\n  - npm run test:ci\n  - npm run lib:build:prod\n  - npm run example:build:prod\n  - npm run compodoc:build\n"
  },
  {
    "path": ".yo-rc.json",
    "content": "{\n  \"generator-angular2-library\": {\n    \"promptValues\": {\n      \"gitRepositoryUrl\": \"https://artemsky.github.io/ng-snotify\"\n    }\n  }\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "## Change Log\n\n\n### v9.0.2\n- fix position in toast config\n\n### v9.0.1\n\n### v9.0.0\n\n- add Angular 9.x support\n- fix sass files\n- bump package name to match angular version\n\n### v8.0.3\n\n### v8.0.2\n\n### v8.0.1\n\n### v8.0.0\n\n- add Angular 8.x support\n- bump package name to match angular version\n\n### v7.0.0\n\n- add Angular 7.x support\n- bump package name to match angular version\n\n### v6.0.0\n\n- add Angular 6.1 support\n- bump package name to match angular version\n\n### v4.3.0\n\n- add Angular 6 support thx [MatissJanis](https://github.com/artemsky/ng-snotify/pull/43)\n- add input `autofocus` to prompt toast\n- add wai-aria attrs [#36](https://github.com/artemsky/ng-snotify/issues/36)\n- add fix backdrop [#41](https://github.com/artemsky/ng-snotify/issues/41)\n\n### v4.2.0\n\n- add Angular 5 support\n\n### v4.1.0\n\n- escape SVG icons bug with Safari, Firefox\n- add [iconClass](https://artemsky.github.io/ng-snotify/documentation/api/options.html#iconclass)\n\n### v4.0.2\n\n- fix toast reposition if position changed in async method\n- bump dependencies\n\n### v4.0.1\n\n- fix css icons width & height\n- update doc\n\n### v4.0.0\n\n- **Breaking changes -** [Look migration guide](https://artemsky.github.io/ng-snotify/documentation/essentials/upgrade.html)\n- **Features**\n  - [New Documentation](https://artemsky.github.io/ng-snotify/documentation) based on gitbook\n  - Prompt input [validation](https://artemsky.github.io/ng-snotify/documentation/essentials/examples.html#prompt--validation)\n  - New [callbacks](https://artemsky.github.io/ng-snotify/documentation/api/callbacks.html) with jQuery-like syntax\n  - Reworked toast arguments ordering based on - see [function signatures](https://artemsky.github.io/ng-snotify/documentation/api/snotify.html)\n  - Replaced all animations and icons to styles (now it more customizable up to you)\n  - Add toast [default configuration](https://artemsky.github.io/ng-snotify/documentation/api/options.html)\n  - Reworked toast `timeout` interval - now based on `requestAnimationFrame`\n  - Now 1kb lighter :)\n\n### v3.0.1\n\n- fix invisible backdrop blinking\n\n### v3.0.0\n\n- Removed style encapsulation. Now you can style component directly in your global styles.scss(css) without using `/deep/` directive.\n- Added 3 themes. Now styles are outside of the component. You should read [migration guide](documentation/v2-to-v3-migration-guide.md)\n- Added the ability to simultaneously display toasts in different positions of the screen\n- Added `maxAtPosition` option, so you can control max toast count at the position\n- update angular 4.3.4 -> 4.3.6 (and other dev dependencies)\n\n### v2.2.0\n\n- thx [ganeshkantu](https://github.com/artemsky/ng-snotify/issues/19), now you can pass HTML into toasts within config object, or use new _html_ toast type\n- update angular 4.3.0 -> 4.3.4 (and other dev dependencies)\n\n### v2.1.0\n\n- optimize components rerender\n- update angular 4.3.0 -> 4.3.1 (and other dev dependencies)\n\n### v2.0.3\n\n- fix horizontal center backdrop thx [ktriek](https://github.com/artemsky/ng-snotify/pull/18)\n- update angular 4.2.6 -> 4.3.0 (and other dev dependencies)\n\n### v2.0.0\n\n- **Breaking changes -** [Look migration guide](https://github.com/artemsky/ng-snotify/tree/master/documentation/v1-to-v2-migration-guide.md)\n- **Features**\n  - Now unlimited amount of buttons.\n  - New [callback](https://github.com/artemsky/ng-snotify/tree/master/documentation/v2/api.md#callbacks) `onInput` for **prompt** toast\n  - reduce start code amount\n  - add custom [animations](https://github.com/artemsky/ng-snotify/tree/master/documentation/v2/animations.md)\n- **Fixes**\n  - rewrite components. Now more optimized. Divided into separate components.\n  - Optimized for AOT build in right way.\n  - rewrite [documentation](https://github.com/artemsky/ng-snotify/tree/master/documentation)\n  - add few test in example app\n  - update dependencies\n    - Auto-documentation add - Interfaces (thx @compodoc/compodoc)\n    - Auto-documentation add - Default values (thx @compodoc/compodoc)\n\n### v1.4.0\n\n- add backdrop ([#15](https://github.com/artemsky/ng-snotify/issues/15))\n- fix @compodoc/compodoc inteface generator - [source 1](https://github.com/compodoc/compodoc/issues/198)\n  [source 2](https://github.com/jvandemo/generator-angular2-library/issues/112)\n\n### v1.3.0\n\n- add **Custom Styling** - [Read more](https://github.com/artemsky/ng-snotify/wiki/Custom-Styling)\n- fix max-height collapsing closeOnClick\n\n### v1.2.0\n\n- add custom icons [Wiki](https://github.com/artemsky/ng-snotify/wiki/API#custom-icon)  \n  You can see an example of custom icon by calling _Simple toast_ in the example app\n\n### v1.1.7\n\n- fix **AOT** compilation ([#13](https://github.com/artemsky/ng-snotify/issues/13))\n\n### v1.1.6\n\n- Add callback text when **No** button pressed (Prompt)\n- Improve documentation\n- Create wiki\n\n### v1.1.4\n\n- remove min-height ([#11](https://github.com/artemsky/ng-snotify/issues/11))\n- fix max-height animation\n- change 2-branches developing (develop\\master) onto 1 branch (master)\n- Upgrade example app **angular cli** 1.0.2 -> 1.1.0\n- Upgrade **yeomen generator-angular2-library** 10.0.0 -> 10.2.2\n\n### v1.1.3\n\n- fix TruncatePipe error ([#9](https://github.com/artemsky/ng-snotify/issues/9))\n- fix box-sizing\n\n### v1.1.2\n\n- fix async toast ([#8](https://github.com/artemsky/ng-snotify/issues/8))\n- add `truncate` pipe\n- add toast `titleMaxLeght` and `bodyMaxLeght` to `SnotifyToastConfig`\n- add toast `maxHeight` to `SnotifyOptions` ([#7](https://github.com/artemsky/ng-snotify/issues/7))\n- add body to **prompt** type and replace input preview text wih new option `placeholder` of `SnotifyToastConfig` type\n\n### v1.0.0\n\n- First release\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nContributions are **welcome** and will be fully **credited**.\n\nWe accept contributions via Pull Requests on [Github](https://github.com/artemsky/ng-snotify).\n\n\n## Pull Requests\n\n- **Keep the same style** - make sure tslint passing\n\n- **Add tests!** - Your patch won't be accepted if it doesn't have tests.\n\n- **Document any change in behaviour** - Make sure the `README.md` and any other relevant documentation are kept up-to-date.\n\n- **Consider our release cycle** - We try to follow [SemVer v2.0.0](http://semver.org/). Randomly breaking public APIs is not an option.\n\n- **Create feature branches** - Don't ask us to pull from your master branch.\n\n- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests.\n\n- **Send coherent history** - Make sure your commits message means something\n\n\n## Running Demo App\n\n``` bash\n$ npm run start\n```\n\n\n**Happy coding**!\n"
  },
  {
    "path": "LICENSE.md",
    "content": "The MIT License\n\nCopyright (c) 2010-2017 Artem Kuznetsov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# ng-snotify\n\n[![Build Status](https://travis-ci.org/artemsky/ng-snotify.svg?branch=master)](https://travis-ci.org/artemsky/ng-snotify)\n[![NPM Version](https://img.shields.io/npm/v/ng-snotify.svg)](https://www.npmjs.com/package/ng-snotify)\n[![NPM Downloads](https://img.shields.io/npm/dt/ng-snotify.svg)](https://www.npmjs.com/package/ng-snotify)\n[![Dev dependencies status list](https://david-dm.org/artemsky/ng-snotify/dev-status.svg)](https://david-dm.org/artemsky/ng-snotify?type=dev)\n\n## Example\nhttps://artemsky.github.io/ng-snotify/\n\n\n## Features\n\n- 9 types of toast notifications (async, confirm, prompt and more...)\n- Ability to create toasts in different positions at the same time\n- Many config options (icons, backdrop, timeout, position and much more)\n- Custom fully controlled styling including animations\n- Repository includes 3 different styles. So you can use on of them, or create your own.\n- Callbacks\n- Custom HTML\n- 4.3KB minified and gzipped\n\n###### Looking for an Vue.js 2 version? [Here](https://github.com/artemsky/vue-snotify/)\n\n![Snotify Gif](https://thumbs.gfycat.com/SoftGranularDalmatian-size_restricted.gif)\n\n## Installation\n\n###### NPM 5\n`npm install ng-snotify`\n\n###### yarn\n`yarn add ng-snotify`\n\n## Documentation and Examples\n\nDocumentation - [here](https://artemsky.github.io/ng-snotify/documentation)  \nExample application source - [here](https://github.com/artemsky/ng-snotify/tree/master/example/app)  \nAuto-Documentation (Compodoc) - [here](https://artemsky.github.io/ng-snotify/compodoc/)  \nChange Log - [here](https://github.com/artemsky/ng-snotify/blob/master/CHANGELOG.md)\n\n## License\n\nMIT © [artemsky](mailto:mr.artemsky@gmail.com)\n"
  },
  {
    "path": "angular.json",
    "content": "{\n  \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n  \"version\": 1,\n  \"newProjectRoot\": \"projects\",\n  \"projects\": {\n    \"ng-snotify-example\": {\n      \"projectType\": \"application\",\n      \"schematics\": {\n        \"@schematics/angular:component\": {\n          \"style\": \"scss\"\n        }\n      },\n      \"root\": \"\",\n      \"sourceRoot\": \"src\",\n      \"prefix\": \"app\",\n      \"architect\": {\n        \"build\": {\n          \"builder\": \"@angular-devkit/build-angular:browser\",\n          \"options\": {\n            \"outputPath\": \"dist/ng-snotify-example\",\n            \"index\": \"src/index.html\",\n            \"main\": \"src/main.ts\",\n            \"polyfills\": \"src/polyfills.ts\",\n            \"tsConfig\": \"tsconfig.app.json\",\n            \"aot\": true,\n            \"assets\": [\"src/favicon.ico\", \"src/assets\"],\n            \"styles\": [\"node_modules/bootstrap/dist/css/bootstrap.min.css\", \"src/styles.scss\"],\n            \"scripts\": []\n          },\n          \"configurations\": {\n            \"production\": {\n              \"fileReplacements\": [\n                {\n                  \"replace\": \"src/environments/environment.ts\",\n                  \"with\": \"src/environments/environment.prod.ts\"\n                }\n              ],\n              \"optimization\": true,\n              \"outputHashing\": \"all\",\n              \"sourceMap\": false,\n              \"extractCss\": true,\n              \"namedChunks\": false,\n              \"extractLicenses\": true,\n              \"vendorChunk\": false,\n              \"buildOptimizer\": true,\n              \"budgets\": [\n                {\n                  \"type\": \"initial\",\n                  \"maximumWarning\": \"2mb\",\n                  \"maximumError\": \"5mb\"\n                },\n                {\n                  \"type\": \"anyComponentStyle\",\n                  \"maximumWarning\": \"6kb\",\n                  \"maximumError\": \"10kb\"\n                }\n              ]\n            }\n          }\n        },\n        \"serve\": {\n          \"builder\": \"@angular-devkit/build-angular:dev-server\",\n          \"options\": {\n            \"browserTarget\": \"ng-snotify-example:build\"\n          },\n          \"configurations\": {\n            \"production\": {\n              \"browserTarget\": \"ng-snotify-example:build:production\"\n            }\n          }\n        },\n        \"extract-i18n\": {\n          \"builder\": \"@angular-devkit/build-angular:extract-i18n\",\n          \"options\": {\n            \"browserTarget\": \"ng-snotify-example:build\"\n          }\n        },\n        \"test\": {\n          \"builder\": \"@angular-devkit/build-angular:karma\",\n          \"options\": {\n            \"main\": \"src/test.ts\",\n            \"polyfills\": \"src/polyfills.ts\",\n            \"tsConfig\": \"tsconfig.spec.json\",\n            \"karmaConfig\": \"karma.conf.js\",\n            \"assets\": [\"src/favicon.ico\", \"src/assets\"],\n            \"styles\": [\"node_modules/bootstrap/dist/css/bootstrap.min.css\", \"src/styles.scss\"],\n            \"scripts\": []\n          },\n          \"configurations\": {\n            \"ci\": {\n              \"watch\": false,\n              \"progress\": false,\n              \"browsers\": \"ChromeHeadlessCI\"\n            }\n          }\n        },\n        \"lint\": {\n          \"builder\": \"@angular-devkit/build-angular:tslint\",\n          \"options\": {\n            \"tsConfig\": [\"tsconfig.app.json\", \"tsconfig.spec.json\", \"e2e/tsconfig.json\"],\n            \"exclude\": [\"**/node_modules/**\"]\n          }\n        },\n        \"e2e\": {\n          \"builder\": \"@angular-devkit/build-angular:protractor\",\n          \"options\": {\n            \"protractorConfig\": \"e2e/protractor.conf.js\",\n            \"devServerTarget\": \"ng-snotify-example:serve\"\n          },\n          \"configurations\": {\n            \"production\": {\n              \"devServerTarget\": \"ng-snotify-example:serve:production\"\n            },\n            \"ci\": {\n              \"devServerTarget\": \"ng-snotify-example:serve:production\",\n              \"protractorConfig\": \"e2e/protractor-ci.conf.js\"\n            }\n          }\n        }\n      }\n    },\n    \"ng-snotify\": {\n      \"projectType\": \"library\",\n      \"root\": \"projects/ng-snotify\",\n      \"sourceRoot\": \"projects/ng-snotify/src\",\n      \"prefix\": \"\",\n      \"architect\": {\n        \"build\": {\n          \"builder\": \"@angular-devkit/build-ng-packagr:build\",\n          \"options\": {\n            \"tsConfig\": \"projects/ng-snotify/tsconfig.lib.json\",\n            \"project\": \"projects/ng-snotify/ng-package.json\"\n          },\n          \"configurations\": {\n            \"production\": {\n              \"tsConfig\": \"projects/ng-snotify/tsconfig.lib.prod.json\"\n            }\n          }\n        },\n        \"test\": {\n          \"builder\": \"@angular-devkit/build-angular:karma\",\n          \"options\": {\n            \"main\": \"projects/ng-snotify/src/test.ts\",\n            \"tsConfig\": \"projects/ng-snotify/tsconfig.spec.json\",\n            \"karmaConfig\": \"projects/ng-snotify/karma.conf.js\"\n          },\n          \"configurations\": {\n            \"ci\": {\n              \"watch\": false,\n              \"progress\": false,\n              \"browsers\": \"ChromeHeadlessCI\"\n            }\n          }\n        },\n        \"lint\": {\n          \"builder\": \"@angular-devkit/build-angular:tslint\",\n          \"options\": {\n            \"tsConfig\": [\"projects/ng-snotify/tsconfig.lib.json\", \"projects/ng-snotify/tsconfig.spec.json\"],\n            \"exclude\": [\"**/node_modules/**\"]\n          }\n        }\n      }\n    }\n  },\n  \"defaultProject\": \"ng-snotify-example\",\n  \"cli\": {\n    \"analytics\": false\n  }\n}\n"
  },
  {
    "path": "browserslist",
    "content": "# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.\n# For additional information regarding the format and rule options, please see:\n# https://github.com/browserslist/browserslist#queries\n\n# You can see what browsers were selected by your queries by running:\n#   npx browserslist\n\n> 0.5%\nlast 2 versions\nFirefox ESR\nnot dead\nnot IE 9-11 # For IE 9-11 support, remove 'not'."
  },
  {
    "path": "docs/README.md",
    "content": "{% include \"./SUMMARY.md\" %}\n"
  },
  {
    "path": "docs/SUMMARY.md",
    "content": "# ng-snotify\n\n## Overview\n* [Installation](installation.md)\n* Basics\n  * [Getting Started](essentials/getting-started.md)\n  * [Basic Examples](essentials/examples.md)\n* API\n  * [Snotify](api/snotify.md)\n    * [simple](api/snotify.md#simple)\n    * [success](api/snotify.md#success)\n    * [info](api/snotify.md#info)\n    * [warning](api/snotify.md#warning)\n    * [error](api/snotify.md#error)\n    * [async](api/snotify.md#async)\n    * [confirm](api/snotify.md#confirm)\n    * [prompt](api/snotify.md#prompt)\n    * [setDefaults](api/snotify.md#setdefaults)\n    * [get](api/snotify.md#get)\n    * [remove](api/snotify.md#remove)\n    * [clear](api/snotify.md#clear)\n    * [create](api/snotify.md#create)\n  * [Callbacks](api/callbacks.md)\n  * [Options](api/options.md)\n    * [SnotifyToastConfig](api/options.md#snotifytoastconfig)\n      * [id](api/options.md#id)\n      * [timeout](api/options.md#timeout)\n      * [showProgressBar](api/options.md#showprogressbar)\n      * [type](api/options.md#type)\n      * [closeOnClick](api/options.md#closeonclick)\n      * [pauseOnHover](api/options.md#pauseonhover)\n      * [buttons](api/options.md#buttons)\n      * [placeholder](api/options.md#placeholder)\n      * [titleMaxLength](api/options.md#titlemaxlength)\n      * [bodyMaxLength](api/options.md#bodymaxlength)\n      * [icon](api/options.md#icon)\n      * [iconClass](api/options.md#iconclass)\n      * [backdrop](api/options.md#backdrop)\n      * [animation](api/options.md#animation)\n      * [html](api/options.md#html)\n      * [position](api/options.md#position)\n    * [SnotifyGlobalConfig](api/options.md#snotifyglobalconfig)\n    * [ToastDefaults](api/options.md#setting-default-configuration)\n  * [Interfaces](api/interfaces.md)\n    * [Snotify](api/interfaces.md#snotify)\n    * [SnotifyButton](api/interfaces.md#snotifybutton)\n    * [SnotifyAnimate](api/interfaces.md#snotifyanimate)\n    * [SnotifyDefaults](api/interfaces.md#snotifydefaults)\n    * [SnotifyStyles](api/interfaces.md#snotifystyles)\n  * [Enumerators](api/enums.md)\n    * [SnotifyStyle](api/enums.md#snotifystyle)\n    * [SnotifyPosition](api/enums.md#snotifyposition)\n  * [Types](api/types.md)\n    * [SnotifyTypeType](api/types.md#snotifytype)\n    * [SnotifyEvent](api/types.md#snotifyevent)\n  * [SnotifyToast](api/model.md)\n    * [on](api/model.md#on)\n    * [value](api/model.md#value)\n    * [valid](api/model.md#valid)\n    * [id](api/model.md#config)\n    * [title](api/model.md#title)\n    * [body](api/model.md#body)\n    * [config](api/model.md#config)\n* Advanced\n  * [Animations](essentials/animations.md)\n  * [Styling](essentials/styling.md)\n  * [Development](essentials/development.md)\n* [Upgrading from v3](essentials/upgrade.md)\n"
  },
  {
    "path": "docs/api/callbacks.md",
    "content": "# Callbacks\n\n## toast.on( event, callback )\n\n> You can chain callbacks `on(e, func).on(e, func)...`\n\n### Callback\n\n- type: `Function`\n\n  Signature:\n\n  ```\n  (toast: Snotify) => void\n  ```\n  \n  > [Snotify](interfaces.md#snotify)\n  \n# Events\n\n - `\"mounted\"`\n - `\"beforeShow\"`\n - `\"shown\"`\n - `\"input\"`\n - `\"click\"`\n - `\"mouseenter\"`\n - `\"mouseleave\"`\n - `\"beforeHide\"`\n - `\"hidden\"`\n - `\"destroyed\"`\n \n > Events type - [SnotifyEvent](types.md#snotifyevent) \n \n  ```js\n    toast.on( \"click\", (toast: Snotify) => {\n      toast.body = \"Change body...\";\n    } )\n  ```\n"
  },
  {
    "path": "docs/api/enums.md",
    "content": "# Enumerators\n\n> Each enum can be imported from `ng-snotify` \n\n\n### SnotifyPosition\n\n  - leftTop:`\"leftTop\"`\n  - leftCenter:`\"leftCenter\"`\n  - leftBottom:`\"leftBottom\"`\n  - rightTop:`\"rightTop\"`\n  - rightCenter:`\"rightCenter\"`\n  - rightBottom:`\"rightBottom\"`\n  - centerTop:`\"centerTop\"`\n  - centerCenter:`\"centerCenter\"`\n  - centerBottom:`\"centerBottom\"`\n\n### SnotifyStyle\n\n  - simple:`\"simple\"`\n  - success:`\"success\"`\n  - error:`\"error\"`\n  - warning:`\"warning\"`\n  - info:`\"info\"`\n  - async:`\"async\"`\n  - confirm:`\"confirm\"`\n  - prompt:`\"prompt\"`\n  \n  \n###### Example\n  ```typescript\n  import {SnotifyPosition, SnotifyStyle} from 'ng-snotify';\n\n  snotifyService.create({\n    title: 'Example title',\n    body: null,\n    config: {\n      position: SnotifyPosition.rightTop,\n      type: SnotifyStyle.info,\n    }\n  })\n  ```\n"
  },
  {
    "path": "docs/api/interfaces.md",
    "content": "# Interfaces\n\n\n### Snotify\n\n### title\n- type: `string`  \n> Toast title\n\n### body\n- type: `string`  \n> Toast content\n\n### config\n- type: [SnotifyToastConfig](options.md/#snotifytoastconfig)  \n> Toast configuration object\n\n### html\n- type: `string` | [SafeHtml](https://angular.io/api/platform-browser/SafeHtml)  \n> Toast html content inside `.snotifyToast__inner`\n\n\n## SnotifyButton\n\n### text\n- type: `string`   \n> Button text\n\n### action\n- type: `function` \n  \n  Signature:\n  \n    ```\n    (\n      toast: SnotifyToast\n    ) => void\n    ```\n   \n> Callback action which will be called on button click.  \n> Receive [SnotifyToast](model.md#snotifytoast)\n\n### bold\n- type: `boolean`  \n> Should button text be bold or not\n\n\n### SnotifyAnimate\n\n### enter\n- type: `string`  \n> In animation name\n\n### exit\n- type: `string`  \n> Out animation name\n\n### time\n- type: `number`   \n> Animation time in ms\n\n\n### SnotifyDefaults\n\n### global\n- type: [SnotifyGlobalConfig](options.md#snotifyglobalconfig)\n> Notifications dock config\n\n### toast\n- type: [SnotifyToastConfig](options.md/#snotifytoastconfig)\n> Toast config\n\n### type\n- type: `{ [key: SnotifyTypeType]: SnotifyToastConfig }`\n> Toast type default config  \n> Example can be found in [options](options.md#setting-default-configuration) defaults\n\n\n### SnotifyStyles\n> Append snotify-${name} class name to snotify element\n\n### simple\n- type: [SnotifyTypeType](types.md#snotifytype)\n\n### success\n- type: [SnotifyTypeType](types.md#snotifytype)\n\n### error\n- type: [SnotifyTypeType](types.md#snotifytype)\n\n### warning\n- type: [SnotifyTypeType](types.md#snotifytype)\n\n### info\n- type: [SnotifyTypeType](types.md#snotifytype)\n\n### async\n- type: [SnotifyTypeType](types.md#snotifytype)\n\n### confirm\n- type: [SnotifyTypeType](types.md#snotifytype)\n\n### prompt\n- type: [SnotifyTypeType](types.md#snotifytype)\n\n\n"
  },
  {
    "path": "docs/api/model.md",
    "content": "# Toast Model\n\n## SnotifyToast\n\n### on\n\n- type: `Function`\n\nSignature:\n  \n    ```\n    (\n     event: SnotifyEvent,\n      action: (toast: this) => void\n    ) => this\n    ```\n> Subscribing to toast events.  \n> Unsubscribing automatically when toast destroyed\n\n\n### value\n\n- type: `string` *readonly*\n- default: `''`\n> It is defined only if toast type === `prompt`. Another case it stays `undefined`\n\n\n### valid\n\n- type: `boolean`\n- default: `undefined`\n> Finds out if toast is valid or not.  \n> Helper class to support `prompt` input validation.  \n> Apply `snotifyToast--valid` or `snotifyToast--invalid` class names\n\n\n### id\n\n- type: `number`\n- default: `<Automatically generated value>`\n> SnotifyService automatically generates this uuid\n\n\n### title\n\n- type: `string`\n- default: `null`\n> Toast title\n\n\n### body\n\n- type: `string`\n- default: `null`\n> Body text content\n\n\n### config\n\n- type: [SnotifyToastConfig](options.md#snotifytoastconfig)\n- default: `<Automatically generated value>`\n> Merges [default config](options.md#setting-default-configuration) with toast type config\n"
  },
  {
    "path": "docs/api/options.md",
    "content": "# Configuration\n\n> `SnotifyToastConfig` - changes toasts configuration.  \n> `SnotifyGlobalConfig` - changes toast dock configuration.\n\n## Setting default configuration\n> Default configuration looks like this - [toastDefaults](https://github.com/artemsky/ng-snotify/blob/master/src/snotify/toastDefaults.ts)  \n> Of course you can use it like json, just omit imports, and replace `SnotifyStyle` & `SnotifyPosition` with string values.\n> Just be sure that you are follow [SnotifyDefaults](interfaces.md#snotifydefaults) interface.  \n> You should initialize `ng-snotify` with default configuration object.   \n> We provide it by custom object injection `{ provide: 'SnotifyToastConfig', useValue: ToastDefaults}` by default.\n\n###### Example\n```typescript\nimport {SnotifyModule, SnotifyService, ToastDefaults} from 'ng-snotify';\n@NgModule({\n  declarations: [\n    AppComponent\n  ],\n  imports: [\n    SnotifyModule\n  ],\n  providers: [\n    { provide: 'SnotifyToastConfig', useValue: ToastDefaults},\n    SnotifyService\n  ],\n  bootstrap: [AppComponent]\n})\nexport class AppModule { }\n\n```\n\n> If you want to change default config in runtime you can use [service.setDefaults()](snotify.md#setdefaults) method\n  \n## SnotifyToastConfig\n\n### timeout\n\n- type: `number`\n- default: `2000`\n  > Toast timeout in milliseconds. 0 - Disable timeout\n  \n### showProgressBar\n\n- type: `boolean`\n- default: `true`\n  > Enable/Disable progress bar. Disabled by default if timeout is 0.\n  \n### type\n\n- type: [SnotifyTypeType](types.md#snotifytype)\n  > Depends on toast type - success | async | error | etc...\n  > Actually it changes only toast class name\n  \n### closeOnClick\n\n- type: `boolean`\n- default: `true`\n  > Enable/Disable close action by clicking on toast\n  \n### pauseOnHover\n\n- type: `boolean`\n- default: `true`\n  > Enable/Disable pause on hover action\n  \n### buttons\n\n- type: [SnotifyButton[]](interfaces.md#snotifybutton)\n- default: \n  ```typescript\n    [\n      {text: 'Ok', action: null, bold: true},\n      {text: 'Cancel', action: null, bold: false},\n    ]\n  ```\n  > Buttons config for Confirmation & Prompt types\n  > You can pass, unlimited number of buttons. Just be sure you can handle it)\n  \n### placeholder\n\n- type: `string`\n- default: `\"Enter answer here...\"`\n  > Placeholder for Prompt toast\n  \n### titleMaxLength\n\n- type: `number`\n- default: `16`\n  > Toast title maximum length\n  \n### bodyMaxLength\n\n- type: `number`\n- default: `150`\n  > Toast body maximum length\n  \n### icon\n\n- type: `string`\n- default: `null`\n  > Custom icon url.\n  ```js\n    const icon = `https://placehold.it/48x100`;\n    vm.$snotify.simple('Example body', null, {\n      icon: icon\n    });\n  ```  \n  \n### iconClass\n\n- type: `string`\n- default: `null`\n  > Custom icon class.  \n  \n### backdrop\n\n- type: `number`\n- default: `-1`\n  > Backdrop opacity in range from `0.0` to `1.0`. \n  > Disabled `-1` \n  \n### animation\n\n- type: [SnotifyAnimate](interfaces.md#snotifyanimate)  \n- default: `{enter: 'fadeIn', exit: 'fadeOut', time: 400}`\n  ```\n > Animation configuration object. Time in milliseconds\n  \n### html\n\n- type: `string`\n- default: `null`\n  > Toast inner html. When set, overrides toast content.\n  \n### position\n\n- type: [SnotifyPosition](enums.md#snotifyposition)\n- default: `rightBottom`\n  > Toasts position on screen\n  \n  \n  \n## SnotifyGlobalConfig\n  \n### maxOnScreen\n\n- type: `number`\n- default: `8`\n  > Max toast items on screen.  \n  > For example you want to display 3 toasts max at the time. But for some purposes your system calls it 10 times.  \n  > With this option, 8 toast will be shown. And after each of it will disappear, new toast from the queue will be shown.\n\n\n### maxAtPosition\n\n- type: `number`\n- default: `8`\n  > Max toast items at position.    \n    Same as `maxOnScreen` but affects only current toast position block.\n\n  \n### newOnTop\n\n- type: `true`\n- default: `150`\n  > Should new items come from top or bottom side.   \n  > This option created for styling purposes.  \n  > For example, if your toast position is TOP-RIGHT. It's not very nice, when items comes from top and pulls down all other toasts\n    \n"
  },
  {
    "path": "docs/api/snotify.md",
    "content": "# SnotifyService\n\n> All methods return toast [SnotifyToast](model.md#snotifytoast)\n> Toast methods creates notifications with different class names `.snotify-${METHOD_NAME}`  \n> You can style them as you want.\n> Look more in [advanced section].\n\n## Core\n\n### simple\n\n- type: `Function`\n\n  Signature:\n\n  ```\n  (body: string): SnotifyToast\n  (body: string, config: SnotifyToastConfig): SnotifyToast\n  (body: string, title: string): SnotifyToast\n  (body: string, title: string, config: SnotifyToastConfig): SnotifyToast\n  ```\n  \n### success\n\n- type: `Function`\n\n  Signature:\n\n  ```\n  (body: string): SnotifyToast\n  (body: string, config: SnotifyToastConfig): SnotifyToast\n  (body: string, title: string): SnotifyToast\n  (body: string, title: string, config: SnotifyToastConfig): SnotifyToast\n  ``` \n  \n### info\n\n- type: `Function`\n\n  Signature:\n\n  ```\n  (body: string): SnotifyToast\n  (body: string, config: SnotifyToastConfig): SnotifyToast\n  (body: string, title: string): SnotifyToast\n  (body: string, title: string, config: SnotifyToastConfig): SnotifyToast\n  ```\n  \n### warning\n\n- type: `Function`\n\n  Signature:\n\n  ```\n  (body: string): SnotifyToast\n  (body: string, config: SnotifyToastConfig): SnotifyToast\n  (body: string, title: string): SnotifyToast\n  (body: string, title: string, config: SnotifyToastConfig): SnotifyToast\n  ```  \n  \n### error\n\n- type: `Function`\n\n  Signature:\n\n  ```\n  (body: string): SnotifyToast\n  (body: string, config: SnotifyToastConfig): SnotifyToast\n  (body: string, title: string): SnotifyToast\n  (body: string, title: string, config: SnotifyToastConfig): SnotifyToast\n  ```\n\n### confirm\n\n- type: `Function`\n\n  Signature:\n\n  ```\n  (body: string): SnotifyToast\n  (body: string, config: SnotifyToastConfig): SnotifyToast\n  (body: string, title: string): SnotifyToast\n  (body: string, title: string, config: SnotifyToastConfig): SnotifyToast\n  ```\n  > Toast notification with buttons  \n  > Example - [here](../essentials/examples.md#confirm) \n   \n### prompt\n\n- type: `Function`\n\n  Signature:\n\n  ```\n  (body: string): SnotifyToast\n  (body: string, config: SnotifyToastConfig): SnotifyToast\n  (body: string, title: string): SnotifyToast\n  (body: string, title: string, config: SnotifyToastConfig): SnotifyToast\n  ```\n  > Toast notification with buttons and input field\n  > Example - [here](../essentials/examples.md#prompt)   \n  \n  \n### async\n\n- type: `Function`\n\n  Signature:\n\n  ```\n  (body: string, action: Promise<Snotify> | Observable<Snotify>): SnotifyToast\n  (body: string, title: string, action: Promise<Snotify> | Observable<Snotify>): SnotifyToast\n  (body: string, action: Promise<Snotify> | Observable<Snotify>, config: SnotifyToastConfig): SnotifyToast\n  (body: string, title: string, action: Promise<Snotify> | Observable<Snotify>, config: SnotifyToastConfig): SnotifyToast\n  ```\n  > Toast notification of style - *info* and loading spinner. It changes style depending on complete or error `Observable`.  \n  > Example - [here](../essentials/examples.md#async)  \n  \n\n\n### html\n\n- type: `Function`\n\n  Signature:\n\n  ```\n   html(html: string | SafeHtml, config?: SnotifyToastConfig): SnotifyToast\n  ```\n  > Toast notification of custom style(default - Simple). \n  > Renders your html string inside `.snotifyToast__inner`\n  > Example - [here](../essentials/examples.md#html)\n\n## Other\n\n### setDefaults\n\n- type: `Function`\n\n  Signature:\n\n  ```\n  (\n    defaults: SnotifyDefaults\n  ) => SnotifyDefaults\n  ```\n  > Set global configuration object  \n  \n### get\n\n- type: `Function`\n\n  Signature:\n\n  ```\n  (\n    id: number\n  ) => SnotifyToast\n  ```\n  > [SnotifyToast](model.md#snotifytoast)\n  > Returns SnotifyToast object by id  \n    \n  \n### remove\n\n- type: `Function`\n\n  Signature:\n\n  ```\n  (\n    id?: number,\n    remove?: boolean\n  ) => void\n  ```\n  > If id passed, removes toast instantly. \n  > If no param passed it's the same as [clear()](#clear).  \n  > If you want to remove toast instantly pass `true` as second argument\n  \n    \n  \n### clear\n\n- type: `Function`\n\n  Signature:\n\n  ```\n  () => void\n  ```\n  > Clear notifications array instantly\n      \n  \n### create\n\n- type: `Function`\n\n  Signature:\n\n  ```\n  (\n  snotify: Snotify\n  ) => SnotifyToast\n  ```\n  > [Snotify](interfaces.md#snotify)\n  > [SnotifyToast](model.md#snotifytoast)\n  > Creates custom notification object\n  \n"
  },
  {
    "path": "docs/api/types.md",
    "content": "# Types\n\n## SnotifyTypeType\n\n - definition\n```typescript\nSnotifyTypeType\n  = 'simple'\n  | 'success'\n  | 'error'\n  | 'warning'\n  | 'info'\n  | 'async'\n  | 'confirm'\n  | 'prompt';\n````\n\n## SnotifyEvent\n\n - definition\n```typescript\nSnotifyTypeType\n  = 'mounted'\n  | 'beforeShow'\n  | 'shown'\n  | 'input'\n  | 'click'\n  | 'mouseenter'\n  | 'mouseleave'\n  | 'beforeHide'\n  | 'hidden'\n  | 'destroyed';\n````\n"
  },
  {
    "path": "docs/book.json",
    "content": "{\n  \"title\": \"ng-snotify\",\n  \"gitbook\": \">3.0.0\",\n  \"plugins\": [\"edit-link\", \"theme-vuejs\", \"-fontsettings\", \"github\"],\n  \"pluginsConfig\": {\n    \"edit-link\": {\n      \"base\": \"https://github.com/artemsky/ng-snotify/tree/develop/documentation\",\n      \"label\": \"Edit This Page\"\n    },\n    \"github\": {\n      \"url\": \"https://github.com/artemsky/ng-snotify/\"\n    }\n  },\n  \"links\": {\n    \"sharing\": {\n      \"facebook\": false,\n      \"twitter\": false\n    }\n  }\n}\n"
  },
  {
    "path": "docs/essentials/animations.md",
    "content": "# Animations\n\nYou are free to create or copy any css animations.\n\n### 1. Add you animation styles into your global styles\n\nIn this example i just copied one of **[animate.css](https://github.com/daneden/animate.css/tree/sass/source)** animations\n```scss\n.bounceInDown {\n  animation-name: bounceInDown;\n}\n\n\n@keyframes bounceInDown {\n  0%, 60%, 75%, 90%, 100% {\n    transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    transform: translate3d(0, -3000px, 0) scaleY(5);\n  }\n\n  60% {\n    opacity: 1;\n    transform: translate3d(0, 25px, 0) scaleY(.9);\n  }\n\n  75% {\n    transform: translate3d(0, -10px, 0) scaleY(.95);\n  }\n\n  90% {\n    transform: translate3d(0, 5px, 0) scaleY(.985);\n  }\n\n  100% {\n    opacity: 1;\n    transform: none;\n  }\n}\n```\n\n\n### 2. Now i would call my notification like that\n\n```javascript\nvm.$snotify.success(this.body, this.title, {\n  animation: {\n    enter: 'bounceInDown',\n    exit: 'bounceInDown',\n    time: 1000\n  }\n});\n```\n"
  },
  {
    "path": "docs/essentials/development.md",
    "content": "# Development\n\n###### This is the fast guide how to run development\n\n- Run example app `npm start`\n- open `localhost:8080` in your browser\n- go to `./src`\n- Start developing!\n\nIn the end you should re-link lib to the `dist` folder, and test\n\n- `npm run example:build`\n- Be sure you pass `npm run lib:lint` and `npm test`\n- Make a pull request\n"
  },
  {
    "path": "docs/essentials/examples.md",
    "content": "# Examples\n\n### Toasts\n#### Simple, Success, Info, Warning, Error\n```typescript\nservice.success('Example body content');\nservice.success('Example body content', 'Example Title');\nservice.success('Example body content', {\n  timeout: 2000,\n  showProgressBar: false,\n  closeOnClick: false,\n  pauseOnHover: true\n});\nservice.success('Example body content', 'Example title', {\n  timeout: 2000,\n  showProgressBar: false,\n  closeOnClick: false,\n  pauseOnHover: true\n});\n```\n#### Async\n\n###### Success\nYou should pass Promise of type Snotify to change some data or do some other actions  \n```typescript\nconst successAction = Observable.create(observer => {\n      setTimeout(() => {\n        observer.next({\n          body: 'Still loading.....',\n        });\n      }, 2000);\n\n      setTimeout(() => {\n        observer.next({\n          title: 'Success',\n          body: 'Example. Data loaded!',\n          config: {\n            closeOnClick: true,\n            timeout: 5000,\n            showProgressBar: true\n          }\n        });\n        observer.complete();\n      }, 5000);\n    });\n\n this.snotifyService.async('This will resolve with success', successAction, config);\n```\n###### Error\n\n```typescript\nconst errorAction = Observable.create(observer => {\n  setTimeout(() => {\n    observer.error({\n      title: 'Error',\n      body: 'Example. Error 404. Service not found',\n    });\n  }, 2000);\n});\n\nservice.async('This will resolve with error', 'Async', errorAction);\n```\n\n#### Prompt & Validation\n```typescript\nconst yesAction = (toast: SnotifyToast) => {\n  if (!toast.value.match('snotify')) {\n    toast.valid = false;\n    return false;\n  } else {\n    toast.valid = true; // default value\n    service.remove(toast.id)\n  }\n}\n\nconst noAction = (toast: SnotifyToast) => {\n  service.remove(toast.id) // default\n}\n\nservice.prompt('Example body content', 'Example title', {\n  buttons: [\n    {text: 'Yes', action: yesAction, bold: true },\n    {text: 'No', action: noAction },\n  ],\n  placeholder: 'This is the example placeholder which you can pass'\n});\n```\n\n#### Confirm\n```typescript\nservice.confirm('Example body content', 'Example title', {\n  timeout: 5000,\n  showProgressBar: true,\n  closeOnClick: false,\n  pauseOnHover: true,\n  buttons: [\n    {text: 'Yes', action: () => console.log('Clicked: Yes'), bold: false},\n    {text: 'No', action: () => console.log('Clicked: No')},\n    {text: 'Later', action: (toast) => {console.log('Clicked: Later'); service.remove(toast.id); } },\n    {text: 'Close', action: (toast) => {console.log('Clicked: No'); service.remove(toast.id); }, bold: true},\n  ]\n});\n```\n\n#### Html\n\n```typescript\nservice.html(`<div class=\"snotifyToast__title\"><b>Html Bold Title</b></div>\n  <div class=\"snotifyToast__body\"><i>Html</i> <b>toast</b> <u>content</u></div> `, {\n  timeout: 5000,\n  showProgressBar: true,\n  closeOnClick: false,\n  pauseOnHover: true,\n});\n```\n\n### Callbacks\n\n```typescript\ntoast.on('mounted', (toast) => {\n  console.log('[CALLBACK]: mounted', toast)\n});\n\ntoast.on('input', (toast) => {\n  if (!toast.value.match('snotify')) {\n      toast.valid = false;\n      return false;\n    } else {\n      toast.valid = true; // default value\n      service.remove(toast.id)\n    }\n});\n```\n\n### Custom icon\nIcon viewport is set to 48x48 pixels.\n```javascript\nservice.simple('Example body content', 'Example title!', {\n  timeout: 2000,\n  showProgressBar: false,\n  closeOnClick: true,\n  icon: 'assets/custom-svg.svg'\n});\n```\n\nOf course you can pass an url, for example `http://placeholde.it/48x100` (this resource will generate us an image with 48x100 dimension).  \nAnd apply `object-fit` to `.snotify-icon` class in your styles\n\n```scss\n.snotify-icon {\n  object-fit: cover;\n  width: 100%;\n  height: 100%;\n  object-position: center;\n}\n```\n"
  },
  {
    "path": "docs/essentials/getting-started.md",
    "content": "# ng-snotify\n\n[![Build Status](https://travis-ci.org/artemsky/ng-snotify.svg?branch=master)](https://travis-ci.org/artemsky/ng-snotify)\n[![NPM Version](https://img.shields.io/npm/v/ng-snotify.svg)](https://www.npmjs.com/package/ng-snotify)\n[![NPM Downloads](https://img.shields.io/npm/dt/ng-snotify.svg)](https://www.npmjs.com/package/ng-snotify)\n[![Dev dependencies status list](https://david-dm.org/artemsky/ng-snotify/dev-status.svg)](https://david-dm.org/artemsky/ng-snotify?type=dev)\n\n## Example\nhttps://artemsky.github.io/ng-snotify/\n\n\n## Features\n\n- 9 types of toast notifications (async, confirm, prompt and more...)\n- Ability to create toasts in different positions at the same time\n- Many config options (icons, backdrop, timeout, position and much more)\n- Custom fully controlled styling including animations\n- Repository includes 3 different styles. So you can use on of them, or create your own.\n- Callbacks\n- Custom HTML\n- 4.3KB minified and gzipped\n\n###### Looking for an Vue.js 2 version? [Here](https://github.com/artemsky/vue-snotify/)\n\n![Snotify Gif](https://thumbs.gfycat.com/SoftGranularDalmatian-size_restricted.gif)\n\n## Installation\n\n###### NPM 5\n`npm install ng-snotify`\n\n###### yarn\n`yarn add ng-snotify`\n\n## Documentation and Examples\n\nDocumentation - [here](https://artemsky.github.io/ng-snotify/documentation)  \nExample application source - [here](https://github.com/artemsky/ng-snotify/tree/master/example/app)  \nAuto-Documentation (Compodoc) - [here](https://artemsky.github.io/ng-snotify/compodoc/)  \nChange Log - [here](https://github.com/artemsky/ng-snotify/blob/master/CHANGELOG.md)\n\n## License\n\nMIT © [artemsky](mailto:mr.artemsky@gmail.com)\n"
  },
  {
    "path": "docs/essentials/styling.md",
    "content": "# Styling\n\n> Note. I'am using `scss` syntax. And there is no default theme.\n\nYou should import one of this in your global style.scss like this `@import \"~ng-snotify/styles/material\";` or `@import \"~ng-snotify/styles/material.css\";` if you using css syntax.\n\n> if you using css syntax and angular-cli. Import styles directly in `.angular-cli.json`\n```json\n{\n  \"styles\": [\n          \"../node_modules/ng-snotify/styles/{STYLE_NAME}.css\",\n          \"styles.css\"\n  ]\n}\n```\n_________________\n\n**Snotify** offers you 3 themes.\n\n#### Material\n`@import \"~ng-snotify/styles/material\";`\n\n![Material Theme](https://artemsky.github.io/vue-snotify/static/material.png)\n\n#### Simple\n`@import \"~ng-snotify/styles/simple\";`\n\n![Simple Theme](https://artemsky.github.io/vue-snotify/static/simple.png)\n\n#### Dark\n`@import \"~ng-snotify/styles/dark\";`\n\n![Dark Theme](https://artemsky.github.io/vue-snotify/static/dark.png)\n\nIf you need something else you can easily create your own theme by duplicating one of this, and writing your own styles.\n\nTheme sources - [here](https://github.com/artemsky/ng-snotify/tree/master/src/styles)\n\n\n\n\n"
  },
  {
    "path": "docs/essentials/upgrade.md",
    "content": "# Upgrade guide\n\n### 1. Provide default configuration\n\n> Options totally reworked.  \n  Now you have [setDefaults](../api/options.md#setting-default-configuration) method to change toast dock configuration.\n\n```typescript\n// Import your library\nimport { SnotifyModule, SnotifyService, ToastDefaults } from 'ng-snotify';\n\n@NgModule({\n  imports: [\n    SnotifyModule\n  ],\n  providers: [\n    { provide: 'SnotifyToastConfig', useValue: ToastDefaults}, // Default configuration\n    SnotifyService\n  ]\n})\nexport class AppModule { }\n```\n\nNow you can play with this, and create `toast.json` configuration for example\n\n\n### 2. Callbacks totally removed from `SnotifyService`\n\nNow you have jQuery-like syntax on toast object\n\n```typescript\nservice.prompt('Accept license', {\n  placeholder: 'Enter your age',\n  buttons: [\n    {text: 'Accept', action: (toast) => { toast.valid ? service.remove(toast.id) : false }, bold: true},\n    {text: 'Cancel' }\n  ]\n}).on('input', (toast: Snotify) => {\n  if (+toast.value >= 21) {\n    toast.valid = true;\n  } else {\n    toast.valid = false;\n  }\n}).on('hidden', () => {\n  /* do some stuff */\n})\n```\n\n### 3. Custom arguments order\n\n> I worked on usability, and i hope this change should help with that.\n\nNow you can pass skip arguments if you don't want to pass them.\nIn that case we don't need to pass `null` in title order. We just skip it.\n\nUnfortunately for now I can not do the same for `body` and `title` because both parameters are typeof string and I can't determine what exactly you are going to pass\n\n###### Before\n```typescript\nservice.simple(body)\nservice.simple(body, null, config)\nservice.async(body, null, action, config)\nservice.async(null, null, action, config)\n```\n\n###### Now\n\n```typescript\nservice.simple(body)\nservice.simple(body, config)\nservice.async(body, action)\nservice.async(body, action, config)\n```\n\n### 4. Buttons\n\nNow button action get only one param of type [SnotifyToast](../api/model.md#snotifytoast) and by default removes toast\n\n```typescript\n action: (toast: SnotifyToast) => service.remove(toast.id)\n```\n\n\n### 5. REMOVED\n - `setConfig`\n - `maxHeight`\n \n \n## All another stuff should not touch you\n- Renamed\n  - SnotifyToastConfig -> SnotifyToastConfig\n  - SnotifyOptions -> SnotifyGlobalConfig\n\n"
  },
  {
    "path": "docs/installation.md",
    "content": "# Installation\n\n###### NPM 5\n`npm install ng-snotify`\n###### yarn\n`yarn add ng-snotify`\n\n\n#### Import Module\nImport SnotifyModule, also you can try SnotifyModule.forRoot() if you have build errors  \nAnd provide SnotifyService with default configuration object  \n> How to change ToastDefaults config - [options](api/snotify.md#setdefaults)  \n\n```typescript\n// Import your library\nimport { SnotifyModule, SnotifyService, ToastDefaults } from 'ng-snotify';\n\n@NgModule({\n  imports: [\n    BrowserModule,\n    SnotifyModule\n  ],\n  providers: [\n    { provide: 'SnotifyToastConfig', useValue: ToastDefaults},\n    SnotifyService\n  ]\n})\nexport class AppModule { }\n```\n\n#### Add selector\nInclude `ng-snotify` component to you root component\n\n```html\n<ng-snotify></ng-snotify>\n```\n#### Dependency injection\nNow you should inject `SnotifyService`\n\n```typescript\nimport {SnotifyService} from 'ng-snotify';\n\n@Component({\n  selector: 'app-root',\n  templateUrl: './app.component.html',\n  styleUrls: ['./app.component.css']\n})\nexport class AppComponent {\n  constructor(private snotifyService: SnotifyService) {}\n}\n\n```\n\n\n#### Import Styles\n\nYou can find this information - [here](essentials/styling.md)\n"
  },
  {
    "path": "e2e/protractor-ci.conf.js",
    "content": "const config = require('./protractor.conf').config;\n\nconfig.capabilities = {\n  browserName: 'chrome',\n  chromeOptions: {\n    args: [\n      '--headless',\n      '--no-sandbox',\n      '--disable-gpu',\n      '--disable-dev-shm-usage',\n      '--ignore-certificate-errors',\n      '--window-size=1920,1080'\n    ],\n    binary: require('puppeteer').executablePath()\n  }\n};\n\nexports.config = config;\n"
  },
  {
    "path": "e2e/protractor.conf.js",
    "content": "// @ts-check\n// Protractor configuration file, see link for more information\n// https://github.com/angular/protractor/blob/master/lib/config.ts\n\nconst { SpecReporter } = require('jasmine-spec-reporter');\n\n/**\n * @type { import(\"protractor\").Config }\n */\nexports.config = {\n  allScriptsTimeout: 11000,\n  specs: ['./src/**/*.e2e-spec.ts'],\n  capabilities: {\n    browserName: 'chrome',\n    chromeOptions: {\n      args: ['--no-sandbox', '--disable-dev-shm-usage', '--ignore-certificate-errors'],\n      binary: require('puppeteer').executablePath()\n    }\n  },\n  directConnect: true,\n  baseUrl: 'http://localhost:4200/',\n  framework: 'jasmine',\n  jasmineNodeOpts: {\n    showColors: true,\n    defaultTimeoutInterval: 30000,\n    print: function() {}\n  },\n  onPrepare() {\n    require('ts-node').register({\n      project: require('path').join(__dirname, './tsconfig.json')\n    });\n    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));\n  }\n};\n"
  },
  {
    "path": "e2e/src/app.e2e-spec.ts",
    "content": "import { APage } from './app.po';\n\ndescribe('a App', () => {\n  let page: APage;\n\n  beforeEach(() => {\n    page = new APage();\n  });\n\n  it('should display welcome message', done => {\n    page.navigateTo();\n    page\n      .getParagraphText()\n      .then(msg => expect(msg).toEqual('Ng-Snotify'))\n      .then(done, done.fail);\n  });\n});\n"
  },
  {
    "path": "e2e/src/app.po.ts",
    "content": "import { browser, by, element } from 'protractor';\n\nexport class APage {\n  navigateTo() {\n    return browser.get('/');\n  }\n\n  getParagraphText() {\n    return element(by.css('app-root h1')).getText();\n  }\n}\n"
  },
  {
    "path": "e2e/tsconfig.json",
    "content": "{\n  \"extends\": \"../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../out-tsc/e2e\",\n    \"module\": \"commonjs\",\n    \"target\": \"es5\",\n    \"types\": [\"jasmine\", \"jasminewd2\", \"node\"]\n  }\n}\n"
  },
  {
    "path": "karma.conf.js",
    "content": "// Karma configuration file, see link for more information\n// https://karma-runner.github.io/1.0/config/configuration-file.html\nprocess.env.CHROME_BIN = require('puppeteer').executablePath();\n\nmodule.exports = function(config) {\n  config.set({\n    basePath: '',\n    frameworks: ['jasmine', '@angular-devkit/build-angular'],\n    plugins: [\n      require('karma-jasmine'),\n      require('karma-chrome-launcher'),\n      require('karma-jasmine-html-reporter'),\n      require('karma-coverage-istanbul-reporter'),\n      require('karma-junit-reporter'),\n      require('@angular-devkit/build-angular/plugins/karma')\n    ],\n    client: {\n      clearContext: false // leave Jasmine Spec Runner output visible in browser\n    },\n    coverageIstanbulReporter: {\n      dir: require('path').join(__dirname, './coverage/ng-snotify-example'),\n      reports: ['html', 'lcovonly', 'text-summary', 'cobertura'],\n      fixWebpackSourcePaths: true\n    },\n    remapIstanbulReporter: {\n      reports: {\n        html: 'coverage',\n        cobertura: './coverage/cobertura.xml'\n      }\n    },\n    remapCoverageReporter: {\n      'text-summary': null, // to show summary in console\n      html: './coverage/html',\n      cobertura: './coverage/cobertura.xml'\n    },\n    reporters: ['progress', 'kjhtml', 'junit'],\n    junitReporter: {\n      outputFile: 'test-report.xml' // if included, results will be saved as $outputDir/$browserName/$outputFile\n    },\n    port: 9876,\n    colors: true,\n    logLevel: config.LOG_INFO,\n    autoWatch: true,\n    browsers: ['ChromeHeadlessCI'],\n    customLaunchers: {\n      ChromeHeadlessCI: {\n        base: 'ChromeHeadless',\n        flags: [\n          '--no-sandbox',\n          '--disable-gpu',\n          '--disable-dev-shm-usage',\n          '--ignore-certificate-errors',\n          '--window-size=1920,1080'\n        ]\n      }\n    },\n    singleRun: false,\n    restartOnFileChange: true\n  });\n};\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"ng-snotify-example\",\n  \"description\": \"Angular 2+ notifications center\",\n  \"version\": \"9.0.2\",\n  \"scripts\": {\n    \"ng\": \"ng\",\n    \"start\": \"ng serve ng-snotify-example\",\n    \"lint\": \"npm run example:lint && npm run lib:lint\",\n    \"test\": \"npm run example:test && npm run lib:test\",\n    \"test:ci\": \"npm run example:test:ci && npm run lib:test:ci\",\n    \"test:lib-coverage\": \"npm run example:test:lib-coverage && npm run lib:test:lib-coverage\",\n    \"example:build\": \"ng build ng-snotify-example\",\n    \"example:build:prod\": \"ng build ng-snotify-example --prod --base-href=/ng-snotify/ --output-path=demo/\",\n    \"example:lint\": \"ng lint ng-snotify-example\",\n    \"example:test\": \"ng test ng-snotify-example --browsers=Chrome --watch false --reporters junit,progress,kjhtml\",\n    \"example:test:ci\": \"ng test ng-snotify-example -c=ci --browsers=ChromeHeadlessCI --watch=false --progress=false --reporters junit,progress,kjhtml\",\n    \"example:test:lib-coverage\": \"ng test ng-snotify-example --code-coverage --watch=false\",\n    \"example:e2e\": \"ng e2e ng-snotify-example\",\n    \"example:e2e:ci\": \"ng e2e ng-snotify-example -c=ci\",\n    \"compodoc\": \"npm run compodoc:build\",\n    \"compodoc:build\": \"compodoc -p tsconfig.docs.json -n ng-snotify -d demo/compodoc/ --hideGenerator --theme Laravel\",\n    \"compodoc:serve\": \"npm run compodoc:build -- -s\",\n    \"compodoc:watch\": \"npm run compodoc:build -- -s -w\",\n    \"lib:build\": \"ng build ng-snotify && cd dist/ng-snotify && npm pack\",\n    \"lib:build:prod\": \"ng build ng-snotify --prod && cd dist/ng-snotify && npm pack\",\n    \"lib:lint\": \"ng lint ng-snotify\",\n    \"lib:test\": \"ng test ng-snotify --browsers=Chrome --watch false --reporters junit,progress,kjhtml\",\n    \"lib:test:ci\": \"ng test ng-snotify -c=ci --browsers=ChromeHeadlessCI --watch=false --progress=false --reporters junit,progress,kjhtml\",\n    \"lib:test:lib-coverage\": \"ng test ng-snotify --code-coverage --watch=false\",\n    \"docs:build\": \"gitbook build ./docs ./demo/documentation\",\n    \"docs:deploy\": \"bash ./update-docs.sh\",\n    \"prettier:check\": \"prettier --check ./**/*.{ts,js,scss,html,json,*rc}\",\n    \"prettier:write\": \"prettier --write ./**/*.{ts,js,scss,html,json,*rc}\",\n    \"precommit\": \"lint-staged && npm run lint && npm run test:ci\",\n    \"prepare\": \"npm run lib:build:prod\",\n    \"postinstall\": \"webdriver-manager update --standalone false --gecko false\"\n  },\n  \"homepage\": \"https://artemsky.github.io/ng-snotify\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/artemsky/ng-snotify\"\n  },\n  \"author\": {\n    \"name\": \"artemsky\",\n    \"email\": \"mr.artemsky@gmail.com\"\n  },\n  \"keywords\": [\n    \"angular\",\n    \"angular 2\",\n    \"angular 4\",\n    \"angular 5\",\n    \"angular 6\",\n    \"angular 7\",\n    \"angular 8\",\n    \"angular 9\",\n    \"Angular2\",\n    \"Angular4\",\n    \"Angular5\",\n    \"Angular6\",\n    \"Angular7\",\n    \"Angular8\",\n    \"Angular9\",\n    \"ng\",\n    \"ng2\",\n    \"ng4\",\n    \"ng5\",\n    \"ng6\",\n    \"ng7\",\n    \"ng8\",\n    \"ng9\",\n    \"2\",\n    \"4\",\n    \"5\",\n    \"6\",\n    \"7\",\n    \"8\",\n    \"9\",\n    \"Library\",\n    \"Notifications\",\n    \"Notification\",\n    \"Toast\",\n    \"toasts\",\n    \"promt\",\n    \"async\",\n    \"confirmation\",\n    \"notify\",\n    \"notie\",\n    \"notification-center\",\n    \"snotify\",\n    \"ng-snotify\",\n    \"ng2-snotify\",\n    \"ng4-snotify\",\n    \"ng5-snotify\",\n    \"ng6-snotify\",\n    \"ng7-snotify\",\n    \"ng8-snotify\",\n    \"ng9-snotify\",\n    \"angular2 notifications\",\n    \"angular4 notifications\",\n    \"angular5 notifications\",\n    \"angular6 notifications\",\n    \"angular7 notifications\",\n    \"angular8 notifications\",\n    \"angular9 notifications\",\n    \"toaster\"\n  ],\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://artemsky.github.io/ng-snotify/issues\"\n  },\n  \"dependencies\": {\n    \"@angular/animations\": \"~9.0.7\",\n    \"@angular/common\": \"~9.0.7\",\n    \"@angular/compiler\": \"~9.0.7\",\n    \"@angular/core\": \"~9.0.7\",\n    \"@angular/forms\": \"~9.0.7\",\n    \"@angular/platform-browser\": \"~9.0.7\",\n    \"@angular/platform-browser-dynamic\": \"~9.0.7\",\n    \"@angular/router\": \"~9.0.7\",\n    \"@compodoc/compodoc\": \"^1.1.11\",\n    \"bootstrap\": \"^3.3.7\",\n    \"ng-snotify\": \"~9.0.1\",\n    \"rxjs\": \"~6.5.4\",\n    \"tslib\": \"^1.10.0\",\n    \"zone.js\": \"~0.10.2\"\n  },\n  \"devDependencies\": {\n    \"@angular-devkit/build-angular\": \"~0.900.7\",\n    \"@angular-devkit/build-ng-packagr\": \"~0.900.7\",\n    \"@angular/cli\": \"~9.0.7\",\n    \"@angular/compiler-cli\": \"~9.0.7\",\n    \"@angular/language-service\": \"~9.0.7\",\n    \"@commitlint/cli\": \"^8.3.5\",\n    \"@commitlint/config-conventional\": \"^8.3.4\",\n    \"@types/jasmine\": \"~3.5.10\",\n    \"@types/jasminewd2\": \"^2.0.8\",\n    \"@types/node\": \"^13.9.3\",\n    \"@types/puppeteer\": \"^2.0.1\",\n    \"codelyzer\": \"^5.2.1\",\n    \"commitizen\": \"^4.0.3\",\n    \"cz-conventional-changelog\": \"^3.1.0\",\n    \"husky\": \"^4.2.3\",\n    \"jasmine-core\": \"~3.5.0\",\n    \"jasmine-spec-reporter\": \"~4.2.1\",\n    \"karma\": \"~4.4.1\",\n    \"karma-chrome-launcher\": \"~3.1.0\",\n    \"karma-coverage-istanbul-reporter\": \"~2.1.1\",\n    \"karma-jasmine\": \"~3.1.1\",\n    \"karma-jasmine-html-reporter\": \"~1.5.2\",\n    \"karma-junit-reporter\": \"~2.0.1\",\n    \"lint-staged\": \"^10.0.9\",\n    \"ng-packagr\": \"^9.0.3\",\n    \"prettier\": \"^1.19.1\",\n    \"protractor\": \"~5.4.3\",\n    \"puppeteer\": \"^2.1.1\",\n    \"ts-node\": \"~7.0.0\",\n    \"tslint\": \"~5.15.0\",\n    \"typescript\": \"~3.7.5\"\n  },\n  \"engines\": {\n    \"node\": \">=10.13.0\"\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/karma.conf.js",
    "content": "// Karma configuration file, see link for more information\n// https://karma-runner.github.io/1.0/config/configuration-file.html\nprocess.env.CHROME_BIN = require('puppeteer').executablePath();\n\nmodule.exports = function(config) {\n  config.set({\n    basePath: '',\n    frameworks: ['jasmine', '@angular-devkit/build-angular'],\n    plugins: [\n      require('karma-jasmine'),\n      require('karma-chrome-launcher'),\n      require('karma-jasmine-html-reporter'),\n      require('karma-coverage-istanbul-reporter'),\n      require('karma-junit-reporter'),\n      require('@angular-devkit/build-angular/plugins/karma')\n    ],\n    client: {\n      clearContext: false // leave Jasmine Spec Runner output visible in browser\n    },\n    coverageIstanbulReporter: {\n      dir: require('path').join(__dirname, '../../coverage/ng-snotify'),\n      reports: ['html', 'lcovonly', 'text-summary', 'cobertura'],\n      fixWebpackSourcePaths: true\n    },\n    remapIstanbulReporter: {\n      reports: {\n        html: 'coverage',\n        cobertura: './coverage/cobertura.xml'\n      }\n    },\n    remapCoverageReporter: {\n      'text-summary': null, // to show summary in console\n      html: './coverage/html',\n      cobertura: './coverage/cobertura.xml'\n    },\n    reporters: ['progress', 'kjhtml', 'junit'],\n    junitReporter: {\n      outputFile: 'test-report.xml' // if included, results will be saved as $outputDir/$browserName/$outputFile\n    },\n    port: 9876,\n    colors: true,\n    logLevel: config.LOG_INFO,\n    autoWatch: true,\n    browsers: ['ChromeHeadlessCI'],\n    customLaunchers: {\n      ChromeHeadlessCI: {\n        base: 'ChromeHeadless',\n        flags: [\n          '--no-sandbox',\n          '--disable-gpu',\n          '--disable-dev-shm-usage',\n          '--ignore-certificate-errors',\n          '--window-size=1920,1080'\n        ]\n      }\n    },\n    singleRun: false,\n    restartOnFileChange: true\n  });\n};\n"
  },
  {
    "path": "projects/ng-snotify/ng-package.json",
    "content": "{\n  \"$schema\": \"../../node_modules/ng-packagr/ng-package.schema.json\",\n  \"dest\": \"../../dist/ng-snotify\",\n  \"lib\": {\n    \"entryFile\": \"src/public-api.ts\"\n  },\n  \"assets\": [\"./styles/**/*.scss\"]\n}\n"
  },
  {
    "path": "projects/ng-snotify/package.json",
    "content": "{\n  \"name\": \"ng-snotify\",\n  \"description\": \"Angular 2+ notifications center\",\n  \"version\": \"9.0.2\",\n  \"homepage\": \"https://artemsky.github.io/ng-snotify\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/artemsky/ng-snotify\"\n  },\n  \"author\": {\n    \"name\": \"artemsky\",\n    \"email\": \"mr.artemsky@gmail.com\"\n  },\n  \"keywords\": [\n    \"angular\",\n    \"angular 2\",\n    \"angular 4\",\n    \"angular 5\",\n    \"angular 6\",\n    \"angular 7\",\n    \"angular 8\",\n    \"angular 9\",\n    \"ng\",\n    \"ng2\",\n    \"ng4\",\n    \"ng5\",\n    \"ng6\",\n    \"ng7\",\n    \"ng8\",\n    \"ng9\",\n    \"Angular2\",\n    \"Angular4\",\n    \"Angular5\",\n    \"Angular6\",\n    \"Angular7\",\n    \"Angular8\",\n    \"Angular9\",\n    \"2\",\n    \"4\",\n    \"5\",\n    \"6\",\n    \"7\",\n    \"8\",\n    \"9\",\n    \"Library\",\n    \"Notifications\",\n    \"Notification\",\n    \"Toast\",\n    \"toasts\",\n    \"promt\",\n    \"async\",\n    \"confirmation\",\n    \"notify\",\n    \"notie\",\n    \"notification-center\",\n    \"snotify\",\n    \"ng-snotify\",\n    \"ng2-snotify\",\n    \"ng4-snotify\",\n    \"ng5-snotify\",\n    \"ng6-snotify\",\n    \"ng7-snotify\",\n    \"ng8-snotify\",\n    \"ng9-snotify\",\n    \"angular2 notifications\",\n    \"angular4 notifications\",\n    \"angular5 notifications\",\n    \"angular6 notifications\",\n    \"angular7 notifications\",\n    \"angular8 notifications\",\n    \"angular9 notifications\",\n    \"toaster\"\n  ],\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://artemsky.github.io/ng-snotify/issues\"\n  },\n  \"peerDependencies\": {\n    \"@angular/core\": \"^9.0.0\",\n    \"rxjs\": \"^6.5.4\",\n    \"zone.js\": \"^0.10.2\"\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/components/buttons/buttons.component.html",
    "content": "<div class=\"snotifyToast__buttons\">\n  <button\n    type=\"button\"\n    *ngFor=\"let button of toast.config.buttons\"\n    [ngClass]=\"{ 'snotifyToast__buttons--bold': button.bold }\"\n    (click)=\"button.action ? button.action(toast) : remove()\"\n  >\n    {{ button.text }}\n  </button>\n</div>\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/components/buttons/buttons.component.ts",
    "content": "import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';\nimport { SnotifyService } from '../../services/snotify.service';\nimport { SnotifyToast } from '../../models/snotify-toast.model';\n\n@Component({\n  selector: 'ng-snotify-button',\n  templateUrl: './buttons.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None\n})\n\n/**\n * Buttons component\n */\nexport class ButtonsComponent {\n  /**\n   * Get buttons Array\n   */\n  @Input() toast: SnotifyToast;\n  constructor(private service: SnotifyService) {}\n\n  /**\n   * remove toast\n   */\n  remove() {\n    this.service.remove(this.toast.id);\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/components/index.ts",
    "content": "export * from './buttons/buttons.component';\nexport * from './prompt/prompt.component';\nexport * from './snotify/snotify.component';\nexport * from './toast/toast.component';\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/components/prompt/prompt.component.html",
    "content": "<span class=\"snotifyToast__input\" [ngClass]=\"{ 'snotifyToast__input--filled': isPromptFocused }\">\n  <input\n    (input)=\"toast.value = $event.target.value; toast.eventEmitter.next('input')\"\n    autofocus\n    class=\"snotifyToast__input__field\"\n    type=\"text\"\n    [id]=\"toast.id\"\n    (focus)=\"isPromptFocused = true\"\n    (blur)=\"isPromptFocused = !!toast.value.length\"\n  />\n  <label class=\"snotifyToast__input__label\" [for]=\"toast.id\">\n    <span class=\"snotifyToast__input__labelContent\">{{ toast.config.placeholder | truncate }}</span>\n  </label>\n</span>\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/components/prompt/prompt.component.ts",
    "content": "import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';\nimport { SnotifyToast } from '../../models/snotify-toast.model';\n\n@Component({\n  selector: 'ng-snotify-prompt',\n  templateUrl: './prompt.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None\n})\n\n/**\n * Prompt component. Part of PROMPT type\n */\nexport class PromptComponent {\n  /**\n   * Get PROMPT placeholder\n   */\n  @Input() toast: SnotifyToast;\n  /**\n   * Is PROMPT focused\n   */\n  isPromptFocused = false;\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/components/snotify/snotify.component.html",
    "content": "<div class=\"snotify-backdrop\" *ngIf=\"backdrop >= 0\" [style.opacity]=\"backdrop\"></div>\n<div *ngFor=\"let position of notifications | keys\" class=\"snotify snotify-{{ position }}\">\n  <ng-snotify-toast\n    *ngFor=\"let notification of notifications[position] | slice: blockSizeA:blockSizeB\"\n    [toast]=\"notification\"\n    (stateChanged)=\"stateChanged($event)\"\n  >\n  </ng-snotify-toast>\n</div>\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/components/snotify/snotify.component.ts",
    "content": "import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\nimport { SnotifyService } from '../../services/snotify.service';\nimport { SnotifyToast } from '../../models/snotify-toast.model';\nimport { Subscription } from 'rxjs';\nimport { SnotifyNotifications } from '../../interfaces/snotify-notifications.interface';\nimport { SnotifyPosition } from '../../enums/snotify-position.enum';\nimport { SnotifyEventType } from '../../types/snotify-event.type';\n\n@Component({\n  selector: 'ng-snotify',\n  templateUrl: './snotify.component.html',\n  encapsulation: ViewEncapsulation.None\n})\nexport class SnotifyComponent implements OnInit, OnDestroy {\n  /**\n   * Toasts array\n   */\n  notifications: SnotifyNotifications;\n  /**\n   * Toasts emitter\n   */\n  emitter: Subscription;\n  /**\n   * Helper for slice pipe (maxOnScreen)\n   */\n  dockSizeA: number;\n  /**\n   * Helper for slice pipe (maxOnScreen)\n   */\n  dockSizeB: number | undefined;\n  /**\n   * Helper for slice pipe (maxAtPosition)\n   */\n  blockSizeA: number;\n  /**\n   * Helper for slice pipe (maxAtPosition)\n   */\n  blockSizeB: number | undefined;\n  /**\n   * Backdrop Opacity\n   */\n  backdrop = -1;\n  /**\n   * How many toasts with backdrop in current queue\n   */\n  withBackdrop: SnotifyToast[];\n\n  constructor(private service: SnotifyService) {}\n\n  /**\n   * Init base options. Subscribe to options, lifecycle change\n   */\n  ngOnInit() {\n    this.emitter = this.service.emitter.subscribe((toasts: SnotifyToast[]) => {\n      if (this.service.config.global.newOnTop) {\n        this.dockSizeA = -this.service.config.global.maxOnScreen;\n        this.dockSizeB = undefined;\n        this.blockSizeA = -this.service.config.global.maxAtPosition;\n        this.blockSizeB = undefined;\n        this.withBackdrop = toasts.filter(toast => toast.config.backdrop >= 0);\n      } else {\n        this.dockSizeA = 0;\n        this.dockSizeB = this.service.config.global.maxOnScreen;\n        this.blockSizeA = 0;\n        this.blockSizeB = this.service.config.global.maxAtPosition;\n        this.withBackdrop = toasts.filter(toast => toast.config.backdrop >= 0).reverse();\n      }\n      this.notifications = this.splitToasts(toasts.slice(this.dockSizeA, this.dockSizeB));\n      this.stateChanged('mounted');\n    });\n  }\n\n  // TODO: fix backdrop if more than one toast called in a row\n  /**\n   * Changes the backdrop opacity\n   * @param event SnotifyEventType\n   */\n  stateChanged(event: SnotifyEventType) {\n    if (!this.withBackdrop.length) {\n      if (this.backdrop >= 0) {\n        this.backdrop = -1;\n      }\n      return;\n    }\n    switch (event) {\n      case 'mounted':\n        if (this.backdrop < 0) {\n          this.backdrop = 0;\n        }\n        break;\n      case 'beforeShow':\n        this.backdrop = this.withBackdrop[this.withBackdrop.length - 1].config.backdrop;\n        break;\n      case 'beforeHide':\n        if (this.withBackdrop.length === 1) {\n          this.backdrop = 0;\n        }\n        break;\n      case 'hidden':\n        if (this.withBackdrop.length === 1) {\n          this.backdrop = -1;\n        }\n        break;\n    }\n  }\n\n  /**\n   * Split toasts toasts into different objects\n   * @param toasts SnotifyToast[]\n   * @returns SnotifyNotifications\n   */\n  splitToasts(toasts: SnotifyToast[]): SnotifyNotifications {\n    const result: SnotifyNotifications = {};\n\n    for (const property in SnotifyPosition) {\n      if (SnotifyPosition.hasOwnProperty(property)) {\n        result[SnotifyPosition[property]] = [];\n      }\n    }\n\n    toasts.forEach((toast: SnotifyToast) => {\n      result[toast.config.position as string].push(toast);\n    });\n\n    return result;\n  }\n\n  /**\n   * Unsubscribe subscriptions\n   */\n  ngOnDestroy() {\n    this.emitter.unsubscribe();\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/components/toast/toast.component.html",
    "content": "<div\n  [attr.role]=\"toast.config.type === state.promptType ? 'dialog' : 'alert'\"\n  [attr.aria-labelledby]=\"'snotify_' + toast.id\"\n  [attr.aria-modal]=\"toast.config.type === state.promptType\"\n  [ngClass]=\"[\n    'snotifyToast animated',\n    'snotify-' + toast.config.type,\n    state.animation,\n    toast.valid === undefined ? '' : toast.valid ? 'snotifyToast--valid' : 'snotifyToast--invalid'\n  ]\"\n  [ngStyle]=\"{\n    '-webkit-transition': toast.config.animation.time + 'ms',\n    transition: toast.config.animation.time + 'ms',\n    '-webkit-animation-duration': toast.config.animation.time + 'ms',\n    'animation-duration': toast.config.animation.time + 'ms'\n  }\"\n  (animationend)=\"onExitTransitionEnd()\"\n  (click)=\"onClick()\"\n  (mouseenter)=\"onMouseEnter()\"\n  (mouseleave)=\"onMouseLeave()\"\n>\n  <div class=\"snotifyToast__progressBar\" *ngIf=\"toast.config.showProgressBar\">\n    <span class=\"snotifyToast__progressBar__percentage\" [ngStyle]=\"{ width: state.progress * 100 + '%' }\"></span>\n  </div>\n  <div class=\"snotifyToast__inner\" *ngIf=\"!toast.config.html; else toastHTML\">\n    <div class=\"snotifyToast__title\" [attr.id]=\"'snotify_' + toast.id\" *ngIf=\"toast.title\">\n      {{ toast.title | truncate: toast.config.titleMaxLength }}\n    </div>\n    <div class=\"snotifyToast__body\" *ngIf=\"toast.body\">{{ toast.body | truncate: toast.config.bodyMaxLength }}</div>\n    <ng-snotify-prompt *ngIf=\"toast.config.type === state.promptType\" [toast]=\"toast\"> </ng-snotify-prompt>\n    <div\n      *ngIf=\"!toast.config.icon; else elseBlock\"\n      [ngClass]=\"['snotify-icon', toast.config.iconClass || 'snotify-icon--' + toast.config.type]\"\n    ></div>\n    <ng-template #elseBlock>\n      <img class=\"snotify-icon\" [src]=\"toast.config.icon\" />\n    </ng-template>\n  </div>\n  <ng-template #toastHTML>\n    <div class=\"snotifyToast__inner\" [innerHTML]=\"toast.config.html\"></div>\n  </ng-template>\n  <ng-snotify-button *ngIf=\"toast.config.buttons\" [toast]=\"toast\"></ng-snotify-button>\n</div>\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/components/toast/toast.component.ts",
    "content": "import {\n  AfterContentInit,\n  Component,\n  EventEmitter,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  ViewEncapsulation\n} from '@angular/core';\nimport { SnotifyService } from '../../services/snotify.service';\nimport { SnotifyToast } from '../../models/snotify-toast.model';\nimport { Subscription } from 'rxjs';\nimport { SnotifyEventType } from '../../types/snotify-event.type';\nimport { SnotifyStyle } from '../../enums/snotify-style.enum';\n\n@Component({\n  selector: 'ng-snotify-toast',\n  templateUrl: './toast.component.html',\n  encapsulation: ViewEncapsulation.None\n})\nexport class ToastComponent implements OnInit, OnDestroy, AfterContentInit {\n  /**\n   * Get toast from notifications array\n   */\n  @Input() toast: SnotifyToast;\n  @Output() stateChanged = new EventEmitter<SnotifyEventType>();\n\n  toastDeletedSubscription: Subscription;\n  toastChangedSubscription: Subscription;\n\n  /**\n   * requestAnimationFrame id\n   */\n  animationFrame: number;\n\n  /**\n   * Toast state\n   */\n  state = {\n    paused: false,\n    progress: 0,\n    animation: '',\n    isDestroying: false,\n    promptType: SnotifyStyle.prompt\n  };\n\n  constructor(private service: SnotifyService) {}\n\n  // Lifecycles\n\n  /**\n   * Init base options. Subscribe to toast changed, toast deleted\n   */\n  ngOnInit() {\n    this.toastChangedSubscription = this.service.toastChanged.subscribe((toast: SnotifyToast) => {\n      if (this.toast.id === toast.id) {\n        this.initToast();\n      }\n    });\n    this.toastDeletedSubscription = this.service.toastDeleted.subscribe(id => {\n      if (this.toast.id === id) {\n        this.onRemove();\n      }\n    });\n    if (!this.toast.config.timeout) {\n      this.toast.config.showProgressBar = false;\n    }\n    this.toast.eventEmitter.next('mounted');\n    this.state.animation = 'snotifyToast--in';\n  }\n\n  ngAfterContentInit() {\n    setTimeout(() => {\n      this.stateChanged.emit('beforeShow');\n      this.toast.eventEmitter.next('beforeShow');\n      this.state.animation = this.toast.config.animation.enter;\n    }, this.service.config.toast.animation.time / 5); // time to show toast push animation (snotifyToast--in)\n  }\n\n  /**\n   * Unsubscribe subscriptions\n   */\n  ngOnDestroy(): void {\n    cancelAnimationFrame(this.animationFrame);\n    this.toast.eventEmitter.next('destroyed');\n    this.toastChangedSubscription.unsubscribe();\n    this.toastDeletedSubscription.unsubscribe();\n  }\n\n  /*\n  Event hooks\n   */\n\n  /**\n   * Trigger OnClick lifecycle\n   */\n  onClick() {\n    this.toast.eventEmitter.next('click');\n    if (this.toast.config.closeOnClick) {\n      this.service.remove(this.toast.id);\n    }\n  }\n\n  /**\n   * Trigger beforeDestroy lifecycle. Removes toast\n   */\n  onRemove() {\n    this.state.isDestroying = true;\n    this.toast.eventEmitter.next('beforeHide');\n    this.stateChanged.emit('beforeHide');\n    this.state.animation = this.toast.config.animation.exit;\n    setTimeout(() => {\n      this.stateChanged.emit('hidden');\n      this.state.animation = 'snotifyToast--out';\n      this.toast.eventEmitter.next('hidden');\n      setTimeout(() => this.service.remove(this.toast.id, true), this.toast.config.animation.time / 2);\n    }, this.toast.config.animation.time / 2);\n  }\n\n  /**\n   * Trigger onHoverEnter lifecycle\n   */\n  onMouseEnter() {\n    this.toast.eventEmitter.next('mouseenter');\n    if (this.toast.config.pauseOnHover) {\n      this.state.paused = true;\n    }\n  }\n\n  /**\n   * Trigger onHoverLeave lifecycle\n   */\n  onMouseLeave() {\n    if (this.toast.config.pauseOnHover && this.toast.config.timeout) {\n      this.state.paused = false;\n      this.startTimeout(this.toast.config.timeout * this.state.progress);\n    }\n    this.toast.eventEmitter.next('mouseleave');\n  }\n\n  /**\n   * Remove toast completely after animation\n   */\n  onExitTransitionEnd() {\n    if (this.state.isDestroying) {\n      return;\n    }\n    this.initToast();\n    this.toast.eventEmitter.next('shown');\n  }\n\n  /*\n   Common\n   */\n\n  /**\n   * Initialize base toast config\n   *\n   */\n  initToast(): void {\n    if (this.toast.config.timeout > 0) {\n      this.startTimeout(0);\n    }\n  }\n\n  /**\n   * Start progress bar\n   * @param startTime number\n   */\n  startTimeout(startTime: number = 0) {\n    const start = performance.now();\n    const calculate = () => {\n      this.animationFrame = requestAnimationFrame(timestamp => {\n        const runtime = timestamp + startTime - start;\n        const progress = Math.min(runtime / this.toast.config.timeout, 1);\n        if (this.state.paused) {\n          cancelAnimationFrame(this.animationFrame);\n        } else if (runtime < this.toast.config.timeout) {\n          this.state.progress = progress;\n          calculate();\n        } else {\n          this.state.progress = 1;\n          cancelAnimationFrame(this.animationFrame);\n          this.service.remove(this.toast.id);\n        }\n      });\n    };\n    calculate();\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/decorators/set-toast-type.decorator.ts",
    "content": "import { SnotifyTypeType } from '../types/snotify-type.type';\nimport { Snotify } from '../interfaces/snotify.interface';\n\n/**\n * Defines toast style depending on method name\n * @param target any\n * @param propertyKey SnotifyTypeType\n * @param descriptor PropertyDescriptor\n * @returns value: ((...args: any[]) => any)\n */\nexport function SetToastType(target: any, propertyKey: SnotifyTypeType, descriptor: PropertyDescriptor) {\n  return {\n    value(...args: any[]) {\n      (args[0] as Snotify).config = {\n        ...(args[0] as Snotify).config,\n        type: propertyKey\n      };\n      return descriptor.value.apply(this, args);\n    }\n  };\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/decorators/transform-argument.decorator.ts",
    "content": "import { Snotify } from '../interfaces/snotify.interface';\nimport { SnotifyTypeType } from '../types/snotify-type.type';\nimport { SnotifyStyle } from '../enums/snotify-style.enum';\n\n/**\n * Transform arguments to Snotify object\n * @param target any\n * @param propertyKey SnotifyTypeType\n * @param descriptor PropertyDescriptor\n * @returns Snotify\n */\nexport function TransformArgument(target: any, propertyKey: SnotifyTypeType, descriptor: PropertyDescriptor) {\n  if (propertyKey === SnotifyStyle.async) {\n    return {\n      value(...args: any[]) {\n        let result;\n        if (args.length === 2) {\n          result = {\n            title: null,\n            body: args[0],\n            config: null,\n            action: args[1]\n          };\n        } else if (args.length === 3) {\n          if (typeof args[1] === 'string') {\n            result = {\n              title: args[1],\n              body: args[0],\n              config: null,\n              action: args[2]\n            };\n          } else {\n            result = {\n              title: null,\n              body: args[0],\n              config: args[2],\n              action: args[1]\n            };\n          }\n        } else {\n          result = {\n            title: args[1],\n            body: args[0],\n            config: args[3],\n            action: args[2]\n          };\n        }\n        return descriptor.value.apply(this, [result as Snotify]);\n      }\n    };\n  } else {\n    return {\n      value(...args: any[]) {\n        let result;\n        if (args.length === 1) {\n          result = {\n            title: null,\n            body: args[0],\n            config: null\n          };\n        } else if (args.length === 3) {\n          result = {\n            title: args[1],\n            body: args[0],\n            config: args[2]\n          };\n        } else {\n          result = {\n            title: null,\n            config: null,\n            body: args[0],\n            [typeof args[1] === 'string' ? 'title' : 'config']: args[1]\n          };\n        }\n        return descriptor.value.apply(this, [result as Snotify]);\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/enums/index.ts",
    "content": "export * from './snotify-position.enum';\nexport * from './snotify-style.enum';\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/enums/snotify-position.enum.ts",
    "content": "/**\n * Toast position\n */\nexport enum SnotifyPosition {\n  leftTop = 'leftTop',\n  leftCenter = 'leftCenter',\n  leftBottom = 'leftBottom',\n  rightTop = 'rightTop',\n  rightCenter = 'rightCenter',\n  rightBottom = 'rightBottom',\n  centerTop = 'centerTop',\n  centerCenter = 'centerCenter',\n  centerBottom = 'centerBottom'\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/enums/snotify-style.enum.ts",
    "content": "/**\n * Toast style.\n */\nexport enum SnotifyStyle {\n  simple = 'simple',\n  success = 'success',\n  error = 'error',\n  warning = 'warning',\n  info = 'info',\n  async = 'async',\n  confirm = 'confirm',\n  prompt = 'prompt'\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/interfaces/index.ts",
    "content": "export * from './snotif-global-config.interface';\nexport * from './snotify.interface';\nexport * from './snotify-animate.interface';\nexport * from './snotify-button.interface';\nexport * from './snotify-defaults.interface';\nexport * from './snotify-notifications.interface';\nexport * from './snotify-styles.interface';\nexport * from './snotify-toast-config.interface';\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/interfaces/snotif-global-config.interface.ts",
    "content": "/**\n * Toast dock configuration\n */\nexport interface SnotifyGlobalConfig {\n  /**\n   * Max toast items on screen.\n   *\n   * > For example you want to display 3 toasts max at the time. But for some purposes your system calls it 10 times.\n   * >\n   * > With this option, 3 toast will be shown. And after each of it will disappear, new toast from the queue will be shown.\n   */\n  maxOnScreen?: number;\n  /**\n   * Max toast items at position.\n   *\n   * Same as maxOnScreen, but affects only current toast position (like rightBottom)\n   */\n  maxAtPosition?: number;\n  /**\n   * Should new items come from top or bottom side.\n   *\n   * > This option created for styling purposes.\n   * >\n   * > For example, if your toast position is TOP-RIGHT. Its not very nice, when items comes from top and pulls down all other toasts\n   */\n  newOnTop?: boolean;\n\n  /**\n   * When enabled duplicated notification are filtered out.\n   *\n   * Duplicates are detected when they have the same title, body and type.\n   *\n   */\n  filterDuplicates?: boolean;\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/interfaces/snotify-animate.interface.ts",
    "content": "/**\n * Snotify animation params\n * If you want more animations, you can include animate.css or write animations yourself in your styles\n * Then you'll need to share this styles with snotify component [ng-snotify] component.\n */\nexport interface SnotifyAnimate {\n  /**\n   * In animation\n   */\n  enter: string;\n  /**\n   * Out animation\n   */\n  exit: string;\n  /**\n   * Animation time in ms\n   */\n  time: number;\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/interfaces/snotify-button.interface.ts",
    "content": "import { SnotifyToast } from '../models/snotify-toast.model';\n/**\n * Buttons config.\n */\n\n/**\n * Buttons config\n */\nexport interface SnotifyButton {\n  /**\n   * Button text\n   */\n  text: string;\n  /**\n   * Action which will be called after buttons click\n   * @param text? string\n   * @returns void\n   */\n  action?: (toast: SnotifyToast) => void;\n  /**\n   * Should buttons text be bold.\n   */\n  bold?: boolean;\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/interfaces/snotify-defaults.interface.ts",
    "content": "// tslint:disable:no-trailing-whitespace\nimport { SnotifyToastConfig } from './snotify-toast-config.interface';\nimport { SnotifyGlobalConfig } from './snotif-global-config.interface';\n\n/**\n * Global configuration object\n */\nexport interface SnotifyDefaults {\n  global?: SnotifyGlobalConfig;\n  toast?: SnotifyToastConfig;\n  type?: {\n    [key: string]: SnotifyToastConfig;\n  };\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/interfaces/snotify-notifications.interface.ts",
    "content": "import { SnotifyToast } from '../models/snotify-toast.model';\n\n/**\n * Notifications object\n */\nexport interface SnotifyNotifications {\n  left_top?: SnotifyToast[];\n  left_center?: SnotifyToast[];\n  left_bottom?: SnotifyToast[];\n\n  right_top?: SnotifyToast[];\n  right_center?: SnotifyToast[];\n  right_bottom?: SnotifyToast[];\n\n  center_top?: SnotifyToast[];\n  center_center?: SnotifyToast[];\n  center_bottom?: SnotifyToast[];\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/interfaces/snotify-styles.interface.ts",
    "content": "import { SnotifyTypeType } from '../types/snotify-type.type';\n\n/**\n * Toast styles\n */\nexport interface SnotifyStyles {\n  simple: SnotifyTypeType;\n  success: SnotifyTypeType;\n  error: SnotifyTypeType;\n  warning: SnotifyTypeType;\n  info: SnotifyTypeType;\n  async: SnotifyTypeType;\n  confirm: SnotifyTypeType;\n  prompt: SnotifyTypeType;\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/interfaces/snotify-toast-config.interface.ts",
    "content": "import { SnotifyButton } from './snotify-button.interface';\nimport { SnotifyAnimate } from './snotify-animate.interface';\nimport { SnotifyTypeType } from '../types/snotify-type.type';\nimport { SafeHtml } from '@angular/platform-browser';\nimport { SnotifyPositionType } from '../types';\n\n/**\n * Toast configuration object\n */\nexport interface SnotifyToastConfig {\n  /**\n   * Toast timeout in milliseconds.\n   * Disable timeout = 0\n   */\n  timeout?: number;\n  /**\n   * Enable/Disable progress bar.\n   * Disabled if timeout is 0.\n   */\n  showProgressBar?: boolean;\n  /**\n   * Type of toast, affects toast style.\n   * It's not recommended to change it.\n   * Depends on toast type.\n   */\n  type?: SnotifyTypeType;\n  /**\n   * Should toast close on click?\n   */\n  closeOnClick?: boolean;\n  /**\n   * Should timeout pause on hover?\n   */\n  pauseOnHover?: boolean;\n  /**\n   * Buttons config.\n   */\n  buttons?: SnotifyButton[];\n  /**\n   * Placeholder for Prompt toast\n   */\n  placeholder?: string;\n  /**\n   * Toast title maximum length\n   */\n  titleMaxLength?: number;\n  /**\n   * Toast body maximum length\n   */\n  bodyMaxLength?: number;\n  /**\n   * Activate custom icon.\n   * You should provide full tag, e.g.\n   * ```html\n   * <img src=\"assets/custom-icon.png\"/>\n   * ```\n   * ```html\n   * <svg x=\"0px\" y=\"0px\" viewBox=\"0 0 512 512\" style=\"enable-background:new 0 0 48 48;\" xml:space=\"preserve\" width=\"48px\" height=\"48px\">\n   *     <g><path....../></g>\n   * </svg>\n   * ```\n   */\n  icon?: string;\n\n  /**\n   * Custom icon class.\n   */\n  iconClass?: string;\n  /**\n   * Backdrop opacity.\n   * * **Range:** `0.0 - 1.0`.\n   * * **Disabled:** `-1`\n   */\n  backdrop?: number;\n  /**\n   * Animation config\n   */\n  animation?: SnotifyAnimate;\n  /**\n   * Html string witch overrides toast content\n   */\n  html?: string | SafeHtml;\n  /**\n   * Toasts position on screen\n   */\n  position?: SnotifyPositionType;\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/interfaces/snotify.interface.ts",
    "content": "import { SnotifyToastConfig } from './snotify-toast-config.interface';\nimport { SafeHtml } from '@angular/platform-browser';\n\n/**\n * Snotify toast params\n */\nexport interface Snotify {\n  /**\n   * Toast Title\n   */\n  title?: string;\n  /**\n   * Toast message\n   */\n  body?: string;\n  /**\n   * Config object\n   */\n  config?: SnotifyToastConfig;\n  /**\n   * Html content\n   */\n  html?: string | SafeHtml;\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/models/index.ts",
    "content": "export * from './snotify-toast.model';\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/models/snotify-toast.model.ts",
    "content": "import { SnotifyToastConfig } from '../interfaces/snotify-toast-config.interface';\nimport { Subject, Subscription } from 'rxjs';\nimport { SnotifyEventType } from '../types/snotify-event.type';\nimport { SnotifyStyle } from '../enums/snotify-style.enum';\n// @TODO remove method in observable way\n/**\n * Toast main model\n */\nexport class SnotifyToast {\n  /**\n   * Emits SnotifyEventType\n   */\n  readonly eventEmitter = new Subject<SnotifyEventType>();\n  /**\n   * Holds all subscribers because we need to unsubscribe from all before toast get destroyed\n   */\n  private eventsHolder: Subscription[] = [];\n  /**\n   * Toast prompt value\n   */\n  value: string;\n  /**\n   * Toast validator\n   */\n  valid: boolean;\n  constructor(public id: number, public title: string, public body: string, public config: SnotifyToastConfig) {\n    if (this.config.type === SnotifyStyle.prompt) {\n      this.value = '';\n    }\n    this.on('hidden', () => {\n      this.eventsHolder.forEach((subscription: Subscription) => {\n        subscription.unsubscribe();\n      });\n    });\n  }\n\n  /**\n   * Subscribe to toast events\n   * @returns this\n   * @param event SnotifyEventType\n   * @param action (toast: this) => void\n   */\n  on(event: SnotifyEventType, action: (toast: this) => void): this {\n    this.eventsHolder.push(\n      this.eventEmitter.subscribe((e: SnotifyEventType) => {\n        if (e === event) {\n          action(this);\n        }\n      })\n    );\n    return this;\n  }\n\n  /**\n   * Tests if a toast equals this toast.\n   * @returns boolean true then equals else false.\n   * @param toast SnotifyToast\n   */\n  equals(toast: SnotifyToast): boolean {\n    return this.body === toast.body && this.title === toast.title && this.config.type === toast.config.type;\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/pipes/index.ts",
    "content": "export * from './keys.pipe';\nexport * from './truncate.pipe';\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/pipes/keys.pipe.ts",
    "content": "import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n  name: 'keys',\n  pure: false\n})\n/**\n * Extract object keys pipe\n */\nexport class KeysPipe implements PipeTransform {\n  transform(value: any, args: any[] = null): any {\n    if (!value) {\n      return value;\n    }\n    return Object.keys(value);\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/pipes/truncate.pipe.ts",
    "content": "import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n  name: 'truncate'\n})\n\n/**\n * Truncate toast text pipe\n */\nexport class TruncatePipe implements PipeTransform {\n  transform(value: string, ...args: Array<any>): any {\n    let limit = 40;\n    let trail = '...';\n    if (args.length > 0) {\n      limit = args.length > 0 ? parseInt(args[0], 10) : limit;\n      trail = args.length > 1 ? args[1] : trail;\n    }\n\n    return value.length > limit ? value.substring(0, limit) + trail : value;\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/services/index.ts",
    "content": "export * from './snotify.service';\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/services/snotify.service.ts",
    "content": "import { Inject, Injectable } from '@angular/core';\nimport { Observable, Subject, Subscription, from } from 'rxjs';\nimport { SnotifyToastConfig } from '../interfaces/snotify-toast-config.interface';\nimport { Snotify } from '../interfaces/snotify.interface';\nimport { SnotifyTypeType } from '../types/snotify-type.type';\nimport { SafeHtml } from '@angular/platform-browser';\nimport { TransformArgument } from '../decorators/transform-argument.decorator';\nimport { mergeDeep, uuid } from '../utils';\nimport { SetToastType } from '../decorators/set-toast-type.decorator';\nimport { SnotifyDefaults } from '../interfaces/snotify-defaults.interface';\nimport { SnotifyToast } from '../models/snotify-toast.model';\nimport { SnotifyStyle } from '../enums/snotify-style.enum';\n\n/**\n * SnotifyService - create, remove, config toasts\n */\n@Injectable()\n// tslint:disable:unified-signatures\nexport class SnotifyService {\n  readonly emitter = new Subject<SnotifyToast[]>();\n  readonly toastChanged = new Subject<SnotifyToast>();\n  readonly toastDeleted = new Subject<number>();\n  private notifications: SnotifyToast[] = [];\n\n  constructor(@Inject('SnotifyToastConfig') public config: SnotifyDefaults) {}\n  /**\n   * emit changes in notifications array\n   */\n  private emit(): void {\n    this.emitter.next(this.notifications.slice());\n  }\n\n  /**\n   * returns SnotifyToast object\n   * @param id Number\n   * @return SnotifyToast|undefined\n   */\n  get(id: number): SnotifyToast {\n    return this.notifications.find(toast => toast.id === id);\n  }\n\n  /**\n   * add SnotifyToast to notifications array\n   * @param toast SnotifyToast\n   */\n  private add(toast: SnotifyToast): void {\n    if (this.config.global.filterDuplicates && this.containsToast(toast)) {\n      return;\n    }\n    if (this.config.global.newOnTop) {\n      this.notifications.unshift(toast);\n    } else {\n      this.notifications.push(toast);\n    }\n    this.emit();\n  }\n\n  /**\n   * checks if the toast is in the collection.\n   * @param inToast SnotifyToast\n   * @returns boolean\n   */\n  private containsToast(inToast: SnotifyToast): boolean {\n    return this.notifications.some(toast => toast.equals(inToast));\n  }\n\n  /**\n   * If ID passed, emits toast animation remove, if ID & REMOVE passed, removes toast from notifications array\n   * @param id number\n   * @param remove boolean\n   */\n  remove(id?: number, remove?: boolean): void {\n    if (!id) {\n      return this.clear();\n    } else if (remove) {\n      this.notifications = this.notifications.filter(toast => toast.id !== id);\n      return this.emit();\n    }\n    this.toastDeleted.next(id);\n  }\n\n  /**\n   * Clear notifications array\n   */\n  clear(): void {\n    this.notifications = [];\n    this.emit();\n  }\n\n  /**\n   * Creates toast and add it to array, returns toast id\n   * @param snotify Snotify\n   * @return number\n   */\n  create(snotify: Snotify): SnotifyToast {\n    const config = mergeDeep(this.config.toast, this.config.type[snotify.config.type], snotify.config);\n    const toast = new SnotifyToast(uuid(), snotify.title, snotify.body, config);\n    this.add(toast);\n    return toast;\n  }\n\n  setDefaults(defaults: SnotifyDefaults): SnotifyDefaults {\n    return (this.config = mergeDeep(this.config, defaults) as SnotifyDefaults);\n  }\n\n  /**\n   * Create toast with simple style returns toast id;\n   * @param body string\n   * @returns number\n   */\n  simple(body: string): SnotifyToast;\n  /**\n   * Create toast with simple style returns toast id;\n   * @param body string\n   * @param title string\n   * @returns number\n   */\n  simple(body: string, title: string): SnotifyToast;\n  /**\n   * Create toast with simple style returns toast id;\n   * @param body string\n   * @param config SnotifyToastConfig\n   * @returns number\n   */\n  simple(body: string, config: SnotifyToastConfig): SnotifyToast;\n  /**\n   * Create toast with simple style  returns toast id;\n   * @param [body] string\n   * @param [title] string\n   * @param [config] SnotifyToastConfig\n   * @returns number\n   */\n  simple(body: string, title: string, config: SnotifyToastConfig): SnotifyToast;\n  /**\n   * Transform toast arguments into Snotify object\n   */\n  @TransformArgument\n  /**\n   * Determines current toast type and collects default configuration\n   */\n  @SetToastType\n  simple(args: any): SnotifyToast {\n    return this.create(args);\n  }\n\n  /**\n   * Create toast with success style returns toast id;\n   * @param body string\n   * @returns number\n   */\n  success(body: string): SnotifyToast;\n  /**\n   * Create toast with success style returns toast id;\n   * @param body string\n   * @param title string\n   * @returns number\n   */\n  success(body: string, title: string): SnotifyToast;\n  /**\n   * Create toast with success style returns toast id;\n   * @param body string\n   * @param config SnotifyToastConfig\n   * @returns number\n   */\n  success(body: string, config: SnotifyToastConfig): SnotifyToast;\n  /**\n   * Create toast with success style  returns toast id;\n   * @param [body] string\n   * @param [title] string\n   * @param [config] SnotifyToastConfig\n   * @returns number\n   */\n  success(body: string, title: string, config: SnotifyToastConfig): SnotifyToast;\n  /**\n   * Transform toast arguments into Snotify object\n   */\n  @TransformArgument\n  /**\n   * Determines current toast type and collects default configuration\n   */\n  @SetToastType\n  success(args: any): SnotifyToast {\n    return this.create(args);\n  }\n\n  /**\n   * Create toast with error style returns toast id;\n   * @param body string\n   * @returns number\n   */\n  error(body: string): SnotifyToast;\n  /**\n   * Create toast with error style returns toast id;\n   * @param body string\n   * @param title string\n   * @returns number\n   */\n  error(body: string, title: string): SnotifyToast;\n  /**\n   * Create toast with error style returns toast id;\n   * @param body string\n   * @param config SnotifyToastConfig\n   * @returns number\n   */\n  error(body: string, config: SnotifyToastConfig): SnotifyToast;\n  /**\n   * Create toast with error style  returns toast id;\n   * @param [body] string\n   * @param [title] string\n   * @param [config] SnotifyToastConfig\n   * @returns number\n   */\n  error(body: string, title: string, config: SnotifyToastConfig): SnotifyToast;\n  /**\n   * Transform toast arguments into Snotify object\n   */\n  @TransformArgument\n  /**\n   * Determines current toast type and collects default configuration\n   */\n  @SetToastType\n  error(args: any): SnotifyToast {\n    return this.create(args);\n  }\n\n  /**\n   * Create toast with info style returns toast id;\n   * @param body string\n   * @returns number\n   */\n  info(body: string): SnotifyToast;\n  /**\n   * Create toast with info style returns toast id;\n   * @param body string\n   * @param title string\n   * @returns number\n   */\n  info(body: string, title: string): SnotifyToast;\n  /**\n   * Create toast with info style returns toast id;\n   * @param body string\n   * @param config SnotifyToastConfig\n   * @returns number\n   */\n  info(body: string, config: SnotifyToastConfig): SnotifyToast;\n  /**\n   * Create toast with info style  returns toast id;\n   * @param [body] string\n   * @param [title] string\n   * @param [config] SnotifyToastConfig\n   * @returns number\n   */\n  info(body: string, title: string, config: SnotifyToastConfig): SnotifyToast;\n  /**\n   * Transform toast arguments into Snotify object\n   */\n  @TransformArgument\n  /**\n   * Determines current toast type and collects default configuration\n   */\n  @SetToastType\n  info(args: any): SnotifyToast {\n    return this.create(args);\n  }\n\n  /**\n   * Create toast with warning style returns toast id;\n   * @param body string\n   * @returns number\n   */\n  warning(body: string): SnotifyToast;\n  /**\n   * Create toast with warning style returns toast id;\n   * @param body string\n   * @param title string\n   * @returns number\n   */\n  warning(body: string, title: string): SnotifyToast;\n  /**\n   * Create toast with warning style returns toast id;\n   * @param body string\n   * @param config SnotifyToastConfig\n   * @returns number\n   */\n  warning(body: string, config: SnotifyToastConfig): SnotifyToast;\n  /**\n   * Create toast with warning style  returns toast id;\n   * @param [body] string\n   * @param [title] string\n   * @param [config] SnotifyToastConfig\n   * @returns number\n   */\n  warning(body: string, title: string, config: SnotifyToastConfig): SnotifyToast;\n  /**\n   * Transform toast arguments into Snotify object\n   */\n  @TransformArgument\n  /**\n   * Determines current toast type and collects default configuration\n   */\n  @SetToastType\n  warning(args: any): SnotifyToast {\n    return this.create(args);\n  }\n\n  /**\n   * Create toast with confirm style returns toast id;\n   * @param body string\n   * @returns number\n   */\n  confirm(body: string): SnotifyToast;\n  /**\n   * Create toast with confirm style returns toast id;\n   * @param body string\n   * @param title string\n   * @returns number\n   */\n  confirm(body: string, title: string): SnotifyToast;\n  /**\n   * Create toast with confirm style returns toast id;\n   * @param body string\n   * @param config SnotifyToastConfig\n   * @returns number\n   */\n  confirm(body: string, config: SnotifyToastConfig): SnotifyToast;\n  /**\n   * Create toast with confirm style  returns toast id;\n   * @param [body] string\n   * @param [title] string\n   * @param [config] SnotifyToastConfig\n   * @returns number\n   */\n  confirm(body: string, title: string, config: SnotifyToastConfig): SnotifyToast;\n  /**\n   * Transform toast arguments into Snotify object\n   */\n  @TransformArgument\n  /**\n   * Determines current toast type and collects default configuration\n   */\n  @SetToastType\n  confirm(args: any): SnotifyToast {\n    return this.create(args);\n  }\n\n  /**\n   * Create toast with Prompt style with two buttons, returns toast id;\n   * @param body string\n   * @returns number\n   */\n  prompt(body: string): SnotifyToast;\n  /**\n   * Create toast with Prompt style with two buttons, returns toast id;\n   * @param body string\n   * @param title string\n   * @returns number\n   */\n  prompt(body: string, title: string): SnotifyToast;\n  /**\n   * Create toast with Prompt style with two buttons, returns toast id;\n   * @param body string\n   * @param config SnotifyToastConfig\n   * @returns number\n   */\n  prompt(body: string, config: SnotifyToastConfig): SnotifyToast;\n  /**\n   * Create toast with Prompt style with two buttons, returns toast id;\n   * @param [body] string\n   * @param [title] string\n   * @param [config] SnotifyToastConfig\n   * @returns number\n   */\n  prompt(body: string, title: string, config: SnotifyToastConfig): SnotifyToast;\n  /**\n   * Transform toast arguments into Snotify object\n   */\n  @TransformArgument\n  /**\n   * Determines current toast type and collects default configuration\n   */\n  @SetToastType\n  prompt(args: any): SnotifyToast {\n    return this.create(args);\n  }\n\n  /**\n   * Creates async toast with Info style. Pass action, and resolve or reject it.\n   * @param body string\n   * @param action Promise<Snotify> | Observable<Snotify>\n   * @returns number\n   */\n  async(body: string, action: Promise<Snotify> | Observable<Snotify>): SnotifyToast;\n  /**\n   * Creates async toast with Info style. Pass action, and resolve or reject it.\n   * @param body string\n   * @param title string\n   * @param action Promise<Snotify> | Observable<Snotify>\n   * @returns number\n   */\n  async(body: string, title: string, action: Promise<Snotify> | Observable<Snotify>): SnotifyToast;\n  /**\n   * Creates async toast with Info style. Pass action, and resolve or reject it.\n   * @param body string\n   * @param action Promise<Snotify> | Observable<Snotify>\n   * @param [config] SnotifyToastConfig\n   * @returns number\n   */\n  async(body: string, action: Promise<Snotify> | Observable<Snotify>, config: SnotifyToastConfig): SnotifyToast;\n  /**\n   * Creates async toast with Info style. Pass action, and resolve or reject it.\n   * @param body string\n   * @param title string\n   * @param action Promise<Snotify> | Observable<Snotify>\n   * @param [config] SnotifyToastConfig\n   * @returns number\n   */\n  async(\n    body: string,\n    title: string,\n    action: Promise<Snotify> | Observable<Snotify>,\n    config: SnotifyToastConfig\n  ): SnotifyToast;\n  /**\n   * Transform toast arguments into Snotify object\n   */\n  @TransformArgument\n  /**\n   * Determines current toast type and collects default configuration\n   */\n  @SetToastType\n  async(args: any): SnotifyToast {\n    let async: Observable<any>;\n    if (args.action instanceof Promise) {\n      async = from(args.action);\n    } else {\n      async = args.action;\n    }\n\n    const toast = this.create(args);\n\n    toast.on('mounted', () => {\n      const subscription: Subscription = async.subscribe(\n        (next?: Snotify) => {\n          this.mergeToast(toast, next);\n        },\n        (error?: Snotify) => {\n          this.mergeToast(toast, error, SnotifyStyle.error);\n          subscription.unsubscribe();\n        },\n        () => {\n          this.mergeToast(toast, {}, SnotifyStyle.success);\n          subscription.unsubscribe();\n        }\n      );\n    });\n\n    return toast;\n  }\n\n  private mergeToast(toast, next, type?: SnotifyTypeType) {\n    if (next.body) {\n      toast.body = next.body;\n    }\n    if (next.title) {\n      toast.title = next.title;\n    }\n    if (type) {\n      toast.config = mergeDeep(toast.config, this.config.global, this.config.toast[type], { type }, next.config);\n    } else {\n      toast.config = mergeDeep(toast.config, next.config);\n    }\n    if (next.html) {\n      toast.config.html = next.html;\n    }\n    this.emit();\n    this.toastChanged.next(toast);\n  }\n\n  /**\n   * Creates empty toast with html string inside\n   * @param html string | SafeHtml\n   * @param config SnotifyToastConfig\n   * @returns number\n   */\n  html(html: string | SafeHtml, config?: SnotifyToastConfig): SnotifyToast {\n    return this.create({\n      title: null,\n      body: null,\n      config: {\n        ...config,\n        ...{ html }\n      }\n    });\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/snotify.module.spec.ts",
    "content": "import { async, TestBed } from '@angular/core/testing';\nimport { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\n\ndescribe('SnotifyModule', () => {\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({\n      imports: [],\n      declarations: [],\n      schemas: [CUSTOM_ELEMENTS_SCHEMA]\n    }).compileComponents();\n  }));\n\n  it('should instanciate the module', () => {\n    expect(true).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/snotify.module.ts",
    "content": "import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { SnotifyComponent } from './components/snotify/snotify.component';\nimport { SnotifyService } from './services/snotify.service';\nimport { KeysPipe } from './pipes/keys.pipe';\nimport { TruncatePipe } from './pipes/truncate.pipe';\nimport { CommonModule } from '@angular/common';\nimport { ButtonsComponent } from './components/buttons/buttons.component';\nimport { PromptComponent } from './components/prompt/prompt.component';\nimport { ToastComponent } from './components/toast/toast.component';\n\n@NgModule({\n  imports: [CommonModule],\n  declarations: [SnotifyComponent, ToastComponent, TruncatePipe, ButtonsComponent, PromptComponent, KeysPipe],\n  exports: [SnotifyComponent, TruncatePipe, KeysPipe]\n})\nexport class SnotifyModule {\n  static forRoot(): ModuleWithProviders<SnotifyModule> {\n    return {\n      ngModule: SnotifyModule,\n      providers: [SnotifyService]\n    };\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/toast-defaults.ts",
    "content": "import { SnotifyPosition } from './enums/snotify-position.enum';\nimport { SnotifyStyle } from './enums/snotify-style.enum';\n\n/**\n * Snotify default configuration object\n */\nexport const ToastDefaults = {\n  global: {\n    newOnTop: true,\n    maxOnScreen: 8,\n    maxAtPosition: 8,\n    filterDuplicates: false\n  },\n  toast: {\n    type: SnotifyStyle.simple,\n    showProgressBar: true,\n    timeout: 2000,\n    closeOnClick: true,\n    pauseOnHover: true,\n    bodyMaxLength: 150,\n    titleMaxLength: 16,\n    backdrop: -1,\n    icon: null,\n    iconClass: null,\n    html: null,\n    position: SnotifyPosition.rightBottom,\n    animation: { enter: 'fadeIn', exit: 'fadeOut', time: 400 }\n  },\n  type: {\n    [SnotifyStyle.prompt]: {\n      timeout: 0,\n      closeOnClick: false,\n      buttons: [\n        { text: 'Ok', action: null, bold: true },\n        { text: 'Cancel', action: null, bold: false }\n      ],\n      placeholder: 'Enter answer here...',\n      type: SnotifyStyle.prompt\n    },\n    [SnotifyStyle.confirm]: {\n      timeout: 0,\n      closeOnClick: false,\n      buttons: [\n        { text: 'Ok', action: null, bold: true },\n        { text: 'Cancel', action: null, bold: false }\n      ],\n      type: SnotifyStyle.confirm\n    },\n    [SnotifyStyle.simple]: {\n      type: SnotifyStyle.simple\n    },\n    [SnotifyStyle.success]: {\n      type: SnotifyStyle.success\n    },\n    [SnotifyStyle.error]: {\n      type: SnotifyStyle.error\n    },\n    [SnotifyStyle.warning]: {\n      type: SnotifyStyle.warning\n    },\n    [SnotifyStyle.info]: {\n      type: SnotifyStyle.info\n    },\n    [SnotifyStyle.async]: {\n      pauseOnHover: false,\n      closeOnClick: false,\n      timeout: 0,\n      showProgressBar: false,\n      type: SnotifyStyle.async\n    }\n  }\n};\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/types/index.ts",
    "content": "export * from './snotify-event.type';\nexport * from './snotify-position.type';\nexport * from './snotify-type.type';\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/types/snotify-event.type.ts",
    "content": "/**\n * Toast event types\n */\nexport type SnotifyEventType =\n  | 'mounted'\n  | 'beforeShow'\n  | 'shown'\n  | 'input'\n  | 'click'\n  | 'mouseenter'\n  | 'mouseleave'\n  | 'beforeHide'\n  | 'hidden'\n  | 'destroyed';\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/types/snotify-position.type.ts",
    "content": "/**\n * Toast position types\n */\nexport type SnotifyPositionType =\n  | 'leftTop'\n  | 'leftCenter'\n  | 'leftBottom'\n  | 'rightTop'\n  | 'rightCenter'\n  | 'rightBottom'\n  | 'centerTop'\n  | 'centerCenter'\n  | 'centerBottom';\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/types/snotify-type.type.ts",
    "content": "export type SnotifyTypeType = 'simple' | 'success' | 'error' | 'warning' | 'info' | 'async' | 'confirm' | 'prompt';\n"
  },
  {
    "path": "projects/ng-snotify/src/lib/utils.ts",
    "content": "/**\n * Generates random id\n * @return number\n */\nexport function uuid(): number {\n  return Math.floor(Math.random() * (Date.now() - 1)) + 1;\n}\n\n/**\n * Simple is object check.\n * @param item Object<any>\n * @returns boolean\n */\nexport function isObject(item): boolean {\n  return item && typeof item === 'object' && !Array.isArray(item);\n}\n\n/**\n * Deep merge objects.\n * @param sources Array<Object<any>>\n * @returns Object<any>\n */\nexport function mergeDeep(...sources) {\n  const target = {};\n  if (!sources.length) {\n    return target;\n  }\n\n  while (sources.length > 0) {\n    const source = sources.shift();\n    if (isObject(source)) {\n      for (const key in source) {\n        if (isObject(source[key])) {\n          target[key] = mergeDeep(target[key], source[key]);\n        } else {\n          Object.assign(target, { [key]: source[key] });\n        }\n      }\n    }\n  }\n  return target;\n}\n\nexport function animate(start: number, duration: number, callback: (currentValue: number, progress: number) => {}) {\n  let endTime;\n  requestAnimationFrame(timestamp => (endTime = timestamp + duration));\n  const calculate = () => {\n    requestAnimationFrame(timestamp => {\n      const runtime = timestamp - endTime;\n      const progress = Math.min(runtime / duration, 1) + start;\n      if (runtime < duration) {\n        if (callback(+(100 * progress).toFixed(2), progress)) {\n          calculate();\n        }\n      }\n    });\n  };\n}\n"
  },
  {
    "path": "projects/ng-snotify/src/public-api.ts",
    "content": "/*\n * Public API Surface of ng-snotify\n */\n\nexport * from './lib/components';\nexport * from './lib/enums';\nexport * from './lib/interfaces';\nexport * from './lib/models';\nexport * from './lib/pipes';\nexport * from './lib/services';\nexport * from './lib/snotify.module';\nexport * from './lib/toast-defaults';\nexport * from './lib/types';\n"
  },
  {
    "path": "projects/ng-snotify/src/test.ts",
    "content": "// This file is required by karma.conf.js and loads recursively all the .spec and framework files\n\nimport 'zone.js/dist/zone';\nimport 'zone.js/dist/zone-testing';\nimport { getTestBed } from '@angular/core/testing';\nimport { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing';\n\ndeclare const require: any;\n\n// First, initialize the Angular testing environment.\ngetTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting());\n// Then we find all the tests.\nconst context = require.context('./', true, /\\.spec\\.ts$/);\n// And load the modules.\ncontext.keys().map(context);\n"
  },
  {
    "path": "projects/ng-snotify/styles/_shared/animations.scss",
    "content": "$animation-name: \"fade\";\n\n.snotifyToast {\n  animation-fill-mode: both;\n}\n\n.snotify-leftTop,\n.snotify-leftCenter,\n.snotify-leftBottom {\n  .#{$animation-name}In {\n    animation-name: fadeInLeft;\n  }\n  .#{$animation-name}Out {\n    animation-name: fadeOutLeft;\n  }\n}\n\n.snotify-rightTop,\n.snotify-rightCenter,\n.snotify-rightBottom {\n  .#{$animation-name}In {\n    animation-name: fadeInRight;\n  }\n  .#{$animation-name}Out {\n    animation-name: fadeOutRight;\n  }\n}\n\n.snotify-centerTop {\n  .#{$animation-name}In {\n    animation-name: fadeInDown;\n  }\n  .#{$animation-name}Out {\n    animation-name: fadeOutUp;\n  }\n}\n.snotify-centerCenter {\n  .#{$animation-name}In {\n    animation-name: fadeIn;\n  }\n  .#{$animation-name}Out {\n    animation-name: fadeOut;\n  }\n}\n.snotify-centerBottom {\n  .#{$animation-name}In {\n    animation-name: fadeInUp;\n  }\n  .#{$animation-name}Out {\n    animation-name: fadeOutDown;\n  }\n}\n\n// Fade in\n\n@keyframes fadeInLeft {\n  0% {\n    opacity: 0;\n    transform: translate3d(-100%, 0, 0) scaleX(1.2);\n  }\n\n  100% {\n    opacity: 1;\n    transform: none;\n  }\n}\n\n@keyframes fadeInRight {\n  0% {\n    opacity: 0;\n    transform: translate3d(100%, 0, 0) scaleX(1.2);\n  }\n\n  100% {\n    opacity: 1;\n    transform: none;\n  }\n}\n\n@keyframes fadeInUp {\n  0% {\n    opacity: 0;\n    transform: translate3d(0, 100%, 0) scaleY(1.2);\n  }\n\n  100% {\n    opacity: 1;\n    transform: none;\n  }\n}\n\n@keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    transform: translate3d(0, -100%, 0) scaleY(1.2);\n  }\n\n  100% {\n    opacity: 1;\n    transform: none;\n  }\n}\n\n@keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n\n// Fade out\n\n@keyframes fadeOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n\n@keyframes fadeOutDown {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    transform: translate3d(0, 100%, 0);\n  }\n}\n\n@keyframes fadeOutLeft {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n\n@keyframes fadeOutRight {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    transform: translate3d(100%, 0, 0);\n  }\n}\n\n@keyframes fadeOutUp {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    transform: translate3d(0, -100%, 0);\n  }\n}\n\n// Toast collapse\n\n@keyframes appear {\n  0% {\n    max-height: 0;\n  }\n\n  100% {\n    max-height: 50vh;\n  }\n}\n\n@keyframes disappear {\n  0% {\n    max-height: 50vh;\n  }\n\n  100% {\n    max-height: 0;\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/_shared/icons.scss",
    "content": "/// Replace `$search` with `$replace` in `$string`\n/// @author Hugo Giraudel\n/// @param String $string - Initial string\n/// @param String $search - Substring to replace\n/// @param String $replace ('') - New value\n/// @return String - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n  $index: str-index($string, $search);\n\n  @if $index {\n    @return str-slice($string, 1, $index - 1) + $replace +\n      str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n  }\n\n  @return $string;\n}\n\n@function -svg($svg, $color, $viewBox: \"0 0 512 512\") {\n  $result: 'data:image/svg+xml;charset=UTF-8,<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" x=\"0px\" y=\"0px\" viewBox=\"#{$viewBox}\" fill=\"#{$color}\">#{$svg}</svg>';\n  $result: str-replace($result, \"%\", \"%25\");\n  $result: str-replace($result, '\"', \"%22\");\n  $result: str-replace($result, \"'\", \"%27\");\n  $result: str-replace($result, \" \", \"%20\");\n  $result: str-replace($result, \"<\", \"%3C\");\n  $result: str-replace($result, \">\", \"%3E\");\n  $result: str-replace($result, \"#\", \"%23\");\n\n  @return $result;\n}\n\n@function -generate-icons($colors-map) {\n  @return (\n    error: -svg('<g><path d=\"M437,75A256,256,0,1,0,75,437,256,256,0,1,0,437,75ZM416.43,416.43a226.82,226.82,0,0,1-320.86,0C7.11,328,7.11,184,95.57,95.57a226.82,226.82,0,0,1,320.86,0C504.89,184,504.89,328,416.43,416.43Z\"/><path d=\"M368.81,143.19a14.5,14.5,0,0,0-20.58,0L256,235.42l-92.23-92.23a14.55,14.55,0,0,0-20.58,20.58L235.42,256l-92.23,92.23a14.6,14.6,0,0,0,10.24,24.89,14.19,14.19,0,0,0,10.24-4.31l92.23-92.23,92.23,92.23a14.64,14.64,0,0,0,10.24,4.31,14,14,0,0,0,10.24-4.31,14.5,14.5,0,0,0,0-20.58l-92-92.23,92.23-92.23A14.5,14.5,0,0,0,368.81,143.19Z\"/></g>', map-get($colors-map, error)),\n    warning: -svg('<g><path d=\"M256,512c141.15,0,256-114.84,256-256S397.15,0,256,0,0,114.84,0,256,114.85,512,256,512Zm0-480.49c123.79,0,224.49,100.71,224.49,224.49S379.79,480.49,256,480.49,31.51,379.79,31.51,256,132.21,31.51,256,31.51Z\"/><circle cx=\"260.08\" cy=\"343.87\" r=\"26.35\"/><path d=\"M254.68,278.39a15.76,15.76,0,0,0,15.75-15.75V128.72a15.75,15.75,0,1,0-31.51,0V262.63A15.76,15.76,0,0,0,254.68,278.39Z\"/></g>', map-get($colors-map, warning)),\n    info: -svg('<g><path d=\"M256,0C114.84,0,0,114.84,0,256S114.84,512,256,512,512,397.16,512,256,397.15,0,256,0Zm0,478.43C133.35,478.43,33.57,378.64,33.57,256S133.35,33.58,256,33.58,478.42,133.36,478.42,256,378.64,478.43,256,478.43Z\"/><path d=\"M251.26,161.24a22.39,22.39,0,1,0-22.38-22.39A22.39,22.39,0,0,0,251.26,161.24Z\"/><path d=\"M286.84,357.87h-14v-160A16.79,16.79,0,0,0,256,181.05H225.17a16.79,16.79,0,0,0,0,33.58h14.05V357.87H225.17a16.79,16.79,0,0,0,0,33.57h61.67a16.79,16.79,0,1,0,0-33.57Z\"/></g>', map-get($colors-map, info)),\n    success: -svg('<g><path d=\"M256,0C114.85,0,0,114.84,0,256S114.85,512,256,512,512,397.16,512,256,397.15,0,256,0Zm0,492.31c-130.29,0-236.31-106-236.31-236.31S125.71,19.69,256,19.69,492.31,125.71,492.31,256,386.29,492.31,256,492.31Z\"/><path class=\"cls-1\" d=\"M376.64,151,225.31,321.24l-91.17-72.93a9.85,9.85,0,0,0-12.3,15.38l98.46,78.77a9.86,9.86,0,0,0,13.52-1.15L391.36,164.08A9.85,9.85,0,0,0,376.64,151Z\"/></g>', map-get($colors-map, success)),\n    async: -svg('<g><path d=\"M256,0a32,32,0,0,0-32,32V96a32,32,0,0,0,64,0V32A32,32,0,0,0,256,0Zm0,384a32,32,0,0,0-32,32v64a32,32,0,0,0,64,0V416A32,32,0,0,0,256,384ZM391.74,165.5,437,120.22A32,32,0,0,0,391.74,75L346.5,120.22a32,32,0,0,0,45.25,45.28Zm-271.52,181L75,391.74A32,32,0,0,0,120.22,437l45.25-45.25a32,32,0,0,0-45.25-45.25Zm0-271.52A32,32,0,1,0,75,120.22l45.25,45.28a32,32,0,1,0,45.25-45.28ZM391.74,346.5a32,32,0,0,0-45.25,45.25L391.74,437A32,32,0,0,0,437,391.74ZM480,224H416a32,32,0,0,0,0,64h64a32,32,0,0,0,0-64ZM128,256a32,32,0,0,0-32-32H32a32,32,0,0,0,0,64H96A32,32,0,0,0,128,256Z\"/></g>', map-get($colors-map, async))\n  );\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/dark/buttons.scss",
    "content": ".snotifyToast__buttons {\n  display: flex;\n  flex-flow: row nowrap;\n  justify-content: space-between;\n  border-top: 1px solid rgba(255, 255, 255, 0.1);\n  button {\n    position: relative;\n    width: 100%;\n    border-right: 1px solid rgba(255, 255, 255, 0.1);\n    border-left: 1px solid rgba(255, 255, 255, 0.1);\n    border-top: none;\n    border-bottom: none;\n    background: transparent;\n    padding: 8px;\n    text-transform: capitalize;\n    color: #fff;\n\n    &:hover,\n    &:focus {\n      background: rgba(255, 255, 255, 0.1);\n      outline: none;\n    }\n\n    &:active {\n      background: rgba(255, 255, 255, 0.15);\n    }\n\n    &:last-child {\n      border-right: none;\n    }\n\n    &:first-child {\n      border-left: none;\n    }\n  }\n\n  &--bold {\n    font-weight: 700;\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/dark/icon.scss",
    "content": "$success: #4caf50;\n$info: #1e88e5;\n$warning: #ff9800;\n$error: #f44336;\n$async: $info;\n\n$icons: -generate-icons(\n  (\n    error: $error,\n    warning: $warning,\n    info: $info,\n    success: $success,\n    async: $async\n  )\n);\n\n.snotify-icon {\n  width: 100%;\n  height: 100%;\n  position: absolute;\n  right: 10px;\n  top: 50%;\n  line-height: 0;\n  transform: translate(0, -50%);\n  max-height: 48px;\n  max-width: 48px;\n}\n\n.snotify-icon--error {\n  background-image: url(\"#{map-get($icons, error)}\");\n}\n\n.snotify-icon--warning {\n  background-image: url(\"#{map-get($icons, warning)}\");\n}\n\n.snotify-icon--info {\n  background-image: url(\"#{map-get($icons, info)}\");\n}\n\n.snotify-icon--success {\n  background-image: url(\"#{map-get($icons, success)}\");\n}\n\n.snotify-icon--async {\n  background-image: url(\"#{map-get($icons, async)}\");\n  animation: async 3s infinite linear;\n  transform-origin: 50% 50%;\n}\n\n@keyframes async {\n  0% {\n    -webkit-transform: translate(0, -50%) rotate(0deg);\n    transform: translate(0, -50%) rotate(0deg);\n  }\n  100% {\n    -webkit-transform: translate(0, -50%) rotate(360deg);\n    transform: translate(0, -50%) rotate(360deg);\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/dark/prompt.scss",
    "content": ".snotifyToast__input {\n  position: relative;\n  z-index: 1;\n  display: inline-block;\n  margin: 0;\n  width: 100%;\n  vertical-align: top;\n  transition: all 0.5s;\n  transition-delay: 0.3s;\n  transition-timing-function: cubic-bezier(0.2, 1, 0.3, 1);\n\n  &__field {\n    position: relative;\n    display: block;\n    float: right;\n    padding: 0.85em 0.5em;\n    width: 100%;\n    border: none;\n    border-radius: 0;\n    background: transparent;\n    color: #333;\n    font-weight: bold;\n    -webkit-appearance: none; /* for box shadows to show on iOS */\n    opacity: 0;\n    transition: opacity 0.3s;\n\n    &:focus {\n      outline: none;\n    }\n  }\n\n  &__label {\n    display: inline-block;\n    float: right;\n    padding: 0 0.85em;\n    width: 100%;\n    color: #999;\n    font-weight: bold;\n    font-size: 70.25%;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    -webkit-touch-callout: none;\n    -webkit-user-select: none;\n    -khtml-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n    position: absolute;\n    left: 0;\n    height: 100%;\n    text-align: left;\n    pointer-events: none;\n\n    &::before,\n    &::after {\n      content: \"\";\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      transition: transform 0.3s;\n    }\n\n    &::before {\n      border-top: 2px solid #4c4c4c;\n      transform: translate3d(0, 100%, 0) translate3d(0, -2px, 0);\n      transition-delay: 0.3s;\n    }\n\n    &::after {\n      z-index: -1;\n      background: #eee;\n      transform: scale3d(1, 0, 1);\n      transform-origin: 50% 0;\n    }\n  }\n\n  &__labelContent {\n    position: relative;\n    display: block;\n    padding: 1em 0;\n    width: 100%;\n    transition: transform 0.3s 0.3s;\n  }\n}\n\n.snotifyToast__input--filled {\n  margin-top: 2.5em;\n\n  &:focus,\n  .snotifyToast__input__field {\n    opacity: 1;\n    transition-delay: 0.3s;\n  }\n}\n\n.snotifyToast__input__field:focus + .snotifyToast__input__label .snotifyToast__input__labelContent,\n.snotifyToast__input--filled .snotifyToast__input__labelContent {\n  transform: translate(0, -80%);\n  transition-timing-function: cubic-bezier(0.2, 1, 0.3, 1);\n}\n\n.snotifyToast__input__field:focus + .snotifyToast__input__label::before,\n.snotifyToast__input--filled .snotifyToast__input__label::before {\n  transition-delay: 0s;\n}\n\n.snotifyToast__input__field:focus + .snotifyToast__input__label::before,\n.snotifyToast__input--filled .snotifyToast__input__label::before {\n  transform: translate(0, 0);\n}\n\n.snotifyToast__input__field:focus + .snotifyToast__input__label::after,\n.snotifyToast__input--filled .snotifyToast__input__label::after {\n  transform: scale(1, 1);\n  transition-delay: 0.3s;\n  transition-timing-function: cubic-bezier(0.2, 1, 0.3, 1);\n}\n\n.snotifyToast {\n  &--invalid {\n    .snotifyToast__input__label::before {\n      border-color: $error;\n    }\n  }\n  &--valid {\n    .snotifyToast__input__label::before {\n      border-color: $success;\n    }\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/dark/snotify.scss",
    "content": "$backdrop-color: #000000;\n$snotify-width: auto !default;\n\n@if $snotify-width == auto {\n  $snotify-width: 300px;\n}\n\n.snotify {\n  display: block;\n  position: fixed;\n  width: $snotify-width;\n  z-index: 9999;\n  box-sizing: border-box;\n  pointer-events: none;\n  * {\n    box-sizing: border-box;\n  }\n}\n\n.snotify-leftTop,\n.snotify-leftCenter,\n.snotify-leftBottom {\n  left: 10px;\n}\n\n.snotify-rightTop,\n.snotify-rightCenter,\n.snotify-rightBottom {\n  right: 10px;\n}\n\n.snotify-centerTop,\n.snotify-centerCenter,\n.snotify-centerBottom {\n  left: calc(50% - #{$snotify-width} / 2);\n}\n\n.snotify-leftTop,\n.snotify-centerTop,\n.snotify-rightTop {\n  top: 10px;\n}\n.snotify-leftCenter,\n.snotify-rightCenter,\n.snotify-centerCenter {\n  top: 50%;\n  transform: translateY(-50%);\n}\n.snotify-leftBottom,\n.snotify-rightBottom,\n.snotify-centerBottom {\n  bottom: 10px;\n}\n\n.snotify-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: $backdrop-color;\n  opacity: 0;\n  z-index: 9998;\n  transition: opacity 0.3s;\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/dark/toast.scss",
    "content": "$toast-bg: rgba(0, 0, 0, 0.9);\n$toast-color: #fff;\n$toast-progressBar: #000;\n$toast-progressBarPercentage: #4c4c4c;\n\n$snotify-title-font-size: auto !default;\n$snotify-body-font-size: auto !default;\n\n@if $snotify-title-font-size == auto {\n  $snotify-title-font-size: 1.8em;\n}\n\n@if $snotify-body-font-size == auto {\n  $snotify-body-font-size: 1em;\n}\n\n.snotifyToast {\n  display: block;\n  cursor: pointer;\n  background-color: $toast-bg;\n  max-height: 300px;\n  height: 100%;\n  margin: 5px;\n  opacity: 0;\n  overflow: hidden;\n  pointer-events: auto;\n\n  &--in {\n    animation-name: appear;\n  }\n\n  &--out {\n    animation-name: disappear;\n  }\n\n  &__inner {\n    display: flex;\n    flex-flow: column nowrap;\n    align-items: flex-start;\n    justify-content: center;\n    position: relative;\n    padding: 5px 65px 5px 15px;\n    min-height: 78px;\n    font-size: 16px;\n    color: $toast-color;\n  }\n\n  &__progressBar {\n    position: relative;\n    width: 100%;\n    height: 5px;\n    background-color: $toast-progressBar;\n\n    &__percentage {\n      position: absolute;\n      top: 0;\n      left: 0;\n      height: 5px;\n      background-color: $toast-progressBarPercentage;\n      max-width: 100%;\n    }\n  }\n\n  &__title {\n    font-size: $snotify-title-font-size;\n    line-height: 1.2em;\n    margin-bottom: 5px;\n    color: $toast-color;\n  }\n\n  &__body {\n    font-size: $snotify-body-font-size;\n    color: $toast-color;\n  }\n}\n\n.snotifyToast-show {\n  transform: translate(0, 0);\n  opacity: 1;\n}\n\n.snotifyToast-remove {\n  max-height: 0;\n  overflow: hidden;\n  transform: translate(0, 50%);\n  opacity: 0;\n}\n\n/***************\n ** Modifiers **\n **************/\n\n.snotify-prompt {\n  ng-snotify-prompt {\n    width: 100%;\n  }\n}\n\n.snotify-confirm,\n.snotify-prompt {\n  .snotifyToast__inner {\n    padding: 10px 15px;\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/dark.scss",
    "content": "@import \"_shared/icons\";\n@import \"_shared/animations\";\n\n@import \"dark/snotify\";\n@import \"dark/toast\";\n@import \"dark/buttons\";\n@import \"dark/icon\";\n@import \"dark/prompt\";\n"
  },
  {
    "path": "projects/ng-snotify/styles/material/buttons.scss",
    "content": ".snotifyToast__buttons {\n  display: flex;\n  flex-flow: row nowrap;\n  justify-content: space-between;\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n  button {\n    position: relative;\n    width: 100%;\n    border-right: 1px solid rgba(0, 0, 0, 0.1);\n    border-left: 1px solid rgba(0, 0, 0, 0.1);\n    border-top: none;\n    border-bottom: none;\n    background: transparent;\n    padding: 8px;\n    text-transform: capitalize;\n    color: #fff;\n    box-sizing: border-box;\n    overflow: hidden;\n\n    &::after {\n      content: \"\";\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      width: 5px;\n      height: 5px;\n      background: rgba(255, 255, 255, 0.3);\n      opacity: 0;\n      border-radius: 100%;\n      transform: scale(1, 1) translate(-50%);\n      transform-origin: 50% 50%;\n    }\n\n    &:focus:not(:active)::after {\n      animation: ripple 1s ease-out;\n    }\n\n    &:hover,\n    &:focus {\n      background: rgba(0, 0, 0, 0.1);\n      outline: none;\n    }\n\n    &:active {\n      background: rgba(0, 0, 0, 0.15);\n    }\n\n    &:last-child {\n      border-right: none;\n    }\n\n    &:first-child {\n      border-left: none;\n    }\n  }\n\n  &--bold {\n    font-weight: 700;\n  }\n}\n\n@keyframes ripple {\n  0% {\n    transform: scale(0, 0);\n    opacity: 1;\n  }\n  20% {\n    transform: scale(25, 25);\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    transform: scale(40, 40);\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/material/icon.scss",
    "content": "$success: #c8e6c9;\n$info: #bbdefb;\n$warning: #ffccbc;\n$error: #ffcdd2;\n$async: $info;\n\n$icons: -generate-icons(\n  (\n    error: $error,\n    warning: $warning,\n    info: $info,\n    success: $success,\n    async: $async\n  )\n);\n\n.snotify-icon {\n  width: 100%;\n  height: 100%;\n  position: absolute;\n  right: 10px;\n  top: 50%;\n  line-height: 0;\n  transform: translate(0, -50%);\n  max-height: 48px;\n  max-width: 48px;\n}\n\n.snotify-icon--error {\n  background-image: url(\"#{map-get($icons, error)}\");\n}\n\n.snotify-icon--warning {\n  background-image: url(\"#{map-get($icons, warning)}\");\n}\n\n.snotify-icon--info {\n  background-image: url(\"#{map-get($icons, info)}\");\n}\n\n.snotify-icon--success {\n  background-image: url(\"#{map-get($icons, success)}\");\n}\n\n.snotify-icon--async {\n  background-image: url(\"#{map-get($icons, async)}\");\n  animation: async 3s infinite linear;\n  transform-origin: 50% 50%;\n}\n\n@keyframes async {\n  0% {\n    -webkit-transform: translate(0, -50%) rotate(0deg);\n    transform: translate(0, -50%) rotate(0deg);\n  }\n  100% {\n    -webkit-transform: translate(0, -50%) rotate(360deg);\n    transform: translate(0, -50%) rotate(360deg);\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/material/prompt.scss",
    "content": ".snotifyToast__input {\n  position: relative;\n  z-index: 1;\n  display: inline-block;\n  margin: 0;\n  width: 100%;\n  vertical-align: top;\n  transition: all 0.5s;\n  transition-delay: 0.3s;\n  transition-timing-function: cubic-bezier(0.2, 1, 0.3, 1);\n\n  &__field {\n    position: relative;\n    display: block;\n    float: right;\n    padding: 0.85em 0.5em;\n    width: 100%;\n    border: none;\n    border-radius: 0;\n    background: transparent;\n    color: #333;\n    font-weight: bold;\n    -webkit-appearance: none; /* for box shadows to show on iOS */\n    opacity: 0;\n    transition: opacity 0.3s;\n\n    &:focus {\n      outline: none;\n    }\n  }\n\n  &__label {\n    display: inline-block;\n    float: right;\n    padding: 0 0.85em;\n    width: 100%;\n    color: #e0f2f1;\n    font-weight: bold;\n    font-size: 70.25%;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    -webkit-touch-callout: none;\n    -webkit-user-select: none;\n    -khtml-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n    position: absolute;\n    left: 0;\n    height: 100%;\n    text-align: left;\n    pointer-events: none;\n\n    &::before,\n    &::after {\n      content: \"\";\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      transition: transform 0.3s;\n    }\n\n    &::before {\n      border-top: 2px solid #fff;\n      transform: translate3d(0, 100%, 0) translate3d(0, -2px, 0);\n      transition-delay: 0.3s;\n    }\n\n    &::after {\n      z-index: -1;\n      background: #b2dfdb;\n      transform: scale3d(1, 0, 1);\n      transform-origin: 50% 0;\n    }\n  }\n\n  &__labelContent {\n    position: relative;\n    display: block;\n    padding: 1em 0;\n    width: 100%;\n    transition: transform 0.3s 0.3s;\n  }\n}\n\n.snotifyToast__input--filled {\n  margin-top: 2.5em;\n\n  &:focus,\n  .snotifyToast__input__field {\n    opacity: 1;\n    transition-delay: 0.3s;\n  }\n}\n\n.snotifyToast__input__field:focus + .snotifyToast__input__label .snotifyToast__input__labelContent,\n.snotifyToast__input--filled .snotifyToast__input__labelContent {\n  transform: translate(0, -80%);\n  transition-timing-function: cubic-bezier(0.2, 1, 0.3, 1);\n}\n\n.snotifyToast__input__field:focus + .snotifyToast__input__label::before,\n.snotifyToast__input--filled .snotifyToast__input__label::before {\n  transition-delay: 0s;\n}\n\n.snotifyToast__input__field:focus + .snotifyToast__input__label::before,\n.snotifyToast__input--filled .snotifyToast__input__label::before {\n  transform: translate(0, 0);\n}\n\n.snotifyToast__input__field:focus + .snotifyToast__input__label::after,\n.snotifyToast__input--filled .snotifyToast__input__label::after {\n  transform: scale(1, 1);\n  transition-delay: 0.3s;\n  transition-timing-function: cubic-bezier(0.2, 1, 0.3, 1);\n}\n\n.snotifyToast {\n  &--invalid {\n    .snotifyToast__input__label::before {\n      border-color: $error-bg;\n    }\n  }\n\n  &--valid {\n    .snotifyToast__input__label::before {\n      border-color: $success-bg;\n    }\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/material/snotify.scss",
    "content": "$backdrop-color: #000000;\n$snotify-width: auto !default;\n\n@if $snotify-width == auto {\n  $snotify-width: 300px;\n}\n\n.snotify {\n  display: block;\n  position: fixed;\n  width: $snotify-width;\n  z-index: 9999;\n  box-sizing: border-box;\n  pointer-events: none;\n  * {\n    box-sizing: border-box;\n  }\n}\n\n.snotify-leftTop,\n.snotify-leftCenter,\n.snotify-leftBottom {\n  left: 10px;\n}\n\n.snotify-rightTop,\n.snotify-rightCenter,\n.snotify-rightBottom {\n  right: 10px;\n}\n\n.snotify-centerTop,\n.snotify-centerCenter,\n.snotify-centerBottom {\n  left: calc(50% - #{$snotify-width} / 2);\n}\n\n.snotify-leftTop,\n.snotify-centerTop,\n.snotify-rightTop {\n  top: 10px;\n}\n.snotify-leftCenter,\n.snotify-rightCenter,\n.snotify-centerCenter {\n  top: 50%;\n  transform: translateY(-50%);\n}\n.snotify-leftBottom,\n.snotify-rightBottom,\n.snotify-centerBottom {\n  bottom: 10px;\n}\n\n.snotify-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: $backdrop-color;\n  opacity: 0;\n  z-index: 9998;\n  transition: opacity 0.3s;\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/material/toast.scss",
    "content": "$simple-bg: #fff;\n$simple-color: #000;\n$simple-progressBar: #c7c7c7;\n$simple-progressBarPercentage: #4c4c4c;\n\n$success-bg: #4caf50;\n$success-color: #c8e6c9;\n$success-progressBar: #388e3c;\n$success-progressBarPercentage: #81c784;\n\n$info-bg: #1e88e5;\n$info-color: #e3f2fd;\n$info-progressBar: #1565c0;\n$info-progressBarPercentage: #64b5f6;\n\n$warning-bg: #ff9800;\n$warning-color: #fff3e0;\n$warning-progressBar: #ef6c00;\n$warning-progressBarPercentage: #ffcc80;\n\n$error-bg: #f44336;\n$error-color: #ffebee;\n$error-progressBar: #c62828;\n$error-progressBarPercentage: #ef9a9a;\n\n$async-bg: $info-bg;\n$async-color: $info-color;\n$async-progressBar: $info-progressBar;\n$async-progressBarPercentage: $info-progressBarPercentage;\n\n$confirm-bg: #009688;\n$confirm-color: #e0f2f1;\n$confirm-progressBar: #4db6ac;\n$confirm-progressBarPercentage: #80cbc4;\n\n$prompt-bg: #009688;\n$prompt-color: #e0f2f1;\n\n$snotify-title-font-size: auto !default;\n$snotify-body-font-size: auto !default;\n\n@if $snotify-title-font-size == auto {\n  $snotify-title-font-size: 1.8em;\n}\n\n@if $snotify-body-font-size == auto {\n  $snotify-body-font-size: 1em;\n}\n\n.snotifyToast {\n  display: block;\n  cursor: pointer;\n  background-color: $simple-bg;\n  height: 100%;\n  margin: 5px;\n  opacity: 0;\n  border-radius: 5px;\n  overflow: hidden;\n  pointer-events: auto;\n\n  &--in {\n    animation-name: appear;\n  }\n\n  &--out {\n    animation-name: disappear;\n  }\n\n  &__inner {\n    display: flex;\n    flex-flow: column nowrap;\n    align-items: flex-start;\n    justify-content: center;\n    position: relative;\n    padding: 5px 65px 5px 15px;\n    min-height: 78px;\n    font-size: 16px;\n    color: $simple-color;\n  }\n\n  &__progressBar {\n    position: relative;\n    width: 100%;\n    height: 10px;\n    background-color: $simple-progressBar;\n\n    &__percentage {\n      position: absolute;\n      top: 0;\n      left: 0;\n      height: 10px;\n      background-color: $simple-progressBarPercentage;\n      max-width: 100%;\n    }\n  }\n\n  &__title {\n    font-size: $snotify-title-font-size;\n    line-height: 1.2em;\n    margin-bottom: 5px;\n    color: #fff;\n  }\n\n  &__body {\n    font-size: $snotify-body-font-size;\n  }\n}\n\n.snotifyToast-show {\n  transform: translate(0, 0);\n  opacity: 1;\n}\n\n.snotifyToast-remove {\n  max-height: 0;\n  overflow: hidden;\n  transform: translate(0, 50%);\n  opacity: 0;\n}\n\n.fadeOutRight {\n  animation-name: fadeOutRight;\n}\n\n/***************\n ** Modifiers **\n **************/\n\n.snotify-simple {\n  .snotifyToast__title,\n  .snotifyToast__body {\n    color: $simple-color;\n  }\n}\n\n.snotify-success {\n  background-color: $success-bg;\n  .snotifyToast__progressBar {\n    background-color: $success-progressBar;\n  }\n  .snotifyToast__progressBar__percentage {\n    background-color: $success-progressBarPercentage;\n  }\n  .snotifyToast__body {\n    color: $success-color;\n  }\n}\n\n.snotify-info {\n  background-color: $info-bg;\n  .snotifyToast__progressBar {\n    background-color: $info-progressBar;\n  }\n  .snotifyToast__progressBar__percentage {\n    background-color: $info-progressBarPercentage;\n  }\n  .snotifyToast__body {\n    color: $info-color;\n  }\n}\n\n.snotify-warning {\n  background-color: $warning-bg;\n  .snotifyToast__progressBar {\n    background-color: $warning-progressBar;\n  }\n  .snotifyToast__progressBar__percentage {\n    background-color: $warning-progressBarPercentage;\n  }\n  .snotifyToast__body {\n    color: $warning-color;\n  }\n}\n\n.snotify-error {\n  background-color: $error-bg;\n  .snotifyToast__progressBar {\n    background-color: $error-progressBar;\n  }\n  .snotifyToast__progressBar__percentage {\n    background-color: $error-progressBarPercentage;\n  }\n  .snotifyToast__body {\n    color: $error-color;\n  }\n}\n\n.snotify-async {\n  background-color: $async-bg;\n  .snotifyToast__progressBar {\n    background-color: $async-progressBar;\n  }\n  .snotifyToast__progressBar__percentage {\n    background-color: $async-progressBarPercentage;\n  }\n  .snotifyToast__body {\n    color: $async-color;\n  }\n}\n\n.snotify-confirm {\n  background-color: $confirm-bg;\n  .snotifyToast__progressBar {\n    background-color: $confirm-progressBar;\n  }\n  .snotifyToast__progressBar__percentage {\n    background-color: $confirm-progressBarPercentage;\n  }\n  .snotifyToast__body {\n    color: $confirm-color;\n  }\n}\n\n.snotify-prompt {\n  background-color: $prompt-bg;\n  ng-snotify-prompt {\n    width: 100%;\n  }\n  .snotifyToast__title {\n    margin-bottom: 0;\n  }\n  .snotifyToast__body {\n    color: $prompt-color;\n  }\n}\n\n.snotify-confirm,\n.snotify-prompt {\n  .snotifyToast__inner {\n    padding: 10px 15px;\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/material.scss",
    "content": "@import \"_shared/icons\";\n@import \"_shared/animations\";\n\n@import \"material/snotify\";\n@import \"material/toast\";\n@import \"material/prompt\";\n@import \"material/buttons\";\n@import \"material/icon\";\n"
  },
  {
    "path": "projects/ng-snotify/styles/simple/buttons.scss",
    "content": ".snotifyToast__buttons {\n  display: flex;\n  flex-flow: row nowrap;\n  justify-content: space-between;\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n  button {\n    position: relative;\n    width: 100%;\n    border-right: 1px solid rgba(0, 0, 0, 0.1);\n    border-left: 1px solid rgba(0, 0, 0, 0.1);\n    border-top: none;\n    border-bottom: none;\n    background: transparent;\n    padding: 8px;\n    text-transform: capitalize;\n    color: #000;\n\n    &:hover,\n    &:focus {\n      background: rgba(0, 0, 0, 0.1);\n      outline: none;\n    }\n\n    &:active {\n      background: rgba(0, 0, 0, 0.15);\n    }\n\n    &:last-child {\n      border-right: none;\n    }\n\n    &:first-child {\n      border-left: none;\n    }\n  }\n\n  &--bold {\n    font-weight: 700;\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/simple/icon.scss",
    "content": "$success: $success-border-color;\n$info: $info-border-color;\n$warning: $warning-border-color;\n$error: $error-border-color;\n$async: $async-border-color;\n\n$icons: -generate-icons(\n  (\n    error: $error,\n    warning: $warning,\n    info: $info,\n    success: $success,\n    async: $async\n  )\n);\n\n.snotify-icon {\n  width: 100%;\n  height: 100%;\n  position: absolute;\n  right: 10px;\n  top: 50%;\n  line-height: 0;\n  transform: translate(0, -50%);\n  max-height: 48px;\n  max-width: 48px;\n}\n\n.snotify-icon--error {\n  background-image: url(\"#{map-get($icons, error)}\");\n}\n\n.snotify-icon--warning {\n  background-image: url(\"#{map-get($icons, warning)}\");\n}\n\n.snotify-icon--info {\n  background-image: url(\"#{map-get($icons, info)}\");\n}\n\n.snotify-icon--success {\n  background-image: url(\"#{map-get($icons, success)}\");\n}\n\n.snotify-icon--async {\n  background-image: url(\"#{map-get($icons, async)}\");\n  animation: async 3s infinite linear;\n  transform-origin: 50% 50%;\n}\n\n@keyframes async {\n  0% {\n    -webkit-transform: translate(0, -50%) rotate(0deg);\n    transform: translate(0, -50%) rotate(0deg);\n  }\n  100% {\n    -webkit-transform: translate(0, -50%) rotate(360deg);\n    transform: translate(0, -50%) rotate(360deg);\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/simple/prompt.scss",
    "content": ".snotifyToast__input {\n  position: relative;\n  z-index: 1;\n  display: inline-block;\n  margin: 0;\n  width: 100%;\n  vertical-align: top;\n  transition: all 0.5s;\n  transition-delay: 0.3s;\n  transition-timing-function: cubic-bezier(0.2, 1, 0.3, 1);\n\n  &__field {\n    position: relative;\n    display: block;\n    float: right;\n    padding: 0.85em 0.5em;\n    width: 100%;\n    border: none;\n    border-radius: 0;\n    background: transparent;\n    color: #333;\n    font-weight: bold;\n    -webkit-appearance: none; /* for box shadows to show on iOS */\n    opacity: 0;\n    transition: opacity 0.3s;\n\n    &:focus {\n      outline: none;\n    }\n  }\n\n  &__label {\n    display: inline-block;\n    float: right;\n    padding: 0 0.85em;\n    width: 100%;\n    color: #999;\n    font-weight: bold;\n    font-size: 70.25%;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n    -webkit-touch-callout: none;\n    -webkit-user-select: none;\n    -khtml-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n    position: absolute;\n    left: 0;\n    height: 100%;\n    text-align: left;\n    pointer-events: none;\n\n    &::before,\n    &::after {\n      content: \"\";\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      transition: transform 0.3s;\n    }\n\n    &::before {\n      border-top: 2px solid $prompt-border-color;\n      transform: translate3d(0, 100%, 0) translate3d(0, -2px, 0);\n      transition-delay: 0.3s;\n    }\n\n    &::after {\n      z-index: -1;\n      background: #eee;\n      transform: scale3d(1, 0, 1);\n      transform-origin: 50% 0;\n    }\n  }\n\n  &__labelContent {\n    position: relative;\n    display: block;\n    padding: 1em 0;\n    width: 100%;\n    transition: transform 0.3s 0.3s;\n  }\n}\n\n.snotifyToast__input--filled {\n  margin-top: 2.5em;\n\n  &:focus,\n  .snotifyToast__input__field {\n    opacity: 1;\n    transition-delay: 0.3s;\n  }\n}\n\n.snotifyToast__input__field:focus + .snotifyToast__input__label .snotifyToast__input__labelContent,\n.snotifyToast__input--filled .snotifyToast__input__labelContent {\n  transform: translate(0, -80%);\n  transition-timing-function: cubic-bezier(0.2, 1, 0.3, 1);\n}\n\n.snotifyToast__input__field:focus + .snotifyToast__input__label::before,\n.snotifyToast__input--filled .snotifyToast__input__label::before {\n  transition-delay: 0s;\n}\n\n.snotifyToast__input__field:focus + .snotifyToast__input__label::before,\n.snotifyToast__input--filled .snotifyToast__input__label::before {\n  transform: translate(0, 0);\n}\n\n.snotifyToast__input__field:focus + .snotifyToast__input__label::after,\n.snotifyToast__input--filled .snotifyToast__input__label::after {\n  transform: scale(1, 1);\n  transition-delay: 0.3s;\n  transition-timing-function: cubic-bezier(0.2, 1, 0.3, 1);\n}\n\n.snotifyToast {\n  &--invalid {\n    .snotifyToast__input__label::before {\n      border-color: $error-border-color;\n    }\n  }\n  &--valid {\n    .snotifyToast__input__label::before {\n      border-color: $success-border-color;\n    }\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/simple/snotify.scss",
    "content": "$backdrop-color: #000000;\n$snotify-width: auto !default;\n\n@if $snotify-width == auto {\n  $snotify-width: 300px;\n}\n\n.snotify {\n  display: block;\n  position: fixed;\n  width: $snotify-width;\n  z-index: 9999;\n  box-sizing: border-box;\n  pointer-events: none;\n  * {\n    box-sizing: border-box;\n  }\n}\n\n.snotify-leftTop,\n.snotify-leftCenter,\n.snotify-leftBottom {\n  left: 10px;\n}\n\n.snotify-rightTop,\n.snotify-rightCenter,\n.snotify-rightBottom {\n  right: 10px;\n}\n\n.snotify-centerTop,\n.snotify-centerCenter,\n.snotify-centerBottom {\n  left: calc(50% - #{$snotify-width} / 2);\n}\n\n.snotify-leftTop,\n.snotify-centerTop,\n.snotify-rightTop {\n  top: 10px;\n}\n.snotify-leftCenter,\n.snotify-rightCenter,\n.snotify-centerCenter {\n  top: 50%;\n  transform: translateY(-50%);\n}\n.snotify-leftBottom,\n.snotify-rightBottom,\n.snotify-centerBottom {\n  bottom: 10px;\n}\n\n.snotify-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: $backdrop-color;\n  opacity: 0;\n  z-index: 9998;\n  transition: opacity 0.3s;\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/simple/toast.scss",
    "content": "$toast-bg: #fff;\n$toast-color: #000;\n$toast-progressBar: #c7c7c7;\n$toast-progressBarPercentage: #4c4c4c;\n\n$border-width: 4px;\n$simple-border-color: #000;\n$success-border-color: #4caf50;\n$info-border-color: #1e88e5;\n$warning-border-color: #ff9800;\n$error-border-color: #f44336;\n$async-border-color: $info-border-color;\n$confirm-border-color: #009688;\n$prompt-border-color: $confirm-border-color;\n\n$snotify-title-font-size: auto !default;\n$snotify-body-font-size: auto !default;\n\n@if $snotify-title-font-size == auto {\n  $snotify-title-font-size: 1.8em;\n}\n\n@if $snotify-body-font-size == auto {\n  $snotify-body-font-size: 1em;\n}\n\n.snotifyToast {\n  display: block;\n  cursor: pointer;\n  background-color: $toast-bg;\n  max-height: 300px;\n  height: 100%;\n  margin: 5px;\n  opacity: 0;\n  overflow: hidden;\n  pointer-events: auto;\n\n  &--in {\n    animation-name: appear;\n  }\n\n  &--out {\n    animation-name: disappear;\n  }\n\n  &__inner {\n    display: flex;\n    flex-flow: column nowrap;\n    align-items: flex-start;\n    justify-content: center;\n    position: relative;\n    padding: 5px 65px 5px 15px;\n    min-height: 78px;\n    font-size: 16px;\n    color: $toast-color;\n  }\n\n  &__progressBar {\n    position: relative;\n    width: 100%;\n    height: 5px;\n    background-color: $toast-progressBar;\n\n    &__percentage {\n      position: absolute;\n      top: 0;\n      left: 0;\n      height: 5px;\n      background-color: $toast-progressBarPercentage;\n      max-width: 100%;\n    }\n  }\n\n  &__title {\n    font-size: $snotify-title-font-size;\n    line-height: 1.2em;\n    margin-bottom: 5px;\n    color: $toast-color;\n  }\n\n  &__body {\n    font-size: $snotify-body-font-size;\n    color: $toast-color;\n  }\n}\n\n.snotifyToast-show {\n  transform: translate(0, 0);\n  opacity: 1;\n}\n\n.snotifyToast-remove {\n  max-height: 0;\n  overflow: hidden;\n  transform: translate(0, 50%);\n  opacity: 0;\n}\n\n/***************\n ** Modifiers **\n **************/\n\n.snotify-simple {\n  border-left: $border-width solid $simple-border-color;\n}\n\n.snotify-success {\n  border-left: $border-width solid $success-border-color;\n}\n\n.snotify-info {\n  border-left: $border-width solid $info-border-color;\n}\n\n.snotify-warning {\n  border-left: $border-width solid $warning-border-color;\n}\n\n.snotify-error {\n  border-left: $border-width solid $error-border-color;\n}\n\n.snotify-async {\n  border-left: $border-width solid $async-border-color;\n}\n\n.snotify-confirm {\n  border-left: $border-width solid $confirm-border-color;\n}\n\n.snotify-prompt {\n  border-left: $border-width solid $prompt-border-color;\n  ng-snotify-prompt {\n    width: 100%;\n  }\n}\n\n.snotify-confirm,\n.snotify-prompt {\n  .snotifyToast__inner {\n    padding: 10px 15px;\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/styles/simple.scss",
    "content": "@import \"_shared/icons\";\n@import \"_shared/animations\";\n\n@import \"simple/snotify\";\n@import \"simple/toast\";\n@import \"simple/prompt\";\n@import \"simple/buttons\";\n@import \"simple/icon\";\n"
  },
  {
    "path": "projects/ng-snotify/tsconfig.lib.json",
    "content": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../../out-tsc/lib\",\n    \"target\": \"es2015\",\n    \"declaration\": true,\n    \"inlineSources\": true,\n    \"types\": [],\n    \"lib\": [\"dom\", \"es2018\"]\n  },\n  \"angularCompilerOptions\": {\n    \"skipTemplateCodegen\": true,\n    \"strictMetadataEmit\": true,\n    \"fullTemplateTypeCheck\": true,\n    \"strictInjectionParameters\": true,\n    \"enableResourceInlining\": true\n  },\n  \"exclude\": [\"src/test.ts\", \"**/*.spec.ts\"]\n}\n"
  },
  {
    "path": "projects/ng-snotify/tsconfig.lib.prod.json",
    "content": "{\n  \"extends\": \"./tsconfig.lib.json\",\n  \"angularCompilerOptions\": {\n    \"enableIvy\": false\n  }\n}\n"
  },
  {
    "path": "projects/ng-snotify/tsconfig.spec.json",
    "content": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"../../out-tsc/spec\",\n    \"types\": [\"jasmine\", \"node\"]\n  },\n  \"files\": [\"src/test.ts\"],\n  \"include\": [\"**/*.spec.ts\", \"**/*.d.ts\"]\n}\n"
  },
  {
    "path": "projects/ng-snotify/tslint.json",
    "content": "{\n  \"extends\": \"../../tslint.json\",\n  \"rules\": {\n    \"directive-selector\": [true, \"attribute\", \"camelCase\"],\n    \"component-selector\": [true, \"element\", \"kebab-case\"]\n  }\n}\n"
  },
  {
    "path": "src/app/app.component.html",
    "content": "<div class=\"wrapper\">\n  <aside>\n    <h3 class=\"text-center\">Toast config</h3>\n\n    <div class=\"form-group\">\n      <label for=\"title\">Title</label>\n      <input [(ngModel)]=\"title\" type=\"text\" id=\"title\" class=\"form-control\" />\n    </div>\n    <div class=\"form-group\">\n      <label for=\"body\">Body</label>\n      <textarea [(ngModel)]=\"body\" id=\"body\" rows=\"2\" class=\"form-control\"></textarea>\n    </div>\n    <div class=\"row\">\n      <div class=\"col-xs-6\">\n        <div class=\"form-group\">\n          <label for=\"titlemaxlen\">Title max-length</label>\n          <input [(ngModel)]=\"titleMaxLength\" type=\"text\" id=\"titlemaxlen\" class=\"form-control\" />\n        </div>\n      </div>\n      <div class=\"col-xs-6\">\n        <div class=\"form-group\">\n          <label for=\"bodymaxlen\">Body max-length</label>\n          <input [(ngModel)]=\"bodyMaxLength\" type=\"text\" id=\"bodymaxlen\" class=\"form-control\" />\n        </div>\n      </div>\n    </div>\n    <div class=\"row\">\n      <div class=\"col-xs-6\">\n        <div class=\"form-group\">\n          <label for=\"timeout\">Timeout</label>\n          <input [(ngModel)]=\"timeout\" type=\"number\" id=\"timeout\" class=\"form-control\" />\n        </div>\n      </div>\n      <div class=\"col-xs-6\">\n        <div class=\"form-group\">\n          <label for=\"backdrop\">\n            Backdrop (0.0 - 1.0)\n          </label>\n          <input [(ngModel)]=\"backdrop\" type=\"number\" id=\"backdrop\" class=\"form-control\" min=\"-1\" max=\"1\" />\n        </div>\n      </div>\n    </div>\n\n    <div class=\"form-group\">\n      <label for=\"position\">Position</label>\n      <div class=\"row\">\n        <div class=\"col-sm-12\">\n          <select [(ngModel)]=\"position\" id=\"position\" class=\"form-control\">\n            <option [ngValue]=\"'leftTop'\">LEFT - TOP</option>\n            <option [ngValue]=\"'leftCenter'\">LEFT - CENTER</option>\n            <option [ngValue]=\"'leftBottom'\">LEFT - BOTTOM</option>\n            <option [ngValue]=\"'rightTop'\">RIGHT - TOP</option>\n            <option [ngValue]=\"'rightCenter'\">RIGHT - CENTER</option>\n            <option [ngValue]=\"'rightBottom'\">RIGHT - BOTTOM</option>\n            <option [ngValue]=\"'centerTop'\">CENTER - TOP</option>\n            <option [ngValue]=\"'centerCenter'\">CENTER - CENTER</option>\n            <option [ngValue]=\"'centerBottom'\">CENTER - BOTTOM</option>\n          </select>\n        </div>\n      </div>\n    </div>\n    <div class=\"switch-group-wrapper\">\n      <div class=\"switch-wrapper\">\n        <strong>Show progress bar?</strong>\n        <div class=\"switch\">\n          <input [(ngModel)]=\"progressBar\" id=\"progressBar\" class=\"cmn-toggle cmn-toggle-yes-no\" type=\"checkbox\" />\n          <label for=\"progressBar\" data-on=\"On\" data-off=\"Off\"></label>\n        </div>\n      </div>\n      <div class=\"switch-wrapper\">\n        <strong>Close on click?</strong>\n        <div class=\"switch\">\n          <input [(ngModel)]=\"closeClick\" id=\"closeClick\" class=\"cmn-toggle cmn-toggle-yes-no\" type=\"checkbox\" />\n          <label for=\"closeClick\" data-on=\"On\" data-off=\"Off\"></label>\n        </div>\n      </div>\n      <div class=\"switch-wrapper\">\n        <strong>Pause on hover?</strong>\n        <div class=\"switch\">\n          <input [(ngModel)]=\"pauseHover\" id=\"pauseHover\" class=\"cmn-toggle cmn-toggle-yes-no\" type=\"checkbox\" />\n          <label for=\"pauseHover\" data-on=\"On\" data-off=\"Off\"></label>\n        </div>\n      </div>\n      <div class=\"switch-wrapper\">\n        <strong>New items on top?</strong>\n        <div class=\"switch\">\n          <input [(ngModel)]=\"newTop\" id=\"newTop\" class=\"cmn-toggle cmn-toggle-yes-no\" type=\"checkbox\" />\n          <label for=\"newTop\" data-on=\"On\" data-off=\"Off\"></label>\n        </div>\n      </div>\n      <div class=\"switch-wrapper\">\n        <strong>Filter duplicates?</strong>\n        <div class=\"switch\">\n          <input\n            [(ngModel)]=\"filterDuplicates\"\n            id=\"filterDuplicates\"\n            class=\"cmn-toggle cmn-toggle-yes-no\"\n            type=\"checkbox\"\n          />\n          <label for=\"filterDuplicates\" data-on=\"On\" data-off=\"Off\"></label>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"row\">\n      <div class=\"col-xs-6\">\n        <div class=\"form-group\">\n          <label for=\"dockMax\">\n            Max on screen\n          </label>\n          <input [(ngModel)]=\"dockMax\" type=\"number\" id=\"dockMax\" class=\"form-control\" min=\"1\" />\n        </div>\n      </div>\n      <div class=\"col-xs-6\">\n        <div class=\"form-group\">\n          <label for=\"blockMax\">\n            Max at position\n          </label>\n          <input [(ngModel)]=\"blockMax\" type=\"number\" id=\"blockMax\" class=\"form-control\" min=\"1\" />\n        </div>\n      </div>\n    </div>\n\n    <div class=\"form-group\">\n      <label for=\"style\">Toast Style</label>\n      <div class=\"row\">\n        <div class=\"col-sm-12\">\n          <select [(ngModel)]=\"style\" id=\"style\" class=\"form-control\">\n            <option [ngValue]=\"'material'\">Material</option>\n            <option [ngValue]=\"'dark'\">Dark</option>\n            <option [ngValue]=\"'simple'\">Simple</option>\n          </select>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"form-group\">\n      <div class=\"buttons\">\n        <div class=\"btn-group btn-group-justified\">\n          <div class=\"btn btn-success\" (click)=\"onSuccess()\">Success</div>\n          <div class=\"btn btn-info\" (click)=\"onInfo()\">Info</div>\n          <div class=\"btn btn-danger\" (click)=\"onError()\">Error</div>\n          <div class=\"btn btn-warning\" (click)=\"onWarning()\">Warning</div>\n        </div>\n        <div class=\"btn-group btn-group-justified\">\n          <div class=\"btn btn-default\" (click)=\"onSimple()\">Simple</div>\n          <div class=\"btn btn-blue\" (click)=\"onAsyncLoading()\">Async</div>\n          <div class=\"btn btn-teal\" (click)=\"onConfirmation()\">Confirm</div>\n          <div class=\"btn btn-black\" (click)=\"onPrompt()\">Prompt</div>\n        </div>\n        <div class=\"btn-group btn-group-justified\">\n          <div class=\"btn btn-default\" (click)=\"onHtml()\">HTML</div>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"btn btn-block btn-primary\" (click)=\"onClear()\">Clear all</div>\n  </aside>\n  <div class=\"content\">\n    <main>\n      <div class=\"brand\">\n        <h1>Ng-Snotify</h1>\n        <p>Angular 2+ Notification Center</p>\n      </div>\n    </main>\n    <footer>\n      <div class=\"footer\">\n        <a href=\"documentation/index.html\" target=\"_blank\">Documentation</a> &#9673;\n        <a href=\"compodoc/index.html\" target=\"_blank\">Compodoc</a> &#9673;\n        <a href=\"https://github.com/artemsky/ng-snotify\" target=\"_blank\">GitHub</a> &#9673;\n        <a href=\"https://www.npmjs.com/package/ng-snotify\" target=\"_blank\">NPM</a>\n        <h6>MIT &copy; 2018 <a href=\"https://github.com/artemsky/\">artemsky</a></h6>\n      </div>\n    </footer>\n    <ng-snotify class=\"{{ style }}\"></ng-snotify>\n  </div>\n</div>\n"
  },
  {
    "path": "src/app/app.component.scss",
    "content": "@import url(\"https://fonts.googleapis.com/css?family=Audiowide\");\n\n.wrapper {\n  display: flex;\n  height: 100vh;\n  width: 100vw;\n  overflow: hidden;\n\n  @media (max-width: 767px) {\n    flex-flow: column nowrap;\n    height: auto;\n    font-size: 12px;\n  }\n\n  aside {\n    flex: 0 0 350px;\n    padding: 10px 15px;\n    overflow-y: auto;\n    z-index: 5;\n    .btn-group {\n      .btn {\n        padding: 6px 9px;\n      }\n    }\n\n    h3 {\n      margin: 0;\n    }\n\n    @media (max-width: 767px) {\n      order: 1;\n      overflow: initial;\n    }\n  }\n\n  .content {\n    position: relative;\n    width: 100%;\n    display: flex;\n    flex-flow: column nowrap;\n    background: #ea5c54; /* Old browsers */\n    background: -moz-linear-gradient(-45deg, #ea5c54 0%, #bb6dec 100%); /* FF3.6+ */\n    background: -webkit-gradient(\n      linear,\n      left top,\n      right bottom,\n      color-stop(0%, #ea5c54),\n      color-stop(100%, #bb6dec)\n    ); /* Chrome,Safari4+ */\n    background: -webkit-linear-gradient(-45deg, #ea5c54 0%, #bb6dec 100%); /* Chrome10+,Safari5.1+ */\n    background: -o-linear-gradient(-45deg, #ea5c54 0%, #bb6dec 100%); /* Opera 11.10+ */\n    background: -ms-linear-gradient(-45deg, #ea5c54 0%, #bb6dec 100%); /* IE10+ */\n    background: linear-gradient(135deg, #ea5c54 0%, #bb6dec 100%); /* W3C */\n    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#EA5C54 ', endColorstr='#bb6dec',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */\n\n    main {\n      height: 100%;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      .brand {\n        position: absolute;\n        color: #ffffff;\n\n        h1 {\n          font-family: \"Audiowide\", cursive;\n          font-display: swap;\n          font-size: 6em;\n        }\n        p {\n          font-size: 2em;\n          text-align: center;\n        }\n\n        @media (max-width: 992px) {\n          h1 {\n            font-size: 4.5em;\n          }\n          p {\n            font-size: 1.8em;\n          }\n\n          @media (max-width: 767px) {\n            h1 {\n              font-size: 4em;\n            }\n            p {\n              font-size: 1.5em;\n            }\n          }\n        }\n      }\n\n      @media (max-width: 767px) {\n        flex-flow: column nowrap;\n        order: 0;\n        height: 110px;\n      }\n    }\n\n    footer {\n      flex: 0 0 65px;\n      text-align: center;\n      color: #ffffff;\n      font-size: 1em;\n      a {\n        color: #fff;\n      }\n      h6 {\n        font-size: 0.9em;\n      }\n\n      @media (max-width: 767px) {\n        flex: 0 0 40px;\n      }\n    }\n  }\n}\n//\n//main {\n//  position: fixed;\n//  top: 0;\n//  left: 0;\n//  width: 100%;\n//  height: 100%;\n//  background: #EA5C54 ; /* Old browsers */\n//  background: -moz-linear-gradient(-45deg,  #EA5C54  0%, #bb6dec 100%); /* FF3.6+ */\n//  background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,#EA5C54 ), color-stop(100%,#bb6dec)); /* Chrome,Safari4+ */\n//  background: -webkit-linear-gradient(-45deg,  #EA5C54  0%,#bb6dec 100%); /* Chrome10+,Safari5.1+ */\n//  background: -o-linear-gradient(-45deg,  #EA5C54  0%,#bb6dec 100%); /* Opera 11.10+ */\n//  background: -ms-linear-gradient(-45deg,  #EA5C54  0%,#bb6dec 100%); /* IE10+ */\n//  background: linear-gradient(135deg,  #EA5C54  0%,#bb6dec 100%); /* W3C */\n//  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#EA5C54 ', endColorstr='#bb6dec',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */\n//  z-index: 1;\n//}\n//\n//aside {\n//  position: fixed;\n//  top: 0;\n//  left: 0;\n//  width: 340px;\n//  height: 100%;\n//  padding: 15px;\n//  background: #fff;\n//  overflow-y: auto;\n//  overflow-x: hidden;\n//  z-index: 3;\n//  .btn-group {\n//    .btn {\n//      padding: 6px 9px;\n//    }\n//  }\n//\n//  h3 {\n//    margin: 0;\n//  }\n//}\n//\n//.brand {\n//  position: absolute;\n//  top: 50%;\n//  left: 50%;\n//  transform: translateY(-50%) translateX(calc(-50% + 340px / 2));\n//  color: #ffffff;\n//  h1 {\n//    font-family: 'Audiowide', cursive;\n//    font-size: 6em;\n//  }\n//  p {\n//    font-size: 2em;\n//    text-align: center;\n//  }\n//}\n//\n//textarea{\n//  resize: vertical;\n//}\n//\n//footer {\n//  display: block;\n//  padding: 10px;\n//  position: fixed;\n//  bottom: 15px;\n//  left: 50%;\n//  font-size: 15px;\n//  text-align: center;\n//  color: white;\n//  width: calc(100% - 340px);\n//  transform: translateX(calc(-50% + 340px / 2));\n//  z-index:2;\n//  a {\n//    color: #ffffff;\n//  }\n//}\n\n.buttons {\n  margin: 20px 0;\n}\n\n.btn-group {\n  margin: 5px 0 0;\n}\n\n.btn-black {\n  color: #f8f8f8;\n  background-color: #2d2d2d;\n  border-color: #000000;\n  &:hover {\n    color: #fff;\n    background-color: #000000;\n    border-color: #000000;\n  }\n}\n\n.btn-blue {\n  color: #f8f8f8;\n  background-color: #2095f2;\n  border-color: #1a80d1;\n  &:hover {\n    color: #fff;\n    background-color: #1a80d1;\n    border-color: #1a80d1;\n  }\n}\n\n.btn-teal {\n  color: #f8f8f8;\n  background-color: #009587;\n  border-color: #018175;\n  &:hover {\n    color: #fff;\n    background-color: #018175;\n    border-color: #018175;\n  }\n}\n\n.switch-wrapper {\n  width: 50%;\n}\n\n.switch-group-wrapper {\n  display: flex;\n  flex-flow: row wrap;\n  margin: 5px 0 10px;\n}\n\n.cmn-toggle {\n  position: absolute;\n  margin-left: -9999px;\n  padding: 2px;\n  width: 60px;\n  height: 30px;\n  visibility: hidden;\n\n  + label {\n    display: block;\n    position: relative;\n    padding: 2px;\n    width: 60px;\n    height: 30px;\n    cursor: pointer;\n    outline: none;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    -ms-user-select: none;\n    user-select: none;\n\n    &::before,\n    &::after {\n      display: block;\n      position: absolute;\n      top: 0;\n      left: 0;\n      bottom: 0;\n      right: 0;\n      color: #fff;\n      font-family: \"Roboto Slab\", serif;\n      font-size: 20px;\n      text-align: center;\n      line-height: 30px;\n    }\n    &::before {\n      background-color: #dddddd;\n      content: attr(data-off);\n      transition: transform 0.5s;\n      backface-visibility: hidden;\n    }\n\n    &::after {\n      background-color: #8ce196;\n      content: attr(data-on);\n      transition: transform 0.5s;\n      transform: rotateY(180deg);\n      backface-visibility: hidden;\n    }\n  }\n\n  &:checked {\n    + label {\n      &::before {\n        transform: rotateY(180deg);\n      }\n      &::after {\n        transform: rotateY(0);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/app/app.component.spec.ts",
    "content": "import { FormsModule } from '@angular/forms';\nimport { ComponentFixture, async, TestBed } from '@angular/core/testing';\nimport { AppComponent } from './app.component';\nimport { SnotifyModule, SnotifyPosition, SnotifyService, ToastDefaults } from 'ng-snotify';\n\ndescribe('NgSnotify Testing', () => {\n  let component: AppComponent;\n  let fixture: ComponentFixture<AppComponent>;\n  let service: SnotifyService;\n  let compiled;\n\n  beforeEach(async(() => {\n    TestBed.configureTestingModule({\n      imports: [FormsModule, SnotifyModule],\n      declarations: [AppComponent],\n      providers: [{ provide: 'SnotifyToastConfig', useValue: ToastDefaults }, SnotifyService]\n    }).compileComponents();\n  }));\n\n  beforeEach(() => {\n    fixture = TestBed.createComponent(AppComponent);\n    component = fixture.componentInstance;\n    service = TestBed.inject(SnotifyService);\n    compiled = fixture.debugElement.nativeElement;\n    fixture.detectChanges();\n  });\n\n  it('should create the app', done => {\n    expect(component).toBeTruthy();\n    done();\n  });\n\n  it(`should render title in a h1 tag 'Ng-Snotify'`, done => {\n    expect(compiled.querySelector('.brand h1').textContent).toContain('Ng-Snotify');\n    done();\n  });\n\n  it(`should init basic options`, done => {\n    expect(service.config).toEqual(jasmine.objectContaining(ToastDefaults));\n    done();\n  });\n\n  it('should create success toast with body', done => {\n    service.success('Ng-Snotify');\n    fixture.detectChanges();\n    expect(compiled.querySelector('.snotifyToast').textContent).toContain('Ng-Snotify');\n    done();\n  });\n\n  it('should create simple toast with body and title', done => {\n    service.simple('Ng-Snotify b', 'Ng-Snotify t');\n    fixture.detectChanges();\n    expect(compiled.querySelector('.snotifyToast .snotifyToast__body').textContent).toContain('Ng-Snotify b');\n    expect(compiled.querySelector('.snotifyToast .snotifyToast__title').textContent).toContain('Ng-Snotify t');\n    done();\n  });\n\n  it('should execute confirm buttons action', done => {\n    let result = null;\n\n    const toastID = service.confirm('Ng-Snotify', null, {\n      buttons: [{ text: 'Yes', action: id => (result = id) }]\n    });\n    fixture.detectChanges();\n    compiled.querySelector('.snotifyToast .snotifyToast__buttons > button').click();\n\n    expect(result).toEqual(toastID);\n    done();\n  });\n\n  it('should create prompt toast with 4 buttons', done => {\n    service.prompt('Ng-Snotify', null, {\n      buttons: [{ text: 'Yes' }, { text: 'Yes' }, { text: 'Yes' }, { text: 'Yes' }]\n    });\n    fixture.detectChanges();\n\n    expect(compiled.querySelectorAll('.snotifyToast .snotifyToast__buttons > button').length).toEqual(4);\n    done();\n  });\n\n  it('should create html toast with html content', done => {\n    service.html(`<strong>HTML Toast Content</strong>`);\n    fixture.detectChanges();\n    expect(compiled.querySelector('.snotifyToast .snotifyToast__inner').textContent).toContain('HTML Toast Content');\n    done();\n  });\n\n  it('should create 3 toasts max at rightTop position', done => {\n    service.setDefaults({\n      global: {\n        maxAtPosition: 3\n      },\n      toast: {\n        position: SnotifyPosition.rightTop\n      }\n    });\n    fixture.detectChanges();\n\n    service.simple('Test');\n    service.success('Test');\n    service.error('Test');\n\n    fixture.detectChanges();\n    expect(compiled.querySelectorAll('.snotify-rightTop > ng-snotify-toast').length).toEqual(3);\n    done();\n  });\n\n  it('should create toasts at different positions', done => {\n    service.simple('Test', null, {\n      position: SnotifyPosition.centerBottom\n    });\n    service.success('Test', null, {\n      position: SnotifyPosition.leftBottom\n    });\n    fixture.detectChanges();\n    expect(compiled.querySelectorAll('.snotify-leftBottom > ng-snotify-toast').length).toEqual(1);\n    expect(compiled.querySelectorAll('.snotify-centerBottom > ng-snotify-toast').length).toEqual(1);\n    done();\n  });\n});\n"
  },
  {
    "path": "src/app/app.component.ts",
    "content": "import { Component } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { SnotifyPosition, SnotifyService, SnotifyToastConfig } from 'ng-snotify';\n\n@Component({\n  selector: 'app-root',\n  templateUrl: './app.component.html',\n  styleUrls: ['./app.component.scss']\n})\nexport class AppComponent {\n  style = 'material';\n  title = 'Snotify title!';\n  body = 'Lorem ipsum dolor sit amet!';\n  timeout = 3000;\n  position: SnotifyPosition = SnotifyPosition.rightBottom;\n  progressBar = true;\n  closeClick = true;\n  newTop = true;\n  filterDuplicates = false;\n  backdrop = -1;\n  dockMax = 8;\n  blockMax = 6;\n  pauseHover = true;\n  titleMaxLength = 15;\n  bodyMaxLength = 80;\n\n  constructor(private snotifyService: SnotifyService) {}\n\n  /*\n  Change global configuration\n   */\n  getConfig(): SnotifyToastConfig {\n    this.snotifyService.setDefaults({\n      global: {\n        newOnTop: this.newTop,\n        maxAtPosition: this.blockMax,\n        maxOnScreen: this.dockMax,\n        // @ts-ignore\n        filterDuplicates: this.filterDuplicates\n      }\n    });\n    return {\n      bodyMaxLength: this.bodyMaxLength,\n      titleMaxLength: this.titleMaxLength,\n      backdrop: this.backdrop,\n      position: this.position,\n      timeout: this.timeout,\n      showProgressBar: this.progressBar,\n      closeOnClick: this.closeClick,\n      pauseOnHover: this.pauseHover\n    };\n  }\n\n  onSuccess() {\n    this.snotifyService.success(this.body, this.title, this.getConfig());\n  }\n  onInfo() {\n    this.snotifyService.info(this.body, this.title, this.getConfig());\n  }\n  onError() {\n    this.snotifyService.error(this.body, this.title, this.getConfig());\n  }\n  onWarning() {\n    this.snotifyService.warning(this.body, this.title, this.getConfig());\n  }\n  onSimple() {\n    // const icon = `assets/custom-svg.svg`;\n    const icon = `https://placehold.it/48x100`;\n\n    this.snotifyService.simple(this.body, this.title, {\n      ...this.getConfig(),\n      icon\n    });\n  }\n\n  onAsyncLoading() {\n    const errorAction = new Observable(observer => {\n      setTimeout(() => {\n        observer.error({\n          title: 'Error',\n          body: 'Example. Error 404. Service not found'\n        });\n      }, 2000);\n    });\n\n    const successAction = new Observable(observer => {\n      setTimeout(() => {\n        observer.next({\n          body: 'Still loading.....'\n        });\n      }, 2000);\n\n      setTimeout(() => {\n        observer.next({\n          title: 'Success',\n          body: 'Example. Data loaded!',\n          config: {\n            closeOnClick: true,\n            timeout: 5000,\n            showProgressBar: true\n          }\n        });\n        observer.complete();\n      }, 5000);\n    });\n\n    /*\n      You should pass Promise or Observable of type Snotify to change some data or do some other actions\n      More information how to work with observables:\n      https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/create.md\n     */\n    const { timeout, ...config } = this.getConfig(); // Omit timeout\n    this.snotifyService.async('This will resolve with error', 'Async', errorAction, config);\n    this.snotifyService.async('This will resolve with success', successAction, config);\n    this.snotifyService.async(\n      'Called with promise',\n      'Error async',\n      new Promise((resolve, reject) => {\n        setTimeout(\n          () =>\n            reject({\n              title: 'Error!!!',\n              body: 'We got an example error!',\n              config: {\n                closeOnClick: true\n              }\n            }),\n          1000\n        );\n        setTimeout(() => resolve(), 1500);\n      }),\n      config\n    );\n  }\n\n  onConfirmation() {\n    /*\n    Here we pass an buttons array, which contains of 2 element of type SnotifyButton\n     */\n    const { timeout, closeOnClick, ...config } = this.getConfig(); // Omit props what i don't need\n    this.snotifyService.confirm(this.body, this.title, {\n      ...config,\n      buttons: [\n        { text: 'Yes', action: () => console.log('Clicked: Yes'), bold: false },\n        { text: 'No', action: () => console.log('Clicked: No') },\n        {\n          text: 'Later',\n          action: toast => {\n            console.log('Clicked: Later');\n            this.snotifyService.remove(toast.id);\n          }\n        },\n        {\n          text: 'Close',\n          action: toast => {\n            console.log('Clicked: Close');\n            this.snotifyService.remove(toast.id);\n          },\n          bold: true\n        }\n      ]\n    });\n  }\n\n  onPrompt() {\n    /*\n     Here we pass an buttons array, which contains of 2 element of type SnotifyButton\n     At the action of the first buttons we can get what user entered into input field.\n     At the second we can't get it. But we can remove this toast\n     */\n    const { timeout, closeOnClick, ...config } = this.getConfig(); // Omit props what i don't need\n    this.snotifyService\n      .prompt(this.body, this.title, {\n        ...config,\n        buttons: [\n          {\n            text: 'Yes',\n            action: toast => console.log('Said Yes: ' + toast.value)\n          },\n          {\n            text: 'No',\n            action: toast => {\n              console.log('Said No: ' + toast.value);\n              this.snotifyService.remove(toast.id);\n            }\n          }\n        ],\n        placeholder: 'Enter \"ng-snotify\" to validate this input' // Max-length = 40\n      })\n      .on('input', toast => {\n        console.log(toast.value);\n        toast.valid = !!toast.value.match('ng-snotify');\n      });\n  }\n\n  onHtml() {\n    const html = `<div class=\"snotifyToast__title\"><b>Html Bold Title</b></div>\n    <div class=\"snotifyToast__body\"><i>Html</i> <b>toast</b> <u>content</u></div>`;\n    this.snotifyService.html(html, this.getConfig());\n  }\n\n  onClear() {\n    this.snotifyService.clear();\n  }\n}\n"
  },
  {
    "path": "src/app/app.module.ts",
    "content": "import { BrowserModule } from '@angular/platform-browser';\nimport { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { AppComponent } from './app.component';\nimport { SnotifyModule, SnotifyService, ToastDefaults } from 'ng-snotify';\nimport { HttpClientModule } from '@angular/common/http';\n\n@NgModule({\n  declarations: [AppComponent],\n  imports: [BrowserModule, FormsModule, HttpClientModule, SnotifyModule],\n  providers: [{ provide: 'SnotifyToastConfig', useValue: ToastDefaults }, SnotifyService],\n  bootstrap: [AppComponent]\n})\nexport class AppModule {}\n"
  },
  {
    "path": "src/assets/.gitkeep",
    "content": ""
  },
  {
    "path": "src/environments/environment.prod.ts",
    "content": "export const environment = {\n  production: true\n};\n"
  },
  {
    "path": "src/environments/environment.ts",
    "content": "// This file can be replaced during build by using the `fileReplacements` array.\n// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.\n// The list of file replacements can be found in `angular.json`.\n\nexport const environment = {\n  production: false\n};\n\n/*\n * For easier debugging in development mode, you can import the following file\n * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.\n *\n * This import should be commented out in production mode because it will have a negative impact\n * on performance if an error is thrown.\n */\n// import 'zone.js/dist/zone-error';  // Included with Angular CLI.\n"
  },
  {
    "path": "src/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>NgSnotify</title>\n    <meta name=\"description\" content=\"Angular 2+ Notification Center\" />\n    <base href=\"/\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <!-- Schema.org markup for Google+ -->\n    <meta itemprop=\"name\" content=\"NgSnotify\" />\n    <meta itemprop=\"description\" content=\"Angular 2 Notification Center\" />\n    <meta itemprop=\"image\" content=\"https://artemsky.github.io/ng-snotify/assets/preview.jpg\" />\n    <!-- Twitter Card data -->\n    <meta name=\"twitter:site\" content=\"https://artemsky.github.io/ng-snotify/\" />\n    <meta name=\"twitter:title\" content=\"NgSnotify\" />\n    <meta name=\"twitter:description\" content=\"Angular 2+ Notification Center\" />\n    <!-- Twitter summary card with large image must be at least 280x150px -->\n    <meta name=\"twitter:image:src\" content=\"https://artemsky.github.io/ng-snotify/assets/preview.jpg\" />\n\n    <!-- Open Graph data -->\n    <meta property=\"og:title\" content=\"NgSnotify\" />\n    <meta property=\"og:type\" content=\"article\" />\n    <meta property=\"og:url\" content=\"https://artemsky.github.io/ng-snotify/\" />\n    <meta property=\"og:image\" content=\"https://artemsky.github.io/ng-snotify/assets/preview.jpg\" />\n    <meta property=\"og:description\" content=\"Angular 2+ Notification Center\" />\n\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <link rel=\"icon\" type=\"image/x-icon\" href=\"favicon.ico\" />\n  </head>\n  <body>\n    <app-root>Loading...</app-root>\n  </body>\n</html>\n"
  },
  {
    "path": "src/main.ts",
    "content": "import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app/app.module';\nimport { environment } from './environments/environment';\n\nif (environment.production) {\n  enableProdMode();\n}\n\nplatformBrowserDynamic()\n  .bootstrapModule(AppModule)\n  .catch(err => console.error(err));\n"
  },
  {
    "path": "src/polyfills.ts",
    "content": "/**\n * This file includes polyfills needed by Angular and is loaded before the app.\n * You can add your own extra polyfills to this file.\n *\n * This file is divided into 2 sections:\n *   1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.\n *   2. Application imports. Files imported after ZoneJS that should be loaded before your main\n *      file.\n *\n * The current setup is for so-called \"evergreen\" browsers; the last versions of browsers that\n * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),\n * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.\n *\n * Learn more in https://angular.io/guide/browser-support\n */\n\n/***************************************************************************************************\n * BROWSER POLYFILLS\n */\n\n/** IE10 and IE11 requires the following for NgClass support on SVG elements */\n// import 'classlist.js';  // Run `npm install --save classlist.js`.\n\n/**\n * Web Animations `@angular/platform-browser/animations`\n * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari.\n * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0).\n */\n// import 'web-animations-js';  // Run `npm install --save web-animations-js`.\n\n/**\n * By default, zone.js will patch all possible macroTask and DomEvents\n * user can disable parts of macroTask/DomEvents patch by setting following flags\n * because those flags need to be set before `zone.js` being loaded, and webpack\n * will put import in the top of bundle, so user need to create a separate file\n * in this directory (for example: zone-flags.ts), and put the following flags\n * into that file, and then add the following code before importing zone.js.\n * import './zone-flags.ts';\n *\n * The flags allowed in zone-flags.ts are listed here.\n *\n * The following flags will work for all browsers.\n *\n * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame\n * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick\n * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames\n *\n *  in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js\n *  with the following flag, it will bypass `zone.js` patch for IE/Edge\n *\n *  (window as any).__Zone_enable_cross_context_check = true;\n *\n */\n\n/***************************************************************************************************\n * Zone JS is required by default for Angular itself.\n */\nimport 'zone.js/dist/zone'; // Included with Angular CLI.\n\n/***************************************************************************************************\n * APPLICATION IMPORTS\n */\n"
  },
  {
    "path": "src/styles.scss",
    "content": ".material {\n  @import \"~ng-snotify/styles/material\";\n}\n.simple {\n  @import \"~ng-snotify/styles/simple\";\n}\n.dark {\n  @import \"~ng-snotify/styles/dark\";\n}\n\n.snotify-icon {\n  object-fit: cover;\n  width: 100%;\n  height: 100%;\n  object-position: center;\n}\n"
  },
  {
    "path": "src/test.ts",
    "content": "// This file is required by karma.conf.js and loads recursively all the .spec and framework files\n\nimport 'zone.js/dist/zone-testing';\nimport { getTestBed } from '@angular/core/testing';\nimport { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing';\n\ndeclare const require: any;\n\n// First, initialize the Angular testing environment.\ngetTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting());\n// Then we find all the tests.\nconst context = require.context('./', true, /\\.spec\\.ts$/);\n// And load the modules.\ncontext.keys().map(context);\n"
  },
  {
    "path": "tsconfig.app.json",
    "content": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"./out-tsc/app\",\n    \"types\": []\n  },\n  \"files\": [\"src/main.ts\", \"src/polyfills.ts\"],\n  \"include\": [\"src/**/*.d.ts\"],\n  \"exclude\": [\"src/test.ts\", \"src/**/*.spec.ts\"]\n}\n"
  },
  {
    "path": "tsconfig.docs.json",
    "content": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"baseUrl\": \"./src\",\n    \"outDir\": \"./demo/compodoc\",\n    \"rootDir\": \"./src\",\n    \"skipLibCheck\": true,\n    \"types\": []\n  },\n  \"exclude\": [\"e2e\", \"example\", \"dist\", \"docs\", \"node_modules\"]\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compileOnSave\": false,\n  \"compilerOptions\": {\n    \"baseUrl\": \"./\",\n    \"outDir\": \"./dist/out-tsc\",\n    \"sourceMap\": true,\n    \"declaration\": false,\n    \"downlevelIteration\": true,\n    \"experimentalDecorators\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"importHelpers\": true,\n    \"target\": \"es2015\",\n    \"typeRoots\": [\"node_modules/@types\"],\n    \"lib\": [\"es2018\", \"dom\"]\n  },\n  \"angularCompilerOptions\": {\n    \"fullTemplateTypeCheck\": true,\n    \"strictInjectionParameters\": true\n  }\n}\n"
  },
  {
    "path": "tsconfig.spec.json",
    "content": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"./out-tsc/spec\",\n    \"types\": [\"jasmine\", \"node\"]\n  },\n  \"files\": [\"src/test.ts\", \"src/polyfills.ts\"],\n  \"include\": [\"src/**/*.spec.ts\", \"src/**/*.d.ts\"]\n}\n"
  },
  {
    "path": "tslint.json",
    "content": "{\n  \"extends\": \"tslint:recommended\",\n  \"rules\": {\n    \"array-type\": false,\n    \"arrow-parens\": false,\n    \"deprecation\": {\n      \"severity\": \"warning\"\n    },\n    \"component-class-suffix\": true,\n    \"contextual-lifecycle\": true,\n    \"directive-class-suffix\": true,\n    \"directive-selector\": [true, \"attribute\", \"app\", \"camelCase\"],\n    \"component-selector\": [true, \"element\", \"app\", \"kebab-case\"],\n    \"import-blacklist\": [true, \"rxjs/Rx\"],\n    \"interface-name\": false,\n    \"max-classes-per-file\": false,\n    \"max-line-length\": [true, 140],\n    \"member-access\": false,\n    \"member-ordering\": [\n      true,\n      {\n        \"order\": [\"static-field\", \"instance-field\", \"static-method\", \"instance-method\"]\n      }\n    ],\n    \"no-consecutive-blank-lines\": false,\n    \"no-console\": [true, \"debug\", \"info\", \"time\", \"timeEnd\", \"trace\"],\n    \"no-empty\": false,\n    \"no-inferrable-types\": [true, \"ignore-params\"],\n    \"no-non-null-assertion\": true,\n    \"no-redundant-jsdoc\": true,\n    \"no-switch-case-fall-through\": true,\n    \"no-var-requires\": false,\n    \"object-literal-key-quotes\": [true, \"as-needed\"],\n    \"object-literal-sort-keys\": false,\n    \"ordered-imports\": false,\n    \"quotemark\": [true, \"single\"],\n    \"trailing-comma\": false,\n    \"no-conflicting-lifecycle\": true,\n    \"no-host-metadata-property\": true,\n    \"no-input-rename\": true,\n    \"no-inputs-metadata-property\": true,\n    \"no-output-native\": true,\n    \"no-output-on-prefix\": true,\n    \"no-output-rename\": true,\n    \"no-outputs-metadata-property\": true,\n    \"template-banana-in-box\": true,\n    \"template-no-negated-async\": true,\n    \"use-lifecycle-interface\": true,\n    \"use-pipe-transform-interface\": true\n  },\n  \"rulesDirectory\": [\"codelyzer\"]\n}\n"
  },
  {
    "path": "update-docs.sh",
    "content": "rm -rf demo\nnpm run example:build:prod\nnpm run compodoc:build\ncd docs\nrm -rf _book\ngitbook install\ngitbook build ./ ../demo/documentation\nrm -rf _book\ncd ../demo\ngit init\ngit add -A\ngit commit -m 'update demo'\ngit push -f git@github.com:artemsky/ng-snotify.git master:gh-pages\n"
  }
]