[
  {
    "path": ".gitignore",
    "content": "node_modules/\n*.iml\n*.xml\n.idea\ndist\ndist-tsc\ntest_dist"
  },
  {
    "path": ".npmignore",
    "content": ".idea\nexample\nnode_modules\n/src\n/*.*\n./dist/dist-tsc\n./dist/example"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nnode_js:\n  - '10'\ndist: trusty\naddons:\n  apt:\n    packages:\n    # This is required to run new chrome on old trusty\n    - libnss3\nnotifications:\n  email: false\ncache:\n  directories:\n  - node_modules\n# allow headful tests\nbefore_install:\n# Enable user namespace cloning\n- \"sysctl kernel.unprivileged_userns_clone=1\"\n# Launch XVFB\n- \"export DISPLAY=:99.0\"\n- \"sh -e /etc/init.d/xvfb start\""
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016-2017 Jacob Harasimo.\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 all\ncopies 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 THE\nSOFTWARE.\n\n"
  },
  {
    "path": "README.md",
    "content": "# ngx-popper  \n\n[![npm](https://img.shields.io/npm/v/ngx-popper.svg?style=flat-square)](https://www.npmjs.com/package/ngx-popper) \n[![npm](https://img.shields.io/npm/dm/ngx-popper.svg?style=flat-square)](https://www.npmjs.com/package/ngx-popper) \n[![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://github.com/MrFrankel/ngx-popper/blob/master/LICENSE) [![Greenkeeper badge](https://badges.greenkeeper.io/MrFrankel/ngx-popper.svg)](https://greenkeeper.io/)\n  <img src=\"http://badge-size.now.sh/https://unpkg.com/ngx-popper@6.0.7/bundles/ngx-popper.umd.js?compression=brotli\" alt=\"Stable Release Size\"/>\n  <img src=\"http://badge-size.now.sh/https://unpkg.com/ngx-popper@6.0.7/bundles/ngx-popper.umd.js?compression=gzip\" alt=\"Stable Release Size\"/>\n[![Build Status](https://travis-ci.org/MrFrankel/ngx-popper.svg?branch=master)](https://travis-ci.org/MrFrankel/ngx-popper)\n\nngx-popper is an angular wrapper for the [Popper.js](https://popper.js.org/) library.\n\n## Changes\n\nAs of version 6.0.0 popper content runs in onPush change detection strategy, therefore forceChangeDetection is no longer necessary and is removed\n\n\nAs of version 4.0.0 ngx-popper now use innerHTML binding for string popper i.e:\n```HTML\n<div popper=\"some text\"></div>\n```\n\nThis should make no difference but you should be aware.\n\nAs of version 4.0.0 popper.model is now popper-model, due to some angular-cli issues, if you are referencing this please update your references.\n\n### Installation\n\nnode and npm are required to run this package.\n\n1. Use npm/yarn to install the package:\n\n  ```terminal\n  $ npm install popper.js --save\n  $ npm install ngx-popper --save \n  ```\n  \n  Or \n  \n   ```terminal\n    $ yarn add popper.js --save\n    $ yarn add ngx-popper --save \n  ```\n\n2. You simply add into your module `NgxPopperModule`:\n\n  ```typescript\n  import {NgxPopperModule} from 'ngx-popper';\n  \n  @NgModule({\n   // ...\n   imports: [\n     // ...\n     NgxPopperModule\n   ]\n  })\n  ```\n  \nSystemJS \n```\n    System.config({\n        paths: {\n            // paths serve as alias\n            'npm:': 'libs/'\n        },\n        // map tells the System loader where to look for things\n        map: {\n            ... ,\n            'ngx-popper': 'npm:ngx-popper',\n            'popper-directive.js': 'npm:ngx-popper',\n            'popper.module': 'npm:ngx-popper',\n        },\n        // packages tells the System loader how to load when no filename and/or no extension\n        packages: {\n            ... ,\n            'ngx-popper': {\n                main: 'index.js',\n                defaultExtension: 'js'\n            },\n            'popper.js': {\n                main: 'popper-directive.js',\n                defaultExtension: 'js'\n            },\n            'popper.module': {\n                main: './popper.module.js',\n                defaultExtension: 'js'\n            }\n        }\n    });\n\n```\n  \n\n3. Add to view:\n\n  ```HTML  \n   <div     [popper]=\"popper1Content\"\n            [popperShowOnStart]=\"true\"\n            [popperTrigger]=\"'click'\"\n            [popperHideOnClickOutside]=\"true\"\n            [popperHideOnScroll]=\"true\"\n            [popperPlacement]=\"'bottom'\">\n         <p class=\"bold\">Hey!</p>\n         <p class=\"thin\">Choose where to put your popper!</p>         \n       </div>\n       <popper-content #popper1Content>\n         <p class=\"bold\">Popper on bottom</p>\n       </popper-content>\n  ```\n\n4. As text:\n ```HTML\n      <div [popper]=\"'As text'\"\n           [popperTrigger]=\"'hover'\"\n           [popperPlacement]=\"'bottom'\"\n           (popperOnShown)=\"onShown($event)\">\n        <p class=\"bold\">Pop</p>\n        <p class=\"thin\">on the bottom</p>\n      </div>\n ```\n\n  ```HTML\n       <div popper=\"{{someTextProperty}}\"\n            [popperTrigger]=\"'hover'\"\n            [popperPlacement]=\"'bottom'\"\n            [popperStyles]=\"{'background-color: 'blue''}\",\n            (popperOnShown)=\"onShown($event)\">\n         <p class=\"bold\">Pop</p>\n         <p class=\"thin\">on the bottom</p>\n       </div>\n  ```\n \n  5. Position fixed, breaking overflow:\n   ```HTML\n        <div [popper]=\"'As text'\"\n             [popperTrigger]=\"'hover'\"\n             [popperPlacement]=\"'bottom'\"\n             [popperPositionFixed]=\"true\"\n             (popperOnShown)=\"onShown($event)\">\n        </div>\n   ```\n \n 6. Specific target:\n  ```HTML\n <div class=\"example\">\n       <div #popperTargetElement></div>\n       <div [popper]=\"'As text'\"\n            [popperTrigger]=\"'hover'\"\n            [popperPlacement]=\"'bottom'\"\n            [popperTarget]=\"popperTargetElement.nativeElement\"\n            (popperOnShown)=\"onShown($event)\">\n       </div>\n  ```\n  \n7. hide/show programmatically:\n  ```HTML\n   <div [popper]=\"tooltipcontent\"\n           [popperTrigger]=\"'hover'\"\n           [popperPlacement]=\"'bottom'\"\n           [popperApplyClass]=\"'popperSpecialStyle'\">\n        <p class=\"bold\">Pop</p>\n        <p class=\"thin\">on the bottom</p>\n      </div>\n      <popper-content #tooltipcontent>\n        <div>\n          <p>This is a tooltip with text</p>\n          <span (click)=\"tooltipcontent.hide()\">Close</span>\n        </div>\n      </popper-content>\n  ```\n \n8. Attributes map:  \n  \n    | Option                       | Type              | Default   | Description                                                                                              |\n    |:-----------------------      |:----------------  |:--------- | :------------------------------------------------------------------------------------------------------  |\n    | popperDisableAnimation       | boolean           | false     | Disable the default animation on show/hide                                                               |\n    | popperDisableStyle           | boolean           | false     | Disable the default styling                                                                              |\n    | popperDisabled               | boolean           | false     | Disable the popper, ignore all events                                                                    |\n    | popperDelay                  | number            | 0         | Delay time until popper it shown                                                                         |\n    | popperTimeout                | number            | 0         | Set delay before the popper is hidden                                                                    |\n    | popperTimeoutAfterShow       | number            | 0         | Set a time on which the popper will be hidden after it is shown                                          |\n    | popperPlacement              | Placement(string) | auto      | The placement to show the popper relative to the reference element                                       |\n    | popperTarget                 | HtmlElement       | auto      | Specify a different reference element other the the one hosting the directive                            |\n    | popperBoundaries             | string(selector)  | undefined | Specify a selector to serve as the boundaries of the element                                             |\n    | popperShowOnStart            | boolean           | false     | Popper default to show                                                                                   |\n    | popperTrigger                | Trigger(string)   | hover     | Trigger/Event on which to show/hide the popper                                                           |\n    | popperPositionFixed          | boolean           | false     | Set the popper element to use position: fixed                                                            |\n    | popperAppendTo               | string            | undefined | append The popper-content element to a given selector, if multiple will apply to first                   |\n    | popperPreventOverflow        | boolean           | undefined | Prevent the popper from being positioned outside the boundary                                            |\n    | popperHideOnClickOutside     | boolean           | true      | Popper will hide on a click outside                                                                      |\n    | popperHideOnScroll           | boolean           | false     | Popper will hide on scroll                                                                               |\n    | popperHideOnMouseLeave       | boolean           | false     | Popper will hide on mouse leave                                                                          |\n    | popperModifiers              | popperModifier    | undefined | popper.js custom modifiers hock                                                                          |\n    | popperApplyClass             | string            | undefined | list of comma separated class to apply on ngpx__container                                                |\n    | popperStyles                 | Object            | undefined | Apply the styles object, aligned with ngStyles                                                           |\n    | popperApplyArrowClass        | string            | undefined | list of comma separated class to apply on ngpx__arrow                                                    |\n    | popperOnShown                | EventEmitter<>    | $event    | Event handler when popper is shown                                                                       |\n    | popperOnHidden               | EventEmitter<>    | $event    | Event handler when popper is hidden                                                                      |\n    | popperOnUpdate               | EventEmitter<>    | $event    | Event handler when popper is updated                                                                     |\n    | popperAriaDescribeBy         | string            | undefined | Define value for aria-describeby attribute                                                               |\n    | popperAriaRole               | string            | popper    | Define value for aria-role attribute                                                                     |\n\n\n\n9. Override defaults:\n\n    Ngx-popper comes with a few default properties you can override in default to effect all instances\n    These are overridden by any child attributes.\n```JavaScript\nNgModule({\n  imports: [\n    BrowserModule,\n    FormsModule,\n    NgxPopperModule.forRoot({placement: 'bottom'})],\n  declarations: [AppComponent],\n  providers: [],\n  bootstrap: [AppComponent]\n\n})\n```\n  \n   | Options                  | Type              | Default   |\n   |:-------------------      |:----------------  |:--------- |\n   | showDelay                | number            | 0         |\n   | disableAnimation         | boolean           | false     |\n   | disableDefaultStyling    | boolean           | false     |\n   | placement                | Placement(string) | auto      |\n   | boundariesElement        | string(selector)  | undefined |\n   | trigger                  | Trigger(string)   | hover     |\n   | popperModifiers          | popperModifier    | undefined |\n   | positionFixed            | boolean           | false     |\n   | hideOnClickOutside       | boolean           | true      |\n   | hideOnMouseLeave         | boolean           | false     |\n   | hideOnScroll             | boolean           | false     |\n   | applyClass               | string            | undefined |\n   | styles                   | Object            | undefined |\n   | applyArrowClass          | string            | undefined |\n   | ariaDescribeBy           | string            | undefined |\n   | ariaRole                 | string            | undefined |\n   | appendTo                 | string            | undefined |\n   | preventOverflow          | boolean           | undefined |\n\n10. popperPlacement:\n\n  | 'top'\n  | 'bottom'\n  | 'left'\n  | 'right'\n  | 'top-start'\n  | 'bottom-start'\n  | 'left-start'\n  | 'right-start'\n  | 'top-end'\n  | 'bottom-end'\n  | 'left-end'\n  | 'right-end'\n  | 'auto'\n  | 'auto-start'\n  | 'auto-end'\n  | Function\n  \n11. popperTrigger:\n\n  | 'click'\n  | 'mousedown'\n  | 'hover'\n  | 'none'\n  \n    \n### Demo\n<a href=\"https://mrfrankel.github.io/ngx-popper/\">Demo</a>\n\n### Contribute\n  Hell ya!!!\n  \n```terminal\n  $ npm install\n  $ npm run build\n  $ npm run dev  //run example\n  $ npm run start_test  //run tests\n```\n\n"
  },
  {
    "path": "_config.yml",
    "content": "theme: jekyll-theme-cayman"
  },
  {
    "path": "example/app/app.component.css",
    "content": "p.thin {\n  font-weight: 100;\n  margin: 0;\n  line-height: 1.2em;\n}\n\np.bold {\n  font-weight: 900;\n  margin: 0;\n  margin-top: -5px;\n}\n\n.rel {\n  width: 30%;\n  margin: 0 auto;\n  position: relative;\n  text-align: center;\n  padding: 20px;\n  border-style: dotted;\n  border-color: white;\n  border-width: medium;\n}\n\n.ngxp__container {\n  width: 150px;\n  background: #FFC107;\n  color: black;\n  padding: 10px;\n  text-align: center;\n}\n\n#example10positionSelector {\n  margin-top: 1em;\n}\n\n.ngxp__container[x-placement^=\"top\"] .ngxp__arrow {\n  border-color: #FFC107 transparent transparent transparent\n}\n\n.ngxp__container[x-placement^=\"bottom\"] .ngxp__arrow {\n  border-color: transparent transparent #FFC107 transparent\n}\n\n.ngxp__container[x-placement^=\"right\"] .ngxp__arrow {\n  border-color: transparent #FFC107 transparent transparent\n}\n\n.ngxp__container[x-placement^=\"left\"] .ngxp__arrow {\n  border-color: transparent transparent transparent #FFC107\n}\n\n.example2__fake-body {\n  overflow-x: scroll;\n  height: 450px;\n  flex: 1;\n}\n\n.example2__scroll-box {\n  height: 200%;\n  display: flex;\n  align-content: center;\n  align-items: center;\n}\n\n#example3 .reference1:hover {\n  background: rgba(255, 255, 255, 0.2);\n}\n\n#example4 .ngxp__container1 {\n  height: 150px;\n}\n\np.thin {\n  font-weight: 100;\n  margin: 0;\n  line-height: 1.2em;\n}\n\np.bold {\n  font-weight: 900;\n  margin: 0;\n  margin-top: -5px;\n}\n\n.rel {\n  width: 30%;\n  margin: 0 auto;\n  position: relative;\n  text-align: center;\n  padding: 20px;\n  border-style: dotted;\n  border-color: white;\n  border-width: medium;\n}\n\n/*\nSpectral by HTML5 UP\nhtml5up.net | @n33co\nFree for personal and commercial use under the CCA 3.0 license (html5up.net/license)\n*/\n/* Reset */\nhtml, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {\n  margin: 0;\n  padding: 0;\n  border: 0;\n  font-size: 100%;\n  font: inherit;\n  vertical-align: baseline;\n}\n\narticle, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {\n  display: block;\n}\n\nbody {\n  line-height: 1;\n}\n\nol, ul {\n  list-style: none;\n}\n\nblockquote, q {\n  quotes: none;\n}\n\nblockquote:before, blockquote:after, q:before, q:after {\n  content: '';\n  content: none;\n}\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\nbody {\n  -webkit-text-size-adjust: none;\n}\n\n/* Box Model */\n*, *:before, *:after {\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n}\n\n/* Basic */\n@-ms-viewport {\n  width: device-width;\n}\n\nbody {\n  background: #2e3842;\n}\n\nbody.is-loading *, body.is-loading *:before, body.is-loading *:after {\n  -moz-animation: none !important;\n  -webkit-animation: none !important;\n  -ms-animation: none !important;\n  å animation: none !important;\n  -moz-transition: none !important;\n  -webkit-transition: none !important;\n  -ms-transition: none !important;\n  transition: none !important;\n}\n\nbody, input, select, textarea {\n  color: #fff;\n  font-family: \"Open Sans\", Helvetica, sans-serif;\n  font-size: 15pt;\n  font-weight: 400;\n  letter-spacing: 0.075em;\n  line-height: 1.65em;\n}\n\n@media screen and (max-width: 1680px) {\n  body, input, select, textarea {\n    font-size: 13pt;\n  }\n}\n\n@media screen and (max-width: 1280px) {\n  body, input, select, textarea {\n    font-size: 12pt;\n  }\n}\n\n@media screen and (max-width: 736px) {\n  body, input, select, textarea {\n    font-size: 11pt;\n    letter-spacing: 0.0375em;\n  }\n}\n\na {\n  -moz-transition: color 0.2s ease, border-bottom-color 0.2s ease;\n  -webkit-transition: color 0.2s ease, border-bottom-color 0.2s ease;\n  -ms-transition: color 0.2s ease, border-bottom-color 0.2s ease;\n  transition: color 0.2s ease, border-bottom-color 0.2s ease;\n  border-bottom: dotted 1px;\n  color: inherit;\n  text-decoration: none;\n}\n\na:hover {\n  border-bottom-color: transparent;\n}\n\nstrong, b {\n  color: #fff;\n  font-weight: 600;\n}\n\nem, i {\n  font-style: italic;\n}\n\np {\n  margin: 0 0 2em 0;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  color: #fff;\n  font-weight: 800;\n  letter-spacing: 0.225em;\n  line-height: 1em;\n  margin: 0 0 1em 0;\n  text-transform: uppercase;\n}\n\nh1 a, h2 a, h3 a, h4 a, h5 a, h6 a {\n  color: inherit;\n  text-decoration: none;\n}\n\nh2 {\n  font-size: 1.35em;\n  line-height: 1.75em;\n}\n\n@media screen and (max-width: 736px) {\n  h2 {\n    font-size: 1.1em;\n    line-height: 1.65em;\n  }\n}\n\nh3 {\n  font-size: 1.15em;\n  line-height: 1.75em;\n}\n\n@media screen and (max-width: 736px) {\n  h3 {\n    font-size: 1em;\n    line-height: 1.65em;\n  }\n}\n\nh4 {\n  font-size: 1em;\n  line-height: 1.5em;\n}\n\nh5 {\n  font-size: 0.8em;\n  line-height: 1.5em;\n}\n\nh6 {\n  font-size: 0.7em;\n  line-height: 1.5em;\n}\n\nsub {\n  font-size: 0.8em;\n  position: relative;\n  top: 0.5em;\n}\n\nsup {\n  font-size: 0.8em;\n  position: relative;\n  top: -0.5em;\n}\n\nhr {\n  border: 0;\n  border-bottom: solid 2px #fff;\n  margin: 3em 0;\n}\n\nhr.major {\n  margin: 4.5em 0;\n}\n\nblockquote {\n  border-left: solid 4px #fff;\n  font-style: italic;\n  margin: 0 0 2em 0;\n  padding: 0.5em 0 0.5em 2em;\n}\n\ncode {\n  background: rgba(144, 144, 144, 0.25);\n  border-radius: 3px;\n  font-family: \"Courier New\", monospace;\n  font-size: 0.9em;\n  letter-spacing: 0;\n  margin: 0 0.25em;\n  padding: 0.25em 0.65em;\n}\n\npre {\n  -webkit-overflow-scrolling: touch;\n  font-family: \"Courier New\", monospace;\n  font-size: 0.8em;\n  margin: 0 0 2em 0;\n  text-align: left;\n}\n\npre code {\n  display: block;\n  line-height: 1.75em;\n  padding: 1em 1.5em;\n  overflow-x: auto;\n}\n\nheader p {\n  color: rgba(255, 255, 255, 0.5);\n  position: relative;\n  top: -0.25em;\n}\n\nheader h3 + p {\n  font-size: 1.1em;\n}\n\nheader h4 + p, header h5 + p, header h6 + p {\n  font-size: 0.9em;\n}\n\nheader.major {\n  margin: 0 0 3.5em 0;\n}\n\nheader.major h2, header.major h3, header.major h4, header.major h5, header.major h6 {\n  border-bottom: solid 2px #fff;\n  display: inline-block;\n  padding-bottom: 1em;\n  position: relative;\n}\n\nheader.major h2:after, header.major h3:after, header.major h4:after, header.major h5:after, header.major h6:after {\n  content: '';\n  display: block;\n  height: 1px;\n}\n\nheader.major p {\n  color: #fff;\n  top: 0;\n}\n\n@media screen and (max-width: 736px) {\n  header.major {\n    margin: 0 0 2em 0;\n  }\n}\n\n@media screen and (max-width: 980px) {\n  header br {\n    display: none;\n  }\n}\n\n/* Form */\nform {\n  margin: 0 0 2em 0;\n}\n\nlabel {\n  color: #fff;\n  display: block;\n  font-size: 0.9em;\n  font-weight: 600;\n  margin: 0 0 1em 0;\n}\n\n@media screen and (max-width: 736px) {\n  .wrapper.style1 .features li {\n    border-top-color: rgba(0, 0, 0, 0.125);\n  }\n}\n\n.wrapper.style2 {\n  background-color: #2e3842;\n}\n\nselect {\n  -moz-appearance: none;\n  -webkit-appearance: none;\n  -ms-appearance: none;\n  appearance: none;\n  background: rgba(144, 144, 144, 0.25);\n  border-radius: 3px;\n  border: none;\n  color: inherit;\n  display: block;\n  outline: 0;\n  padding: 0 1em;\n  text-decoration: none;\n  width: 100%;\n}\n\n::-webkit-input-placeholder {\n  color: rgba(255, 255, 255, 0.5) !important;\n  opacity: 1.0;\n}\n\n:-moz-placeholder {\n  color: rgba(255, 255, 255, 0.5) !important;\n  opacity: 1.0;\n}\n\n::-moz-placeholder {\n  color: rgba(255, 255, 255, 0.5) !important;\n  opacity: 1.0;\n}\n\n:-ms-input-placeholder {\n  color: rgba(255, 255, 255, 0.5) !important;\n  opacity: 1.0;\n}\n\n.formerize-placeholder {\n  color: rgba(255, 255, 255, 0.5) !important;\n  opacity: 1.0;\n}\n\n/* Spotlight */\n.spotlight {\n  display: -moz-flex;\n  display: -webkit-flex;\n  display: -ms-flex;\n  display: flex;\n}\n\n.spotlight:nth-child(2n) {\n  -moz-flex-direction: row-reverse;\n  -webkit-flex-direction: row-reverse;\n  -ms-flex-direction: row-reverse;\n  flex-direction: row-reverse;\n}\n\n.spotlight:nth-child(1) {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.spotlight:nth-child(2) {\n  background-color: rgba(0, 0, 0, 0.15);\n}\n\n.spotlight:nth-child(3) {\n  background-color: rgba(0, 0, 0, 0.225);\n}\n\n.spotlight:nth-child(4) {\n  background-color: rgba(0, 0, 0, 0.3);\n}\n\n.spotlight:nth-child(5) {\n  background-color: rgba(0, 0, 0, 0.375);\n}\n\n.spotlight:nth-child(6) {\n  background-color: rgba(0, 0, 0, 0.45);\n}\n\n.spotlight:nth-child(7) {\n  background-color: rgba(0, 0, 0, 0.525);\n}\n\n.spotlight:nth-child(8) {\n  background-color: rgba(0, 0, 0, 0.6);\n}\n\n.spotlight:nth-child(9) {\n  background-color: rgba(0, 0, 0, 0.675);\n}\n\n.spotlight:nth-child(10) {\n  background-color: rgba(0, 0, 0, 0.75);\n}\n\n@media screen and (max-width: 1280px) {\n  .spotlight .image {\n    width: 45%;\n  }\n\n  .spotlight .content {\n    width: 55%;\n  }\n}\n\n@media screen and (max-width: 980px) {\n  .spotlight {\n    display: block;\n  }\n\n  .spotlight br {\n    display: none;\n  }\n\n  .spotlight .image, .spotlight .example {\n    width: 100%;\n  }\n\n  .spotlight .content {\n    padding: 4em 3em 2em 3em;\n    max-width: none;\n    text-align: center;\n    width: 100%;\n  }\n}\n\n@media screen and (max-width: 736px) {\n  .spotlight .content {\n    padding: 3em 2em 1em 2em;\n  }\n}\n\n/* Wrapper */\n.wrapper {\n  padding: 6em 0 4em 0;\n}\n\n.wrapper > .inner {\n  width: 60em;\n  margin: 0 auto;\n}\n\n@media screen and (max-width: 1280px) {\n  .wrapper > .inner {\n    width: 90%;\n  }\n}\n\n@media screen and (max-width: 980px) {\n  .wrapper > .inner {\n    width: 100%;\n  }\n}\n\n.wrapper.alt {\n  padding: 0;\n}\n\n.wrapper.style2 {\n  background-color: #2e3842;\n}\n\n/* Spotlight */\n.spotlight {\n  display: -moz-flex;\n  display: -webkit-flex;\n  display: -ms-flex;\n  display: flex;\n}\n\n.spotlight .image {\n  -moz-order: 1;\n  -webkit-order: 1;\n  -ms-order: 1;\n  order: 1;\n  border-radius: 0;\n  width: 40%;\n}\n\n.spotlight .image img {\n  border-radius: 0;\n  width: 100%;\n}\n\n.spotlight .example {\n  -moz-order: 1;\n  -webkit-order: 1;\n  -ms-order: 1;\n  order: 1;\n  position: relative;\n  min-height: 450px;\n  width: 40%;\n  background: rgba(0, 0, 0, 0.3);\n  display: flex;\n  align-content: center;\n  align-items: center;\n}\n\n.spotlight .content {\n  padding: 2em 4em 0.1em 4em;\n  -moz-order: 2;\n  -webkit-order: 2;\n  -ms-order: 2;\n  order: 2;\n  max-width: 48em;\n  width: 60%;\n}\n\n.spotlight:nth-child(2n) {\n  -moz-flex-direction: row-reverse;\n  -webkit-flex-direction: row-reverse;\n  -ms-flex-direction: row-reverse;\n  flex-direction: row-reverse;\n}\n\n.spotlight:nth-child(1) {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.spotlight:nth-child(2) {\n  background-color: rgba(0, 0, 0, 0.15);\n}\n\n.spotlight:nth-child(3) {\n  background-color: rgba(0, 0, 0, 0.225);\n}\n\n.spotlight:nth-child(4) {\n  background-color: rgba(0, 0, 0, 0.3);\n}\n\n.spotlight:nth-child(5) {\n  background-color: rgba(0, 0, 0, 0.375);\n}\n\n.spotlight:nth-child(6) {\n  background-color: rgba(0, 0, 0, 0.45);\n}\n\n.spotlight:nth-child(7) {\n  background-color: rgba(0, 0, 0, 0.525);\n}\n\n.spotlight:nth-child(8) {\n  background-color: rgba(0, 0, 0, 0.6);\n}\n\n.spotlight:nth-child(9) {\n  background-color: rgba(0, 0, 0, 0.675);\n}\n\n.spotlight:nth-child(10) {\n  background-color: rgba(0, 0, 0, 0.75);\n}\n\n@media screen and (max-width: 1280px) {\n  .spotlight .image {\n    width: 45%;\n  }\n\n  .spotlight .content {\n    width: 55%;\n  }\n}\n\n@media screen and (max-width: 980px) {\n  .spotlight {\n    display: block;\n  }\n\n  .spotlight br {\n    display: none;\n  }\n\n  .spotlight .image, .spotlight .example {\n    width: 100%;\n  }\n\n  .spotlight .content {\n    padding: 4em 3em 2em 3em;\n    max-width: none;\n    text-align: center;\n    width: 100%;\n  }\n}\n\n@media screen and (max-width: 736px) {\n  .spotlight .content {\n    padding: 3em 2em 1em 2em;\n  }\n}\n\n@media screen and (max-width: 980px) {\n  .wrapper {\n    padding: 4em 3em 2em 3em;\n  }\n}\n\n@media screen and (max-width: 736px) {\n  .wrapper {\n    padding: 3em 2em 1em 2em;\n  }\n}\n"
  },
  {
    "path": "example/app/app.component.html",
    "content": "<section id=\"two\" class=\"wrapper alt style2\">\n  <section class=\"spotlight\">\n    <div class=\"example\">\n      <div #popper1\n           [popper]=\"popper1Content\"\n           [popperTrigger]=\"'click'\"\n           [popperShowOnStart]=\"true\"\n           [popperPlacement]=\"example1select\" class=\"rel\" id=\"example10reference1\">\n        <p class=\"bold\">Hey!</p>\n        <p class=\"thin\">Choose where to put your popper!</p>\n        <select [(ngModel)]=\"example1select\" (change)=\"changeExample1(popper1Content)\"\n                id=\"example10positionSelector\">\n          <option value=\"top\">Top</option>\n          <option value=\"right\">Right</option>\n          <option value=\"bottom\">Bottom</option>\n          <option value=\"left\">Left</option>\n        </select>\n      </div>\n      <popper-content #popper1Content>\n        <p class=\"bold\" >Popper on <b id=\"example10currentPosition\" class=\"currentPosition\">{{example1select}}</b></p>\n      </popper-content>\n    </div>\n\n    <div class=\"content\">\n      <a class=\"anchor-wrapper\" href=\"#example10\"><h2 id=\"\" tabindex=\"0\"><a name=\"example10\"></a>Popper on your side!<i\n          class=\"fa fa-link link-anchor\"></i></h2></a>\n      <p id=\"example10Title\">\n        What are you waiting for? Select a popper from that dropdown.<br>\n        Placing poppers around elements is just that easy!\n      </p>\n\n      <div id=\"example10code\">\n\n      </div>\n\n    </div>\n\n  </section>\n  <section class=\"spotlight\">\n    <div class=\"example\">\n      <div class=\"example2__fake-body\">\n        <div class=\"example2__scroll-box\">\n          <div class=\"rel\" id=\"example2reference1\"\n               #popper2\n               [popper]=\"popper2Content\"\n               [popperShowOnStart]=\"true\">\n            <p class=\"bold\">Scroll me</p>\n            <p class=\"thin\">up and down</p>\n          </div>\n          <popper-content\n              #popper2Content id=\"example2popper1\">\n            <p class=\"bold\">I follow it</p>\n            <p class=\"thin\">staying between boundaries</p>\n          </popper-content>\n\n        </div>\n      </div>\n\n    </div>\n    <div class=\"content\">\n      <h2 id=\"example2\" tabindex=\"0\">Popper on scrolling container</h2>\n      <p>\n        In this example we have a relative div which contains a div with <code>overflow: scroll</code>.\n        <br> Inside it, there are our popper and reference elements.\n      </p>\n\n\n    </div>\n  </section>\n  <section class=\"spotlight\">\n    <div id=\"example3Container\" class=\"example\">\n      <div\n          #popper3\n          [popper]=\"popper3Content\"\n          [popperShowOnStart]=\"true\"\n          [popperPlacement]=\"'right'\"\n          [popperBoundaries]=\"'#example3Container'\"\n          [popperModifiers]=\"example3modifiers\"\n          [ng2-draggable]\n          (mouseover)=\"popper3Content.update()\" class=\"rel\" id=\"example3reference1\">\n        <p class=\"bold\">Drag me</p>\n        <p class=\"thin\">on the edges</p>\n      </div>\n    </div>\n    <popper-content #popper3Content id=\"example3popper1\">\n      <p class=\"bold\">Flipping popper</p>\n      <p class=\"thin\">which never flips to right</p>\n    </popper-content>\n    <div class=\"content\">\n      <h2 id=\"example3\" tabindex=\"0\">Custom flip behavior</h2>\n      <p>\n        Try dragging the reference element on the left side, its popper will move on its bottom edge. Then,\n        try to move the reference element on the bottom left corner, it will move on its top edge.\n      </p>\n\n\n    </div>\n  </section>\n  <section class=\"spotlight\">\n    <div class=\"example\">\n      <div class=\"rel\" id=\"example4reference1\"\n           #popper4\n           [popper]=\"popper4Content\"\n           [popperShowOnStart]=\"true\"\n           [popperPlacement]=\"'left-start'\">\n        <p class=\"bold\">Reference</p>\n      </div>\n      <popper-content #popper4Content>\n        <div style=\"height: 150px\" id=\"example4popper1\">\n          <p class=\"bold\">Shifted popper</p>\n          <p class=\"thin\">on start</p>\n        </div>\n      </popper-content>\n    </div>\n    <div class=\"content\">\n      <h2 id=\"example5\" tabindex=\"0\">Shifted poppers</h2>\n      <p>\n        Shift your poppers on start or end of its reference element side.\n      </p>\n    </div>\n  </section>\n  <section class=\"spotlight\">\n    <div class=\"example\">\n      <div class=\"rel\" id=\"example5reference1\"\n           #popper5\n           [popper]=\"popper5Content\"\n           [popperShowOnStart]=\"true\"\n           [popperPlacement]=\"'bottom'\">\n        <p class=\"bold\">Pop</p>\n        <p class=\"thin\">on the bottom</p>\n      </div>\n      <popper-content #popper5Content>\n        <div id=\"example5popper1\">\n          <p class=\"bold\">Popper on bottom</p>\n          <p class=\"thin\">Flips when hits viewport</p>\n        </div>\n      </popper-content>\n\n    </div>\n    <div class=\"content\">\n      <h2 id=\"example4\" tabindex=\"0\">Viewport boundaries</h2>\n      <p>\n        By default, poppers use as boundaries the page viewport.\n        <br> Scroll the page to see the popper flip when hits the page viewport margins.\n      </p>\n    </div>\n  </section>\n</section>\n"
  },
  {
    "path": "example/app/app.component.ts",
    "content": "import {Component, ElementRef, ViewEncapsulation, OnInit, ViewChild} from '@angular/core';\nimport {PopperContent} from '../../dist';\n/**\n * This class represents the main application component.\n */\n@Component({\n  selector: 'demo-app',\n  templateUrl: './app.component.html',\n  styleUrls: ['./app.component.css'],\n  encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent implements OnInit {\n  example3modifiers = {\n    flip: {\n      behavior: ['right', 'bottom', 'top']\n    }\n  };\n  example1select: string = 'top';\n  @ViewChild('popper3Content') popper3Content: any;\n\n  constructor(private elem: ElementRef) {\n  }\n\n  ngOnInit() {\n    setInterval(() => {\n      this.popper3Content.update();\n    }, 10);\n  }\n\n  changeExample1(popperRef: PopperContent) {\n    setTimeout(() => {\n      this.elem.nativeElement.querySelector('#example10reference1').dispatchEvent(new Event('click'));\n    }, 100)\n\n  }\n\n}"
  },
  {
    "path": "example/app/app.module.ts",
    "content": "import {NgModule} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {BrowserModule} from '@angular/platform-browser';\nimport {AppComponent} from './app.component';\nimport {NgxPopperModule, Triggers} from '../../dist';\nimport {Draggable} from 'ng2draggable/draggable.directive';\n\n@NgModule({\n  imports: [\n    BrowserModule,\n    FormsModule,\n    NgxPopperModule.forRoot({\n      trigger: Triggers.CLICK,\n      hideOnClickOutside: false\n    })],\n  declarations: [\n    Draggable,\n    AppComponent],\n  providers: [],\n  bootstrap: [AppComponent]\n\n})\nexport class AppModule {\n}"
  },
  {
    "path": "example/app/index.ts",
    "content": "import 'zone.js';\nimport 'reflect-metadata';\nimport '@angular/common';\nimport '@angular/compiler';\nimport '@angular/core';\nimport '@angular/forms';\nimport '@angular/platform-browser-dynamic';\nimport '@angular/platform-browser';\nimport 'rxjs';\n\nimport { enableProdMode } from '@angular/core';\n// The browser platform with a compiler\n//import {platformBrowser} from '@angular/platform-browser';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\n// The app module\nimport { AppModule } from './app.module';\n\nenableProdMode();\n\nplatformBrowserDynamic().bootstrapModule(AppModule);\n"
  },
  {
    "path": "example/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title>ngx-popper</title>\n</head>\n\n<body>\n <demo-app></demo-app>\n</body>\n</html>"
  },
  {
    "path": "example/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"outDir\": \"./dist-tsc\",\n    \"module\": \"commonjs\",\n    \"target\": \"es5\",\n    \"sourceMap\": true,\n    \"declaration\": true,\n    \"moduleResolution\": \"node\",\n    \"emitDecoratorMetadata\": true,\n    \"experimentalDecorators\": true,\n    \"strictNullChecks\": true,\n    \"skipLibCheck\": true,\n    \"lib\": [\n      \"es7\",\n      \"dom\",\n      \"es2017.object\",\n      \"es2015.iterable\",\n      \"ScriptHost\"\n    ]\n  },\n  \"typeRoots\": [\n    \"../node_modules/@types\",\n    \"../node_modules\"\n  ],\n  \"types\": [\n    \"node\"\n  ],\n  \"include\": [\n    \".\"\n  ],\n  \"exclude\": [\n    \"../dist\",\n    \"../dist-tsc\",\n    \"../test\"\n  ],\n  \"angularCompilerOptions\": {\n    \"preserveWhiteSpace\": false\n\n  }\n}"
  },
  {
    "path": "example/webpack.config.js",
    "content": "const path = require('path');\nconst {CheckerPlugin} = require('awesome-typescript-loader');\nconst webpack = require('webpack');\nconst chalk = require('chalk');\nconst HtmlWebpackPlugin = require('html-webpack-plugin');\nconst ProgressBarPlugin = require('progress-bar-webpack-plugin');\n\nmodule.exports = {\n  entry: './example/app/index.ts',\n  output: {\n    filename: '[name].js',\n    path: path.resolve(__dirname, 'dist')\n  },\n  resolve: {\n    extensions: ['.ts', '.tsx', '.js', '.jsx', '.html', '.css']\n  },\n  devtool: 'source-map',\n  module: {\n    rules: [\n      {\n        test: /\\.ts?$/,\n        use: ['awesome-typescript-loader?configFileName=\"./tsconfig.json\"', 'angular2-template-loader'],\n      //  exclude: [/node_modules/, /dist/, /dist-tsc/, /test/, /public_api/]\n      },\n      {\n        test: /\\.(html|css)$/,\n        use: 'raw-loader',\n    //    exclude: [/node_modules/, /dist/, /dist-tsc/, /test/]\n      }\n    ]\n  },\n  plugins: [\n    new CheckerPlugin(),\n    new HtmlWebpackPlugin({\n      inject: true,\n      template: './example/index.html'\n    }),\n    new ProgressBarPlugin({\n      format: '  build [' + chalk.blue.bold(':bar') + ']' + chalk.green.bold(':percent') + ' (:elapsed seconds) => :msg...  ',\n      clear: false\n    }),\n    new webpack.HotModuleReplacementPlugin()\n  ],\n  devServer: {\n    // https: true,\n    hot: true,\n    stats: 'errors-only',\n    port: 8888,\n    inline: true,\n    historyApiFallback: {\n      index: './example/'\n    },\n    open: false\n  }\n};"
  },
  {
    "path": "jest.config.js",
    "content": "module.exports = {\n  globalSetup: './setup.js',\n  globalTeardown: './teardown.js',\n  testEnvironment: './puppeteer_environment.js',\n};"
  },
  {
    "path": "ng-package.json",
    "content": "{\n  \"$schema\": \"./node_modules/ng-packagr/ng-package.schema.json\",\n  \"dest\": \"dist\",\n  \"workingDirectory\": \".ng_build\",\n  \"lib\": {\n    \"entryFile\": \"public_api.ts\"\n  }\n}"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"ngx-popper\",\n  \"version\": \"7.0.0\",\n  \"description\": \"ngx-popper is an Angular wrapper for popper.js\",\n  \"directories\": {\n    \"test\": \"test\"\n  },\n  \"scripts\": {\n    \"test-server\": \"http-server test_dist -p 8888\",\n    \"create_test_server\": \"rm -rf test_dist && webpack --config ./test/webpack.config.js && npm run test-server\",\n    \"test\": \"npm install && npm run start_test\",\n    \"run_jest\": \"jest\",\n    \"start_test\": \"npm run build && start-server-and-test create_test_server http://localhost:8888 run_jest\",\n    \"build\": \"ng-packagr -p ng-package.json\",\n    \"deploy\": \"npm run build && npm publish --access=public dist\",\n    \"dev\": \"webpack-dev-server --config ./example/webpack.config.js\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git@github.com:MrFrankel/ngx-popper\"\n  },\n  \"keywords\": [\n    \"Angular\",\n    \"ngx\",\n    \"ngx-popper\",\n    \"ngx-tooltip\",\n    \"popper\",\n    \"popperjs\"\n  ],\n  \"engines\": {\n    \"node\": \">=6.0.0\",\n    \"npm\": \">=3.4.0\"\n  },\n  \"author\": \"MrFrankel\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"/issues\"\n  },\n  \"homepage\": \"\",\n  \"devDependencies\": {\n    \"@angular/animations\": \"^7.2.0\",\n    \"@angular/cli\": \"^7.3.9\",\n    \"@angular/common\": \"^7.2.0\",\n    \"@angular/compiler\": \"^7.2.0\",\n    \"@angular/compiler-cli\": \"^7.2.15\",\n    \"@angular/core\": \"^7.2.0\",\n    \"@angular/forms\": \"^7.2.0\",\n    \"@angular/http\": \"^7.2.0\",\n    \"@angular/platform-browser\": \"^7.2.0\",\n    \"@angular/platform-browser-dynamic\": \"^7.2.0\",\n    \"@angular/platform-server\": \"^7.2.0\",\n    \"@ngtools/webpack\": \"^7.2.1\",\n    \"@types/node\": \"^10.12.2\",\n    \"angular2-template-loader\": \"^0.6.2\",\n    \"awesome-typescript-loader\": \"^5.2.1\",\n    \"chalk\": \"^2.3.0\",\n    \"css-loader\": \"^1.0.1\",\n    \"html-loader\": \"^0.5.5\",\n    \"html-webpack-plugin\": \"^3.2.0\",\n    \"http-server\": \"^0.11.1\",\n    \"install\": \"^0.12.2\",\n    \"jest\": \"^23.0.0\",\n    \"jest-puppeteer\": \"^3.8.0\",\n    \"ng-packagr\": \"^4.5.0\",\n    \"ng2draggable\": \"^1.3.2\",\n    \"popper.js\": \"^1.14.3\",\n    \"progress-bar-webpack-plugin\": \"^1.10.0\",\n    \"puppeteer\": \"^1.15.0\",\n    \"raw-loader\": \"^0.5.1\",\n    \"reflect-metadata\": \"^0.1.12\",\n    \"rxjs\": \"^6.3.3\",\n    \"script-loader\": \"^0.7.2\",\n    \"standard-version\": \"^4.3.0\",\n    \"start-server-and-test\": \"^1.7.11\",\n    \"style-loader\": \"^0.23.1\",\n    \"tsickle\": \"^0.34.0\",\n    \"typescript\": \"^3.1.6\",\n    \"webpack\": \"^4.24.0\",\n    \"webpack-cli\": \"^3.2.1\",\n    \"webpack-dev-server\": \"^3.1.14\",\n    \"webpack-shell-plugin\": \"^0.5.0\",\n    \"zone.js\": \"^0.8.20\"\n  },\n  \"peerDependencies\": {\n    \"popper.js\": \"^1.14.3\"\n  }\n}\n"
  },
  {
    "path": "public_api.ts",
    "content": "export * from \"./src/index\";"
  },
  {
    "path": "puppeteer_environment.js",
    "content": "const chalk = require('chalk');\nconst NodeEnvironment = require('jest-environment-node');\nconst puppeteer = require('puppeteer');\nconst fs = require('fs');\nconst os = require('os');\nconst path = require('path');\n\nconst DIR = path.join(os.tmpdir(), 'jest_puppeteer_global_setup');\n\nclass PuppeteerEnvironment extends NodeEnvironment {\n  constructor(config) {\n    super(config)\n  }\n\n  async setup() {\n    console.log(chalk.yellow('Setup Test Environment.'));\n    await super.setup();\n    const wsEndpoint = fs.readFileSync(path.join(DIR, 'wsEndpoint'), 'utf8');\n    if (!wsEndpoint) {\n      throw new Error('wsEndpoint not found')\n    }\n    this.global.__BROWSER__ = await puppeteer.connect({\n      browserWSEndpoint: wsEndpoint,\n    })\n  }\n\n  async teardown() {\n    console.log(chalk.yellow('Teardown Test Environment.'));\n    await super.teardown()\n  }\n\n  runScript(script) {\n    return super.runScript(script)\n  }\n}\n\nmodule.exports = PuppeteerEnvironment;"
  },
  {
    "path": "setup.js",
    "content": "const chalk = require('chalk');\nconst puppeteer = require('puppeteer');\nconst fs = require('fs');\nconst mkdirp = require('mkdirp');\nconst os = require('os');\nconst path = require('path');\n\nconst DIR = path.join(os.tmpdir(), 'jest_puppeteer_global_setup');\n\nmodule.exports = async function() {\n  console.log(chalk.green('Setup Puppeteer'));\n  const browser = await puppeteer.launch({devtools: true});\n  global.__BROWSER__ = browser;\n  mkdirp.sync(DIR);\n  fs.writeFileSync(path.join(DIR, 'wsEndpoint'), browser.wsEndpoint());\n};"
  },
  {
    "path": "src/index.ts",
    "content": "export * from './popper-model';\nexport * from './popper-directive';\nexport * from './popper-content';\nexport * from './popper.module';"
  },
  {
    "path": "src/popper-content.css",
    "content": ".ngxp__container {\n  display: none;\n  position: absolute;\n  border-radius: 3px;\n  border: 1px solid grey;\n  box-shadow: 0 0 2px rgba(0, 0, 0, 0.5);\n  padding: 10px;\n}\n\n.ngxp__container.ngxp__animation {\n  -webkit-animation: ngxp-fadeIn 150ms ease-out;\n  -moz-animation: ngxp-fadeIn 150ms ease-out;\n  -o-animation: ngxp-fadeIn 150ms ease-out;\n  animation: ngxp-fadeIn 150ms ease-out;\n}\n\n.ngxp__container > .ngxp__arrow {\n  border-color: grey;\n  width: 0;\n  height: 0;\n  border-style: solid;\n  position: absolute;\n  margin: 5px;\n}\n\n.ngxp__container[x-placement^=\"top\"],\n.ngxp__container[x-placement^=\"bottom\"],\n.ngxp__container[x-placement^=\"right\"],\n.ngxp__container[x-placement^=\"left\"] {\n  display: block;\n}\n\n.ngxp__container[x-placement^=\"top\"] {\n  margin-bottom: 5px;\n}\n\n.ngxp__container[x-placement^=\"top\"] > .ngxp__arrow {\n  border-width: 5px 5px 0 5px;\n  border-right-color: transparent;\n  border-bottom-color: transparent;\n  border-left-color: transparent;\n  bottom: -5px;\n  left: calc(50% - 5px);\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.ngxp__container[x-placement^=\"top\"] > .ngxp__arrow.__force-arrow {\n  border-right-color: transparent !important;\n  border-bottom-color: transparent !important;\n  border-left-color: transparent !important;\n}\n\n.ngxp__container[x-placement^=\"bottom\"] {\n  margin-top: 5px;\n}\n\n.ngxp__container[x-placement^=\"bottom\"] > .ngxp__arrow {\n  border-width: 0 5px 5px 5px;\n  border-top-color: transparent;\n  border-right-color: transparent;\n  border-left-color: transparent;\n  top: -5px;\n  left: calc(50% - 5px);\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.ngxp__container[x-placement^=\"bottom\"] > .ngxp__arrow.__force-arrow {\n  border-top-color: transparent !important;\n  border-right-color: transparent !important;\n  border-left-color: transparent !important;\n}\n\n.ngxp__container[x-placement^=\"right\"] {\n  margin-left: 5px;\n}\n\n.ngxp__container[x-placement^=\"right\"] > .ngxp__arrow {\n  border-width: 5px 5px 5px 0;\n  border-top-color: transparent;\n  border-bottom-color: transparent;\n  border-left-color: transparent;\n  left: -5px;\n  top: calc(50% - 5px);\n  margin-left: 0;\n  margin-right: 0;\n}\n\n.ngxp__container[x-placement^=\"right\"] > .ngxp__arrow.__force-arrow {\n  border-top-color: transparent !important;\n  border-bottom-color: transparent !important;\n  border-left-color: transparent !important;\n}\n\n.ngxp__container[x-placement^=\"left\"] {\n  margin-right: 5px;\n}\n\n.ngxp__container[x-placement^=\"left\"] > .ngxp__arrow {\n  border-width: 5px 0 5px 5px;\n  border-top-color: transparent;\n  border-bottom-color: transparent;\n  border-right-color: transparent;\n  right: -5px;\n  top: calc(50% - 5px);\n  margin-left: 0;\n  margin-right: 0;\n}\n\n.ngxp__container[x-placement^=\"left\"] > .ngxp__arrow.__force-arrow {\n  border-top-color: transparent !important;\n  border-bottom-color: transparent !important;\n  border-right-color: transparent !important;\n}\n\n@-webkit-keyframes ngxp-fadeIn {\n  0% {\n    display: none;\n    opacity: 0;\n  }\n\n  1% {\n    display: block;\n    opacity: 0;\n  }\n\n  100% {\n    display: block;\n    opacity: 1;\n  }\n}\n\n@keyframes ngxp-fadeIn {\n  0% {\n    display: none;\n    opacity: 0;\n  }\n\n  1% {\n    display: block;\n    opacity: 0;\n  }\n\n  100% {\n    display: block;\n    opacity: 1;\n  }\n}\n"
  },
  {
    "path": "src/popper-content.ts",
    "content": "import {\n  ChangeDetectionStrategy, ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  HostListener,\n  OnDestroy,\n  Renderer2,\n  ViewChild,\n  ViewContainerRef,\n  ViewEncapsulation,\n} from \"@angular/core\"\nimport Popper from 'popper.js'\nimport {Placements, PopperContentOptions, Triggers} from './popper-model'\n\n@Component({\n  selector: \"popper-content\",\n  encapsulation: ViewEncapsulation.None,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div #popperViewRef\n         [class.ngxp__container]=\"!popperOptions.disableDefaultStyling\"\n         [class.ngxp__animation]=\"!popperOptions.disableAnimation\"\n         [style.display]=\"displayType\"\n         [style.opacity]=\"opacity\"\n         [ngStyle]=\"popperOptions.styles\"\n         [ngClass]=\"extractAppliedClassListExpr(popperOptions.applyClass)\"\n         attr.aria-hidden=\"{{ariaHidden}}\"\n         [attr.aria-describedby]=\"popperOptions.ariaDescribe || null\"\n         attr.role=\"{{popperOptions.ariaRole}}\">\n      <div class=\"ngxp__inner\" *ngIf=\"text\" [innerHTML]=\"text\">\n        <ng-content></ng-content>\n      </div>\n      <div class=\"ngxp__inner\" *ngIf=\"!text\">\n        <ng-content></ng-content>\n      </div>\n      <div class=\"ngxp__arrow\" [style.border-color]=\"arrowColor\" [class.__force-arrow]=\"arrowColor\"\n           [ngClass]=\"extractAppliedClassListExpr(popperOptions.applyArrowClass)\"></div>\n\n    </div>\n  `,\n  styleUrls: ['./popper-content.css'],\n})\nexport class PopperContent implements OnDestroy {\n\n  popperOptions: PopperContentOptions = <PopperContentOptions>{\n    disableAnimation: false,\n    disableDefaultStyling: false,\n    placement: Placements.Auto,\n    boundariesElement: '',\n    trigger: Triggers.HOVER,\n    positionFixed: false,\n    appendToBody: false,\n    popperModifiers: {}\n  };\n\n  referenceObject: HTMLElement;\n\n  isMouseOver: boolean = false;\n\n  onHidden = new EventEmitter();\n\n  text: string;\n\n  popperInstance: Popper;\n\n  displayType: string = \"none\";\n\n  opacity: number = 0;\n\n  ariaHidden: string = 'true';\n\n  arrowColor: string | null = null;\n\n  onUpdate: Function;\n\n  state: boolean = true;\n\n  private globalResize: any;\n\n  @ViewChild(\"popperViewRef\")\n  popperViewRef: ElementRef;\n\n  @HostListener('mouseover')\n  onMouseOver() {\n    this.isMouseOver = true;\n  }\n\n  @HostListener('mouseleave')\n  showOnLeave() {\n    this.isMouseOver = false;\n    if (this.popperOptions.trigger !== Triggers.HOVER && !this.popperOptions.hideOnMouseLeave) {\n      return;\n    }\n    this.hide();\n  }\n\n  onDocumentResize() {\n    this.update();\n  }\n\n  constructor(\n    public elemRef: ElementRef,\n    private renderer: Renderer2,\n    private viewRef: ViewContainerRef,\n    private CDR: ChangeDetectorRef) {\n  }\n\n  ngOnDestroy() {\n    this.clean();\n    if(this.popperOptions.appendTo && this.elemRef && this.elemRef.nativeElement && this.elemRef.nativeElement.parentNode){\n      this.viewRef.detach();\n      this.elemRef.nativeElement.parentNode.removeChild(this.elemRef.nativeElement);\n    }\n  }\n\n  clean() {\n    this.toggleVisibility(false);\n    if (!this.popperInstance) {\n      return;\n    }\n    (this.popperInstance as any).disableEventListeners();\n    this.popperInstance.destroy();\n\n  }\n\n  show(): void {\n    if (!this.referenceObject) {\n      return;\n    }\n\n    const appendToParent = this.popperOptions.appendTo && document.querySelector(this.popperOptions.appendTo);\n    if (appendToParent && this.elemRef.nativeElement.parentNode !== appendToParent) {\n      this.elemRef.nativeElement.parentNode && this.elemRef.nativeElement.parentNode.removeChild(this.elemRef.nativeElement);\n      appendToParent.appendChild(this.elemRef.nativeElement);\n    }\n\n    let popperOptions: Popper.PopperOptions = <Popper.PopperOptions>{\n      placement: this.popperOptions.placement,\n      positionFixed: this.popperOptions.positionFixed,\n      modifiers: {\n        arrow: {\n          element: this.popperViewRef.nativeElement.querySelector('.ngxp__arrow')\n        }\n      }\n    };\n    if (this.onUpdate) {\n      popperOptions.onUpdate = this.onUpdate as any;\n    }\n\n    let boundariesElement = this.popperOptions.boundariesElement && document.querySelector(this.popperOptions.boundariesElement);\n\n    if (popperOptions.modifiers && boundariesElement) {\n      popperOptions.modifiers.preventOverflow = {boundariesElement};\n    }\n    if (popperOptions.modifiers && this.popperOptions.preventOverflow !== undefined) {\n      popperOptions.modifiers.preventOverflow = popperOptions.modifiers.preventOverflow || {};\n      popperOptions.modifiers.preventOverflow.enabled = this.popperOptions.preventOverflow;\n      if (!popperOptions.modifiers.preventOverflow.enabled) {\n        popperOptions.modifiers.hide = {enabled: false};\n      }\n    }\n    this.determineArrowColor();\n    popperOptions.modifiers = Object.assign(popperOptions.modifiers, this.popperOptions.popperModifiers);\n\n    this.popperInstance = new Popper(\n      this.referenceObject,\n      this.popperViewRef.nativeElement,\n      popperOptions,\n    );\n\n    (this.popperInstance as any).enableEventListeners();\n    this.scheduleUpdate();\n    this.toggleVisibility(true);\n    this.globalResize = this.renderer.listen('document', 'resize', this.onDocumentResize.bind(this))\n  }\n\n  private determineArrowColor() {\n    ['background-color', 'backgroundColor'].some((clr) => {\n      if (!this.popperOptions.styles) {\n        return false;\n      }\n      if (this.popperOptions.styles.hasOwnProperty(clr)) {\n        this.arrowColor = this.popperOptions.styles[clr];\n        return true;\n      }\n      return false;\n    })\n  }\n\n  update(): void {\n    this.popperInstance && (this.popperInstance as any).update();\n  }\n\n  scheduleUpdate(): void {\n    this.popperInstance && (this.popperInstance as any).scheduleUpdate();\n  }\n\n  hide(): void {\n\n    if (this.popperInstance) {\n      this.popperInstance.destroy();\n    }\n    this.toggleVisibility(false);\n    this.onHidden.emit();\n  }\n\n  toggleVisibility(state: boolean) {\n    if (!state) {\n      this.opacity = 0;\n      this.displayType = \"none\";\n      this.ariaHidden = 'true';\n      this.state = false;\n    }\n    else {\n      this.opacity = 1;\n      this.displayType = \"block\";\n      this.ariaHidden = 'false';\n      this.state = true;\n    }\n    if (!this.CDR['destroyed']) {\n      this.CDR.detectChanges();\n    }\n  }\n\n  extractAppliedClassListExpr(classList?: string): Object | null {\n    if (!classList || typeof classList !== 'string') {\n      return null;\n    }\n    try {\n      return classList\n        .replace(/ /, '')\n        .split(',')\n        .reduce((acc, clss) => {\n          acc[clss] = true;\n          return acc;\n        }, {})\n    }\n    catch (e) {\n      return null;\n    }\n  }\n\n  private clearGlobalResize() {\n    this.globalResize && typeof this.globalResize === 'function' && this.globalResize();\n  }\n\n}\n"
  },
  {
    "path": "src/popper-directive.ts",
    "content": "import {\n  Directive,\n  ComponentRef,\n  ViewContainerRef,\n  ComponentFactoryResolver,\n  Input,\n  OnChanges,\n  SimpleChange,\n  Output,\n  OnDestroy,\n  EventEmitter, OnInit, Renderer2, ChangeDetectorRef, Inject, ElementRef\n} from '@angular/core';\nimport {Placement, Placements, PopperContentOptions, Trigger, Triggers} from './popper-model';\nimport {PopperContent} from './popper-content';\n\n@Directive({\n  selector: '[popper]',\n  exportAs: 'popper'\n})\nexport class PopperController implements OnInit, OnDestroy, OnChanges {\n  private popperContentClass = PopperContent;\n  private popperContentRef: ComponentRef<PopperContent>;\n  private shown: boolean = false;\n  private scheduledShowTimeout: any;\n  private scheduledHideTimeout: any;\n  private subscriptions: any[] = [];\n  private eventListeners: any[] = [];\n  private globalEventListeners: any[] = [];\n  private popperContent: PopperContent;\n\n  constructor(private viewContainerRef: ViewContainerRef,\n              private changeDetectorRef: ChangeDetectorRef,\n              private resolver: ComponentFactoryResolver,\n              private elementRef: ElementRef,\n              private renderer: Renderer2,\n              @Inject('popperDefaults') private popperDefaults: PopperContentOptions = {}) {\n    PopperController.baseOptions = {...PopperController.baseOptions, ...this.popperDefaults};\n  }\n\n  public static baseOptions: PopperContentOptions = <PopperContentOptions>{\n    showDelay: 0,\n    placement: Placements.Auto,\n    hideOnClickOutside: true,\n    hideOnMouseLeave: false,\n    hideOnScroll: false,\n    showTrigger: Triggers.HOVER,\n    appendTo: undefined,\n    ariaRole: 'popper',\n    ariaDescribe: '',\n    styles: {}\n  };\n\n  @Input('popper')\n  content: string | PopperContent;\n\n  @Input('popperDisabled')\n  disabled: boolean;\n\n  @Input('popperPlacement')\n  placement: Placement;\n\n  @Input('popperTrigger')\n  showTrigger: Trigger | undefined;\n\n  @Input('popperTarget')\n  targetElement: HTMLElement;\n\n  @Input('popperDelay')\n  showDelay: number | undefined;\n\n  @Input('popperTimeout')\n  hideTimeout: number = 0;\n\n  @Input('popperTimeoutAfterShow')\n  timeoutAfterShow: number = 0;\n\n  @Input('popperBoundaries')\n  boundariesElement: string;\n\n  @Input('popperShowOnStart')\n  showOnStart: boolean;\n\n  @Input('popperCloseOnClickOutside')\n  closeOnClickOutside: boolean;\n\n  @Input('popperHideOnClickOutside')\n  hideOnClickOutside: boolean | undefined;\n\n  @Input('popperHideOnScroll')\n  hideOnScroll: boolean | undefined;\n\n  @Input('popperHideOnMouseLeave')\n  hideOnMouseLeave: boolean | undefined;\n\n  @Input('popperPositionFixed')\n  positionFixed: boolean;\n\n  @Input('popperModifiers')\n  popperModifiers: {};\n\n  @Input('popperDisableStyle')\n  disableStyle: boolean;\n\n  @Input('popperDisableAnimation')\n  disableAnimation: boolean;\n\n  @Input('popperApplyClass')\n  applyClass: string;\n\n  @Input('popperApplyArrowClass')\n  applyArrowClass: string;\n\n  @Input('popperAriaDescribeBy')\n  ariaDescribe: string | undefined;\n\n  @Input('popperAriaRole')\n  ariaRole: string | undefined;\n\n  @Input('popperStyles')\n  styles: Object | undefined;\n\n  @Input('popperAppendTo')\n  appendTo: string;\n\n  @Input('popperPreventOverflow')\n  preventOverflow: boolean;\n\n  @Output()\n  popperOnShown: EventEmitter<PopperController> = new EventEmitter<PopperController>();\n\n  @Output()\n  popperOnHidden: EventEmitter<PopperController> = new EventEmitter<PopperController>();\n\n  @Output()\n  popperOnUpdate: EventEmitter<any> = new EventEmitter<any>();\n\n  hideOnClickOutsideHandler($event: MouseEvent): void {\n    if (this.disabled || !this.hideOnClickOutside || $event.srcElement &&\n      $event.srcElement === this.popperContent.elemRef.nativeElement ||\n      this.popperContent.elemRef.nativeElement.contains($event.srcElement)) {\n      return;\n    }\n    this.scheduledHide($event, this.hideTimeout);\n  }\n\n  hideOnScrollHandler($event: MouseEvent): void {\n    if (this.disabled || !this.hideOnScroll) {\n      return;\n    }\n    this.scheduledHide($event, this.hideTimeout);\n  }\n\n  applyTriggerListeners() {\n    switch (this.showTrigger) {\n      case Triggers.CLICK:\n        this.eventListeners.push(this.renderer.listen(this.elementRef.nativeElement, 'click', this.toggle.bind(this)));\n        break;\n      case Triggers.MOUSEDOWN:\n        this.eventListeners.push(this.renderer.listen(this.elementRef.nativeElement, 'mousedown', this.toggle.bind(this)));\n        break;\n      case Triggers.HOVER:\n        this.eventListeners.push(this.renderer.listen(this.elementRef.nativeElement, 'mouseenter', this.scheduledShow.bind(this, this.showDelay)));\n        this.eventListeners.push(this.renderer.listen(this.elementRef.nativeElement, 'touchend', this.scheduledHide.bind(this, null, this.hideTimeout)));\n        this.eventListeners.push(this.renderer.listen(this.elementRef.nativeElement, 'touchcancel', this.scheduledHide.bind(this, null, this.hideTimeout)));\n        this.eventListeners.push(this.renderer.listen(this.elementRef.nativeElement, 'mouseleave', this.scheduledHide.bind(this, null, this.hideTimeout)));\n        break;\n    }\n    if (this.showTrigger !== Triggers.HOVER && this.hideOnMouseLeave) {\n      this.eventListeners.push(this.renderer.listen(this.elementRef.nativeElement, 'touchend', this.scheduledHide.bind(this, null, this.hideTimeout)));\n      this.eventListeners.push(this.renderer.listen(this.elementRef.nativeElement, 'touchcancel', this.scheduledHide.bind(this, null, this.hideTimeout)));\n      this.eventListeners.push(this.renderer.listen(this.elementRef.nativeElement, 'mouseleave', this.scheduledHide.bind(this, null, this.hideTimeout)));\n    }\n  }\n\n  static assignDefined(target: any, ...sources: any[]) {\n    for (const source of sources) {\n      for (const key of Object.keys(source)) {\n        const val = source[key];\n        if (val !== undefined) {\n          target[key] = val;\n        }\n      }\n    }\n    return target;\n  }\n\n  ngOnInit() {\n    //Support legacy prop\n    this.hideOnClickOutside = typeof this.hideOnClickOutside === 'undefined' ?\n      this.closeOnClickOutside : this.hideOnClickOutside;\n\n    if (typeof this.content === 'string') {\n      const text = this.content;\n      this.popperContent = this.constructContent();\n      this.popperContent.text = text;\n    }\n    else {\n      this.popperContent = this.content;\n    }\n    const popperRef = this.popperContent;\n    popperRef.referenceObject = this.getRefElement();\n    this.setContentProperties(popperRef);\n    this.setDefaults();\n    this.applyTriggerListeners();\n    if (this.showOnStart) {\n      this.scheduledShow();\n    }\n  }\n\n  ngOnChanges(changes: { [propertyName: string]: SimpleChange }) {\n    if (changes['popperDisabled'] && changes['popperDisabled'].currentValue) {\n      this.hide();\n    }\n    if (changes['content']\n      && !changes['content'].firstChange\n      && typeof changes['content'].currentValue === 'string') {\n      this.popperContent.text = changes['content'].currentValue;\n    }\n\n    if (changes['applyClass']\n      && !changes['applyClass'].firstChange\n      && typeof changes['applyClass'].currentValue === 'string') {\n      this.popperContent.popperOptions.applyClass = changes['applyClass'].currentValue;\n    }\n\n    if (changes['applyArrowClass']\n      && !changes['applyArrowClass'].firstChange\n      && typeof changes['applyArrowClass'].currentValue === 'string') {\n      this.popperContent.popperOptions.applyArrowClass = changes['applyArrowClass'].currentValue;\n    }\n  }\n\n  ngOnDestroy() {\n    this.subscriptions.forEach(sub => sub.unsubscribe && sub.unsubscribe());\n    this.subscriptions.length = 0;\n    this.clearEventListeners();\n    this.clearGlobalEventListeners();\n    clearTimeout(this.scheduledShowTimeout);\n    clearTimeout(this.scheduledHideTimeout);\n    this.popperContent && this.popperContent.clean();\n  }\n\n  toggle() {\n    if (this.disabled) {\n      return;\n    }\n    this.shown ? this.scheduledHide(null, this.hideTimeout) : this.scheduledShow();\n  }\n\n  show() {\n    if (this.shown) {\n      this.overrideHideTimeout();\n      return;\n    }\n\n    this.shown = true;\n    const popperRef = this.popperContent;\n    const element = this.getRefElement();\n    if (popperRef.referenceObject !== element) {\n      popperRef.referenceObject = element;\n    }\n    this.setContentProperties(popperRef);\n    popperRef.show();\n    this.popperOnShown.emit(this);\n    if (this.timeoutAfterShow > 0) {\n      this.scheduledHide(null, this.timeoutAfterShow);\n    }\n    this.globalEventListeners.push(this.renderer.listen('document', 'touchend', this.hideOnClickOutsideHandler.bind(this)));\n    this.globalEventListeners.push(this.renderer.listen('document', 'click', this.hideOnClickOutsideHandler.bind(this)));\n    this.globalEventListeners.push(this.renderer.listen(this.getScrollParent(this.getRefElement()), 'scroll', this.hideOnScrollHandler.bind(this)));\n  }\n\n  hide() {\n    if (this.disabled) {\n      return;\n    }\n    if (!this.shown) {\n      this.overrideShowTimeout();\n      return;\n    }\n\n    this.shown = false;\n    if (this.popperContentRef) {\n      this.popperContentRef.instance.hide();\n    }\n    else {\n      this.popperContent.hide();\n    }\n    this.popperOnHidden.emit(this);\n    this.clearGlobalEventListeners();\n  }\n\n  scheduledShow(delay: number | undefined = this.showDelay) {\n    if (this.disabled) {\n      return;\n    }\n    this.overrideHideTimeout();\n    this.scheduledShowTimeout = setTimeout(() => {\n      this.show();\n      this.applyChanges();\n    }, delay)\n  }\n\n  scheduledHide($event: any = null, delay: number = this.hideTimeout) {\n    if (this.disabled) {\n      return;\n    }\n    this.overrideShowTimeout();\n    this.scheduledHideTimeout = setTimeout(() => {\n      const toElement = $event ? $event.toElement : null;\n      const popperContentView = this.popperContent.popperViewRef ? this.popperContent.popperViewRef.nativeElement : false;\n      if (!popperContentView || popperContentView === toElement || popperContentView.contains(toElement) || (this.content as PopperContent).isMouseOver) {\n        return;\n      }\n      this.hide();\n      this.applyChanges();\n    }, delay);\n  }\n\n  getRefElement() {\n    return this.targetElement || this.viewContainerRef.element.nativeElement;\n  }\n\n  private applyChanges() {\n    this.changeDetectorRef.markForCheck();\n    this.changeDetectorRef.detectChanges();\n  }\n\n  private setDefaults() {\n    this.showDelay = typeof this.showDelay === 'undefined' ? PopperController.baseOptions.showDelay : this.showDelay;\n    this.showTrigger = typeof this.showTrigger === 'undefined' ? PopperController.baseOptions.trigger : this.showTrigger;\n    this.hideOnClickOutside = typeof this.hideOnClickOutside === 'undefined' ? PopperController.baseOptions.hideOnClickOutside : this.hideOnClickOutside;\n    this.hideOnScroll = typeof this.hideOnScroll === 'undefined' ? PopperController.baseOptions.hideOnScroll : this.hideOnScroll;\n    this.hideOnMouseLeave = typeof this.hideOnMouseLeave === 'undefined' ? PopperController.baseOptions.hideOnMouseLeave : this.hideOnMouseLeave;\n    this.ariaRole = typeof this.ariaRole === 'undefined' ? PopperController.baseOptions.ariaRole : this.ariaRole;\n    this.ariaDescribe = typeof this.ariaDescribe === 'undefined' ? PopperController.baseOptions.ariaDescribe : this.ariaDescribe;\n    this.styles = typeof this.styles === 'undefined' ? Object.assign({}, PopperController.baseOptions.styles) : this.styles;\n  }\n\n  private clearEventListeners() {\n    this.eventListeners.forEach(evt => {\n      evt && typeof evt === 'function' && evt();\n    });\n    this.eventListeners.length = 0;\n  }\n\n  private clearGlobalEventListeners() {\n    this.globalEventListeners.forEach(evt => {\n      evt && typeof evt === 'function' && evt();\n    });\n    this.globalEventListeners.length = 0;\n  }\n\n  private overrideShowTimeout() {\n    if (this.scheduledShowTimeout) {\n      clearTimeout(this.scheduledShowTimeout);\n      this.scheduledHideTimeout = 0;\n    }\n  }\n\n  private overrideHideTimeout() {\n    if (this.scheduledHideTimeout) {\n      clearTimeout(this.scheduledHideTimeout);\n      this.scheduledHideTimeout = 0;\n    }\n  }\n\n  private constructContent(): PopperContent {\n    const factory = this.resolver.resolveComponentFactory(this.popperContentClass);\n    this.popperContentRef = this.viewContainerRef.createComponent(factory);\n    return this.popperContentRef.instance as PopperContent;\n  }\n\n  private setContentProperties(popperRef: PopperContent) {\n    popperRef.popperOptions = PopperController.assignDefined(popperRef.popperOptions, PopperController.baseOptions, {\n      showDelay: this.showDelay,\n      disableAnimation: this.disableAnimation,\n      disableDefaultStyling: this.disableStyle,\n      placement: this.placement,\n      boundariesElement: this.boundariesElement,\n      trigger: this.showTrigger,\n      positionFixed: this.positionFixed,\n      popperModifiers: this.popperModifiers,\n      ariaDescribe: this.ariaDescribe,\n      ariaRole: this.ariaRole,\n      applyClass: this.applyClass,\n      applyArrowClass: this.applyArrowClass,\n      hideOnMouseLeave: this.hideOnMouseLeave,\n      styles: this.styles,\n      appendTo: this.appendTo,\n      preventOverflow: this.preventOverflow,\n    });\n    popperRef.onUpdate = this.onPopperUpdate.bind(this);\n    this.subscriptions.push(popperRef.onHidden.subscribe(this.hide.bind(this)));\n  }\n\n  private getScrollParent(node) {\n    const isElement = node instanceof HTMLElement;\n    const overflowY = isElement && window.getComputedStyle(node).overflowY;\n    const isScrollable = overflowY !== 'visible' && overflowY !== 'hidden';\n\n    if (!node) {\n      return null;\n    } else if (isScrollable && node.scrollHeight >= node.clientHeight) {\n      return node;\n    }\n\n    return this.getScrollParent(node.parentNode) || document;\n  }\n\n  private onPopperUpdate(event) {\n    this.popperOnUpdate.emit(event);\n  }\n\n}\n"
  },
  {
    "path": "src/popper-model.ts",
    "content": "export type Trigger =\n  | 'click'\n  | 'mousedown'\n  | 'hover'\n  | 'none' ;\n\nexport class Triggers {\n  static CLICK: Trigger = 'click';\n  static HOVER: Trigger = 'hover';\n  static MOUSEDOWN: Trigger = 'mousedown';\n  static NONE: Trigger = 'none';\n}\n\nexport type Placement =\n  | 'top'\n  | 'bottom'\n  | 'left'\n  | 'right'\n  | 'top-start'\n  | 'bottom-start'\n  | 'left-start'\n  | 'right-start'\n  | 'top-end'\n  | 'bottom-end'\n  | 'left-end'\n  | 'right-end'\n  | 'auto'\n  | 'auto-start'\n  | 'auto-end'\n  | Function\n\nexport class Placements {\n  static Top: Placement = 'top';\n  static Bottom: Placement = 'bottom';\n  static Left: Placement = 'left';\n  static Right: Placement = 'right';\n  static TopStart: Placement = 'top-start';\n  static BottomStart: Placement = 'bottom-start';\n  static LeftStart: Placement = 'left-start';\n  static RightStart: Placement = 'right-start';\n  static TopEnd: Placement = 'top-end';\n  static BottomEnd: Placement = 'bottom-end';\n  static LeftEnd: Placement = 'left-end';\n  static RightEnd: Placement = 'right-end';\n  static Auto: Placement = 'auto';\n  static AutoStart: Placement = 'auto-start';\n  static AutoEnd: Placement = 'auto-end';\n}\n\nexport interface PopperContentOptions {\n  showDelay?: number;\n  disableAnimation?: boolean;\n  disableDefaultStyling?: boolean;\n  placement?: Placement;\n  boundariesElement?: string;\n  trigger?: Trigger;\n  positionFixed?: boolean;\n  hideOnClickOutside?: boolean;\n  hideOnMouseLeave?: boolean;\n  hideOnScroll?: boolean;\n  popperModifiers?: {};\n  ariaRole?: string;\n  ariaDescribe?: string;\n  applyClass?: string;\n  applyArrowClass?: string;\n  styles?: Object;\n  appendTo?: string;\n  preventOverflow?: boolean;\n}"
  },
  {
    "path": "src/popper.module.ts",
    "content": "import {CommonModule} from \"@angular/common\";\nimport {ModuleWithProviders, NgModule} from \"@angular/core\";\nimport {PopperContentOptions} from './popper-model';\nimport {PopperController} from './popper-directive';\nimport {PopperContent} from './popper-content';\n\n@NgModule({\n  imports: [\n    CommonModule\n  ],\n  declarations: [\n    PopperController,\n    PopperContent\n  ],\n  exports: [\n    PopperController,\n    PopperContent\n  ],\n  entryComponents: [\n    PopperContent\n  ]\n})\nexport class NgxPopperModule {\n  ngDoBootstrap() {\n  }\n\n  public static forRoot(popperBaseOptions: PopperContentOptions = {}): ModuleWithProviders {\n    return {ngModule: NgxPopperModule, providers: [{provide: 'popperDefaults', useValue: popperBaseOptions}]};\n  }\n}"
  },
  {
    "path": "teardown.js",
    "content": "const chalk = require('chalk');\nconst puppeteer = require('puppeteer');\nconst rimraf = require('rimraf');\nconst os = require('os');\nconst path = require('path');\n\nconst DIR = path.join(os.tmpdir(), 'jest_puppeteer_global_setup');\n\nmodule.exports = async function() {\n  console.log(chalk.green('Teardown Puppeteer'));\n  await global.__BROWSER__.close();\n  rimraf.sync(DIR);\n};"
  },
  {
    "path": "test/__tests__/basic.test.js",
    "content": "const utils = require('../utils');\nconst timeout = 20000;\nlet testCounter = 0;\n\njest.setTimeout(timeout);\ndescribe(\n  '/basic tests',\n  () => {\n    let page;\n\n    beforeEach(async () => {\n      testCounter++;\n      await page.evaluate((count) => {\n        const elm = document.querySelector('test-app > div');\n        elm.id = `popper${count}`;\n        elm.style.display = 'block';\n        const elm2 = document.querySelector('body > .ngxp__container');\n        elm2 && elm2.parentNode.removeChild(elm2);\n\n      }, testCounter - 1)\n    });\n\n    afterEach(async () => {\n      await page.evaluate(() => {\n        const elm = document.querySelector('test-app > div');\n        elm.parentNode.removeChild(elm);\n        const elm2 = document.querySelector('body > .ngxp__container');\n        elm2 && elm2.parentNode.removeChild(elm2);\n      });\n    });\n\n    beforeAll(async () => {\n      page = await global.__BROWSER__.newPage();\n      await page.goto('http://localhost:8888');\n      await page.waitForSelector('popper-content');\n      console.log('page ready');\n    }, timeout);\n\n    afterAll(async () => {\n      await page.close()\n    });\n\n    it('should show popper on start', async () => {\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: false\n      });\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: true\n      });\n      const popperText = await utils.getPopperText(page);\n      expect(popperText.trim()).toEqual('testing');\n      // let popperBox = await popper.boundingBox();\n      // let targetBox = await popperTarget.boundingBox();\n      // await page.evaluate(() => {debugger});\n      // expect((targetBox.y + targetBox.height) - popperBox.y).toEqual(18);\n\n    });\n\n    it('should show popper on click', async () => {\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: false\n      });\n      await page.click(`.popperTarget`);\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: true\n      });\n      const popperText = await utils.getPopperText(page);\n      const popperContainerBox = await utils.getPopperBoundingBox(page);\n      const targetBox = await utils.getTargetBoundingBox(page);\n      expect(popperText.trim()).toEqual('testing');\n      expect(popperContainerBox.y - (targetBox.y + targetBox.height)).toEqual(5);\n    });\n\n    it('should on right', async () => {\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: false\n      });\n      await page.click(`.popperTarget`);\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: true\n      });\n      const popperText = await utils.getPopperText(page);\n      const popperContainerBox = await utils.getPopperBoundingBox(page);\n      const targetBox = await utils.getTargetBoundingBox(page);\n      expect(popperText.trim()).toEqual('testing');\n      expect(popperContainerBox.x - (targetBox.x + targetBox.width)).toEqual(5);\n    });\n\n    it('should open to top', async () => {\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: false\n      });\n      await page.click(`.popperTarget`);\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: true\n      });\n      const popperText = await utils.getPopperText(page);\n      const popperContainerBox = await utils.getPopperBoundingBox(page);\n      const targetBox = await utils.getTargetBoundingBox(page);\n      expect(popperText.trim()).toEqual('testing');\n      //await utils.pause(page);\n      expect(targetBox.y - (popperContainerBox.y + popperContainerBox.height)).toEqual(5);\n\n    });\n\n    it('left placement should flip to right', async () => {\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: false\n      });\n      await page.click(`.popperTarget`);\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: true\n      });\n      const popperText = await utils.getPopperText(page);\n      const popperContainerBox = await utils.getPopperBoundingBox(page);\n      const targetBox = await utils.getTargetBoundingBox(page);\n      expect(popperText.trim()).toEqual('testing');\n      expect(popperContainerBox.x - (targetBox.x + targetBox.width)).toEqual(5);\n\n    });\n\n    it('should show/hover in hover', async () => {\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: false\n      });\n      await page.hover(`.popperTarget`);\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: true\n      });\n      const popperText = await utils.getPopperText(page);\n      const popperContainerBox = await utils.getPopperBoundingBox(page);\n      const targetBox = await utils.getTargetBoundingBox(page);\n      expect(popperText.trim()).toEqual('testing');\n      expect(popperContainerBox.x - (targetBox.x + targetBox.width)).toEqual(5);\n      await page.hover('p');\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: false\n      });\n    });\n\n    it('should not show popper with trigger none', async () => {\n      await page.click(`.popperTarget`);\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: false\n      });\n      await page.hover(`.popperTarget`);\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: false\n      });\n    });\n\n    it('should show popper-content component on right', async () => {\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: false\n      });\n      await page.click(`.popperTarget`);\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: true\n      });\n\n      const popperText = await utils.getPopperText(page);\n      const popperContainerBox = await utils.getPopperBoundingBox(page);\n      const targetBox = await utils.getTargetBoundingBox(page);\n      expect(popperText.trim()).toEqual('testing');\n      expect(popperContainerBox.x - (targetBox.x + targetBox.width)).toEqual(5);\n    });\n\n    it('should show popper-content component on right after delay', async () => {\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: false\n      });\n      await page.click(`.popperTarget`);\n      await page.waitFor(4500);\n      //utils.pause(page);\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: true,\n        timeout: 1000\n      });\n\n      const popperText = await utils.getPopperText(page);\n      const popperContainerBox = await utils.getPopperBoundingBox(page);\n      const targetBox = await utils.getTargetBoundingBox(page);\n      expect(popperText.trim()).toEqual('testing');\n      expect(popperContainerBox.x - (targetBox.x + targetBox.width)).toEqual(5);\n    });\n\n\n    it('should show popper on the right and attached to body', async () => {\n    //  utils.pause(page);\n      await page.waitForSelector(`popper-content`, {\n        visible: false\n      });\n      await page.hover(`.popperTarget`);\n      await page.waitForSelector(`.ngxp__container`, {\n        visible: true\n      });\n      const popperText = await utils.getPopperText(page, 'body');\n      const popperContainerBox = await utils.getPopperBoundingBox(page, 'body');\n      const targetBox = await utils.getTargetBoundingBox(page);\n      expect(popperText.trim()).toEqual('testing');\n      expect(popperContainerBox.x - (targetBox.x + targetBox.width)).toEqual(5);\n    });\n\n    // it('should show popper on the right with position fixed and attached to body', async () => {\n    //   await page.waitForSelector(`.ngxp__container`, {\n    //     visible: false\n    //   });\n    //   await page.hover(`.popperTarget`);\n    //   await page.waitForSelector(`.ngxp__container`, {\n    //     visible: true\n    //   });\n    //   const popper = await page.$('.ngxp__container');\n    //   const popperText = await utils.getPopperText(page, 'body');\n    //   const popperContainerBox = await utils.getPopperBoundingBox(page, 'body');\n    //   const targetBox = await utils.getTargetBoundingBox(page);\n    //   expect(popperText.trim()).toEqual('testing');\n    //   expect(popperContainerBox.x - (targetBox.x + targetBox.width)).toEqual(5);\n    // })\n    //\n    // it('should show popper on the right with show on start and attached to body', async () => {\n    //\n    //   await page.waitForSelector(`.ngxp__container`, {\n    //     visible: true\n    //   });\n    //   const popperText = await utils.getPopperText(page, 'body');\n    //   const popperContainerBox = await utils.getPopperBoundingBox(page, 'body');\n    //   const targetBox = await utils.getTargetBoundingBox(page);\n    //\n    //   expect(popperText.trim()).toEqual('testing');\n    //   expect(popperContainerBox.x - (targetBox.x + targetBox.width)).toEqual(5);\n    // })\n  }\n);"
  },
  {
    "path": "test/app/app.component.css",
    "content": "test-app > div {\n  display: none;\n}\n\n.popperTarget {\n  display: inline-block;\n  height: 50px;\n  width: 50px;\n  background: green;\n}\n\npopper-content .ngxp__container {\n  background-color: blue;\n  color: white;\n}"
  },
  {
    "path": "test/app/app.component.html",
    "content": "<p>ngx-popper testing started...</p>\n<div>\n  <div class=\"popperTarget\" popper=\"testing\" popperPlacement=\"bottom\" [popperShowOnStart]=\"true\">popper</div>\n</div>\n<div>\n  <div class=\"popperTarget\" popper=\"testing\" popperPlacement=\"bottom\" [popperTrigger]=\"'click'\">click</div>\n</div>\n<div>\n  <div class=\"popperTarget\" popper=\"testing\" [popperTrigger]=\"'click'\" [popperPlacement]=\"'right'\">click</div>\n</div>\n<div>\n  <div class=\"popperTarget\" popper=\"testing\" [popperTrigger]=\"'click'\" [popperPlacement]=\"'top'\">click</div>\n</div>\n<div>\n  <div class=\"popperTarget\" popper=\"testing\" [popperTrigger]=\"'click'\" [popperPlacement]=\"'left'\">click</div>\n</div>\n<div>\n  <div class=\"popperTarget\" popper=\"testing\" [popperTrigger]=\"'hover'\" [popperPlacement]=\"'right'\"  >click</div>\n</div>\n<div>\n  <div class=\"popperTarget\" popper=\"testing\" [popperTrigger]=\"'none'\" [popperPlacement]=\"'right'\">click</div>\n</div>\n<div>\n  <div class=\"popperTarget\" [popper]=\"popper1\" [popperTrigger]=\"'click'\" [popperPlacement]=\"'right'\">click</div>\n  <popper-content #popper1>testing</popper-content>\n</div>\n<div>\n  <div class=\"popperTarget\" popper=\"testing\" [popperTrigger]=\"'click'\" [popperDelay]=\"5000\" [popperPlacement]=\"'right'\">click</div>\n</div>\n<div>\n  <div class=\"popperTarget\" popper=\"testing\" [popperTrigger]=\"'hover'\" [popperPlacement]=\"'right'\" [popperAppendTo]=\"'body'\">click</div>\n</div>\n<!--<div>-->\n  <!--<div class=\"popperTarget\" popper=\"testing\" [popperTrigger]=\"'hover'\" [popperPlacement]=\"'right'\" [popperAppendToBody]=\"true\" [popperPositionFixed]=\"true\">click</div>-->\n<!--</div>-->\n<!--<div>-->\n  <!--<div class=\"popperTarget\" popper=\"testing\" [popperShowOnStart]=\"true\" [popperPlacement]=\"'right'\" [popperAppendToBody]=\"true\">click</div>-->\n<!--</div>-->"
  },
  {
    "path": "test/app/app.component.ts",
    "content": "import {Component, ViewEncapsulation} from '@angular/core';\n\n/**\n * This class represents the main application component.\n */\n@Component({\n  selector: 'test-app',\n  templateUrl: './app.component.html',\n  styleUrls: ['./app.component.css'],\n  encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent  {\n\n  constructor() {\n  }\n\n}"
  },
  {
    "path": "test/app/app.module.ts",
    "content": "import {NgModule} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {BrowserModule} from '@angular/platform-browser';\nimport {AppComponent} from './app.component';\nimport {NgxPopperModule, Triggers} from '../../dist';\n\n@NgModule({\n  imports: [\n    BrowserModule,\n    FormsModule,\n    NgxPopperModule.forRoot({\n      trigger: Triggers.CLICK,\n      hideOnClickOutside: false\n    })],\n  declarations: [\n    AppComponent],\n  providers: [],\n  bootstrap: [AppComponent]\n\n})\nexport class AppModule {\n}"
  },
  {
    "path": "test/app/index.ts",
    "content": "import 'zone.js';\nimport 'reflect-metadata';\nimport '@angular/common';\nimport '@angular/compiler';\nimport '@angular/core';\nimport '@angular/forms';\nimport '@angular/platform-browser-dynamic';\nimport '@angular/platform-browser';\nimport 'rxjs';\n\nimport { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\n// The app module\nimport { AppModule } from './app.module';\n\nenableProdMode();\n\nplatformBrowserDynamic().bootstrapModule(AppModule);\n"
  },
  {
    "path": "test/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title>ngx-popper</title>\n</head>\n\n<body>\n <test-app></test-app>\n</body>\n</html>"
  },
  {
    "path": "test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"module\": \"commonjs\",\n    \"target\": \"es5\",\n    \"sourceMap\": true,\n    \"declaration\": true,\n    \"moduleResolution\": \"node\",\n    \"emitDecoratorMetadata\": true,\n    \"experimentalDecorators\": true,\n    \"strictNullChecks\": true,\n    \"skipLibCheck\": true,\n    \"lib\": [\n      \"es7\",\n      \"dom\",\n      \"es2017.object\",\n      \"es2015.iterable\",\n      \"ScriptHost\"\n    ]\n  },\n  \"typeRoots\": [\n    \"../node_modules/@types\",\n    \"../node_modules\"\n  ],\n  \"types\": [\n    \"node\"\n  ],\n  \"include\": [\n    \".\"\n  ],\n  \"exclude\": [\n    \"../node_modules\",\n    \"../dist\",\n    \"../dist-tsc\",\n    \"../example\",\n    \"../example-cli\"\n  ],\n  \"angularCompilerOptions\": {\n    \"preserveWhiteSpace\": false\n\n  }\n}"
  },
  {
    "path": "test/utils.js",
    "content": "module.exports = {\n  curPage: {},\n  getPopperText: async (page, parent) => {\n    let popper = await page.$(parent || 'popper-content');\n    let popperInner = await popper.$('.ngxp__inner');\n    let popperText = await popperInner.getProperty('innerText');\n    return await popperText.jsonValue();\n  },\n  getPopperBoundingBox: async (page, parent) => {\n    let popper = await page.$(parent || 'popper-content');\n    let popperContainer = await popper.$('.ngxp__container');\n    return await popperContainer.boundingBox();\n  },\n  getTargetBoundingBox: async (page) => {\n    let popperTarget = await page.$('.popperTarget');\n    return await popperTarget.boundingBox();\n  },\n  pause: async (page) => {\n    jest.setTimeout(500000);\n    return await page.evaluate(() => {\n      debugger;\n    });\n  }\n\n};"
  },
  {
    "path": "test/webpack.config.js",
    "content": "const path = require('path');\nconst {CheckerPlugin} = require('awesome-typescript-loader');\n//const OpenBrowserPlugin = require('open-browser-webpack-plugin');\nconst chalk = require('chalk');\nconst HtmlWebpackPlugin = require('html-webpack-plugin');\nconst ProgressBarPlugin = require('progress-bar-webpack-plugin');\n\n\nmodule.exports = {\n  entry: './test/app/index.ts',\n  output: {\n    filename: '[name].js',\n    path: path.resolve(__dirname, '../test_dist')\n  },\n  resolve: {\n    extensions: ['.ts', '.tsx', '.js', '.jsx', '.html', '.css']\n  },\n  devtool: 'source-map',\n  module: {\n    rules: [\n      {\n        test: /\\.ts?$/,\n        use: ['awesome-typescript-loader?configFileName=\"./tsconfig.json\"', 'angular2-template-loader'],\n        exclude:  [/__tests__/]\n      },\n      {\n        test: /\\.(html|css)$/,\n        use: 'raw-loader',\n        exclude: [/__tests__/]\n      }\n    ]\n  },\n  plugins: [\n    new CheckerPlugin(),\n    new HtmlWebpackPlugin({\n      inject: true,\n      template: './test/index.html'\n    }),\n    new ProgressBarPlugin({\n      format: '  build [' + chalk.blue.bold(':bar') + ']' + chalk.green.bold(':percent') + ' (:elapsed seconds) => :msg...  ',\n      clear: false\n    }),\n    // new OpenBrowserPlugin({\n    //   url: `http://localhost:8888`\n    // })\n\n  ],\n  devServer: {\n    // https: true,\n    //hot: true,\n    stats: 'errors-only',\n    port: 8888,\n    inline: true,\n    historyApiFallback: {\n      index: './test/'\n    },\n    open: false\n  }\n};"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"outDir\": \"./dist-tsc\",\n    \"module\": \"commonjs\",\n    \"target\": \"es5\",\n    \"sourceMap\": true,\n    \"declaration\": true,\n    \"moduleResolution\": \"node\",\n    \"emitDecoratorMetadata\": true,\n    \"experimentalDecorators\": true,\n    \"strictNullChecks\": true,\n    \"skipLibCheck\": true,\n    \"lib\": [\n      \"es7\",\n      \"dom\",\n      \"es2017.object\",\n      \"es2015.iterable\",\n      \"ScriptHost\"\n    ]\n  },\n  \"typeRoots\": [\n    \"./node_modules/@types\",\n    \"./node_modules\"\n  ],\n  \"types\": [\n    \"node\"\n  ],\n  \"include\": [\n    \"src\"\n  ],\n  \"exclude\": [\n    \"node_modules\",\n    \"dist\",\n    \"dist-tsc\",\n    \"test\",\n    \"example\",\n    \"example-cli\"\n  ],\n  \"angularCompilerOptions\": {\n    \"preserveWhiteSpace\": false\n\n  }\n}"
  }
]